哈喽,大家好,今天我们一起来做一个人脸检测的小应用案例,看看现在满大街普及的人脸检测到底是个什么玩意儿。其实,这个技术没那么唬人,现在技术已经非常成熟啦。小白同学可以跟着我一步一步操作,就能够实现。
具体操作流程如下:
1. 打开电脑上命令行窗口,如图所示:
2. 安装软件包virtualenv, 用于创建虚拟环境。命令如下:
pip install virtualenv
3. 进入桌面,并创建新的文件夹,名称为:Face_Detection,操作如下图:
4. 创建项目所在的虚拟环境,名称为:FD,操作如下图:
5. 进入虚拟环境,并查看默认已经安装的软件包。操作如下图:
【注意:在最前面有(FD),说明我们已经进入到了虚拟环境下。】
6. 安装我们接下来需要用到的软件包opencv,操作如下图:
7. 检验opencv是否安装成功,操作如下图:
【注意:我这里的opencv版本是4.5.1,你和我默认安装的版本可能不同,不过,这并不影响后续操作。】
8. 这里我们使用opencv官网提供的预训练模型(级联正脸检测模型),下载地址如下:
链接: https://pan.baidu.com/s/1xLPrxVVqvXDYAzuVmCaHpg 密码: u8c7
【注意:将该文件放入项目Face_Detection文件夹下】
9. 从这里开始,我们需要写一个python代码文件了。不过,非常简答。具体如下:
【注意:建议各位同学到百度下载代码编辑工具:sublime ,非常方便、高效。下载路径:https://www.sublimetext.com ,由于我提前已经下载、安装了,这里不再演示。安装真的非常简答 ^_^ 】
首先,新建一个空白的python文件,保存到项目文件Face_Detection下,操作如下图所示:
10. 查看我们的项目Face_Detection文件夹下的内容:
11. 准备人脸检测的素材,这里我提供了网上两张图片。如下:
12. 开始写一些代码啦,不过,不用担心,都是写非常简单的内容。后附上代码,各位同学可以直接粘贴、复制、运行。
运行程序,并输出检测框的值,截图如下:
一共输出4个bbox的值,对应着图片1中的4张人脸,所以,检测准确。
13. 我们将在图片上绘制人脸检测框,即做上标记。代码如下:
接下来,运行代码文件,如图所示:
程序运行结果,如图所示:【检测结果其实比较粗糙,检测框并不是很准确。毕竟这个模型不是深度学习的模型,先将就看一看吧。后面,我们还有改进版本。】
14. 接下来,我们以同样的方式在图片02.jpg上进行测试,我们只需要替换上述代码中的一行:img = cv2.imread('02.jpg') 即可。
检测输出结果如下:
检测效果很差了,很多人脸并未被检测出来。毕竟这个opencv自带的人脸检测模型还是一个很古老的工具,在当下的深度学习(卷积神经网络)时代,真的犹如大刀遇见大炮,不能相提并论。
我们继续调节一下2个参数值,看看能不能提高模型的检测效果。这里我们需要条件代码中的一行:face_bboxes = model.detectMultiScale(img),这里重点介绍一下这个函数:detectMultiScale(),具体可以参考官网介绍,链接如下:函数API ,函数里面的几个参数含义如下:
① image表示的是要检测的输入图像
② objects表示检测到的人脸目标序列
③ scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;注意:这个值必须大于1,不然会报错,这是不同版本造成的。
④ minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
我们设置新的参数值:face_bboxes = model.detectMultiScale(img, 1.01, 10),注意这个参数值可以自己调节,多运行几次代码看看效果。【opencv自带的分类器就是这么古老呀】
你会发现,有很多人脸被检测出来了,即使检测框的标注不是很准确。
15. 接下来,我们要用一下高级货啦(深度学习模型),检测效果会大幅提升。这里我们就使用一下MTCNN算法模型,这里提一句:几年前的毕业项目中我就用到了该算法做一些实现。
MTCNN算法全名是(Multi-Task Cascaded Convolutional Neural Networks),论文地址如下:https://arxiv.org/pdf1604.02878.pdf
稍微提一下该算法的核心思想:也就是3个网络,分别是P-Net,R-Net,O-Net构成。
① P-Net :提供候选脸部区域;② R-Net:过滤掉一些检测框,我们也叫bounding-boxes;③ O-Net:提供脸部五官标记。
总结来说,MTCNN算法的3个模型就做了3件事情:脸的分类,bbox回归(位置),脸部坐标点定位。具体算法,建议各位同学看一下刚刚提供的这篇论文。
关于MTCNN算法实现,建议各位同学学习一下:
https://github.com/ipazc/mtcnn
16. 好啦,接下来,我们就开始实现如何利用MTCNN进行人脸检测。
① 安装MTCNN
pip install mtcnn
② 查看mtcnn安装信息
pip show mtcnn
17. 接下来,我们需要重新创建一个python文件,写一些新代码,利用mtcnn实现人脸检测。同样的方式,我们在项目Face_Detection文件夹下创建新的python代码文件,如图所示:
18. 文件创建好啦,接下来,我们写代码,非常简单啦
接下来,我们运行这个python代码文件,如下图:
报错啦,提示我们没有安装matplotlib,简单,安装即可。
pip install matplotlib
同时,我们还需要安装tensorflow,命令如下:
pip install tensorflow-gpu
【注意:如果你的电脑上没有GPU,那么就安装:pip install tensorflow】
安装过程中,会输出一堆安装信息。
19. 我们执行刚刚创建的python代码文件face_mtcnn.py,截图如下: 【运行后,输出一堆信息】
输出信息还包含一些检测到的人脸信息,如图所示: 【bbox,confidence,keypoints】
【注意: 如果运行过程中,报错,如下:】
【解决措施: 在 face_mtcnn.py 文件中加入如下代码片段: 】
20. 根据MTCNN检测到的人脸信息,绘制人脸检测框。我们继续修改python代码文件face_mtcnn.py,具体增加内容如下:
【整个案例的代码资源我会分享,不用担心下载不到代码。No Problem :)】
21. 接下来,我们运行程序,命令如下:
python face_mtcnn.py
检测结果如下: 【虽然检测的人脸框更多了,不过,检测框不准确,还需要调参数。我们后续再改。】
22. 我们继续绘制人脸的五个关键点,分别是: 左眼,右眼,鼻子,左边嘴角,右边嘴角,继续修改代码文件face_mtcnn.py
【增加了绘制人脸的五个关键点代码】
23. 运行代码文件 face_mtcnn.py ,命令如下:
python face_mtcnn.py
输出结果如下: 【各位同学注意一下,每张人脸都有了五个关键点。】
关键点检测还是比较准确的,只是检测框不准确。这主要与网络的模型有关,如果网络训练的好,模型检测性能更佳;否则,就像现在这样,不精准。
解决措施: 可以基于一个大的人脸数据集重新训练MTCNN(主要是P-Net,R-Net,O-Net),关于这三个网络的算法实现,各位同学可以去github看看,有很多开源项目。
如果本篇点赞数过百,那我好好研究一下MTCNN算法,实现一下该算法。:)
好啦,本次案例实践圆满完成 :)如果你按照我的步骤一步一步下来,应该不会有什么问题。
如果遇到任何问题,请到B站,查看我的个人简介,添加"AI学习部落"QQ群一起讨论。
目前,我们一共有10个QQ群,学员已经超过1800名。
更多AI相关课程,请在 网易云课堂 和 B站 关注账号:唐国梁Tommy
本次课程代码资源,请在百度云盘下载:
链接:
https://pan.baidu.com/s/1qsfjLzqE97eU49UN9l7JKA
密码: b6wr