Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für die von OpenCV in Python implementierte Gesichtserkennung

Detaillierte Erläuterung von Beispielen für die von OpenCV in Python implementierte Gesichtserkennung

Y2J
Y2JOriginal
2017-04-27 11:27:244882Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Verwendung von opencv zur Implementierung der Gesichtserkennung in Python vorgestellt. Hat einen sehr guten Referenzwert. Schauen wir es uns mit dem Editor unten an

Die Hauptschritte sind wie folgt:

1. Gesichtserkennung

2. Gesichtsvorverarbeitung

3. Training des maschinellen Lernalgorithmus aus gesammelten Gesichtern

4. Gesichtserkennung

5. Abschlussarbeiten

Gesichtserkennungsalgorithmus :

Die Grundidee des Haar-basierten Gesichtsdetektors besteht darin, dass für die meisten Bereiche auf der Vorderseite des Gesichts der Bereich, in dem sich die Augen befinden, dunkler sein sollte als die Stirn und die Wangen. und der Mund sollte dunkler sein als die Wangen usw. Typischerweise werden etwa 20 dieser Vergleiche durchgeführt, um zu entscheiden, ob es sich bei dem erkannten Objekt um ein Gesicht handelt, und zwar oft tausende Male.

Die Grundidee des LBP-basierten Gesichtsdetektors ähnelt dem Haar-basierten Gesichtsdetektor, vergleicht jedoch das Pixelhelligkeitshistogramm, beispielsweise das Histogramm von Kanten, Ecken und flachen Bereichen.

Diese beiden Gesichtsdetektoren können Gesichter finden, indem sie große Bildsätze trainieren, die zur späteren Verwendung in XML-Dateien in opencv gespeichert werden.

Diese Kaskadenklassifizierungsdetektoren erfordern normalerweise mindestens 1.000 eindeutige Gesichtsbilder und 10.000 Nicht-Gesichtsbilder für das Training. Die Schulungszeit dauert im Allgemeinen mehrere Stunden für LBP und

Haar erfordert eine Woche.

Die Schlüsselcodes im Projekt lauten wie folgt:

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//有需要则缩小图片使检测运行更快,之后要恢复原来大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

Gesichtsvorverarbeitung:

In der Praxis normalerweise Training (Sammeln von Bildern) und Tests (Bilder von Kamerabildern) werden aufgrund von (z. B. Beleuchtung, Gesichtsausrichtung, Ausdruck usw.) sehr unterschiedlich sein.

Die Ergebnisse werden schlecht sein, daher ist der für das Training verwendete Datensatz wichtig.

Der Zweck der Gesichtsvorverarbeitung besteht darin, solche Probleme zu reduzieren und dazu beizutragen, die Zuverlässigkeit des gesamten Gesichtserkennungssystems zu verbessern.

Die einfachste Form der Gesichtsvorverarbeitung besteht darin, die Funktion equalizeHist() für den Histogrammausgleich zu verwenden, was mit dem Gesichtserkennungsschritt identisch ist.

Um den Erkennungsalgorithmus zuverlässiger zu machen, wird in der Praxis die Erkennung von Gesichtsmerkmalen (z. B. Erkennung von Augen, Nase, Mund und Augenbrauen) verwendet. Dieses Projekt verwendet nur die Augenerkennung.

Verwenden Sie den trainierten Augendetektor, der mit OpenCV geliefert wird. Nachdem beispielsweise die frontale Gesichtserkennung abgeschlossen ist und ein Gesicht erhalten wurde, wird der Augendetektor verwendet, um den linken und rechten Augenbereich des Gesichts zu extrahieren, und für jeden Augenbereich wird ein Histogrammausgleich durchgeführt.

Die in diesem Schritt enthaltenen Vorgänge umfassen Folgendes:

1. Geometrische Transformation und Zuschneiden

Gesichtsausrichtung ist sehr Wichtig: Drehen Sie das Gesicht so, dass die Augen horizontal bleiben. Skalieren Sie das Gesicht so, dass der Abstand zwischen den Augen immer gleich ist. Verschieben Sie das Gesicht so, dass die Augen immer horizontal auf der gewünschten Höhe zentriert sind.

Zuschneiden die Peripherie des Gesichts (z. B. Bildhintergrund, Haare, Stirn, Ohren und Kinn).

2. Verwenden Sie den Histogrammausgleich auf der linken und rechten Seite des Gesichts

3

Verwenden Sie einen bilateralen Filter, um Bildrauschen zu reduzieren

4. Ellipsenmaske

Übrige Haare und Gesicht auftragen Bildhintergrundentfernung

Die Schlüsselcodes im Projekt sind wie folgt:

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左脸区域内检测左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼类似,这样眼睛中心点就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到两眼的中点,然后计算两眼之间的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一个仿射矩阵
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//现在可变换人脸来得到检测到的双眼出现在人脸的所需位置
warpAffine(gray, warped, rot_mat, warped.size());

//先对人脸左侧和右侧分开进行直方图均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,这里合并时左侧1/4和右侧1/4直接取像素值,中间的2/4区域像素值通过一定计算进行处理。

//双边滤波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//采用椭圆掩码来删除一些区域
filtered.copyTo(dstImg, mask);

Gesichter sammeln und trainieren:

Ein gutes Datenset sollte verschiedene Szenarien von Gesichtstransformationen enthalten, die im Trainingssatz erscheinen können. Wenn Sie nur Frontalgesichter testen, müssen in den Trainingsbildern nur vollständige Frontalgesichter vorhanden sein.

Ein gutes Trainingsset sollte also viele reale Situationen enthalten.

Die in diesem Projekt gesammelten Bilder sind mindestens eine Sekunde voneinander entfernt, und das relative Fehlerbewertungskriterium basierend auf der L2-Norm wird verwendet, um die Ähnlichkeit zwischen den Pixeln der beiden Bilder zu vergleichen.

errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);
Vergleichen Sie es dann mit dem Schwellenwert für das Sammeln neuer Gesichter, um zu entscheiden, ob dieses Bild gesammelt werden soll.

Viele Techniken können verwendet werden, um mehr Trainingsdaten zu erhalten, z. B. die Verwendung gespiegelter Gesichter, das Hinzufügen von zufälligem Rauschen, das Ändern einiger Pixel des Gesichtsbilds, das Drehen usw.

//翻转
flip(preprocessedFace, mirroredFace, 1);
Nachdem Sie für jede Person genügend Gesichtsbilder gesammelt haben, müssen Sie einen für die Gesichtserkennung geeigneten Algorithmus für maschinelles Lernen auswählen und ihn verwenden, um die gesammelten Daten zu lernen, um ein Gesichtserkennungssystem zu trainieren.

Gesichtserkennungsalgorithmus:

1. Eigenface, auch PCA (Hauptkomponentenanalyse) genannt

2. Fisher-Gesicht, auch LDA (lineare Diskriminanzanalyse) genannt

3 Histogramme (LBPH)

Andere Gesichtserkennungsalgorithmen: www.face-rec.org/algorithms/

OpenCV bietet die CV::Algorithm-Klasse, diese Klasse hat mehrere verschiedene Algorithmen, und Sie können einen dieser Algorithmen verwenden, um eine einfache und universelle Gesichtserkennung durchzuführen.

In der Contrib-Vorlage von OpenCV gibt es eine FaceRecognizer-Klasse, die die oben genannten Gesichtserkennungsalgorithmen implementiert.

initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);
Dieser Code führt den gesamten Trainingsalgorithmus für die ausgewählte Gesichtserkennung aus.

Gesichtserkennung:

1. Gesichtserkennung: Identifizieren Sie die Person anhand des Gesichts

Sie können einfach die Funktion FaceRecognizer::predict() aufrufen, um die Person auf dem Foto zu identifizieren ,

int identity = model->predict(preprocessedFace);

Das Problem besteht darin, dass es immer eine bestimmte Person vorhersagen kann (auch wenn das Eingabebild nicht zu der Person im Trainingssatz gehört).

Der Weg zur Lösung dieses Problems besteht darin, einen Vertrauensstandard festzulegen. Wenn das Vertrauen zu niedrig ist, kann davon ausgegangen werden, dass es sich um eine unbekannte Person handelt.

2. Gesichtsüberprüfung: Überprüfen Sie, ob sich die gesuchte Person auf dem Bild befindet

Um zu überprüfen, ob es zuverlässig ist , oder ob das System die korrekte Identifizierung einer unbekannten Person korrekt durchführen kann, erfordert eine Gesichtsverifizierung.

Die Methode zur Berechnung des Vertrauens lautet hier:

Verwenden Sie Eigenvektoren und Eigenwerte, um das Gesichtsbild zu rekonstruieren, und vergleichen Sie dann das Eingabebild mit dem rekonstruierten Bild. Wenn eine Person mehrere Gesichtsbilder im Trainingssatz hat, sollte die Rekonstruktion mit Merkmalsvektoren und Merkmalswerten sehr gute Ergebnisse liefern. Andernfalls wird es einen großen Unterschied geben, was darauf hindeutet, dass es sich möglicherweise um ein Unbekanntes handelt Person. Gesicht.

Die Funktion subspaceProject() ordnet das Gesichtsbild dem Merkmalsraum zu und verwendet dann die Funktion subspaceReconstruct(), um das Bild aus dem Merkmalsraum zu rekonstruieren.

Endbearbeitung: Interaktive GUI

Mithilfe von OpenCV-Funktionen ist es einfach, einige Komponenten, Mausklicks usw. zu zeichnen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für die von OpenCV in Python implementierte Gesichtserkennung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn