Impossible de détecter les points de repère du visage à l'aide d'OpenCV2
J'ai développé un script utilisant dlib
et cv2
pour 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 detector
affiche 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' dlib
utilisation 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
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.
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)