Bien. Il est temps de parler d'une nouvelle expérience. Comment il l'a recueilli, ce qui en est arrivé et comment le répéter.
J'ai été poussé à un nouveau projet par un événement, dans un sens, banal - un fils est né. Je me suis arrangé pour un mois de congé à l'avance. Mais l'enfant s'est avéré calme - il y avait du temps libre. Et mettez le dormeur à cÎté de lui.
De nombreuses maisons différentesmatériel embarqué pour la vision par ordinateur. En conséquence, j'ai décidé de créer une nounou vidéo. Mais pas aussi ennuyeux que tous les magasins sont remplis. Et quelque chose de plus intelligent et de plus intéressant.
L'article sera Ă©crit dans une veine narrative afin de comprendre comment s'est dĂ©roulĂ© le dĂ©veloppement du jouet, oĂč il en est venu et oĂč il va ensuite.
L'article a plusieurs ajouts:
- VidĂ©o oĂč je montre et raconte comment tout fonctionne.
- Un petit article sur VC, oĂč je vous explique pourquoi de telles choses ne se produiront probablement pas dans la production normale, et sur les limites des systĂšmes ML de ce type.
- Trie tout sur github + image prĂȘte Ă l'emploi pour RPi. Ă la fin de l'article, une description de son utilisation.
Choisir une idée
La fonctionnalitĂ© la plus courante d'un babyphone est de voir ce qui arrive Ă l'enfant Ă tout moment. Malheureusement, cela ne fonctionne pas toujours. Vous ne regarderez pas l'Ă©mission tout le temps, ce n'est pas pratique. Le bĂ©bĂ© peut gĂ©nĂ©ralement ĂȘtre endormi Ă proximitĂ© dans un cocon, pourquoi la vidĂ©o tout le temps? En consĂ©quence, la collection suivante a Ă©tĂ© constituĂ©e pour commencer:
- Le systÚme doit permettre de regarder une vidéo ou une photo à tout moment depuis le téléphone
- Le systÚme doit réagir au réveil de l'enfant et en informer
- Le systÚme doit détecter un visage manquant pour éviter le SMSN
SĂ©lection de plateforme
J'ai eu un long article sur Habré sur la comparaison de différentes plateformes. Globalement, pour un prototype comme ce que je fais, il existe plusieurs options:
- Jetson Nano. + ( Nano), , . . â TensorRT. . , , , TensorRT .
- VIM3. , . â .
- Raspberry PI + Movidius. . , , .
- , .
- . .
- Raspberry PI 4 - lorsque vous travaillez avec OpenCV, il sera bon de se débarrasser des réseaux ouverts, ce qui devrait suffire. Mais il y avait un soupçon qu'il n'y aura pas assez de performances.
- Corail - Je l'ai entre les mains, ça passerait en termes de performances, mais dans mon autre article il est écrit pourquoi je ne l'aime pas :)
Total - J'ai choisi Rpi + movidius. Je l'ai sous la main, je peux travailler avec.
Le fer
L'ordinateur est Raspberry Pi 3B, le neuroprocesseur est Movidius Myriad X. C'est clair.
Le reste - gratté sur le fond du canon, acheté en plus.
Caméra
J'ai vérifié trois différents que j'avais:
- Appareil photo de RaspberryPI. Cùble bruyant et peu pratique, pas de fixation pratique. Noté.
- Une sorte de camĂ©ra IP. TrĂšs pratique car il n'a pas besoin d'ĂȘtre inclus dans le RPI. La camĂ©ra est sĂ©parĂ©e de l'ordinateur. Ma cellule avait mĂȘme deux modes, jour et nuit. Mais celui que j'avais ne donnait pas une qualitĂ© de visage suffisante.
- Webcam de Genius. Je l'utilise depuis environ 5 ans dĂ©jĂ , mais quelque chose est devenu instable ces derniers temps. Mais pour RPI, c'est parfait. De plus, il s'est avĂ©rĂ© qu'il pouvait ĂȘtre facilement dĂ©montĂ© et le filtre IR retirĂ© de lĂ . De plus, comme il s'est avĂ©rĂ© plus tard, c'Ă©tait la seule option avec un microphone.
Et le filtre change comme ceci:
En général, il est clair que ce n'est pas une solution produit. Mais ça marche.
Si quoi que ce soit, alors dans le code, vous verrez les piĂšces restantes pour passer aux deux autres types de camĂ©ras. Peut-ĂȘtre mĂȘme quelque chose fonctionnera-t-il si vous modifiez 1-2 paramĂštres.
Ăclairage
J'avais un illuminateur qui traĂźnait avec l'un des vieux problĂšmes.
Je lui ai soudĂ© une sorte d'alimentation Ă©lectrique. Ăa brille bien.
Dirigez-le vers le plafond - la piÚce est éclairée.
Ăcran
Pour certains modes de fonctionnement, j'avais besoin d'un moniteur. ArrĂȘtĂ© Ă ceci . Bien que je ne sois pas sĂ»r que ce soit la bonne dĂ©cision. J'aurais peut-ĂȘtre dĂ» prendre la version intĂ©grale. Mais plus lĂ -dessus plus tard.
Nutrition
L'enfant dort dans des endroits arbitraires. C'est donc plus facile lorsque le systÚme est alimenté par une banque d'alimentation. J'ai choisi ceci, simplement parce que c'est à la maison pour la randonnée:
OpenVino
Marchons un peu Ă travers OpenVino. Comme je l'ai dit ci-dessus, le gros avantage d'OpenVino est la grande quantitĂ© de rĂ©seaux prĂ©-entraĂźnĂ©s. Ce qui peut nous ĂȘtre utile.
Détection facial. Il existe de nombreux réseaux de ce type dans OpenVino:
Reconnaissance des points clés du visage . Nous en avons besoin pour lancer les réseaux d'
orientation du visage suivants . ActivitĂ© de l'enfant et oĂč il regarde.
Reconnaissance de la direction des yeux - si vous essayez d'interagir avec l'
analyse de profondeur ? Peut-ĂȘtre que cela se rĂ©vĂ©lera une
analyse squelette
Eh bien, beaucoup d'autres intéressants ...
Le principal inconvénient de ces réseaux sera leur principal avantage - leur pré-formation ...
Cela peut ĂȘtre corrigĂ©, mais maintenant nous faisons un prototype rapide, notre objectif n'est pas de travailler dans 100% des cas, mais un travail fondamental qui apportera au moins certains avantages.
Aller. Logique générale version 1
Puisque nous dĂ©veloppons un appareil embarquĂ©, nous devons en quelque sorte interagir avec lui. Recevez des signaux photo / d'alarme. J'ai donc dĂ©cidĂ© de faire la mĂȘme chose que lorsque j'ai fait le creux , par tĂ©lĂ©gramme. Mais rappelez-vous.
Pour la premiÚre version, j'ai décidé:
- Lancez les réseaux désignés sur RPi (je voudrais tout d'un coup, du coup les performances le permettront). Cela vous permettra de voir plus d'options pour résoudre le problÚme / les moyens probables de développement
- Rédigez un modÚle de programme général.
- Trouvez un algorithme qui reconnaßt le réveil.
- Créer un algorithme qui envoie une notification en cas de perte de visage
Tout s'est plus ou moins bien passé, à part un tas de bugs tout autour. C'est inhérent à ComputerVision ... J'y suis habitué.
Voici un bref résumé de ce que je suis tombé sur:
- OpenVino RPi ( 2020) - from openvino.inference_engine import IECore. OpenVino ( OpenCV ), , .
- OpenVino , -generate_deprecated_IR_V7
- OpenVino ( , ) Movidius int 8 . int32 . RPi int8 . , .
- OpenVino . , OpenVino . , â .
- OpenVino , Intel ( , ).
- PyTorch 1.5 onnx, 1.4âŠ
Mais voici comment ... Je suis sûr que si je passais par TensorRT, il y aurait plus de problÚmes, comme toujours.
Alors. Tout est rĂ©uni, les rĂ©seaux tournent, on obtient quelque chose comme ça (en faisant passer la pile sur la tĂȘte, l'orientation, les points clĂ©s):
on voit que le visage se perd souvent lorsque l'enfant le couvre avec ses mains / tourne la tĂȘte. et tous les indicateurs ne sont pas stables.
Et aprĂšs? Comment analyser l'endormissement?
Je regarde ces grilles, et la premiÚre chose qui me vient à l'esprit est de reconnaßtre les émotions. Lorsque l'enfant est endormi et calme, il y a une expression neutre sur son visage. Mais ce n'est pas si simple. Voici un graphique bleu foncé, c'est une expression neutre d'un enfant endormi pendant une heure:
Le reste des graphiques est triste / en colĂšre / joie / surprise. Pas mĂȘme vraiment l'essence de ce qui est oĂč en couleurs. Malheureusement, les donnĂ©es du rĂ©seau sont instables, ce que nous constatons. L'instabilitĂ© se produit lorsque:
- Ombre excessive sur le visage (ce qui n'est pas rare la nuit)
- Les visages de l'enfant n'Ă©taient pas dans l'ensemble de formation OpenVino => passage arbitraire Ă d'autres Ă©motions
- L'enfant fait des grimaces, y compris dans un rĂȘve
Dans l'ensemble, je n'ai pas été surpris. J'ai déjà rencontré des réseaux qui reconnaissent les émotions, et ils sont toujours instables, notamment en raison de l'instabilité de la transition entre les émotions - il n'y a pas de frontiÚre claire.
Ok, le rĂ©veil ne peut pas ĂȘtre reconnu Ă l'aide des Ă©motions. Jusqu'Ă prĂ©sent, je ne voulais pas enseigner quelque chose moi-mĂȘme, alors j'ai dĂ©cidĂ© d'essayer sur la base des mĂȘmes rĂ©seaux, mais de l'autre cĂŽtĂ©. L'un des filets donne l'angle de rotation de la tĂȘte. C'est dĂ©jĂ mieux (Ă©cart total par rapport Ă la vision de la camĂ©ra dans le temps en degrĂ©s). 5 Ă 10 minutes avant le rĂ©veil:
mieux. Mais ... Le fils peut commencer Ă secouer la tĂȘte pendant son sommeil. Ou vice versa, si vous dĂ©finissez un grand seuil - rĂ©veillez-vous et ne secouez pas la tĂȘte aprĂšs cela. Pour recevoir une notification Ă chaque fois ... Malheureusement:
(il y a environ une heure de sommeil)
Nous devons donc encore faire une reconnaissance normale.
ProblÚmes rencontrés dans la version 1
Résumons tout ce que je n'ai pas aimé dans la premiÚre version.
- Démarrage automatique. Il n'est pas pratique de redémarrer ce jouet à chaque fois, de se connecter via SSH, d'exécuter le script de surveillance. Dans ce cas, le script doit:
- Vérifiez l'état de la caméra. Il arrive que l'appareil photo soit éteint / non branché. Le systÚme doit attendre que l'utilisateur allume la caméra.
- VĂ©rification de l'Ă©tat de l'accĂ©lĂ©rateur. La mĂȘme chose qu'avec l'appareil photo.
- VĂ©rification du rĂ©seau. Je veux utiliser la chose Ă la fois Ă la maison et Ă la campagne. Ou peut-ĂȘtre ailleurs. Et encore une fois, je ne veux pas me connecter via ssh => J'ai besoin de crĂ©er un algorithme pour me connecter au wiFi s'il n'y a pas d'Internet.
- Réveil, formation réseau. Les approches simples ne sont pas arrivées, ce qui signifie qu'il est nécessaire d'entraßner le neurone à reconnaßtre les yeux ouverts.
DĂ©marrage automatique
En général, le schéma d'exécution automatique est le suivant:
- Je lance mon programme au début. Comment je fais - j'ai écrit un article séparé, pour ne pas dire qu'il est trivial de le faire sur RPi. En bref:
- OpenVino
- , â
- Movidius-
-
- â QR- wifi
- telegram . â QR-
Hahaha. Le réseau est déjà apparu. Mais, comme il s'est avéré, il n'a été lancé qu'aprÚs avoir commencé à développer. Et dans la version et la documentation, cela apparaissait déjà quand je faisais plus ou moins tout. J'écrivais maintenant un article et j'ai trouvé une mise à jour .
Mais, je ne vais pas le refaire, alors j'Ă©cris comme je l'ai fait.
Il est trÚs facile de former un tel réseau. Ci-dessus, j'ai dit que j'avais utilisé la sélection des yeux par cadre. Il ne reste plus rien: ajoutez la sauvegarde de tous les yeux rencontrés dans le cadre. Il s'avÚre un tel jeu de données:
il reste à le marquer et à le former. J'ai décrit le processus de marquage plus en détail ici (et une vidéo du processus pendant 10 minutes ici). Toloka a été utilisé pour le marquage. Il a fallu ~ 2 heures pour configurer la tùche, 5 minutes pour baliser + 300 roubles du budget.
En apprenant, je ne voulais pas trop réfléchir, j'ai donc choisi un réseau volontairement rapide, de qualité suffisante pour résoudre le problÚme - mobilenetv2. L'ensemble du code, y compris le chargement de l'ensemble de données, l'initialisation et l'enregistrement, a pris moins de 100 lignes (principalement tirées de sources ouvertes, réécrit quelques dizaines de lignes):
Texte masqué
import numpy as np
import torch
from torch import nn
from torch import optim
from torchvision import datasets, transforms, models
data_dir = 'F:/Senya/Dataset'
def load_split_train_test(datadir, valid_size = .1):
train_transforms = transforms.Compose([transforms.Resize(64),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
])
test_transforms = transforms.Compose([transforms.Resize(64),
transforms.ToTensor(),
])
train_data = datasets.ImageFolder(datadir,
transform=train_transforms)
test_data = datasets.ImageFolder(datadir,
transform=test_transforms)
num_train = len(train_data)
indices = list(range(num_train))
split = int(np.floor(valid_size * num_train))
np.random.shuffle(indices)
from torch.utils.data.sampler import SubsetRandomSampler
train_idx, test_idx = indices[split:], indices[:split]
train_sampler = SubsetRandomSampler(train_idx)
test_sampler = SubsetRandomSampler(test_idx)
trainloader = torch.utils.data.DataLoader(train_data,
sampler=train_sampler, batch_size=64)
testloader = torch.utils.data.DataLoader(test_data,
sampler=test_sampler, batch_size=64)
return trainloader, testloader
trainloader, testloader = load_split_train_test(data_dir, .1)
print(trainloader.dataset.classes)
device = torch.device("cuda" if torch.cuda.is_available()
else "cpu")
model = models.mobilenet_v2(pretrained=True)
model.classifier = nn.Sequential(nn.Linear(1280, 3),
nn.LogSoftmax(dim=1))
print(model)
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
model.to(device)
epochs = 5
steps = 0
running_loss = 0
print_every = 10
train_losses, test_losses = [], []
for epoch in range(epochs):
for inputs, labels in trainloader:
steps += 1
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
logps = model.forward(inputs)
loss = criterion(logps, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if steps % print_every == 0:
test_loss = 0
accuracy = 0
model.eval()
with torch.no_grad():
for inputs, labels in testloader:
inputs, labels = inputs.to(device), labels.to(device)
logps = model.forward(inputs)
batch_loss = criterion(logps, labels)
test_loss += batch_loss.item()
ps = torch.exp(logps)
top_p, top_class = ps.topk(1, dim=1)
equals = top_class == labels.view(*top_class.shape)
accuracy += torch.mean(equals.type(torch.FloatTensor)).item()
train_losses.append(running_loss / len(trainloader))
test_losses.append(test_loss / len(testloader))
print(f"Epoch {epoch + 1}/{epochs}.. "
f"Train loss: {running_loss / print_every:.3f}.. "
f"Test loss: {test_loss / len(testloader):.3f}.. "
f"Test accuracy: {accuracy / len(testloader):.3f}")
running_loss = 0
model.train()
torch.save(model, 'EyeDetector.pth')
Et quelques lignes de plus pour enregistrer le modĂšle dans ONNX:
Texte masqué
from torchvision import transforms
import torch
from PIL import Image
use_cuda=1
mobilenet = torch.load("EyeDetector.pth")
mobilenet.classifier = mobilenet.classifier[:-1]
mobilenet.cuda()
img = Image.open('E:/OpenProject/OpenVinoTest/face_detect/EyeDataset/krnwapzu_left.jpg')
mobilenet.eval()
transform = transforms.Compose([transforms.Resize(64),
transforms.ToTensor(),
])
img = transform(img)
img = torch.unsqueeze(img, 0)
if use_cuda:
img = img.cuda()
img = torch.autograd.Variable(img)
list_features = mobilenet(img)
ps = torch.exp(list_features.data.cpu())
top_p, top_class = ps.topk(1, dim=1)
list_features_numpy = []
for feature in list_features:
list_features_numpy.append(feature.data.cpu().numpy())
mobilenet.cpu()
x = torch.randn(1, 3, 64, 64, requires_grad=True)
torch_out = mobilenet(x)
torch.onnx.export(mobilenet, x,"mobilnet.onnx", export_params=True, opset_version=10, do_constant_folding=True,
input_names = ['input'],output_names = ['output'])
print(list_features_numpy)
L'enregistrement du modÚle dans ONNX est nécessaire pour appeler le modÚle dans Open Vino. Je n'ai pas pris la peine de convertir en int8, j'ai laissé le modÚle tel qu'il était au format 32 bits.
Analyse de prĂ©cision, mĂ©triques de qualitĂ©? .. Pourquoi est-ce dans un projet amateur. Ces choses sont tarifĂ©es diffĂ©remment. Aucune mĂ©trique ne vous dira «le systĂšme fonctionne». Que le systĂšme fonctionne ou non, vous ne le comprendrez qu'en pratique. MĂȘme 1% des erreurs peuvent rendre le systĂšme dĂ©sagrĂ©able Ă utiliser. Il se trouve que je suis le contraire. Comme 20% d'erreurs, mais le systĂšme est configurĂ© de maniĂšre Ă ce qu'elles ne soient pas visibles.
De telles choses sont plus faciles à regarder dans la pratique, «fonctionnera ou non». Et ayant déjà compris le critÚre du travail - pour entrer des métriques, si elles sont nécessaires.
ProblĂšmes de version 2
L'implémentation actuelle est qualitativement différente, mais elle pose encore un certain nombre de problÚmes:
- . , :
- - â .
- . . , , . , .
- . ?
?
Je n'ai pas réentraßné la détection des visages. Contrairement à la reconnaissance oculaire, c'est beaucoup plus de travail. Et avec la collecte d'un jeu de données, et avec une formation de qualité.
Bien sĂ»r, vous pouvez le faire sur le visage de votre fils, probablement mĂȘme un peu mieux fonctionnera que le rĂ©seau actuel. Mais pour le reste du peuple, non. Et, peut-ĂȘtre, pour mon fils dans 2 mois - pas non plus.
La collecte d'un ensemble de données normal prend beaucoup de temps.
Du son
Il serait possible de suivre la voie classique de la reconnaissance sonore et d'entraĂźner le neurone. En gĂ©nĂ©ral, ce ne serait pas trĂšs long, au plus plusieurs fois plus long que la reconnaissance oculaire. Mais je ne voulais pas me soucier de la collecte de l'ensemble de donnĂ©es, j'ai donc utilisĂ© un moyen plus simple. Vous pouvez utiliser des outils WebRTC prĂȘts Ă l'emploi . Tout s'avĂšre Ă©lĂ©gant et simple, en quelques lignes.
L'inconvénient que j'ai trouvé est que la qualité de la solution est différente sur différents microphones. Quelque part déclenché avec un grincement, et quelque part seulement avec un grand cri.
Allez-y, quoi d'autre
Ă un moment donnĂ©, j'ai effectuĂ© un test en exĂ©cutant une vidĂ©o de 5 secondes en boucle de moi-mĂȘme avec ma femme: il
était clair que le fils collait aux visages des personnes dans le champ de vision (le moniteur l'a suspendu pendant 30 minutes). Et l'idée est née: contrÎler l'expression du visage. Ce n'est pas seulement une vidéo statique, mais une option d'interaction. Il s'est avéré quelque chose comme ça (quand l'émotion du fils change, la séquence vidéo change):
"Papa, tu baises?!"
Devrait probablement essayer avec un grand moniteur. Mais je ne suis pas encore prĂȘt.
Vous devez peut-ĂȘtre remplacer la vidĂ©o en cours de lecture. Heureusement, c'est simple - la vidĂ©o est lue Ă partir d'images sĂ©parĂ©es, oĂč le changement d'image est ajustĂ© au FPS.
Peut-ĂȘtre que vous devez attendre (au niveau actuel, l'enfant pourrait simplement ne pas comprendre le lien entre ses Ă©motions et l'Ă©cran)
Et alors?
L'une des directions les plus prometteuses, me semble-t-il, est d'essayer de contrĂŽler certains objets physiques / lumiĂšres / moteurs par la direction vue / pose.
Mais jusqu'à présent, je n'ai pas réfléchi profondément à cette question. Pour l'instant, je vais plutÎt tester la gestion des émotions.
à quoi ça ressemble à la fin, description, pensées
Comment tout fonctionne maintenant (il y a une vidéo plus grande au début de l'article):
- Tout contrÎle passe par Telegramm + via la caméra.
- Si vous n'avez pas besoin de contrÎler la vidéo avec des émotions, tout l'appareil ressemble à ceci:
- Il est démarré en mettant sous tension la banque d'alimentation.
- S'il existe un rĂ©seau connectĂ©, l'appareil est dĂ©jĂ prĂȘt Ă fonctionner
- S'il n'y a pas de réseau, vous devez afficher le code QR avec le réseau, le systÚme démarrera automatiquement
- Grùce à Telegramm, vous pouvez sélectionner un ensemble d'événements à surveiller:
- Chaque fois qu'un événement intéressant se produit, une notification est envoyée:
- Ă tout moment, vous pouvez demander une photo Ă l'appareil pour voir ce qui se passe
En gĂ©nĂ©ral, les avis d'un ĂȘtre cher:
- Le détecteur de visage ne fonctionne pas trÚs bien. C'est vraiment une caractéristique de tous les détecteurs qui ne sont pas réglés pour les enfants. Habituellement, cela n'interfÚre pas avec la détection du réveil (au moins quelques photos normales avec les yeux ouverts vont arriver). Il n'est pas prévu de se recycler maintenant.
- Sans écran, un lancement légÚrement opaque (que le code QR ait été lu ou non). Et il y a beaucoup de fils avec l'écran. Je pense que l'option la plus correcte serait de mettre des diodes sur les GPIO. Et allumez-les en fonction de l'état (il y a une connexion, la caméra ne fonctionne pas, Movidius ne fonctionne pas, il n'y a pas de connexion au télégramme, etc.). Mais pas encore fait
- Il est parfois difficile de sĂ©curiser la camĂ©ra. Depuis que j'ai une paire de trĂ©pieds, je peux me dĂ©brouiller d'une maniĂšre ou d'une autre. Et sans eux, peut-ĂȘtre, rien n'aurait fonctionnĂ©.
- Permet vraiment de libĂ©rer du temps et de donner une libertĂ© de mouvement. Est-ce plus qu'un moniteur pour bĂ©bĂ© / moniteur vidĂ©o normal avec streaming? Je ne sais pas. Peut-ĂȘtre un peu plus facile.
- Des trucs sympas pour les expériences.
Comment lancer
Comme je l'ai dit ci-dessus - j'ai essayĂ© de prĂ©senter toutes les sources. Le projet est vaste et ramifiĂ©, alors j'ai peut-ĂȘtre oubliĂ© quelque chose ou n'ai pas donnĂ© d'instructions dĂ©taillĂ©es. N'hĂ©sitez pas Ă demander et Ă clarifier.
Il existe plusieurs façons de tout développer:
- Sors de github. C'est une mĂ©thode plus compliquĂ©e, il faudra beaucoup de temps pour configurer le RPi, peut-ĂȘtre que j'ai oubliĂ© quelque chose. Mais vous avez un contrĂŽle total sur le processus (y compris les paramĂštres RPi).
- Utilisez une image prĂȘte Ă l'emploi. Ici, nous pouvons dire qu'il est sans grĂące et non sĂ©curisĂ©. Mais c'est beaucoup plus facile.
Github
Le référentiel principal se trouve ici - github.com/ZlodeiBaal/BabyFaceAnalizer
Il se compose de deux fichiers que vous devez exécuter:
- Le script d'initialisation / de vérification de l'état / de la configuration du réseau est QRCode.py (pour ce script, rappelez-vous, il y a une description plus détaillée ). Il se connecte au WiFi et vérifie qu'il existe des paramÚtres pour le bot dans Telegram.
- Le script de travail principal est face.py
Outre. il manque deux choses dans Git:
- Fichier d'informations d'identification WiFi - wpa_supplicant_auto.conf
- Fichier avec les informations d'identification Telegram-bot - tg_creedential.txt
Vous pouvez laisser le systÚme les créer automatiquement au prochain démarrage. Vous pouvez utiliser les éléments suivants en remplissant les champs vides:
tg_creedential.txt
token to access the HTTP API â , @BotFather telegram "/newbot"
socks5://⊠â ,
socks5 â ,
socks5 â ,
socks5://⊠â ,
socks5 â ,
socks5 â ,
wpa_supplicant_auto.conf
network={
ssid="******"
psk="*******"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}
ssid="******"
psk="*******"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}
RPi tuning sifflets et faux
Malheureusement, mettre et exécuter des scripts sur RPi ne fonctionnera pas. Voici ce dont vous avez besoin pour un travail stable:
- Installez l_openvino_toolkit_runtime_raspbian_p_2020.1.023.tgz selon les instructions - docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_raspbian.html
- Installer autorun
- Supprimez le message sur le mot de passe par dĂ©faut (peut-ĂȘtre pas nĂ©cessaire, mais cela m'a dĂ©rangĂ©) - sudo apt purge libpam-chksshpwd
- désactiver l'économiseur d'écran - www.raspberrypi.org/forums/viewtopic.php?t=260355
- Pour la détection audio:
- pip3 installer webrtcvad
- sudo apt-get installer python-dev
- sudo apt-get installer portaudio19-dev
- sudo pip3 installer pyaudio
- Téléchargez des modÚles depuis le référentiel OpenVino à l'aide du script «Get_models.py» dans le dossier «Models»
Forme
L'image est postée ici (5 concerts).
Quelques points:
- Le mot de passe de connexion standard est utilisé (pi, framboise)
- AccÚs SSH activé
- Par défaut, le WiFi n'est pas connecté et l'adresse du bot dans le panier que le systÚme utilisera pour la surveillance n'est pas configurée.
Comment configurer le WiFi dans une image
La premiĂšre option consiste Ă afficher le code QR avec le texte aprĂšs le lancement:
WIFI:T:WPA;P:qwerty123456;S:TestNet;;
OĂč aprĂšs P est le mot de passe du rĂ©seau, aprĂšs S est l'identifiant du rĂ©seau.
- Si vous avez un téléphone avec Android 10, un tel code QR est généré automatiquement lorsque vous cliquez sur "partager le réseau"
- Sinon, vous pouvez le générer sur www.the-qrcode-generator.com
La deuxiĂšme option est de SSH dans le RPi (en se connectant sur le fil). Ou allumez le moniteur et le clavier. Et mettre le fichier
wpa_supplicant_auto.conf
network={
ssid="*********"
psk="*******"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}
ssid="*********"
psk="*******"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}
avec vos paramĂštres Wi-Fi dans le dossier "/ home / pi / face_detect".
Comment configurer un robot de télégramme dans une image
La premiĂšre option consiste Ă afficher le code QR avec le texte aprĂšs le lancement:
tg_creedential.txt
token to access the HTTP API â , @BotFather telegram "/newbot"
socks5://⊠â ,
socks5 â ,
socks5 â ,
socks5://⊠â ,
socks5 â ,
socks5 â ,
en le générant via www.the-qrcode-generator.com La
deuxiÚme option est de SSH dans le RPi (connecté par fil). Ou allumez le moniteur et le clavier. Et placez le fichier tg_creedential.txt décrit ci-dessus dans le dossier "/ home / pi / face_detect".
Remarque sur l'enfance
Déjà quand j'ai récupéré la premiÚre version et l'ai montrée à ma mÚre, j'ai reçu une réponse soudaine:
"Oh, et nous avons fait presque la mĂȘme chose dans votre enfance."
"?!"
«Eh bien, ils ont mis la voiture avec vous sur le balcon, ont jetĂ© un microphone Ă travers la fenĂȘtre, qui Ă©tait inclus dans l'amplificateur de l'appartement.
En général, il s'est soudainement avéré que c'était héréditaire.
Remarque sur le conjoint
«Comment votre femme a-t-elle réagi?
«Comment vous a-t-elle laissé expérimenter sur votre fils?!»
Ils ont demandé plus d'une fois.
Mais j'ai bien ruinĂ© ma femme. Ici, elle Ă©crit mĂȘme parfois des articles sur HabrĂ©.
PS1
Je ne suis pas un spĂ©cialiste de la sĂ©curitĂ© de l'information. Bien sĂ»r, j'ai essayĂ© de m'assurer qu'aucun mot de passe ne devait ĂȘtre affichĂ© nulle part, etc., et tout le monde pouvait configurer pour lui-mĂȘme, en indiquant toutes les informations de sĂ©curitĂ© aprĂšs le dĂ©marrage.
Mais je n'exclus pas que j'ai raté quelque chose quelque part. Si vous voyez des erreurs évidentes, je vais essayer de les corriger.
PS2
TrÚs probablement, je parlerai des mises à jour de ce projet dans ma chaßne de télégramme , ou dans le groupe VKontakte . Si j'accumule beaucoup de choses intéressantes, je ferai une autre publication ici.