Невозможно определить лицевые ориентиры с помощью OpenCV2

Jan 22 2021

Я разработал сценарий, использующий 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]))

Вот результат оценки достоверности для первого изображения в приведенных выше изображениях во второй строке;

С нетерпением жду возможности получить лучшие исследования от любого из замечательных ребят. Спасибо

Ответы

j2abro Jan 26 2021 at 09:55

Во-первых, я мог бы попытаться узнать, можете ли вы получить оценку уверенности с помощью 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, с очень хорошими результатами.

AliAhmad Jan 26 2021 at 13:15

Скачать ссылку " 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)