Không thể phát hiện các điểm mốc trên khuôn mặt bằng OpenCV2

Jan 22 2021

Tôi đã phát triển một kịch bản sử dụng dlibcv2để vẽ các điểm mốc trên khuôn mặt trên hình ảnh có một khuôn mặt trong hình ảnh đó. Đây là các tập lệnh;

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

Bây giờ, đây là điều khiến tôi phát điên. Khi tôi cố gắng tải xuống bất kỳ hình ảnh nào (có hoặc không có mặt nạ) từ google để kiểm tra, tập lệnh này đang hoạt động tốt. Tương tự như vậy, bạn có thể thấy những kết quả này, chẳng hạn như,

Nhưng khi tôi thử qua những hình ảnh sau đây, nó không có tác dụng gì.

Tôi đã thực hiện một vài tìm kiếm trên internet nhưng tôi không tìm thấy bất kỳ thứ gì phục vụ cho mục đích hiện tại.

Thậm chí, tôi đã thử kết hợp

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

Tôi cũng đã xem xét các liên kết hữu ích sau đây;

  • Hộp giáp mặt

  • Phát hiện mốc khuôn mặt trong Android (Ngay cả khi không cùng miền)

  • Phát hiện mốc

  • OpenCV2 phát hiện mốc trên khuôn mặt

nhưng nó cũng không hoạt động trên những hình ảnh này. CV2 detectorhiển thị danh sách trống khi tôi gỡ lỗi thông qua tập lệnh chẳng hạn như;

Tôi chỉ muốn vẽ các mốc thời gian bằng cách sử dụng các hình ảnh trên. Giải pháp tốt nhất có thể mà tôi có thể thực hiện là gì? Có thể, tôi đang thiếu một cái gì đó trong cv2& Dlib, nhưng không thể nhận được kết quả như yêu cầu.

Tôi cũng đã tìm thấy điểm tin cậy cho dlibviệc sử dụng triển khai được đề xuất từ ​​một chuyên gia về Stack Overflow chẳng hạn như;

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

Đây là kết quả của điểm tin cậy cho hình ảnh đầu tiên trong các hình ảnh đã cho ở trên ở hàng thứ hai;

Mong nhận được nghiên cứu tốt hơn từ bất kỳ chàng trai tuyệt vời nào ngoài kia. Cảm ơn

Trả lời

j2abro Jan 26 2021 at 09:55

Đầu tiên, tôi có thể thử xem liệu bạn có thể nhận được điểm tin cậy từ dlib hay không. Tôi không chắc ngưỡng tin cậy là bao nhiêu, nhưng có lẽ chúng tôi đã phát hiện ra những khuôn mặt nằm dưới giới hạn. Từ dlib Git Repo , đây là một ví dụ về cách lấy sự tin cậy từ các phát hiện:

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

Ngoài ra, hãy xem xét một công cụ dò tìm khuôn mặt khác, chẳng hạn như một công cụ dò tìm dựa trên CNN như bộ dò tìm khuôn mặt SSD MobileNet này . Tôi chưa sử dụng mô hình cụ thể này, nhưng tôi đã sử dụng các mô hình tương tự, như mô hình dò ​​tìm khuôn mặt dựa trên TPU của Google ở ​​đây với kết quả rất tốt.

AliAhmad Jan 26 2021 at 13:15

Tải xuống liên kết " shape_predictor_68_face_landmarks.dat ": nhập mô tả liên kết tại đây

100% mã hoạt động Hãy thử cái này:

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)