【问题标题】:rotated face detection旋转人脸检测
【发布时间】:2011-06-28 06:12:20
【问题描述】:

是否有用于检测已在图像平面中旋转的面部的库?或者有什么方法可以使用级联进行opencv的直立人脸检测来做到这一点?

【问题讨论】:

  • 您尝试过 EXIF 库吗?我相信它会有所帮助。

标签: opencv face-detection


【解决方案1】:

此 repo 可以将对象检测为旋转的边界框:https://github.com/NVIDIA/retinanet-examples

您可以通过将包含“人脸”类的图像随机旋转 -30 到 30 度来从 Open Images 创建数据集,然后训练该网络来检测这些人脸。

【讨论】:

    【解决方案2】:

    mtcnn 效果很好。似乎只有当面部非常接近 90 度或 180 度时才有问题。所以如果正常检测失败,只需将图像旋转 45 度,然后重试。如果图像中有一张脸,那么这应该会检测到它。

    不过我很好奇,为什么当面部正好旋转 90 度或倒置(旋转 180 度)时,mtcnn 会失败

    【讨论】:

      【解决方案3】:

      我一直在处理非正面图像的人脸检测问题。尝试使用多任务 CNN。这是人脸检测和对齐的最佳解决方案。它能够处理各种姿势、光照、遮挡等问题。

      论文可在Link 获得。该代码可在 GitHub 上的 Link 获得。我使用了python实现,结果非常出色。虽然如果图像有很多面孔,代码会有点慢。

      虽然如果你想坚持使用 OpenCV,那么 OpenCV 中已经添加了一个新的人脸检测深度学习模型。结果不如 Multi Task CNN。在 pyimagesearch Link 有一个用于人脸检测的 OpenCV 深度学习模型的实现

      【讨论】:

        【解决方案4】:

        就我个人而言,我不知道图书馆。但是,我能说的是,使用眼睛检测Haar Cascade,并在眼睛之间画一条线。然后,您可以使用atan 函数并找到头部旋转的角度。 (假设头部不旋转时,人的双眼在同一水平面上)

        deg = atan( (leftEye.y - rightEye.y) / (leftEye.x - rightEye.x) )
        

        一旦你得到这个角度,将你拥有的图像旋转负deg 度,你应该有一张可以使用 Haar Cascades 检测到的脸。

        【讨论】:

        • 有分别检测左眼/右眼的想法吗?我试过 haarcascade_lefteye_2splits 但它似乎同时检测到左右(大部分)。
        【解决方案5】:

        这是我用 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")
        

        【讨论】:

          【解决方案6】:

          您可以使用带有约束 AAM、ASM 方法的词袋/特征袋方法。 但它们也可以给出不收敛到全局最大值的非最优解。

          haar-like-features 也只是特征的集合,您可以使用旋转不变特征并将其放入 adaboost 分类器中。

          【讨论】:

            【解决方案7】:

            基于颜色直方图的人脸检测方法与人脸方向无关。

            【讨论】:

            • 那些方法是什么?
            【解决方案8】:

            天真的方式:

            • 生成角度列表(例如,以 10 度为单位从 -170 到 180)
            • 对于列表中的每个角度n
              • 将图像旋转ndegrees
              • 在旋转图像上运行人脸检测器
              • 计算检测到的人脸在原始图像中的位置(撤消旋转)
            • 对所有角度的连接结果执行非极大值抑制(您可能会从相邻角度获得多次检测)

            【讨论】:

            • 这使得检测非常慢并且返回更多的误报,但这可能是使 Haar 检测成为旋转不变的唯一方法......
            • 这不是一个好的解决方案。不会检测到倾斜头部的眼睛,与头部相比,您需要更高的分辨率/更大的变焦来检测眼睛。最好的办法是用包括倾斜头的照片来训练你自己的神经网络
            猜你喜欢
            • 2014-01-18
            • 2019-11-18
            • 2013-09-24
            • 1970-01-01
            • 1970-01-01
            • 2012-04-17
            • 1970-01-01
            • 2013-07-16
            • 2019-02-27
            相关资源
            最近更新 更多