Wie der Computer sieht





Haben Sie sich jemals gefragt, wie der Computer die für die Verarbeitung benötigten Objekte aus dem Videostream findet? Auf den ersten Blick sieht es aus wie eine "hohe" Programmieraufgabe, die eine Vielzahl von Formeln aus mathematischer Analyse, diskreter Mathematik usw. verwendet. Sie erfordert eine große Menge an Wissen, um mindestens ein kleines Programm wie "Hallo Welt" in der Erkennungswelt zu schreiben Bilder auf dem Video. Und wenn Ihnen gesagt wurde, dass es jetzt viel einfacher ist, in die Welt des Computer Vision einzutreten, und nachdem Sie diesen Artikel gelesen haben, können Sie Ihr eigenes Programm schreiben, das Ihrem Computer das Sehen und Erkennen von Gesichtern beibringt? Außerdem finden Sie am Ende des Artikels einen Bonus, der die Sicherheit Ihres PCs mithilfe von Computer Vision erhöhen kann.



Damit Ihr Computer versteht, dass Sie ihm etwas zeigen, das wie ein Gesicht aussieht, benötigen wir:



  1. Computer;
  2. Web-Kamera;
  3. Python 3;
  4. Ihr Lieblingscode-Editor (PyCharm, Jupyter usw.).


Nachdem Sie alles, was Sie brauchen, aus der obigen Liste zusammengestellt haben, können wir mit dem direkten Schreiben unseres Programms zur Gesichtserkennung fortfahren.



Laden Sie zunächst die erforderlichen Python-Bibliotheken mit dem Befehl in der Befehlszeile herunter:



pip install opencv-python; numpy






Kurz darüber, warum wir sie brauchen:



OpenCV. Diese Bibliothek ist das Rückgrat fast aller modernen Computer-Vision-Projekte. Es enthält Hunderte von Computer Vision- und Bildverarbeitungsalgorithmen. Es wurde ursprünglich in C / C ++ geschrieben, aber später wurde es aufgrund seiner großen Nachfrage in dieser Sprache auch in Python neu geschrieben.



Numpy. Hilft bei internen Berechnungen der OpenCV-Bibliothek.



Öffnen Sie nach Abschluss der Installation der benötigten Bibliotheken unseren bevorzugten Code-Editor und schreiben Sie unser Programm:



Fügen Sie die OpenCV-Computer-Vision-Bibliothek hinzu



import cv2 as cv


2. Wir erfassen einen Videostream von einer Webkamera mithilfe der VideoCapture-Methode (Index), wobei index die Seriennummer unserer Webkamera im System ist. Wenn nur eine Kamera vorhanden ist, ist der Parameter gleich 0.



capture = cv.VideoCapture(0)


3. Um das Video zu erhalten, verwenden wir die read () -Methode, die uns das rtrn-Flag zurückgibt - zeigt den Erfolg der Aufnahme eines Frames aus dem Videostream und dem Bild - den Frame unseres Videostreams (numpy array). Wir werden kontinuierlich Daten aus dem Videostream lesen, bis die Escape-Taste gedrückt wird.



while True:
    rtrn, image = capture.read()
    cv.imshow("Capture from Web-camera", image) #      
    if cv.waitKey(1) == 27:  #      Esc
        break
capture.release()
cv.destroyAllWindows()


Wir speichern unsere Datei und führen sie über die Befehlszeile mit Python our_file_name.py aus. Jetzt kann unser Programm einen Videostream von einer Webkamera empfangen! Dies bedeutet, dass wir bereits auf halbem Weg sind, dass der Computer Gesichter erkennen kann.



4. Machen wir es so, dass unser Computer auch Videos in eine Datei schreiben kann:



Geben Sie den Codec zum Speichern des Videos an, geben Sie den Namen für die gespeicherte Datei, fps und Größen an. Für unsere Aufgabe nehmen wir den XVID-Codec.



import cv2 as cv
capture = cv.VideoCapture(0)
codec = cv.VideoWriter_fourcc(*'XVID')


5. Wir geben die Frames nacheinander im Videofenster aus und speichern das Ergebnis in der Ausgabevariablen. Dann werden die Daten von der Ausgabe nach dem Ende des Videostreams in die Datei "saved_from_camera.avi" übertragen:



output = cv.VideoWriter('saved_from_camera.avi ', codec, 25.0, (640, 480))
while capture.isOpened():
    rtrn, image = capture.read()
    if cv.waitKey(1) == 27 or rtrn == False:
        break
    cv.imshow('video for save', image)
    output.write(image)
output.release()
capture.release()
cv.destroyAllWindows()


Nachdem wir gelernt haben, wie man ein Video von einer Webkamera aufnimmt und in einer Datei speichert, können wir mit dem Interessantesten fortfahren - der Gesichtserkennung in einem Videostream. Um das Gesicht in den Rahmen zu finden, verwenden wir die sogenannten Haar-Merkmale. Ihre Essenz ist, dass wir, wenn wir rechteckige Bereiche im Bild nehmen, durch den Intensitätsunterschied zwischen den Pixeln benachbarter Rechtecke Merkmale unterscheiden können, die Gesichtern inhärent sind.



Beispielsweise ist bei Bildern mit Gesichtern der Bereich um die Augen dunkler als um die Wangen. Daher kann eines der Haarzeichen für Gesichter als 2 benachbarte Rechtecke an den Wangen und Augen bezeichnet werden.



Es gibt viele andere, schnellere und genauere Methoden zum Erkennen von Objekten im Bild, aber um die allgemeinen Prinzipien zu verstehen, müssen wir erst einmal die Haarzeichen kennen.



Die Entwickler von OpenCV haben bereits an der Definition von Haar Signs gearbeitet und allen die Ergebnisse für die Verarbeitungsfunktionen des Videostreams zur Verfügung gestellt.



Beginnen wir mit dem Schreiben eines Gesichtsdetektors über unsere Webcam:



6. Holen Sie sich zunächst unsere Haar-Funktionen und definieren Sie die Parameter für die Aufnahme eines Videostreams. Die Traits-Datei befindet sich in dem Pfad, in dem die Python-Bibliotheken installiert sind. Standardmäßig befinden sie sich im Ordner



C:/Python3X/Lib/sitepackages/cv2/data/haarcascade_frontalface_default.xml


Dabei ist X Ihre Python 3-Subversion.



import cv2 as cv
cascade_of_face = cv.CascadeClassifier('C:/Python3.X/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml ')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25) #   25   


7. Als nächstes lesen wir in der Schleife abwechselnd Bilder von der Webkamera und senden sie an unseren Gesichtsdetektor:



while True:
    rtrn, image = capture.read()
    gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    faces_detect = cascade_of_face.detectMultiScale(
        image=gr,
        minSize=(15, 15),
        minNeighbors=10,
        scaleFactor=1.2
    )
    for (x_face, y_face, w_face, h_face) in faces_detect:
        cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (0, 0, 255), 2)
    cv.imshow("Image", image)
    if cv.waitKey(1) == 27:  # Esc key
        break
capture.release()
cv.destroyAllWindows()


8. Nun kombinieren wir alles zu einem Ganzen und erhalten ein Programm, das Videos von einer Webkamera aufzeichnet, Gesichter darauf erkennt und das Ergebnis in einer Datei speichert:



import cv2 as cv
faceCascade = cv.CascadeClassifier('C:/Users/Zet/Desktop/Python/test_opencv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25)
codec = cv.VideoWriter_fourcc(*'XVID')
output = cv.VideoWriter('saved_from_camera.avi', codec, 25.0, (640, 480))
while True:
    rtrn, image = capture.read()
    gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    faces_detect = faceCascade.detectMultiScale(
        image=gr,
        minSize=(15, 15),
        minNeighbors=10,
        scaleFactor=1.2
    )
    for (x_face, y_face, w_face, h_face) in faces_detect:
        cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (255, 0, 0), 2)
    cv.imshow("Image", image)
    output.write(image)
    if cv.waitKey(1) == 27:  # Esc key
        break
output.release()
capture.release()
cv.destroyAllWindows()


Alle! Sie haben ein Programm geschrieben, das der erste Schritt ist, um zu verstehen, wie ein Computer sieht. Darüber hinaus können Sie beispielsweise die Gesichtserkennung verbessern, sodass der Computer bestimmte Personen im Video erkennt, indem Sie neuronale Netze trainieren. Es ist auch möglich, einen Detektor zu schreiben, der so konfiguriert ist, dass er komplexere Objekte erkennt (z. B. den Verkehr verfolgt), und diese analysieren kann. Und auch um andere, nicht weniger interessante Aufgaben der Computer Vision zu lösen.



BONUS Wenden



wir das Programm in der Praxis an - wir verfolgen die Anmeldungen unter dem Konto.



  1. Gehen wir zum Taskplaner (kann über die Standard-Windows-Suche gefunden werden).
  2. Lassen Sie uns eine einfache Aufgabe erstellen, ihr einen Titel und eine kurze Beschreibung geben.






3. Klicken Sie auf Weiter und gehen Sie zum Element Auslöser. Hier wählen wir das Ereignis aus, bei dem der Start unserer Aufgabe erfolgen soll. Wir wählen "Bei der Eingabe von Windows";



4. Als nächstes geben wir in Aktion "Programm ausführen" an.



5. Geben Sie in Aktion den Pfad zu python.exe und in den Parametern den Pfad zu unserem Programm an:







Fertig! Wenn Sie sich anmelden, wird die unter dem Konto angemeldete Person aufgezeichnet und das Video gespeichert. Auf diese Weise können Sie verfolgen, wer in Ihrer Abwesenheit am Computer gearbeitet hat, und gleichzeitig Beweise aufzeichnen.



All Articles