0x01 写在前面

本学期有一门专业选修课《大数据分析与隐私保护》,期末需要完成一个小组项目,也不是很复杂就是想让我们玩玩神经网络啊,深度学习啊啥的。

于是和小组成员HiramdriveTom简单讨论了几个想法之后,遂决定把想法都试试,看看可行性。

于是我搜集资料的过程中找到了大佬们的库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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 导入库
import face_recognition

# 读取第一张图片
pic1 = face_recognition.load_image_file('pic1.jpg')

# 将第一张图片编码(转化为向量)
# face_encodings 返回的是一个列表,表中元素是识别出来的图片中的脸,若图中有多张脸也可以识别出来
# 这里我们只取了第一张脸
# 如果这里报错了(index out of range)就说明该模型没有识别出来人脸 返回的应该是一个空列表
pic1_encode = face_recognition.face_encodings(pic1)[0]

# 故技重施 读取第二个图
pic2 = face_recognition.load_image_file('pic2.jpg')

# 故技重施 编码第二个图
pic2_encode = face_recognition.face_encodings(pic2)[0]

# 判断这两个图中的人是不是同一个
# compare_faces 第一个参数是一个列表,是需要比对的脸,他会返回一个列表表示第二个参数与第一个列表中的每一个脸是否是同一个
# 这里我们只有两张脸 所以第一个参数就自成一个列表,我们也取第一个
# tolerance 越小,要求比较的两个脸也必须越接近才能判断是同一个脸
# 若 results 是 True 则是同一个人,否则就不是同一个人
# 他的原理应该就是计算两个脸的距离,当距离小于 tolerance 时,就判断是同一个人
results = face_recognition.compare_faces([pic1_encode], pic2_encode, tolerance=0.5)[0]

提供两个可以用的胡歌。感谢胡歌提供的图片。

huge1

huge2

usage

0x04 结合 opencv 玩

有了上述的代码,我们就可以结合 opencv 打开摄像头开始happy了。

官方提供了一份样例 demo

于是下载下来,结合自己的情况简单改改就OK啦。

这里就是坑所在的地方了。

找不到 cv2

cv2 是代码中导入 opencv ,于是我们可以安装就好了。

首先我们知道 Windows 上我们安装的命令是 pip install opencv-python 可以一瞬成功,但是 Ubuntu 失败了。

1
2
# Windows 安装 opencv
pip install opencv-python

于是查阅资料,发现应该用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
import time

capture = cv2.VideoCapture(0)
time.sleep(1)

while True:
ret, frame = capture.read()
frame = cv2.flip(frame,1) #镜像操作
cv2.imshow('Photo_Detect',frame) #显示窗口 查看实时图像
key = cv2.waitKey(50)
if key == ord('q'): #判断是哪一个键按下
break
cv2.destroyAllWindows()

这个代码用 Windows 跑没有问题,说明代码没问题。

查阅资料重新配置了 VMware 的 usb 来设置摄像头。在 虚拟机 -> 可移动设备 -> 摄像头名字 (这里因设备而异哈)连接这个摄像头。

连接摄像头

然后在虚拟机的右下角就会有一个小标志表示摄像头。绿色小点点说明虚拟机在使用中,否则点它一下,VMware 会给一个弹窗,确定就好,然后就有绿色小点点了。

摄像头图标

然后通过下面的命令查看有没有输出,输出类似于这个样子 /dev/video0 没有就不对。

1
ls /dev/video*

显示摄像头

然后可以用这个工具 cheese 检测摄像头是否正常 ,在终端输入这个命令会弹出来一个摄像头的窗口。

若没有这个命令,可以先安装。

1
sudo apt-get install cheese

正常情况就会弹出一个框,实时的摄像头画面,里面有自己的高雅美照。若是黑的框框就说明它不对。

那我们就从 VMware 的虚拟机设置中,将 usb 的连接设置为 3.* 再断开摄像头重连一下。他会自动挂起虚拟机一下。

修改USB到3.x

然后再用 cheese 试试。就可以一瞬看到自己的高雅美照了。

cheese看自己高雅美照

然后再运行脚本,运气好就可以一瞬成功了。运气不好就可能还得改。

还是不对

运气不好的朋友还是不对,还有报错。不知道还真以为代码有问题,这个 resize 有问题,实则不是,这个是无问题的。只是他没有正确捕获到图片,还是摄像头连接的问题。我从另一个参考资料里面得到了解释。

错误assertion

还是之前的命令 ls /dev/video*

1
ls /dev/video*

看看返回的结果是啥,我这里刚好有 0,我也不知道为啥有两个。

1
/dev/video0  /dev/video1

这个时候,代码中获取摄像头的地方就要改变啦。

videoCapture

1
2
# Get a reference to webcam #0 (the default one)
video_capture = cv2.VideoCapture(0)

这个 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