Generieren Sie Kandidatenbilder, die das Ziel zeigen, bis Letztes Mal und Letztes Mal Ich habe erwähnt, wie man es bekommt, aber dieses Mal werde ich vorstellen, wie man den Gesichtsbereichsteil daraus extrahiert und ein Gesichtsbild erzeugt.
Um ein Gesichtsbild zu erzeugen, schneiden Sie nur den Bereich, in dem das Gesicht von den Kandidatenbildern reflektiert wird, und generieren Sie den zugeschnittenen Bereich als neues Bild = Gesichtsbild. Die manuelle Ausführung dieser Arbeit erfordert jedoch viel Zeit und Mühe. Um sie auch nur ein wenig zu lösen, verwenden wir dieses Mal die folgende Gesichtserkennungs-API (Bibliothek).
Wenn Sie diese APIs verwenden, ist es möglich, automatisch nur den Gesichtsbereich aus dem Kandidatenbild zu extrahieren. Dieses Mal wird die Methode jedoch mit OpenCV und dlib erläutert. Der spezifische Fluss der Gesichtsbilderzeugung ist im Wesentlichen der gleiche wie folgt.
Der obige Prozess wird durch die face_detect-Methode im folgenden Code definiert.
# -*- coding: utf-8 -*-
import glob
#Verzeichnispfad mit Kandidatenbildern
IMG_PATH = "/home/hoge/image/"
def face_detect(img_list):
#Definieren Sie mit dieser Methode den Prozess zur Erzeugung von Gesichtsbildern
return
if __name__ == '__main__':
#Holen Sie sich Kandidatenbilder aus dem angegebenen Verzeichnis und generieren Sie Gesichtsbilder mithilfe der API usw.
images = glob.glob(IMG_PATH + '*.jpg')
face_detect(images)
dlib dlib ist eine Bibliothek, die für C ++ entwickelte Bildverarbeitungs- und maschinelle Lernfunktionen kombiniert, aber auch mit Python verwendet werden kann. (Informationen zum Installieren von dlib in einer Mac-Umgebung finden Sie in diesem Artikel usw.)
dlib bietet eine Methode "get_frontal_face_detector" für die Gesichtserkennung. Verwenden Sie diese. Wenn Sie SVM-bezogene Methoden verwenden, bei denen es sich um eine Art nichtlinearen Diskriminator mit hoher Unterscheidungsgenauigkeit handelt, ist eine erweiterte Erkennung möglich. Diesmal wird jedoch die Benutzerfreundlichkeit priorisiert. Der Code zur Generierung von Gesichtsbildern, der tatsächlich die Methode "get_frontal_face_detector" verwendet, lautet wie folgt.
import dlib
import cv2
def face_detect(img_list):
#Identifikatoranruf zur Erkennung des Gesichtsbereichs
detector = dlib.get_frontal_face_detector()
#Erhalten Sie Koordinateninformationen, indem Sie das Kandidatenbild auf den Klassifizierer anwenden
for img_path in img_list:
#Kandidatenbild zum Trimmen (Farbmodus)
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
#Setzen Sie die Bildanordnung wieder zusammen und geben Sie sie in den Klassifizierer ein, um Koordinateninformationen zu erhalten, die als Gesichtsbereich erscheinen
cv_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
faces = detector(cv_img, 1)
#Gesichtsbildgenerierung, wenn ein Gesichtsbereich erkannt wird
img_count = 1
for face in faces:
#Holen Sie sich die Bildgröße des Kandidaten
height, width = img.shape[:2]
#Holen Sie sich Koordinatenpunkte des Gesichtsbereichs
top = face.top()
bottom = face.bottom()
left = face.left()
right = face.right()
#Ignorieren Sie unregelmäßige Gesichtsbereiche
if not top < 0 and left < 0 and bottom > height and right > width:
break
else:
#Trimmen des Gesichtsbereichs
dst_img = img[top:bottom, left:right]
#Gesichtsbildgröße Normalisiert und gespeichert
face_img = cv2.resize(dst_img, (64,64))
new_img_name = str(img_count) + '.jpg'
cv2.imwrite(new_img_name, face_img)
img_count += 1
OpenCV und dlib verarbeiten unterschiedliche Pixelwerte von RGB (Rot / Grün / Blau), bei denen es sich um die Farbinformationen des Bildes handelt. In OpenCV werden RGB-Pixelwerte (Rot / Grün / Blau) in der Reihenfolge BGR im Array gespeichert, in dlib jedoch in der Reihenfolge RGB, sodass die Array-Struktur mit der Methode "cvtColor" konvertiert werden muss. Es gibt.
Außerdem gibt get_frontal_face_detector selten die Koordinatenwerte außerhalb des Bildbereichs als Koordinateninformationen des Gesichtsbereichs zurück. Dies liegt daran, dass das Gesicht am Rand des Bildes reflektiert wird. In vielen Fällen fehlt ein Teil des Gesichts. Selbst wenn es als Gesichtsbild wie als Trainingsdaten generiert wird, ist es schwierig, es zu verwenden. Ignorieren Sie es daher als unregelmäßigen Gesichtsbereich. Ich bin. OpenCV OpenCV ist eine Bildverarbeitungsbibliothek, die in C ++, Python usw. verwendet werden kann und in dieser Artikelserie bekannt ist. Hier wird jedoch die Klasse "CascadeClassifier" als Kaskadenklassifikatorklasse vorbereitet Benutzen. Mit dieser Klasse ist es möglich, einen Klassifizierer zu erstellen, der verschiedenen Objekten entspricht, abhängig vom Inhalt der XML-Datei, in der die Lernergebnisse gespeichert sind, die beim Erstellen des Klassifizierers gelesen werden sollen. Diesmal unter Bezugnahme auf "haarcascade_frontalface_default.xml" (bereitgestellte Site), bereitgestellt von OpenCV, als Gesichtsdetektor Ich werde es benutzen.
import cv2
#XML-Dateipfad, auf den der HaarCascade-Klassifizierer verweist
XML_PATH = "./haarcascade_frontalface_default.xml"
def face_detect(img_list):
#Stellen Sie den Gesichtsbereichsklassifikator ein
classifier = cv2.CascadeClassifier(xml_path)
#Gesichtsbildgenerierung, wenn ein Gesichtsbereich erkannt wird
img_count = 1
for img_path in img_list:
#Farbbild zum Trimmen
org_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
#Graustufenbild für die Klassifizierungseingabe
gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
#Geben Sie ein Kandidatenbild (Graustufenbild) in den Klassifizierer ein und erfassen Sie Koordinateninformationen, die als Gesichtsbereich erscheinen
face_points = classifier.detectMultiScale(gray_img, \
scaleFactor=1.2, minNeighbors=2, minSize=(1,1))
#Gesichtsbilderzeugung durch Trimmen des Farbbildes aus dem Identifikationsergebnis (rechteckige Koordinateninformationen)
for points in face_points:
#Holen Sie sich Koordinatenpunkte des Gesichtsbereichs
x, y, width, height = points
#Trimmen des Gesichtsbereichs
dst_img = org_img[y:y+height, x:x+width]
#Gesichtsbildgröße Normalisiert und gespeichert
face_img = cv2.resize(dst_img, (64,64))
new_img_name = str(img_count) + '.jpg'
cv2.imwrite(new_img_name, face_img)
img_count += 1
Bei der Methode mit OpenCV werden zwei Arten von Kandidatenbildern erstellt: ein Farbbild zum Trimmen und ein Graustufenbild für die Klassifizierungseingabe. Dies liegt daran, dass die Methode "detectMultiScale" die Eingabe von Farbbildern nicht unterstützt.
Die Methode "detectMultiScale" verwendet die folgenden Parameterargumente.
Versuchen Sie die Objekterkennung (detectMultiScale) mit verschiedenen Parametern (minNeighbors) Versuchen Sie die Objekterkennung (detectMultiScale) mit verschiedenen Parametern (scaleFactor Edition)
dlib
OpenCV
Das ist einfach, aber dieses Mal habe ich erklärt, wie man aus einem Kandidatenbild ein Gesichtsbild erzeugt.
Recommended Posts