Mit OpenCV2 können Gesichtsmarkierungen nicht erkannt werden

Jan 22 2021

Ich habe ein Skript entwickelt , das Gesichtsmarkierungen auf Bildern mit einem Gesicht in diesem Bild verwendet dlibund cv2zeichnet. 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 detectorzeigt 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 dlibVerwendung 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

j2abro Jan 26 2021 at 09:55

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.

AliAhmad Jan 26 2021 at 13:15

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)