OpenCV2 kullanılarak yüzdeki önemli noktalar tespit edilemiyor

Jan 22 2021

Bu görüntüde bir yüzü olan görüntülerin üzerine yüz işaretlerini kullanarak dlibve cv2çizmek için bir komut dosyası geliştirdim . İşte komut dosyaları;

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

Şimdi, işte beni deli eden şey. Herhangi bir resmi (maskeli veya maskesiz) google'dan test etmek için indirmeye çalıştığımda, bu komut dosyası iyi çalışıyor. Aynı şekilde, bu sonuçları aşağıdaki gibi görebilirsiniz:

Ancak aşağıdaki görüntüleri denediğimde hiçbir şey yapmıyor.

İnternet üzerinden birkaç arama yaptım ancak mevcut amaca hizmet eden hiçbir şey bulamadım.

Hatta kombinasyonunu denedim

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

Ayrıca aşağıdaki yararlı bağlantılara da baktım;

  • Yüz Sınırlama Kutusu

  • Android'de Yüz İşaretlerini Algıla (Aynı etki alanında olmasa bile)

  • Yer işaretleri algılama

  • OpenCV2 Yüzdeki Yer İşaretlerini Algıla

ama aynı zamanda bu görüntüler üzerinde çalışmıyor. CV2 detectorgibi komut dosyası aracılığıyla hata ayıkladığımda boş bir liste gösteriyor;

Sadece yukarıdaki resimleri kullanarak referans noktaları çizmek istiyorum . Mümkün olan en iyi çözüm ne olurdu? Belki cv2& bölümünde bir şey eksik Dlib, ancak sonuçları gerektiği gibi alamıyorum.

Ayrıca öğrenim sonuçları güven puanı için dlibbir recommended uygulamasını kullanarak inek yığın taşması gibi;

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

İşte yukarıda verilen ikinci satırdaki görüntülerde ilk görüntü için bir güven puanının sonucudur ;

Dışarıdaki harika adamların herhangi birinden daha iyi araştırma yapmayı dört gözle bekliyorum. Teşekkürler

Yanıtlar

j2abro Jan 26 2021 at 09:55

İlk olarak, dlib'den güven puanı alıp alamayacağınızı görmeye çalışabilirim. Güven eşiğinin ne olduğundan emin değilim, ancak sınırın altındaki yüzler algılanabilir. Dlib Git Repo'dan , tespitlerden nasıl güven kazanılacağına dair bir örnek:

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

Alternatif olarak, başka bir yüz dedektörünü, örneğin bu MobileNet SSD yüz dedektörü gibi bir CNN tabanlı algılayıcıyı düşünün . Bu özel modeli kullanmadım, ancak Google TPU tabanlı yüz dedektör modeli gibi benzer modeller kullandım ve çok iyi sonuçlar aldım .

AliAhmad Jan 26 2021 at 13:15

" Shape_predictor_68_face_landmarks.dat " bağlantısını indirin : bağlantı açıklamasını buraya girin

% 100 çalışan Kod Bunu Deneyin:

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)