Impossible de détecter les points de repère du visage à l'aide d'OpenCV2

Jan 22 2021

J'ai développé un script utilisant dlibet cv2pour dessiner des repères faciaux sur des images ayant un visage dans cette image. Voici les scripts;

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

Maintenant, voici ce qui me rend fou. Lorsque j'essaie de télécharger l'une des images (avec ou sans masque) de Google pour la tester, ce script fonctionne bien. De même, vous pouvez voir ces résultats tels que,

Mais quand j'essaye ces images suivantes, ça ne fait rien.

J'ai fait quelques recherches sur Internet, mais je n'ai rien trouvé qui réponde à l'objectif actuel.

Même, j'ai essayé la combinaison de

  • cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
  • eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
  • m_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')

J'ai également examiné les liens utiles suivants;

  • Boîte de délimitation de visage

  • Détecter les repères de visage dans Android (même pas le même domaine)

  • Détection des points de repère

  • OpenCV2 Détecter les repères faciaux

mais cela ne fonctionne pas non plus sur ces images. CV2 detectoraffiche une liste vide lorsque je débogue via un script tel que;

Je veux juste dessiner des repères fiduciaires en utilisant les images ci-dessus. Quelle serait la meilleure solution possible que je puisse utiliser? Il me manque peut-être quelque chose dans cv2& Dlib, mais je ne parviens pas à obtenir les résultats requis.

J'ai également trouvé le score de confiance pour l' dlibutilisation de l'implémentation recommandée par un geek de Stack Overflow tel que;

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]))

Voici le résultat d'un score de confiance pour la première image dans les images ci-dessus dans la deuxième ligne;

Au plaisir d'obtenir de meilleures recherches de l'un des gars géniaux là-bas. Merci

Réponses

j2abro Jan 26 2021 at 09:55

Tout d'abord, je pourrais essayer de voir si vous pouvez obtenir des scores de confiance avec dlib. Je ne sais pas quel est le seuil de confiance, mais peut-être que des visages sont détectés en dessous de la limite. À partir du dlib Git Repo , voici un exemple de la façon d'obtenir la confiance des détections:

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]))

Vous pouvez également envisager un autre détecteur de visage, par exemple un détecteur basé sur CNN comme ce détecteur de visage MobileNet SSD . Je n'ai pas utilisé ce modèle particulier, mais j'ai utilisé des modèles similaires, comme le modèle de détecteur de visage basé sur Google TPU, avec de très bons résultats.

AliAhmad Jan 26 2021 at 13:15

Télécharger le lien " shape_predictor_68_face_landmarks.dat ": entrez la description du lien ici

Code 100% fonctionnel Essayez celui-ci:

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)