是否有用于检测已在图像平面中旋转的面部的库?或者有什么方法可以使用级联进行opencv的直立人脸检测来做到这一点?
8 回答
这是我用 Python cv2 写的一个简单的
这不是最有效的方法,它使用了 etarion 建议的幼稚方式,但对于正常的头部倾斜它工作得相当好(它检测到从 -40 到 40 的任何头部倾斜,这大约是你可以倾斜你的头保持直立。
import cv2
from math import sin, cos, radians
camera = cv2.VideoCapture(0)
face = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
settings = {
'scaleFactor': 1.3,
'minNeighbors': 3,
'minSize': (50, 50),
'flags': cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT|cv2.cv.CV_HAAR_DO_ROUGH_SEARCH
}
def rotate_image(image, angle):
if angle == 0: return image
height, width = image.shape[:2]
rot_mat = cv2.getRotationMatrix2D((width/2, height/2), angle, 0.9)
result = cv2.warpAffine(image, rot_mat, (width, height), flags=cv2.INTER_LINEAR)
return result
def rotate_point(pos, img, angle):
if angle == 0: return pos
x = pos[0] - img.shape[1]*0.4
y = pos[1] - img.shape[0]*0.4
newx = x*cos(radians(angle)) + y*sin(radians(angle)) + img.shape[1]*0.4
newy = -x*sin(radians(angle)) + y*cos(radians(angle)) + img.shape[0]*0.4
return int(newx), int(newy), pos[2], pos[3]
while True:
ret, img = camera.read()
for angle in [0, -25, 25]:
rimg = rotate_image(img, angle)
detected = face.detectMultiScale(rimg, **settings)
if len(detected):
detected = [rotate_point(detected[-1], img, -angle)]
break
# Make a copy as we don't want to draw on the original image:
for x, y, w, h in detected[-1:]:
cv2.rectangle(img, (x, y), (x+w, y+h), (255,0,0), 2)
cv2.imshow('facedetect', img)
if cv2.waitKey(5) != -1:
break
cv2.destroyWindow("facedetect")
就个人而言,我不知道图书馆。但是,我能说的是,使用眼睛检测Haar Cascade,并在眼睛之间画一条线。然后,您可以使用该atan
功能并找到头部旋转的角度。(假设头部不旋转时,人的双眼在同一水平面上)
deg = atan( (leftEye.y - rightEye.y) / (leftEye.x - rightEye.x) )
一旦你得到这个角度,将你拥有的图像旋转负deg
度,你应该有一张可以使用 Haar Cascades 检测到的脸。
天真的方式:
- 生成角度列表(例如,从 -170 到 180,以 10 度为步长)
- 对于列表中的每个角度
n
:n
以度数旋转图像- 在旋转图像上运行人脸检测器
- 计算检测到的人脸在原始图像中的位置(撤消旋转)
- 从所有角度对连接结果执行非最大抑制(您可能会从相邻角度获得多个检测)
您可以使用带有约束 AAM、ASM 方法的词袋/特征袋方法。但它们也可以给出不收敛到全局最大值的非最优解。
同样 haar-like-features 只是特征的集合,您可以使用旋转不变特征并将其放入 adaboost 分类器中。
我一直在处理非正面图像的人脸检测问题。尝试使用多任务 CNN。这是人脸检测和对齐的最佳解决方案。它能够处理各种姿势、光照、遮挡等问题。
该论文可在Link获得。该代码可在 GitHub 上的Link上找到。我使用了python实现,结果非常出色。虽然如果图像有很多面孔,代码会有点慢。
虽然如果你想坚持使用 OpenCV,那么 OpenCV 中已经添加了一个新的人脸检测深度学习模型。结果不如 Multi Task CNN。在 pyimagesearch链接上有一个用于人脸检测的 OpenCV 深度学习模型的实现
mtcnn 很好用。似乎只有当面部非常接近 90 度或 180 度时才有问题。所以如果正常检测失败,只需将图像旋转 45 度,然后重试。如果图像中有一张脸,那么这应该检测到它。
不过我很好奇,为什么当面部正好旋转 90 度或倒置(旋转 180 度)时 mtcnn 会失败
这个 repo 可以将对象检测为旋转的边界框:https ://github.com/NVIDIA/retinanet-examples
您可以通过将包含“人脸”类的图像随机旋转 -30 到 30 度来从 Open Images 创建数据集,然后训练该网络以检测这些人脸。
基于颜色直方图的人脸检测方法与人脸方向无关。