手把手教学,人脸检测小案例 opencv+MTCNN

2021-05-08 15:16:14 浏览数 (1)

哈喽,大家好,今天我们一起来做一个人脸检测的小应用案例,看看现在满大街普及的人脸检测到底是个什么玩意儿。其实,这个技术没那么唬人,现在技术已经非常成熟啦。小白同学可以跟着我一步一步操作,就能够实现。

具体操作流程如下:

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

0 人点赞