0x01 写在前面
本学期有一门专业选修课《大数据分析与隐私保护》,期末需要完成一个小组项目,也不是很复杂就是想让我们玩玩神经网络啊,深度学习啊啥的。
于是和小组成员Hiram和driveTom简单讨论了几个想法之后,遂决定把想法都试试,看看可行性。
于是我搜集资料的过程中找到了大佬们的库face_recognition,测试了下效果局得还不错。于是便和成员决定试试看。
0x02 安装 face_recognition
大概浏览了网上的教程,似乎都说得挺难的。我就怀着忐忑的信息试了试。(最开始是在百度的 aistudio 上试的,感谢百度。
1 | pip install face_recognition |
虽然过程慢的一批,但是还是一瞬成功了。而后面的使用也是成功的,说明确实是一瞬成功了。
然后看网上说的,这个是有很多C语言整的,可能比较麻烦。我尝试在我的 Windows 10
上进行安装,果不其然出错了。说是缺少 cmake
。想着 Windows
上整这玩意比较麻烦,于是我就想转到我的 Ubuntu
虚拟机中试试。于是有了后文。
Ubuntu 中首先安装一下 cmake
如果没有的话
1 | sudo apt-get install cmake |
然后再执行前面的 pip
命令就好了
1 | pip install face_recognition |
虽然过程还是比较慢,但是还是可以一瞬成功,并且可以用。
0x03 简单使用
从知乎那里剽窃到了使用教程。只需要6行就可以简单使用起来。
1 | # 导入库 |
提供两个可以用的胡歌。感谢胡歌提供的图片。
0x04 结合 opencv 玩
有了上述的代码,我们就可以结合 opencv
打开摄像头开始happy了。
官方提供了一份样例 demo。
于是下载下来,结合自己的情况简单改改就OK啦。
这里就是坑所在的地方了。
找不到 cv2
cv2
是代码中导入 opencv
,于是我们可以安装就好了。
首先我们知道 Windows
上我们安装的命令是 pip install opencv-python
可以一瞬成功,但是 Ubuntu
失败了。
1 | Windows 安装 opencv |
于是查阅资料,发现应该用 sudo apt-get install python-opencv
。好的整一个。
1 | sudo apt-get install python-opencv |
一瞬安装成功了,那就走脚本吧!
可是报错还是找不到 cv2
。这是什么情况呢?明明安装成功了。那找不到就只有可能是安装在其他地方了所以找不到。于是不得不怀疑是不是装在 python2
中了,毕竟这双 python
环境有好有坏。用终端的 python2
测试一波,实锤了。
于是,怎么装到 python3
里面去呢?我突发奇想,或许可以试试 sudo apt-get install python3-opencv
。
1 | sudo apt-get install python3-opencv |
于是一瞬成功了。也可以成功运行了。
打不开摄像头
程序前面都正常了,可就是这个摄像头弹不出来。单独用 opencv
整一个弹摄像头画面的脚本跑跑,发现也弹不出来,因此是摄像头这里的问题了。
下面的单纯弹摄像头显示高雅美照的。
1 | import cv2 |
这个代码用 Windows
跑没有问题,说明代码没问题。
查阅资料重新配置了 VMware 的 usb
来设置摄像头。在 虚拟机
-> 可移动设备
-> 摄像头名字
(这里因设备而异哈)连接这个摄像头。
然后在虚拟机的右下角就会有一个小标志表示摄像头。绿色小点点说明虚拟机在使用中,否则点它一下,VMware 会给一个弹窗,确定就好,然后就有绿色小点点了。
然后通过下面的命令查看有没有输出,输出类似于这个样子 /dev/video0
没有就不对。
1 | ls /dev/video* |
然后可以用这个工具 cheese
检测摄像头是否正常 ,在终端输入这个命令会弹出来一个摄像头的窗口。
若没有这个命令,可以先安装。
1 | sudo apt-get install cheese |
正常情况就会弹出一个框,实时的摄像头画面,里面有自己的高雅美照。若是黑的框框就说明它不对。
那我们就从 VMware 的虚拟机设置中,将 usb
的连接设置为 3.*
再断开摄像头重连一下。他会自动挂起虚拟机一下。
然后再用 cheese
试试。就可以一瞬看到自己的高雅美照了。
然后再运行脚本,运气好就可以一瞬成功了。运气不好就可能还得改。
还是不对
运气不好的朋友还是不对,还有报错。不知道还真以为代码有问题,这个 resize
有问题,实则不是,这个是无问题的。只是他没有正确捕获到图片,还是摄像头连接的问题。我从另一个参考资料里面得到了解释。
还是之前的命令 ls /dev/video*
1 | ls /dev/video* |
看看返回的结果是啥,我这里刚好有 0
,我也不知道为啥有两个。
1 | /dev/video0 /dev/video1 |
这个时候,代码中获取摄像头的地方就要改变啦。
1 | # Get a reference to webcam #0 (the default one) |
这个 0
就不是默认了,如果上面 ls /dev/video*
的输出结果中含有 0
,那就还是 0
。不是就得改。
改成啥呢?我也不知道。有一次我的输出结果是
1 | /dev/video4 /dev/video5 |
我就从 0
一直改到了 4
,然后就可以了,为啥是 4
我也不知道。也不想深究了。。。。。。
0x05 结果展示
然后就可以开心 happy 了。
自我欣赏美照,框出来我是谁,还能框我手机里面的照片是谁。效果还行。
参考
face_recognition: https://github.com/ageitgey/face_recognition
知乎用法教程: https://zhuanlan.zhihu.com/p/77678302
虚拟机连接物理机摄像头: https://blog.csdn.net/u012005313/article/details/82146385
选择正确的摄像头: https://blog.csdn.net/u011888840/article/details/106146285