精简版
0
0
0
云栖社区 > 博客 > 正文
uncle_ll 2019-12-13 19:26:43 浏览 144
python
算法
Image
人脸识别
OpenCV
人脸检测
dlib
展开阅读全文
人脸检测
随着人脸识别, 人脸支付, 换脸等业务等爆发, 多的人都将目光放在人脸方面的研究上. 可以说, 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一, 它在安防监控, 人机交互, 金融支付, 社交和娱乐等方面有很强的应用价值, 也是整个人脸识别算法的第一步.
问题描述
人脸检测的目标就是从图像中找到所有的人脸对应的位置, 算法结果输出的是人脸在图像中所处的坐标. 有些算法还会有其它的一些信息, 比如性别, 年龄, 面部情绪等. 详细的发展过程网上有很多的参考资料, 这里不作过多的介绍.
Dlib
DLIB 是包含机器学习算法和工具, 一个现代化的 C ++ 工具包. 它在工业界和学术界使用非常广泛, 包括机器人, 嵌入式设备, 移动电话, 和高性能的计算环境. DLIB 有开源许可, 因此可以在任何应用程序中免费使用.
详细介绍: http://dlib.net/python/index.html
实现的功能有很多:
使用起来也是比较简单的, 首先进行安装:
- pip install dlib
- pip install opencv-python
关于人脸检测这块的函数是 get_frontal_face_detector
写一个测试脚本:
- import cv2
- import sys
- import dlib
- detector = dlib.get_frontal_face_detector() # init detector
- img_file = sys.argv[1]
- img = cv2.imread(img_file)
- img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # convert to gray img to speed
- faces = detector(img_gray, 1) # detect input img, para 1 means 1 times upsamle
- for face in faces: # may be many faces in one image
- print(face)
- y1 = face.bottom() # detect box bottom y value
- y2 = face.top() # top y value
- x1 = face.left() # left x value
- x2 = face.right() # right x value
- print(x1, x2, y1, y2)
- # add detect box in image
- cv2.rectangle(img,(int(x1),int(y1)),(int(x2),int(y2)),(0,255,0),3)
- cv2.imshow('new.jpg', img)
- cv2.waitKey(0)
- python test.py image1
单人情况下, image1:
在这里插入图片描述
结果:
- [(161, 247) (546, 632)]
- 161 546 632 247
多人情况下, img2:
结果:
关于 get_frontal_face_detector 的使用参数可以看下官方例子:
- #!/usr/bin/python
- # The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
- #
- # This example program shows how to find frontal human faces in an image. In
- # particular, it shows how you can take a list of images from the command
- # line and display each on the screen with red boxes overlaid on each human
- # face.
- #
- # The examples/faces folder contains some jpg images of people. You can run
- # this program on them and see the detections by executing the
- # following command:
- # ./face_detector.py ../examples/faces/*.jpg
- #
- # This face detector is made using the now classic Histogram of Oriented
- # Gradients (HOG) feature combined with a linear classifier, an image
- # pyramid, and sliding Windows detection scheme. This type of object detector
- # is fairly general and capable of detecting many types of semi-rigid objects
- # in addition to human faces. Therefore, if you are interested in making
- # your own object detectors then read the train_object_detector.py example
- # program.
- #
- #
- # COMPILING/INSTALLING THE DLIB PYTHON INTERFACE
- # You can install dlib using the command:
- # pip install dlib
- #
- # Alternatively, if you want to compile dlib yourself then go into the dlib
- # root folder and run:
- # python setup.py install
- #
- # Compiling dlib should work on any operating system so long as you have
- # CMake installed. On Ubuntu, this can be done easily by running the
- # command:
- # sudo apt-get install cmake
- #
- # Also note that this example requires Numpy which can be installed
- # via the command:
- # pip install numpy
- import sys
- import dlib
- detector = dlib.get_frontal_face_detector()
- win = dlib.image_window()
- for f in sys.argv[1:]:
- print("Processing file: {}".format(f))
- img = dlib.load_rgb_image(f)
- # The 1 in the second argument indicates that we should upsample the image
- # 1 time. This will make everything bigger and allow us to detect more
- # faces.
- dets = detector(img, 1)
- print("Number of faces detected: {}".format(len(dets)))
- for i, d in enumerate(dets):
- print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
- i, d.left(), d.top(), d.right(), d.bottom()))
- win.clear_overlay()
- win.set_image(img)
- win.add_overlay(dets)
- dlib.hit_enter_to_continue()
- # Finally, if you really want to you can ask the detector to tell you the score
- # for each detection. The score is bigger for more confident detections.
- # The third argument to run is an optional adjustment to the detection threshold,
- # where a negative value will return more detections and a positive value fewer.
- # Also, the idx tells you which of the face sub-detectors matched. This can be
- # used to broadly identify faces in different orientations.
- 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]))
重点说明第二个参数, 设置为 1 表示一次上采样, 对原图进行上采样放大, 能够使得检测器检测出更多的人脸. 也可以设置为其它值, 比如 2, 表示进行两次上采样.
参考
人脸检测算法综述
人脸检测背景介绍和发展现状
dlib GitHub
来源: https://yq.aliyun.com/articles/739270