Als ich das Dokument diagonal las, während ich die Bildverarbeitung mit Python + OpenCV untersuchte, gab es Tutorial zur Gesichtserkennung. Es ist eine Technologie, die mir zu helfen scheint, die sich heutzutage nicht mehr an die Gesichter der Menschen erinnern kann.
Ich weiß nicht viel über maschinelles Lernen hier, aber um es einfach auszudrücken, ich trainiere, um Gesichter von Haar-Merkmalen anhand von Nicht-Gesichtsbildern und Gesichtsbildern unterscheiden zu können. Infolgedessen werden Identifikationsdaten erzeugt, aber als Methode zur effizienten Verwendung der Identifikationsdaten zur Identifikation wurde ein Cascade-Klassifikator entwickelt, der in der OpenCV-Distribution enthalten zu sein scheint.
Im Fall von Mac Anaconda befindet es sich in "anaconda3 / share / OpenCV / haarcascades" und im Fall der Windows-Version Anaconda in "Anaconda3 \ Library \ etc \ haarcascades".
--haarcascade_eye.xml ... Augenerkennung --haarcascade_frontalface_default.xml ... Gesichtserkennung --haarcascade_smile.xml ... Lächelnerkennung
Vorerst habe ich eine Kopie davon gemacht. Machen Sie es also als Klassifikator verwendbar.
face_cascade = cv2.CascadeClassifier(‘haarcascades/haarcascade_frontalface_default.xml’)
Lesen Sie als nächstes die Bilddatei. cv2.imread () liest im Graustufenmodus, wenn im zweiten Argument 0 angegeben ist, aber ohne diese Funktion zu verwenden, verwenden Sie nach dem Einlesen der Farbe als img cv2.cvtColor () Lassen Sie eine Kopie in Graustufen konvertieren. Dies liegt daran, dass die Gesichtserkennung unter Verwendung eines Graustufenbilds durchgeführt wird und ein Farbbild angezeigt wird.
img = cv2.imread(file)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Suchen Sie das Gesicht im Bild und geben Sie die Koordinaten der Position des Gesichts zurück. Nur eine Zeile, da Sie nur den Klassifikator verwenden, der auf den bereits trainierten Identifikationsdaten basiert.
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Das Gesicht wird im konvertierten Graustufenbild (grau) gesucht, aber ein das Gesicht umgebendes Rechteck wird im ursprünglichen Farbbild (img) basierend auf der Position der Gesichtskoordinaten gezeichnet.
for (x, y, w, h) in faces:
cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2)
x und y geben die x- und y-Koordinaten oben links im Rechteck an, und w und h geben die Breite bzw. Höhe an. Wenn Sie jedoch mit OpenCV ein Rechteck im Bild (img) zeichnen, oben links Da die x-, y-Koordinaten und die x-, y-Koordinaten unten rechts erforderlich sind, werden sie als (x, y), (x + w, y + h) angegeben.
plt.imshow( cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
Das Bild mit dem am Ende geschriebenen Rechteck wird angezeigt, aber aus irgendeinem Grund enthält das von imread () von OpenCV gelesene Farbbild die Daten in der Reihenfolge BGR, diesmal jedoch im Pyplot von matplotlib, das für die Bildanzeige verwendet wird Da angenommen wird, dass die Daten in der Reihenfolge RGB gespeichert sind, werden sie beim Übergeben der Daten an plt.imshow () von cv2.cvtColor (img, cv2.COLOR_BGR2RGB) konvertiert.
Übrigens ist es in Ordnung, auch wenn es mehrere Gesichter gibt, also erhalte ich es wie für (x, y, w, h) in Gesichtern: aber ein Gruppenfoto mit genau den richtigen Urheber- und Porträtrechten Ich habe so etwas nicht, also kann ich es nicht versuchen.
import os
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
def facedetect(file):
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
img = cv2.imread(file)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2)
plt.imshow( cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
if __name__ == '__main__':
lenna = "4.2.04.tiff"
if os.path.exists(lenna):
facedetect(lenna)
Tutorial enthält auch ein Beispiel für die Augenerkennung nach der Gesichtserkennung. Wenn es ein Gesicht gibt, gibt es ein Auge, und es gibt kein Auge an einem anderen Ort als dem Gesicht. Daher wurde die Augenerkennung in dem Rechteck ausgeführt, das das Gesicht erkannt hat.
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
Das Problem ist, dass ich nichts über "Cascade-Klassifizierer basierend auf Haar-Funktionen" weiß und die Erklärung der Argumente der Methode "detectMultiScale ()" überhaupt nicht verstehen kann. Das heißt, es ist einfach und großartig.
Wenn Sie nun auch etwas aus dem Bild identifizieren möchten, müssen Sie diesen Cascade-Klassifikator richtig erstellen, aber das ist eine andere Geschichte.
Recommended Posts