OpenCV2를 사용하여 얼굴 랜드 마크를 감지 할 수 없음

Jan 22 2021

내가 사용하는 스크립트 개발 dlibcv2그 이미지에서 하나 개의 얼굴을 가진 이미지에 얼굴 랜드 마크를 그릴 수 있습니다. 다음은 스크립트입니다.

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에서 뭔가를 놓치고 있지만 필요한 결과를 얻을 수 없습니다.

또한 다음 과 같은 Stack Overflow 괴짜 로부터 권장 구현 을 사용하는 것에 대한 신뢰도 점수 를 찾았습니다 .dlib

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 망할 놈의 리포 , 여기에 탐지에서 자신감을 얻는 방법의 예입니다 :

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

또는 다른 얼굴 감지기, 예를 들어이 MobileNet SSD 얼굴 감지기 와 같은 CNN 기반 감지기를 고려하십시오 . 이 특정 모델을 사용하지 않았지만 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)