Mit OpenCV2 können Gesichtsmarkierungen nicht erkannt werden
Ich habe ein Skript entwickelt , das Gesichtsmarkierungen auf Bildern mit einem Gesicht in diesem Bild verwendet dlib
und cv2
zeichnet. Hier sind die Skripte;
import cv2
import dlib
img_path = 'landmarks.png'
detector = dlib.get_frontal_face_detector()
shape_predictor = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(shape_predictor)
count = 1
ready = True
while ready:
frame = cv2.imread("demo.jpg")
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = detector(gray)
for face in faces:
x1 = face.left()
y1 = face.top()
x2 = face.right()
y2 = face.bottom()
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 3)
landmarks = predictor(gray, face)
for n in range(0, 68):
x = landmarks.part(n).x
y = landmarks.part(n).y
cv2.circle(frame, (x, y), 4, (255, 0, 0), -1)
cv2.imshow("Frame", frame)
cv2.waitKey(0)
ready = False
Nun, hier, was mich verrückt macht. Wenn ich versuche, eines der Bilder (mit oder ohne Maske) von Google herunterzuladen, um es zu testen, funktioniert dieses Skript einwandfrei. Ebenso können Sie diese Ergebnisse sehen, wie z.
Aber wenn ich diese folgenden Bilder ausprobiere, tut es nichts.
Ich habe einige Suchanfragen über das Internet durchgeführt, aber nichts gefunden, was dem aktuellen Zweck dient.
Sogar ich habe die Kombination von versucht
cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
m_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
Ich habe mir auch die folgenden nützlichen Links angesehen.
Face Bounding Box
Gesichtsmarkierungen in Android erkennen (auch nicht dieselbe Domain)
Erkennung von Orientierungspunkten
OpenCV2 Gesichtsmarkierungen erkennen
aber es funktioniert auch nicht auf diesen Bildern. CV2 detector
zeigt eine leere Liste an, wenn ich über ein Skript debugge, wie z.
Ich möchte nur Passermarken mit den obigen Bildern zeichnen . Was wäre die bestmögliche Lösung, die ich durchmachen kann? Vielleicht fehlt mir etwas in cv2
& Dlib
, aber ich kann die gewünschten Ergebnisse nicht erzielen.
Ich habe auch den Konfidenzwert für die dlib
Verwendung der empfohlenen Implementierung von einem Stack Overflow-Geek gefunden, wie z.
import dlib
detector = dlib.get_frontal_face_detector()
img = dlib.load_rgb_image('demo.jpg')
dets, scores, idx = detector.run(img, 1, -1)
for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))
Hier ist das Ergebnis einer Konfidenzbewertung für das erste Bild in den oben angegebenen Bildern in der zweiten Zeile;
Ich freue mich darauf, von einem der großartigen Jungs da draußen bessere Nachforschungen anzustellen. Vielen Dank
Antworten
Zunächst könnte ich versuchen, herauszufinden, ob Sie mit dlib Vertrauenswerte erzielen können. Ich bin nicht sicher, wie hoch die Konfidenzschwelle ist, aber möglicherweise werden Gesichter erkannt, die unter dem Grenzwert liegen. In der dlib Git Repo finden Sie ein Beispiel dafür, wie Sie Vertrauen in die Erkennungen gewinnen können:
if (len(sys.argv[1:]) > 0):
img = dlib.load_rgb_image(sys.argv[1])
dets, scores, idx = detector.run(img, 1, -1)
for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))
Alternativ können Sie einen anderen Gesichtsdetektor in Betracht ziehen, beispielsweise einen CNN-basierten Detektor wie diesen MobileNet SSD- Gesichtsdetektor. Ich habe dieses spezielle Modell nicht verwendet, aber ich habe ähnliche Modelle wie das auf Google TPU basierende Gesichtsdetektormodell mit sehr guten Ergebnissen verwendet.
Laden Sie den Link " shape_predictor_68_face_landmarks.dat " herunter: Geben Sie hier die Linkbeschreibung ein
100% funktionierender Code Probieren Sie diesen aus:
import cv2
import dlib
import numpy as np
img= cv2.imread('Capture 8.PNG')
gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
p = "shape_predictor_68_face_landmarks.dat"
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(p)
faces = detector(gray)
for face in faces:
x1=face.left()
y1=face.top()
x2=face.right()
y2=face.bottom()
cv2.rectangle(img, (x1,y1), (x2,y2),(0,255,0),3)
landmarks=predictor(gray, face)
for n in range(0,68):
x=landmarks.part(n).x
y=landmarks.part(n).y
cv2.circle(img, (x, y), 4, (0, 0, 255), -1)
cv2.imshow(img)