Không thể phát hiện các điểm mốc trên khuôn mặt bằng OpenCV2
Tôi đã phát triển một kịch bản sử dụng dlib
và cv2
để 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 detector
hiể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 dlib
việ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
Đầ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.
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)