用于头部提取的 Mtcnn 面部提取器
Mtcnn face-extractor for head extraction
我正在使用 Mtcnn 网络 (https://towardsdatascience.com/face-detection-using-mtcnn-a-guide-for-face-extraction-with-a-focus-on-speed-c6d59f82d49) 来检测人脸和头部。为此,我使用经典的线条代码进行人脸检测:我得到了人脸边界框左上角的坐标 (x,y) + 边界框的高度和宽度 (h,w) ,然后我展开框以在裁剪中找到头部:
import mtcnn
img = cv2.imread('images/'+path_res)
faces = detector.detect_faces(img)# result
for result in faces:
x, y, w, h = result['box']
x1, y1 = x + w, y + h
x, y, w, h = result['box']
x1, y1 = x + w, y + h
if x-100>=0:
a=x-100
else:
a=0
if y-150 >=0:
b=y-150
else:
b=0
if x1+100 >= w:
c=x1+100
else:
c=w
if y1+60 >= h:
d=y1+60
else:
d=h
crop=img[b:d,a:c] #<--- final crop of the head
问题是这个解决方案适用于某些图像,但对于许多其他图像,在我的裁剪中,我得到了目标人物的肩膀和脖子。我认为,这是因为每张图片中的 pixels/inch(即一张图片中的 +150 像素与另一张图片中的不同)。因此,我该怎么做才能正确提取头部?
非常感谢
对于检测到的人脸周围的边距,您可以使用相对大小而不是绝对大小。例如,上下左右50%:
import mtcnn
img = cv2.imread('images/'+path_res)
faces = []
for result in detector.detect_faces(img):
x, y, w, h = result['box']
b = max(0, y - (h//2))
d = min(img.shape[0], (y+h) + (h//2))
a = max(0, x - (w//2):(x+w))
c = min(img.shape[1], (x+w) + (w//2))
face = img[b:d, a:c, :]
faces.append(face)
我正在使用 Mtcnn 网络 (https://towardsdatascience.com/face-detection-using-mtcnn-a-guide-for-face-extraction-with-a-focus-on-speed-c6d59f82d49) 来检测人脸和头部。为此,我使用经典的线条代码进行人脸检测:我得到了人脸边界框左上角的坐标 (x,y) + 边界框的高度和宽度 (h,w) ,然后我展开框以在裁剪中找到头部:
import mtcnn
img = cv2.imread('images/'+path_res)
faces = detector.detect_faces(img)# result
for result in faces:
x, y, w, h = result['box']
x1, y1 = x + w, y + h
x, y, w, h = result['box']
x1, y1 = x + w, y + h
if x-100>=0:
a=x-100
else:
a=0
if y-150 >=0:
b=y-150
else:
b=0
if x1+100 >= w:
c=x1+100
else:
c=w
if y1+60 >= h:
d=y1+60
else:
d=h
crop=img[b:d,a:c] #<--- final crop of the head
问题是这个解决方案适用于某些图像,但对于许多其他图像,在我的裁剪中,我得到了目标人物的肩膀和脖子。我认为,这是因为每张图片中的 pixels/inch(即一张图片中的 +150 像素与另一张图片中的不同)。因此,我该怎么做才能正确提取头部? 非常感谢
对于检测到的人脸周围的边距,您可以使用相对大小而不是绝对大小。例如,上下左右50%:
import mtcnn
img = cv2.imread('images/'+path_res)
faces = []
for result in detector.detect_faces(img):
x, y, w, h = result['box']
b = max(0, y - (h//2))
d = min(img.shape[0], (y+h) + (h//2))
a = max(0, x - (w//2):(x+w))
c = min(img.shape[1], (x+w) + (w//2))
face = img[b:d, a:c, :]
faces.append(face)