Невозможно определить лицевые ориентиры с помощью OpenCV2
Я разработал сценарий, использующий dlib
и cv2
для рисования ориентиров на изображениях с одним лицом на этом изображении. Вот сценарии;
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
Вот что меня сводит с ума. Когда я пытаюсь загрузить любое изображение (с маской или без нее) из Google, чтобы проверить его, этот скрипт работает нормально. Точно так же вы можете увидеть такие результаты, как,



Но когда я пытаюсь просмотреть следующие изображения, ничего не получается.



Я сделал несколько поисков в Интернете, но не нашел ничего, что служило бы текущей цели.
Даже я пробовал комбинацию
cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
m_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
Я также просмотрел следующие полезные ссылки;
Граница лица
Обнаружение ориентиров на лицах в Android (даже в другом домене)
Обнаружение ориентиров
OpenCV2 обнаруживает лицевые ориентиры
но он также не работает с этими изображениями. CV2 detector
показывает пустой список, когда я отлаживаю скрипт, например:

Я просто хочу нарисовать реперные ориентиры, используя изображения выше. Какое наилучшее из возможных решений я смогу пройти? Возможно, я что-то упускаю в cv2
& Dlib
, но не могу получить требуемый результат.
Я также нашел оценку достоверности для dlib
использования рекомендованной реализации от компьютерного фаната Stack Overflow, например:
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]))
Вот результат оценки достоверности для первого изображения в приведенных выше изображениях во второй строке;

С нетерпением жду возможности получить лучшие исследования от любого из замечательных ребят. Спасибо
Ответы
Во-первых, я мог бы попытаться узнать, можете ли вы получить оценку уверенности с помощью dlib. Я не уверен, что такое порог уверенности, но, возможно, обнаруживаются лица, которые ниже этого предела. Вот пример того, как добиться уверенности в обнаружениях из dlib Git Repo :
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]))
В качестве альтернативы рассмотрите другой детектор лиц, например детектор на основе CNN, такой как этот детектор лиц MobileNet SSD . Я не использовал эту конкретную модель, но я использовал похожие модели, такие как модель детектора лица на основе Google TPU, с очень хорошими результатами.
Скачать ссылку " shape_predictor_68_face_landmarks.dat ": введите описание ссылки здесь
100% рабочий код Попробуй:
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)