Tidak dapat mendeteksi landmark wajah menggunakan OpenCV2

Jan 22 2021

Saya telah mengembangkan skrip menggunakan dlibdan cv2menggambar 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 detectormenunjukkan 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 dlibmenggunakan 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

j2abro Jan 26 2021 at 09:55

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.

AliAhmad Jan 26 2021 at 13:15

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)