Gut. Es ist Zeit, ĂĽber ein neues Experiment zu sprechen. Wie er es sammelte, was daraus wurde und wie man es wiederholt.
Ich wurde durch eine Veranstaltung, die in gewisser Weise banal war, zu einem neuen Projekt aufgefordert - ein Sohn wurde geboren. Ich habe mir einen Monat Urlaub im Voraus arrangiert. Aber das Kind stellte sich als ruhig heraus - es gab Freizeit. Und stell den Schlafenden neben ihn.
Viele verschiedene Häusereingebettete Hardware für Computer Vision. Infolgedessen habe ich beschlossen, ein Video-Kindermädchen zu machen. Aber nicht so langweilig wie alle Läden gefüllt sind. Und etwas Klügeres und Interessanteres.
Der Artikel wird in einer narrativen Ader geschrieben, um zu verstehen, wie die Entwicklung des Spielzeugs verlief, wohin es kam und wohin es als nächstes geht.
Der Artikel enthält mehrere Ergänzungen:
- Video, in dem ich zeige und erzähle, wie alles funktioniert.
- Ein kleiner Artikel über VC, in dem ich Ihnen erkläre, warum solche Dinge höchstwahrscheinlich nicht zur normalen Produktion führen werden, und über die Einschränkungen solcher ML-Systeme.
- Alle Arten auf Github + fertiges Bild fĂĽr RPi Am Ende des Artikels finden Sie eine Beschreibung der Verwendung.
Eine Idee auswählen
Die gebräuchlichste Funktion eines Babyphone ist es, jederzeit zu sehen, was mit dem Kind passiert. Dies funktioniert leider nicht immer. Sie werden die Sendung nicht die ganze Zeit sehen, es ist nicht bequem. Das Baby kann in der Regel in einem Kokon in der Nähe eingeschläfert werden. Warum die ganze Zeit Videos? Infolgedessen wurde zunächst die folgende Sammlung zusammengestellt:
- Das System sollte es ermöglichen, jederzeit ein Video oder Foto vom Telefon aus anzusehen
- Das System sollte auf das Aufwachen des Kindes reagieren und darĂĽber benachrichtigen
- Das System muss ein fehlendes Gesicht erkennen, um SIDS zu verhindern
Plattformauswahl
Ich hatte einen langen Artikel über Habré über den Vergleich verschiedener Plattformen. Für einen Prototyp wie den, den ich mache, gibt es weltweit mehrere Möglichkeiten:
- Jetson Nano. + ( Nano), , . . — TensorRT. . , , , TensorRT .
- VIM3. , . — .
- Raspberry PI + Movidius. . , , .
- , .
- . .
- Raspberry PI 4 - Wenn Sie mit OpenCV arbeiten, sollten Sie offene Netzwerke entsorgen, was ausreichen sollte. Es bestand jedoch der Verdacht, dass nicht genĂĽgend Leistung erbracht wird.
- Coral - Ich habe es in meinen Händen, es würde in Bezug auf die Leistung vergehen, aber mein anderer Artikel sagt, warum ich es nicht mag :)
Also habe ich Rpi + movidius gewählt. Ich habe es zur Hand, ich kann damit arbeiten.
Eisen
Der Computer ist Raspberry Pi 3B, der Neuroprozessor ist Movidius Myriad X. Dies ist klar.
Der Rest - am Boden des Fasses abgekratzt, zusätzlich gekauft.
Kamera
Ich habe drei verschiedene ĂĽberprĂĽft, die ich hatte:
- Kamera von RaspberryPI. Lautes, unbequemes Kabel, keine bequeme Befestigung. Erzielt.
- Eine Art IP-Kamera. Sehr praktisch, da es nicht im RPI enthalten sein muss. Die Kamera ist vom Computer getrennt. Meine Zelle hatte sogar zwei Modi, Tag und Nacht. Aber der, den ich hatte, gab keine ausreichende Qualität des Gesichts.
- Webcam von Genius. Ich benutze es bereits seit ungefähr 5 Jahren. Aber in letzter Zeit ist etwas instabil geworden. Aber für RPI genau richtig. Darüber hinaus stellte sich heraus, dass es trivial zerlegt und der IR-Filter von dort entfernt werden kann. Wie sich später herausstellte, war dies die einzige Option mit einem Mikrofon.
Und der Filter ändert sich folgendermaßen:
Im Allgemeinen ist klar, dass dies keine Produktlösung ist. Aber es funktioniert.
Wenn überhaupt, sehen Sie im Code die verbleibenden Teile für den Wechsel zu den beiden anderen Kameratypen. Vielleicht funktioniert sogar etwas sofort, wenn Sie 1-2 Parameter ändern.
Beleuchtung
Ich hatte einen Illuminator mit einem der alten Rätsel herumliegen.
Ich habe eine Art Netzteil darauf gelötet. Es scheint gut.
Richten Sie es auf die Decke - der Raum ist beleuchtet.
Bildschirm
Für einige Betriebsarten brauchte ich einen Monitor. Hielt an diesem . Obwohl ich nicht sicher bin, ob dies die richtige Entscheidung ist. Vielleicht hätte ich die in voller Länge nehmen sollen. Aber dazu später mehr.
Ernährung
Das Kind schläft an beliebigen Orten. So ist es einfacher, wenn das System von einer Power Bank gespeist wird. Ich habe mich dafür entschieden, einfach weil es zum Wandern zu Hause ist:
OpenVino
Lassen Sie uns ein wenig durch OpenVino gehen. Wie ich oben sagte, ist der groĂźe Vorteil von OpenVino die groĂźe Anzahl vorgefertigter Netzwerke. Was kann fĂĽr uns nĂĽtzlich sein.
Gesichtserkennung. Es gibt viele solcher Netzwerke in OpenVino:
Erkennen von SchlĂĽsselpunkten im Gesicht . Wir brauchen dies, um die folgenden
Gesichtsorientierungsnetzwerke zu starten . Aktivität des Kindes und wohin es schaut.
Augenrichtungserkennung - wenn Sie versuchen, die
Tiefenanalyse zu interagieren ? Vielleicht wird es sich herausstellen
Skeleton Analyse
Nun viele andere interessante diejenigen , ...,
Der Hauptnachteil dieser Netze werden ihre Hauptvorteil sein - ihre Pre-Training ...
Dies korrigiert werden kann, aber jetzt machen wir einen schnellen Prototyp, ist unser Ziel , in 100% der Fälle nicht Arbeit, sondern grundlegende Arbeit , die zumindest bringen einige profitieren.
Gehen. Allgemeine Logikversion 1
Da wir ein eingebettetes Gerät entwickeln, müssen wir irgendwie damit interagieren. Empfangen Sie Foto- / Alarmsignale. Also beschloss ich , die gleiche wie zu tun ist, wenn ich das tat Trog , über Telegramme. Aber denken Sie daran.
FĂĽr die erste Version habe ich mich entschieden:
- Starten Sie die angegebenen Netzwerke auf RPi (ich möchte alles auf einmal, plötzlich wird die Leistung erlauben). Auf diese Weise sehen Sie mehr Optionen zur Lösung des Problems / der wahrscheinlichen Entwicklungsmethoden
- Schreiben Sie eine allgemeine Programmvorlage.
- Ăśberlegen Sie sich einen Algorithmus, der das Aufwachen erkennt.
- Erstellen Sie einen Algorithmus, der eine Benachrichtigung ĂĽber Gesichtsverlust sendet
Alles lief mehr oder weniger gut, bis auf ein paar Fehler. Dies ist ComputerVision inhärent ... Ich bin daran gewöhnt.
Hier ist eine kurze Zusammenfassung dessen, was mir begegnet ist:
- 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…
Aber so geht's ... Ich bin mir sicher, dass es wie immer mehr Probleme geben wĂĽrde, wenn ich TensorRT durchlaufen wĂĽrde.
Damit. Alles wird zusammengefĂĽhrt, die Netzwerke laufen, wir bekommen so etwas (indem wir den Stapel ĂĽber den Kopf laufen lassen, Orientierung, wichtige Punkte):
Es ist zu sehen, dass das Gesicht oft verloren geht, wenn das Kind es mit den Händen bedeckt / den Kopf dreht. und nicht alle Indikatoren sind stabil.
Was weiter? Wie kann man das Einschlafen analysieren?
Ich schaue mir diese Gitter an, und das erste, was mir in den Sinn kommt, ist, Emotionen zu erkennen. Wenn das Kind schläft und ruhig ist, hat es einen neutralen Ausdruck im Gesicht. Aber so einfach ist das nicht. Hier ist eine dunkelblaue Grafik, dies ist ein neutraler Ausdruck eines schlafenden Kindes für eine Stunde:
Der Rest der Grafiken ist traurig / wütend / Freude / Überraschung. Nicht einmal wirklich die Essenz dessen, was wo in Farben ist. Leider sind die Netzwerkdaten instabil, was wir sehen. Instabilität tritt auf, wenn:
- Übermäßiger Schatten im Gesicht (was nachts nicht ungewöhnlich ist)
- Die Gesichter des Kindes befanden sich nicht im OpenVino-Trainingssatz => willkĂĽrliches Umschalten auf andere Emotionen
- Das Kind macht tatsächlich Gesichter, auch in einem Traum
Insgesamt war ich nicht überrascht. Ich bin schon früher auf Netzwerke gestoßen, die Emotionen erkennen, und sie sind immer instabil, auch aufgrund der Instabilität des Übergangs zwischen Emotionen - es gibt keine klare Grenze.
Ok, das Aufwachen kann nicht mit Hilfe von Emotionen erkannt werden. Bisher wollte ich selbst nichts unterrichten, deshalb habe ich mich entschlossen, es auf der Grundlage derselben Netzwerke zu versuchen, aber auf der anderen Seite. Eines der Netze gibt den Kopfdrehwinkel an. Dies ist bereits besser (Gesamtabweichung vom zeitlichen Blick auf die Kamera in Grad). Letzte 5-10 Minuten vor dem Aufwachen:
Besser. Aber ... Der Sohn kann im Schlaf mit dem Kopf winken. Oder umgekehrt, wenn Sie eine groĂźe Schwelle festlegen - wachen Sie auf und winken Sie danach nicht mehr mit dem Kopf. Um jedes Mal eine Benachrichtigung zu erhalten ... Leider:
(es gibt ungefähr eine Stunde Schlafzeit)
Wir mĂĽssen also noch eine normale Erkennung durchfĂĽhren.
In Version 1 aufgetretene Probleme
Fassen wir alles zusammen, was mir in der ersten Version nicht gefallen hat.
- Auto-Start. Es ist nicht bequem, dieses Spielzeug jedes Mal neu zu starten, eine Verbindung ĂĽber SSH herzustellen und das Ăśberwachungsskript auszufĂĽhren. In diesem Fall muss das Skript:
- ĂśberprĂĽfen Sie den Status der Kamera. Es kommt vor, dass die Kamera ausgeschaltet / nicht angeschlossen ist. Das System muss warten, bis der Benutzer die Kamera einschaltet.
- ĂśberprĂĽfen des Status des Gaspedals. Das gleiche wie bei der Kamera.
- Überprüfen des Netzwerks. Ich möchte das Ding sowohl zu Hause als auch auf dem Land benutzen. Oder vielleicht woanders. Und wieder möchte ich mich nicht über ssh anmelden => Ich muss einen Algorithmus für die Verbindung mit WiFi erstellen, wenn kein Internet vorhanden ist.
- Aufwachen, Netzwerktraining. Einfache Ansätze sind nicht eingetreten, was bedeutet, dass das Neuron trainiert werden muss, um offene Augen zu erkennen.
Auto-Start
Im Allgemeinen ist das Autorun-Schema wie folgt:
- Ich starte mein Programm zu Beginn. Wie ich es mache - Ich habe einen separaten Artikel geschrieben, um nicht zu sagen, dass es trivial ist, es auf RPi zu machen. Zusamenfassend:
- OpenVino
- , —
- Movidius-
-
- — QR- wifi
- telegram . — QR-
Hahaha. Das Netzwerk ist bereits erschienen. Aber wie sich herausstellte, wurde es erst gestartet, nachdem ich mit der Entwicklung begonnen hatte. Und in der Veröffentlichung und Dokumentation erschien es bereits, als ich mehr oder weniger alles tat. Jetzt schrieb ich einen Artikel und fand ein Update .
Aber ich werde es nicht wiederholen, also schreibe ich so wie ich es getan habe.
Es ist sehr einfach, ein solches Netzwerk zu trainieren. Oben habe ich gesagt, dass ich die Auswahl der Augen nach Rahmen verwendet habe. Es ist nichts mehr ĂĽbrig: Speichern Sie alle Augen, die im Rahmen getroffen wurden. Es stellt sich ein solcher Datensatz heraus:
Es bleibt zu markieren und zu trainieren. Ich beschreiben den Markierungsprozess näher hier (und ein Video des Prozesses für 10 Minuten hier). Toloka wurde zum Markieren verwendet. Das Einrichten der Aufgabe dauerte ca. 2 Stunden, das Markup + 300 Rubel des Budgets 5 Minuten.
Beim Lernen wollte ich nicht zu viel nachdenken, deshalb habe ich ein bewusst schnelles Netzwerk verwendet, das von ausreichender Qualität ist, um das Problem zu lösen - mobiletv2. Der gesamte Code, einschließlich des Ladens des Datensatzes, des Initialisierens und Speicherns, dauerte weniger als 100 Zeilen (meistens aus offenen Quellen, ein paar Dutzend Zeilen neu geschrieben):
Versteckter Text
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')
Und noch ein paar Zeilen, um das Modell in ONNX zu speichern:
Versteckter Text
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)
Das Speichern des Modells in ONNX ist erforderlich, um das Modell in Open Vino weiter aufzurufen. Ich habe mich nicht um die Konvertierung in int8 gekĂĽmmert, sondern das Modell im 32-Bit-Format belassen.
Analyse der Genauigkeit, Qualitätsmetriken? .. Warum ist es in einem Amateurprojekt. Solche Dinge sind unterschiedlich teuer. Keine Metrik sagt Ihnen, dass das System funktioniert. Ob das System funktioniert oder nicht, werden Sie nur in der Praxis verstehen. Selbst 1% der Fehler können die Verwendung des Systems unangenehm machen. Ich bin zufällig das Gegenteil. Wie 20% Fehler, aber das System ist so konfiguriert, dass sie nicht sichtbar sind.
Solche Dinge sind in der Praxis leichter zu betrachten, "werden funktionieren oder nicht". Und das Kriterium der Arbeit bereits verstanden - Metriken eingeben, wenn sie benötigt werden.
Probleme mit Version 2
Die derzeitige Implementierung ist qualitativ unterschiedlich, weist jedoch noch eine Reihe von Problemen auf:
- . , :
- - â…“ .
- . . , , . , .
- . ?
?
Ich habe die Gesichtserkennung nicht neu trainiert. Im Gegensatz zur Augenerkennung ist dies viel mehr Arbeit. Und mit der Sammlung eines Datensatzes und mit qualitativ hochwertigem Training.
Natürlich können Sie es auf dem Gesicht Ihres Sohnes tun, wahrscheinlich funktioniert sogar ein bisschen besser als das aktuelle Netzwerk. Aber für den Rest der Leute nein. Und vielleicht für meinen Sohn in 2 Monaten - auch nicht.
Das Sammeln eines normalen Datensatzes dauert lange.
Klang
Es wäre möglich, dem klassischen Weg der Schallerkennung zu folgen und das Neuron zu trainieren. Im Allgemeinen wäre es nicht sehr lang, höchstens um ein Vielfaches länger als die Augenerkennung. Aber ich wollte nicht mit dem Sammeln des Datensatzes herumspielen, also habe ich einen einfacheren Weg gewählt. Sie können vorgefertigte WebRTC- Tools verwenden . Alles stellt sich in ein paar Zeilen als elegant und einfach heraus.
Der Nachteil, den ich festgestellt habe, ist, dass die Qualität der Lösung bei verschiedenen Mikrofonen unterschiedlich ist. Irgendwo mit einem Quietschen ausgelöst und irgendwo nur mit einem lauten Schrei.
Mach weiter, was noch
Irgendwann fĂĽhrte ich einen Test durch, indem ich mit meiner Frau ein 5-Sekunden-Video von mir drehte: Es
war klar, dass der Sohn an den Gesichtern von Menschen im Sichtfeld klebte (der Monitor hängte ihn 30 Minuten lang auf). Und die Idee war geboren: die Kontrolle des Gesichtsausdrucks. Dies ist nicht nur ein statisches Video, sondern eine Interaktionsoption. Es stellte sich so etwas heraus (wenn sich die Emotionen des Sohnes ändern, wechselt die Videosequenz):
"Dad, fickst du verdammt noch mal ?!"
Sollte es wohl mit einem groĂźen Monitor versuchen. Aber ich bin noch nicht fertig.
Möglicherweise müssen Sie das abgespielte Video ersetzen. Glücklicherweise ist es einfach - das Video wird aus separaten Bildern abgespielt, wobei der Bildwechsel an die FPS angepasst wird.
Vielleicht müssen Sie warten (auf der aktuellen Ebene versteht das Kind möglicherweise einfach nicht den Zusammenhang zwischen seinen Emotionen und dem Bildschirm).
Und dann?
Eine der vielversprechendsten Richtungen scheint mir zu sein, zu versuchen, einige physische Objekte / Lichter / Motoren durch die Blickrichtung / Pose zu steuern.
Aber bisher habe ich nicht tief ĂĽber dieses Thema nachgedacht. Vielmehr werde ich vorerst das Emotionsmanagement testen.
Wie es am Ende aussieht, Beschreibung, Gedanken
Wie alles jetzt funktioniert (es gibt ein größeres Video am Anfang des Artikels):
- Die gesamte Steuerung erfolgt ĂĽber Telegramm + ĂĽber die Kamera.
- Wenn Sie das Video nicht mit Emotionen steuern müssen, sieht das gesamte Gerät folgendermaßen aus:
- Es wird durch Einschalten der Power Bank gestartet.
- Wenn ein Netzwerk verbunden ist, ist das Gerät bereits betriebsbereit
- Wenn kein Netzwerk vorhanden ist, mĂĽssen Sie den QR-Code mit dem Netzwerk anzeigen. Das System wird automatisch gestartet
- Über Telegramm können Sie eine Reihe von Ereignissen auswählen, die überwacht werden sollen:
- Jedes Mal, wenn ein interessantes Ereignis eintritt, wird eine Benachrichtigung gesendet:
- Sie können jederzeit ein Foto vom Gerät anfordern, um zu sehen, was gerade passiert
Im Allgemeinen Bewertungen von einem geliebten Menschen:
- Der Gesichtsdetektor funktioniert nicht sehr gut. Dies ist wirklich eine Funktion von Detektoren, die nicht auf Kinder abgestimmt sind. Normalerweise beeinträchtigt dies nicht die Weckerkennung (mindestens ein paar normale Fotos mit offenen Augen werden kommen). Eine Umschulung ist derzeit nicht geplant.
- Ohne Bildschirm ein leicht undurchsichtiger Start (unabhängig davon, ob der QR-Code gelesen wurde oder nicht). Und es gibt viele Kabel mit dem Bildschirm. Ich denke, die richtigste Option wäre, Dioden auf den GPIO zu setzen. Und zünden Sie sie je nach Status an (es besteht eine Verbindung, die Kamera funktioniert nicht, Movidius funktioniert nicht, es besteht keine Verbindung zum Telegramm usw.). Aber noch nicht fertig
- Es ist manchmal schwierig, die Kamera zu sichern. Da ich ein Paar Stative habe, kann ich es irgendwie schaffen. Und ohne sie hätte vielleicht nichts funktioniert.
- Ermöglicht es Ihnen wirklich, etwas Zeit freizugeben und Bewegungsfreiheit zu geben. Ist es mehr als ein normaler Babyphone / Videomonitor mit Streaming? Weiß nicht. Vielleicht etwas einfacher.
- Cooles Zeug zum Experimentieren.
So starten Sie
Wie ich oben sagte - ich habe versucht, alle Quellen darzulegen. Das Projekt ist groß und verzweigt, also habe ich vielleicht etwas vergessen oder keine detaillierten Anweisungen gegeben. Fühlen Sie sich frei zu fragen und zu klären.
Es gibt verschiedene Möglichkeiten, alles zu erweitern:
- Sors von Github. Dies ist eine kompliziertere Methode. Die Konfiguration des RPi wird lange dauern. Vielleicht habe ich etwas vergessen. Sie haben jedoch die vollständige Kontrolle über den Prozess (einschließlich der RPi-Einstellungen).
- Verwenden Sie ein fertiges Bild. Hier können wir sagen, dass es graziless und unsicher ist. Aber es ist viel einfacher.
Github
Das Haupt-Repository befindet sich hier - github.com/ZlodeiBaal/BabyFaceAnalizer
Es besteht aus zwei Dateien, die Sie ausfĂĽhren mĂĽssen:
- Das Skript zum Initialisieren / ĂśberprĂĽfen des Status / der Einstellung des Netzwerks lautet QRCode.py (fĂĽr dieses Skript gibt es eine detailliertere Beschreibung ). Er verbindet WiFi und prĂĽft, ob Einstellungen fĂĽr den Bot in Telegram vorhanden sind.
- Das Hauptarbeitsskript ist face.py
AuĂźerdem. In Git fehlen zwei Dinge:
- WiFi-Anmeldeinformationsdatei - wpa_supplicant_auto.conf
- Datei mit Telegramm-Bot-Anmeldeinformationen - tg_creedential.txt
Sie können sie beim nächsten Start automatisch vom System erstellen lassen. Sie können Folgendes verwenden, indem Sie die leeren Felder ausfüllen:
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 pfeift und fälscht
Leider funktioniert es nicht, nur Skripte auf RPi zu setzen und auszuführen. Folgendes benötigen Sie noch für eine stabile Arbeit:
- Installieren Sie l_openvino_toolkit_runtime_raspbian_p_2020.1.023.tgz gemäß den Anweisungen - docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_raspbian.html
- Installieren Sie den Autorun
- Löschen Sie die Nachricht über das Standardkennwort (möglicherweise nicht erforderlich, aber es hat mich gestört) - sudo apt purge libpam-chksshpwd
- Schalten Sie den Bildschirmschoner aus - www.raspberrypi.org/forums/viewtopic.php?t=260355
- Zur Audioerkennung:
- pip3 installiere webrtcvad
- sudo apt-get install python-dev
- sudo apt-get install portaudio19-dev
- sudo pip3 installiere pyaudio
- Laden Sie Modelle aus dem OpenVino-Repository mit dem Skript "Get_models.py" im Ordner "Models" herunter
Bilden
Das Bild ist hier gepostet (5 Gigs).
Ein paar Punkte:
- Das Standard-Login-Passwort wird verwendet (pi, himbeere)
- SSH-Zugriff aktiviert
- Standardmäßig ist kein WLAN verbunden und die Adresse des Bots im Einkaufswagen, den das System zur Überwachung verwendet, ist nicht konfiguriert.
So richten Sie WLAN in einem Bild ein
Die erste Möglichkeit besteht darin, den QR-Code nach dem Start mit dem Text anzuzeigen:
WIFI:T:WPA;P:qwerty123456;S:TestNet;;
Wobei nach P das Netzwerkkennwort ist, nach S die Netzwerkkennung.
- Wenn Sie ein Telefon mit Android 10 haben, wird ein solcher QR-Code automatisch generiert, wenn Sie auf "Netzwerk freigeben" klicken.
- Wenn nicht, können Sie es unter www.the-qrcode-generator.com generieren
Die zweite Option ist SSH in das RPi (durch Verbinden ĂĽber das Kabel). Oder schalten Sie den Monitor und die Tastatur ein. Und legen Sie die Datei
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
}
mit Ihren Wi-Fi-Einstellungen in den Ordner "/ home / pi / face_detect".
So richten Sie einen Telegrammbot in einem Bild ein
Die erste Möglichkeit besteht darin, den QR-Code nach dem Start mit dem Text anzuzeigen:
tg_creedential.txt
token to access the HTTP API — , @BotFather telegram "/newbot"
socks5://… — ,
socks5 — ,
socks5 — ,
socks5://… — ,
socks5 — ,
socks5 — ,
durch Generieren ĂĽber www.the-qrcode-generator.com Die
zweite Option ist SSH in das RPi (ĂĽber Kabel verbunden). Oder schalten Sie den Monitor und die Tastatur ein. Und legen Sie die oben beschriebene Datei tg_creedential.txt im Ordner "/ home / pi / face_detect" ab.
Bemerkung zur Kindheit
Bereits als ich die erste Version sammelte und meiner Mutter zeigte, erhielt ich plötzlich die Antwort:
„Oh, und wir haben in Ihrer Kindheit fast dasselbe getan.“
"?!"
"Nun, sie haben den Kinderwagen mit dir auf den Balkon gestellt und ein Mikrofon durch das Fenster geworfen, das im Verstärker in der Wohnung enthalten war."
Im Allgemeinen stellte sich plötzlich heraus, dass es erblich ist.
Bemerkung zum Ehepartner
"Wie hat deine Frau reagiert?"
"Wie hat sie dich an deinem Sohn experimentieren lassen ?!"
Sie fragten mehr als einmal.
Aber ich habe meine Frau gut ruiniert. Hier schreibt sie manchmal sogar Artikel über Habré.
PS1
Ich bin kein Spezialist für Informationssicherheit. Natürlich habe ich versucht sicherzustellen, dass nirgendwo Passwörter usw. angezeigt werden und dass jeder für sich selbst konfigurieren kann, wobei alle Sicherheitsinformationen nach dem Start angegeben werden.
Aber ich schlieĂźe nicht aus, dass ich irgendwo etwas verpasst habe. Wenn Sie offensichtliche Fehler sehen, werde ich versuchen, diese zu beheben.
PS2
Höchstwahrscheinlich werde ich in meinem Telegrammkanal oder in der VKontakte- Gruppe über Updates für dieses Projekt sprechen . Wenn ich viele interessante Dinge sammle, werde ich hier eine weitere Veröffentlichung machen.