https://d226lax1qjow5r.cloudfront.net/blog/blogposts/real-time-human-detection-with-opencv-and-vonage-sms-api-dr/Blog_Human-Detection_1200x600.png

Menschliche Erkennung in Echtzeit mit OpenCV

Zuletzt aktualisiert am April 15, 2020

Lesedauer: 4 Minuten

In diesem Blogbeitrag wird gezeigt, wie Sie Ihre eigene "intelligente" Videokamera bauen können. Er zeigt, wie man ein Bild aus dem Rahmen einer Webkamera aufnimmt, erkennt, ob sich ein Mensch im Rahmen befindet, und eine SMS über die Kommunikations-APIs von Vonage verschickt, um Sie über potenzielle Bedrohungen zu informieren.

Einführung

Diese Idee kam mir, nachdem in das Haus meiner Eltern eingebrochen worden war. Sie leben an einem abgelegenen Ort ohne Überwachungskameras, und die Polizei konnte den Täter nie ermitteln. Daraufhin beschlossen meine Eltern, das Haus mit einer Sicherheitsausrüstung auszustatten. Da ich zu dieser Zeit Studentin war, beschloss ich, meine Fähigkeiten einzusetzen, um ein Sicherheitssystem für sie zu bauen.

Sie können sich gerne mit mir in Verbindung setzen, denn ich habe dies vollständig zu einem einen funktionierenden Prototyp der von meiner Familie genutzt wird!

Hardware-Anforderungen

Sie benötigen einen Raspberry Pi (ich habe einen Raspberry Pi 2), a Raspberry Pi-Kameraund eine "Dummy"-Überwachungskamera.

Voraussetzungen

Um dieses Projekt zu bauen, benötigen Sie neben der Hardware die folgenden Dinge:

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

Der Objekterkennungsalgorithmus

In diesem Lehrgang werden wir den Haar-Klassifikator verwenden. Dabei handelt es sich um eine wirksame Methode zur Objekterkennung, die von Paul Viola und Michael Jones in ihrer 2001 veröffentlichten Arbeit "Rapid Object Detection using a Boosted Cascade of Simple Features" entwickelt wurde.

Zunächst benötigt der Algorithmus eine große Anzahl positiver Bilder (in unserem Fall Bilder verschiedener Personen) und negativer Bilder (Bilder, auf denen kein Mensch zu sehen ist), um den Klassifikator zu trainieren.

Von dort aus müssen wir dem Klassifikator bestimmte Merkmale entlocken. Jedes Merkmal ist ein einzelner Wert, der durch Subtraktion der Summe der Pixel unter dem weißen Rechteck von der Summe der Pixel unter dem schwarzen Dreieck ermittelt wird.

Lesen Sie mehr über den Cascade Classifier und den Algorithmus, der dahinter steckt, in diesem OpenCV: Kaskaden-Klassifikator Artikel.

Umsetzung

Erstellen Sie auf Ihrem Raspberry Pi eine neue Python-Datei und importieren Sie alle benötigten Bibliotheken mit den folgenden import-Anweisungen:

import cv2
import nexmo
import time

Diese Bibliotheken werden verwendet, um Personen zu erkennen, den Nutzern die erkannten Personen mitzuteilen und die Zeitdifferenz zwischen gesendeten Texten zu berechnen.

Danach müssen wir damit beginnen, das Videomaterial von Ihrer verfügbaren Kamera zu erfassen:

video_captured = cv2.VideoCapture(0)

Die Angabe von 0 im obigen Parameter bedeutet, dass wir die erste verfügbare Videokamera verwenden - normalerweise ist nur eine verfügbar, aber wenn Sie eine externe Kamera angeschlossen haben, können Sie angeben, welcher Stream verwendet werden soll, indem Sie den entsprechenden Parameter an VideoCapture übergeben.

Lassen Sie uns nun den Vonage API SMS-Client initialisieren. Hierfür benötigen Sie Ihren API-Schlüssel und Ihr Geheimnis, die Sie im Dashboard des von Ihnen erstellten Vonage API Accounts finden:

client_nexmo = nexmo.Client(key=’your_project_key’, secret=’your_secret_key’)

Danach laden wir den bereits trainierten Klassifikator. Der in diesem Tutorial verwendete Klassifikator kann über den folgenden Link aufgerufen werden Link folgen und den Klassifikator auswählen, den Sie in Ihrem Projekt verwenden möchten.

Wir werden den haarcascade_fullbody.xml Klassifikator.

Zu Testzwecken und um es einfacher zu machen, richtige Screenshots einzufügen, habe ich den haarcascade_frontalface_default.xml Klassifikator in meinem Beispiel-Repositoriumverwendet, aber der haarcascade_fullbody.xml Klassifikator ist für den Anwendungsfall der Überwachungskamera am besten geeignet.

classifier = cv2.CascadeClassifier('haarcascade/haarcascade_fullbody.xml')

Der größte Teil der Erkennung findet in dem folgenden Code-Stück statt:

while (True):
    # read frame-by-frame
    ret, frame = video_captured.read()

    # set the frame to gray as we do not need color, save up the resources
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # pass the frame to the classifier
    persons_detected = classifier.detectMultiScale(gray_frame, 1.3, 5)

    # check if people were detected on the frame
try:
        human_count = persons_detected.shape[0]
else:
        human_count = 0
    
    # extract boxes so we can visualize things better
    # for actual deployment with hardware, not needed
    for (x, y, w, h) in persons_detected:
        cv2.rectangle(frame, (x,y), (x+w, y+h), (255, 0, 0), 2)    
    cv2.imshow('Video footage', frame)

    if (cv2.waitKey(1) & 0xFF == ord('q')):
        break

Wir lesen jedes Bild aus unserem aufgenommenen Video-Stream. Es ist auch eine gute Idee, es in Grau zu konvertieren, um Ressourcen zu sparen. Danach übergeben wir das Bild an den Klassifikator, um zu sehen, ob eine Person erkannt wurde. Ist dies der Fall, wird auf dem Bild ein Rechteck um die erkannte Person gezeichnet.

Unten sehen Sie ein Beispiel, wie mein Gesicht erkannt wird:

Example below of my face being detectedExample below of my face being detected

Wenn Sie einen anderen Klassifikator laden, z. B. upperbody.xml oder fullbody.xml, können Sie denselben Code für die Erkennung verwenden.

Bitte beachten Sie, dass der Ganzkörperklassifikator die Person auf dem Bild nur erkennt, wenn der gesamte Körper im Bild ist. Nur das Gesicht und/oder der Oberkörper würden nicht funktionieren. Dasselbe gilt für den Oberkörper-Klassifikator - nur das Gesicht im Bild zu haben, würde nicht zu einer erfolgreichen Erkennung führen.

Dies liegt an einer Einschränkung in den von OpenCV bereitgestellten Klassifikatoren. Sie können jederzeit versuchen, Ihre eigenen Klassifikatoren zu trainieren; das kann zusätzliche Zeit und Ressourcen in Anspruch nehmen, aber es ist eine gute Möglichkeit, auf diesem Projekt aufzubauen, wenn Sie mehr über diese Seite der Dinge lernen möchten.

Fügen wir nun die SMS API-Funktionen von Vonage in unsere Anwendung ein, damit der Benutzer benachrichtigt werden kann, wenn ein Fremder auf seinem Videobild erkannt wird.

Hinweis: Es ist wichtig, dies zu verzögern (vor allem beim Testen), damit der Benutzer nicht zu viele SMS-Nachrichten für ein Erkennungsereignis erhält.

In unserem Beispiel werden wir eine time.sleep(number of seconds) Methode verwenden; Sie können jedoch auch Ihre eigene, ausgefeiltere Methode entwickeln, wenn Sie eine haben.

Fügen Sie den folgenden Code nach dem try/else-Block in den Code ein:

if (human_count > 0):
        client_nexmo.send_message({
            'from': ‘your_outbound_phone_number’,
                'to': ‘your_inbound_phone_number’,
                'text': 'There has been ' + str(human_count) + ' human(s) detected!',
        })

Die SMS wird nur verschickt, wenn mindestens ein Mensch im Bild erkannt wird. Um sicherzustellen, dass nicht zu viele Nachrichten verschickt werden, wird der Thread für etwa fünf Sekunden in den Ruhezustand versetzt und danach nach der Person im Bild gesucht.

Das war's! In nur 50 Zeilen Code sind Sie in der Lage, Schnüffler auf Ihrem Grundstück zu erkennen und sich über die Vonage SMS API benachrichtigen zu lassen, wenn dies geschieht.

Der Quellcode zu diesem Beitrag kann unter folgendem Link gefunden werden GitHub-Link. Ich habe auch die in diesem Projekt verwendeten Haar-Cascade-Klassifikatoren hinzugefügt, damit Sie schnell loslegen können.

Mögliche Verbesserungen

Natürlich kann noch mehr getan werden, um dieses Projekt noch anspruchsvoller und effizienter zu gestalten.

Erstens bedeutet die time.sleep() Methode bedeutet, dass zwischen den Bildanalysen mindestens fünf Sekunden liegen, was nicht ideal ist und verbessert werden könnte. Es wäre auch eine gute Idee, das Videobild, das Sie von der Kamera erhalten, auf einen bestimmten Erkennungsbereich zu beschneiden, um die Effizienz der Erkennung zu verbessern - weniger zu prüfende Pixel bedeuten schnellere Erkennungen.

Referenzen

https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html https://github.com/opencv/opencv/tree/master/data/haarcascades

Teilen Sie:

https://a.storyblok.com/f/270183/364x364/50552ba95c/misha-behei.png
Misha BeheiIngenieur für Kundenlösungen

Misha ist ein Ingenieur für Kundenlösungen bei Vonage, wo er sich auf die Entwicklung der Video API konzentriert. Nachdem er den Trubel von San Francisco gegen den Charme von Milwaukee, Wisconsin, eingetauscht hat, verbringt er nun seine Freizeit damit, die versteckten Schätze des Mittleren Westens zu entdecken.