OpenCV2 kullanılarak yüzdeki önemli noktalar tespit edilemiyor
Bu görüntüde bir yüzü olan görüntülerin üzerine yüz işaretlerini kullanarak dlib
ve 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 detector
gibi 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 dlib
bir 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
İ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 .
" 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)