[PYTHON] Gesichtserkennung aus mehreren Bilddateien mit openCV, ausschneiden und speichern

Ich habe mit openCV ein Programm erstellt, um Gesichter aus mehreren Bilddateien in einem Ordner zu erkennen, den Gesichtsteil auszuschneiden und das Bild zu speichern. Dies ist also eine Einführung. Im Folgenden finden Sie weitere Referenzartikel zu openCV.

Die Umweltzusammenfassung lautet wie folgt. 00.ArchitectureopenCV.JPG

Python-Code

Unter Verwendung des im Artikel "OpenCV-Gesichtserkennung verwendet Parameter zur schnellen Verbesserung der Erkennungsgenauigkeit" erläuterten Codes werden der Name der Bilddatei, die Anzahl der Bilder, Die Parameter des trainierten Modells detelcMultiScale können zur Laufzeit angegeben werden. Ich habe mich gefragt, welche Quelldatei und Ausgabedatei anhand des Namens der Ausgabedatei identifiziert werden kann, aber ich habe aufgehört, weil es beim anschließenden Lernen mit tensorFlow im Weg zu stehen schien.

import cv2, os, argparse, shutil

#Verzeichnis zum Speichern des zugeschnittenen Bildes
SAVE_PATH = "./outputs/"

#Grundlegende Modellparameter
FLAGS = None

#Arten von trainierten Modellen
CASCADE = ["default","alt","alt2","tree","profile","nose"]

#Bestehen, wenn direkt ausgeführt(Importiert und nicht zur Laufzeit übergeben)
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--cascade",
        type=str,
        default="alt",
        choices=CASCADE,
        help="cascade file."
  )
    parser.add_argument(
        "--scale",
        type=float,
        default=1.3,
        help="scaleFactor value of detectMultiScale."
  )
    parser.add_argument(
        "--neighbors",
        type=int,
        default=2,
        help="minNeighbors value of detectMultiScale."
  )
    parser.add_argument(
        "--min",
        type=int,
        default=80,
        help="minSize value of detectMultiScale."
  )
    parser.add_argument(
        "--input_dir",
        type=str,
        default="./input/",
        help="The path of input directory."
  )
    parser.add_argument(
        "--move_dir",
        type=str,
        default="/done/",
        help="The path of moving detected files."
  )

#Parametererfassung und -ausführung
FLAGS, unparsed = parser.parse_known_args() 

#Sortierverzeichnis(Erhalten von)
# https://github.com/opencv/opencv/blob/master/data/haarcascades/
# https://github.com/opencv/opencv_contrib/blob/master/modules/face/data/cascades/

#Geschulte Modelldatei
if   FLAGS.cascade == CASCADE[0]:#"default":
    cascade_path = "./models/haarcascade_frontalface_default.xml"
elif FLAGS.cascade == CASCADE[1]:#"alt":
    cascade_path = "./models/haarcascade_frontalface_alt.xml"
elif FLAGS.cascade == CASCADE[2]:#"alt2":
    cascade_path = "./models/haarcascade_frontalface_alt2.xml"
elif FLAGS.cascade == CASCADE[3]:#"tree":
    cascade_path = "./models/haarcascade_frontalface_alt_tree.xml"
elif FLAGS.cascade == CASCADE[4]:#"profile":
    cascade_path = "./models/haarcascade_profileface.xml"
elif FLAGS.cascade == CASCADE[5]:#"nose":
    cascade_path = "./models/haarcascade_mcs_nose.xml"

#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
faceCascade = cv2.CascadeClassifier(cascade_path)

#Anzahl erfolgreicher Gesichtserkennungen(Geben Sie standardmäßig 0 an)
face_detect_count = 0

#Anzahl der Gesichtserkennungsfehler(Geben Sie standardmäßig 0 an)
face_undetected_count = 0

#Speichern Sie Dateien in Ordnern in Variablen(Speichert auch Verzeichnisse)
files =  os.listdir(FLAGS.input_dir)

#Wenn Sie die Erfolgsdatei nicht verschoben haben, löschen Sie das Ausgabeverzeichnis und erstellen Sie es neu, falls vorhanden
if FLAGS.move_dir == "":
    if os.path.exists(SAVE_PATH):
        shutil.rmtree(SAVE_PATH)
    os.mkdir(SAVE_PATH)

print(FLAGS)

#Wenn aus den gesammelten Bilddaten ein Gesicht erkannt wird, schneiden Sie es aus und speichern Sie es.
for file_name in files:

    #Für Dateien(Wenn nicht ein Verzeichnis)
    if os.path.isfile(FLAGS.input_dir + file_name):

        #Lesen der Bilddatei
        img = cv2.imread(FLAGS.input_dir + file_name)
        
        #Da es Dateien gibt, die bei einer großen Anzahl von Bildern selten fehlschlagen, protokollieren Sie die Ausgabe und überspringen Sie sie(Ursache unbekannt)
        if img is None:
            print(file_name + ':Cannot read image file')
            continue

        #Von Farbe in Graustufen konvertieren(Weil das Gesicht nicht durch Farbe erkannt wird)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        #Gesichtserkennung
        face = faceCascade.detectMultiScale(gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min))

        if len(face) > 0:
            for rect in face:
                #Bildausgabe zuschneiden
                cv2.imwrite(SAVE_PATH + str(face_detect_count) + file_name, img[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]])
                face_detect_count = face_detect_count + 1
                
            #Verschieben Sie die erkannte Datei
            if FLAGS.move_dir != "":
                shutil.move(FLAGS.input_dir + file_name, FLAGS.input_dir + FLAGS.move_dir)
        else:
            print(file_name + ':No Face')
            face_undetected_count = face_undetected_count + 1
            
print('Undetected Image Files:%d' % face_undetected_count)

Bitte erstellen Sie die Ein- und Ausgabeordner direkt unter der Ausführung und legen Sie die Bilder im Eingabeordner ab. Führen Sie es in der Befehlszeile aus. Da der Anfangswert angegeben ist, müssen Sie keine Parameter angeben.

python openCVCutAndSave01_20170804.py

Natürlich können Sie auch Parameter angeben und ausführen.

python openCVCutAndSave01_20170804.py --cascade "alt" --image_file "cut_source" --image_count 4 --scale 1.1 --neigbors 3 --min 50

Das Bild im Eingabeordner wird ausgeschnitten und in den Ausgabeordner ausgegeben, und das Bild, dessen Gesicht erkannt werden kann, wird in den Ordner "Fertig" verschoben. Bei der Verarbeitung einer großen Anzahl von Bildern ist es zweckmäßig, die Ordner nach Vorhandensein oder Nichtvorhandensein einer Erkennung zu unterteilen. Daher haben wir diese Spezifikation vorgenommen. 10.openCVResult.JPG Details finden Sie im Artikel "Tipps zum effizienten Erkennen von Gesichtern in einer großen Anzahl von Bildern mit openCV".

Recommended Posts

Gesichtserkennung aus mehreren Bilddateien mit openCV, ausschneiden und speichern
Ich möchte mit Python nur das Gesicht aus einem Personenbild ausschneiden und speichern ~ Gesichtserkennung und Zuschneiden mit face_recognition ~
Schneiden Sie das Gesicht mit Python + OpenCV aus
Gesichtserkennung mit Python + OpenCV
Anime-Gesichtserkennung mit OpenCV
Schneiden Sie mit Python + OpenCV jede Sekunde ein Bild aus einem Video aus
Schneiden Sie ein Bild mit Python aus
Speichern und Abrufen von Dateien mit Pepper
Schneiden wir das Gesicht aus dem Bild
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Bearbeiten und speichern Sie schreibgeschützte Dateien mit vim
Bildaufnahme von der Kamera mit Python + OpenCV
Schneiden Sie Bilder aus und verbinden Sie sie mit ImageMagick
Größenänderung, Mosaik, Gesichtserkennung mit OpenCV, manchmal Elefantenstempel
Ein Memo, das das Gesicht des mit Djangos OpenCV von der Webkamera aufgenommenen Bilds erkennt und zurückgibt.
[Ubuntu] [Python] Vergleich der Gesichtserkennung zwischen dlib und OpenCV
Entfernen Sie Überschriften aus CSV-Dateien mit mehreren Formaten mit Python
[Python] Google Mail mit Python senden: Senden Sie eins nach dem anderen mit mehreren angehängten Bilddateien
Verbessern Sie schnell die Erkennungsgenauigkeit, indem Sie Parameter mit openCV-Gesichtserkennung angeben
Ähnliche Gesichtsbilderkennung mit Gesichtserkennung und PCA- und K-Mittel-Clustering
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Gesichtserkennung mit OpenCV von Python
Bildbearbeitung mit Python OpenCV
Gesichtserkennung mit Python + dlib
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Echtzeit-Kantenerkennung mit OpenCV
Bilddateien mit Python sortieren
Holen Sie sich Bildfunktionen mit OpenCV
Gesichtserkennung / Schneiden mit OpenCV
Gesichtserkennung mit Haar Cascades
Bilderkennung mit Keras + OpenCV
Automatische Bildinterpolation mit OpenCV und Python (Fast Marching Method, Navier-Stokes)
[AWS] Suchen und Abrufen der erforderlichen Daten aus S3-Dateien mit S3 Select
[Bildverarbeitung] Poo-san ist durch Kantenerkennung mit Python und OpenCV nackt!
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
ZOOM, indem Sie Ihr Gesicht durch ein Twitter-Symbol mit openCV-Gesichtserkennung ersetzen
Holen Sie sich OCTA-Simulationsbedingungen aus einer Datei und speichern Sie sie mit Pandas
Betreiben Sie Firefox mit Selen aus Python und speichern Sie die Bildschirmaufnahme
[Erklärung für Anfänger] OpenCV-Gesichtserkennungsmechanismus und -praxis (MultiScale erkennen)
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
So fügen Sie OpenCV in Raspberry Pi ein und sammeln mit Python ganz einfach Bilder von Gesichtserkennungsergebnissen