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.
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 #).
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 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.'
)
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