[PYTHON] Verbessern Sie schnell die Erkennungsgenauigkeit, indem Sie Parameter mit openCV-Gesichtserkennung angeben

Wenn Sie ein Gesicht mit openCV erkennen, ** "1. Welches trainierte Modell (Kaskadendatei) soll ich verwenden?" Und "2. Was soll ich mit den Parametern der DetectMultiScale-Methode tun?" Ich werde. Die beiden oben genannten sind unabdingbar, um die Erkennungsgenauigkeit zu verbessern, und es ist ineffizient, das Programm einzeln umzuschreiben und auszuführen. Dies ist eine Einführung in die Angabe von Parametern (ohne das Programm zu ändern) und deren Ausführung, um die Erkennungsgenauigkeit schnell zu verbessern. Im Folgenden finden Sie weitere Referenzartikel zu openCV.

Die Umweltzusammenfassung lautet wie folgt. 00.ArchitectureopenCV.JPG

Parameterbibliothek argparse

argparse ist Teil der Python-Standardbibliothek, mit der Sie Programmargumente verwenden können. Weitere Informationen erhalten Sie von Official Help und Official Tutorial. Bitte beziehen Sie sich auf HTML #).

Grundlegende Verwendung von Argparse

Es ist eine einfache Möglichkeit, Argparse zu verwenden. Schreiben Sie diesen Code und speichern Sie ihn als "argparse_test01.py" ([Tutorial "Einführung in Positionierungsargumente"](https://docs.python.jp/3/howto/argparse.html#introducing- Zitiert aus Positionsargumenten)).

import argparse

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", 
                    help="display a square of a given number",
                    type=int)
args = parser.parse_args()
print(args.square**2)

Holen Sie sich zunächst Hilfe in der Befehlszeile.

python argparse_test01.py --h

Anschließend wird eine Beschreibung der definierten Parameter zurückgegeben.

usage: argparse_test01.py [-h] square

positional arguments:
  square      display a square of a given number

optional arguments:
  -h, --help  show this help message and exit

Führen Sie nun das Programm in der Befehlszeile aus.

python argparse_test01.py 4

Dann wird der Wert "16" zurückgegeben, der das als Parameter angegebene Quadrat von "4" ist.

Fügen Sie Parameter in ein Array ein

Fügen Sie die Parameter in ein Array ein, wie in Tensorflow-Tutorial verwendet. Es war.

argparse_test02.py


import argparse

#Grundmodell
FLAGS = None

def main():
    print(FLAGS.parameter1)
    print(FLAGS.parameter2)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--parameter1',
        type=float,
        default=0.01,
        help='Parameter1.'
  )
    parser.add_argument(
        '--parameter2',
        type=int,
        default=2000,
        help='Parameter2.'
  )

FLAGS, unparsed = parser.parse_known_args()
main()

Wenn Sie es mit dem folgenden Befehl ausführen, wird der Parameterwert unverändert ausgegeben.

python argparse_test02.py --parameter1 3.23 --parameter2 112

Übrigens können Sie auch Abkürzungen definieren, indem Sie zwei angeben. In diesem Fall können Sie den Parameter auch mit "-p" angeben.

    parser.add_argument(
        '-p',
        '--parameter',
        type=int,
        default=2000,
        help='Parameter2.'
  )

Gesichtserkennungsprogramm

Wie ich zu Beginn schrieb, "1. Trainiertes Modell (Kaskadendatei)" und "2. Parameter der Methode" detectMultiScale "" und parametrisieren Sie dann den Namen der Bilddatei. Der Code sieht so aus.

openCVWithParameter01.py


import cv2
import argparse

#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="default",
        choices=cascade,
        help="cascade file."
  )
    parser.add_argument(
        "--image_file",
        type=str,
        default="cut_source0.jpg ",
        help="image 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=30,
        help="minSize value of detectMultiScale."
  )

#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/

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"

#Verwendete Dateien und Eingabe- / Ausgabeverzeichnisse
image_path  = "./inputs/"  + FLAGS.image_file
output_path = "./outputs/" + FLAGS.image_file

#Zur Verzeichnisbestätigung(Denn wenn etwas schief geht)
#import os
#print(os.path.exists(image_path))

#Datei lesen
image = cv2.imread(image_path)

#Graustufenumwandlung
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
cascade = cv2.CascadeClassifier(cascade_path)    

#Ausführung der Objekterkennung (Gesichtserkennung)
#image - CV_Matrix vom Typ 8U. In den hier gespeicherten Bildern werden Objekte erkannt
#objects -Ein Vektor, dessen Elemente Rechtecke sind. Jedes Rechteck enthält das erkannte Objekt
#scaleFactor -Stellt den Verkleinerungsbetrag bei jedem Bildmaßstab dar
#minNeighbors -Kandidatenrechtecke müssen mindestens diese Anzahl benachbarter Rechtecke enthalten
#flags -Dieser Parameter wird in der neuen Kaskade nicht verwendet. Für ältere Kaskaden hat es dieselbe Bedeutung wie für die Funktion cvHaarDetectObjects.
#minSize -Die Mindestgröße, die ein Objekt annehmen kann. Objekte, die kleiner als diese sind, werden ignoriert
facerect = cascade.detectMultiScale(image_gray, scaleFactor=FLAGS.scale, minNeighbors=FLAGS.neighbors, minSize=(FLAGS.min, FLAGS.min))

#print(facerect)

color = (255, 255, 255) #Weiß

#Wenn erkannt
if len(facerect) > 0:

    #Erstellen Sie ein Rechteck, das das erkannte Gesicht umgibt
    for rect in facerect:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)

    #Erkennungsergebnisse speichern
    cv2.imwrite(output_path, image)

Alles was Sie tun müssen, ist es auszuführen. Dies sollte den Zeit- und Arbeitsaufwand reduzieren, der erforderlich ist, um das Programm einzeln neu zu schreiben und auszuführen, und die Effizienz verbessern! ** ** **

python openCVWithParameter01.py --scale 1.3 --neighbors 1 --image_file "cut_source1.jpg " --cascade "nose" --min 50

Natürlich ist es möglich, den Standardwert ohne Angabe des Parameters auszuführen.

python openCVWithParameter01.py

Recommended Posts

Verbessern Sie schnell die Erkennungsgenauigkeit, indem Sie Parameter mit openCV-Gesichtserkennung angeben
Gesichtserkennung mit Python + OpenCV
Anime-Gesichtserkennung mit OpenCV
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
[Python] Gesichtserkennung durch OpenCV (Haar Cascade)
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Größenänderung, Mosaik, Gesichtserkennung mit OpenCV, manchmal Elefantenstempel
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Gesichtserkennung mit OpenCV von Python
Gesichtserkennung in Echtzeit mit von getUserMedia [HTML5, openCV] aufgenommenem Video
Versuchen Sie die Kantenerkennung mit OpenCV
Ein Memo, wenn mit Python + OpenCV schnell ein Gesicht erkannt wird
Gesichtserkennung mit Python + dlib
Echtzeit-Kantenerkennung mit OpenCV
Gesichtserkennung / Schneiden mit OpenCV
Gesichtserkennung mit Haar Cascades
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Gesichtserkennung mit Lambda (Python) + Erkennung
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
[OpenCV] Persönliche Identifikation mit Gesichtsfoto
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Beschleunigung des Lesevorgangs durch Angabe eines OpenCV-Frames
Ich habe versucht, das Gesicht mit MTCNN zu erkennen
Schneiden Sie das Gesicht mit Python + OpenCV aus
Gesichtserkennung mit Kamera mit opencv3 + python2.7
OpenCV-Funktionserkennung mit Google Colaboratory
Katzenerkennung mit OpenCV (Modellverteilung)
Objekterkennung mit openCV durch traincascade
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Gesichtserkennung aus mehreren Bilddateien mit openCV, ausschneiden und speichern
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Speichern Sie Videos Frame für Frame mit Python OpenCV
Gesichtserkennung durch Sammeln von Bildern von Angers.
Installieren Sie, indem Sie die Version mit pip angeben
[python, openCV] base64 Gesichtserkennung in Bildern