Tidak dapat mendeteksi landmark wajah menggunakan OpenCV2
Saya telah mengembangkan skrip menggunakan dlib
dan cv2
menggambar landmark wajah pada gambar yang memiliki satu wajah di gambar itu. Ini skripnya;
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
Nah, inilah yang membuat saya gila. Ketika saya mencoba mengunduh gambar apa pun (dengan atau tanpa topeng) dari google untuk mengujinya, skrip ini berfungsi dengan baik. Demikian juga, Anda dapat melihat hasil ini seperti,
Tetapi ketika saya mencoba gambar-gambar berikut ini, itu tidak melakukan apa-apa.
Saya telah melakukan beberapa pencarian melalui internet tetapi saya belum menemukan apa pun yang melayani tujuan saat ini.
Bahkan, saya sudah mencoba kombinasi dari
cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
m_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
Saya juga telah melihat tautan berguna berikut di luar sana;
Face Bounding Box
Mendeteksi Face Landmark di Android (Bahkan domainnya tidak sama)
Deteksi landmark
OpenCV2 Mendeteksi Landmark Wajah
tapi itu juga tidak berfungsi pada gambar-gambar ini. CV2 detector
menunjukkan daftar kosong ketika saya men-debug melalui skrip seperti;
Saya hanya ingin menggambar landmark fidusia menggunakan gambar di atas. Apa solusi terbaik yang bisa saya lakukan? Mungkin, saya melewatkan sesuatu di cv2
& Dlib
, tetapi tidak bisa mendapatkan hasil seperti yang diminta.
Saya juga menemukan skor kepercayaan untuk dlib
menggunakan implementasi yang direkomendasikan dari seorang geek Stack Overflow seperti;
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]))
Berikut adalah hasil skor keyakinan untuk gambar pertama pada gambar yang diberikan di atas pada baris kedua;
Menantikan untuk mendapatkan penelitian yang lebih baik dari orang-orang hebat di luar sana. Terima kasih
Jawaban
Pertama, saya mungkin mencoba melihat apakah Anda bisa mendapatkan skor kepercayaan diri dari dlib. Saya tidak yakin apa itu ambang batas keyakinan, tetapi mungkin wajah yang terdeteksi berada di bawah batas. Dari dlib Git Repo , berikut adalah contoh cara mendapatkan kepercayaan dari deteksi:
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]))
Atau, pertimbangkan detektor wajah lain, misalnya detektor berbasis CNN seperti detektor wajah SSD MobileNet ini . Saya belum pernah menggunakan model khusus ini, tetapi saya telah menggunakan model yang serupa, seperti model detektor wajah berbasis Google TPU di sini dengan hasil yang sangat bagus.
Unduh tautan " shape_predictor_68_face_landmarks.dat ": masukkan deskripsi tautan di sini
100% Kode Kerja Coba Yang Ini:
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)