此文章教你如何使用谷歌Colaboratory实现静止图片的人脸识别和划框框。
CoLab最大好处:GPU计算速度快!
注:
· 国内登陆Colab需使用到梯梯才能使用;
· 初次接触Colab同学请先自行搜索熟悉基本操作;
· 同学们可自行尝试将代码放到Jetson Nano环境,或其他具备GPU环境运行;
· ipynb格式的教程传送门在此。
准备工作& 安装库
1) CoLab开启GPU支持
上方菜单栏 ➡ 代码执行程序 ➡ 更改运行时类型 ➡ 笔记本设置 ➡ 硬件加速器:GPU
2) 安装:依赖项
通过apt安装一些基本库,为了支持numpy和dlib的运行
(注:CuLab内置已经有numpy)
!sudo apt-get update
!sudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev
!pip3 install numpy
3) 安装:Dlib深度学习库
大师Davis King创建的深度学习库,使得face_recognition库的运行效率大大提高。
下载dlib,解压代码,安装dlib
(CuLab环境下安装需10分钟左右,耐心等待一下)
!wget http://dlib.net/files/dlib-19.17.tar.bz2
!tar jxvf dlib-19.17.tar.bz2
!cd dlib-19.17;python setup.py install
4) 安装:人脸识别库 Face_recognition
以上完成之后,我们就开始安装人脸识别python库face_recognition啦:
!sudo pip3 install face_recognition
加载大神Adam Geitgey在GitHub的源代码文档
!git clone https://github.com/ageitgey/face_recognition.git
(一)人脸划框框(一步步教你玩)
加载人脸识别、OpenCV和MatPlotlib库
import face_recognition
import cv2
import matplotlib.pyplot as plt
首先我们先下载一张复仇联盟合照,将其图片Wget下载到“文件”根目录下,并修改命名为avengers_cast.jpeg
然后通过load_image_file可以将图片文件转变为数组数据,利用MatPlotlib的imshow来输出原图像。
!wget https://www.cheatsheet.com/wp-content/uploads/2019/05/The-Avengers-Cast-640x427.jpg -O avengers_cast.jpeg
image = face_recognition.load_image_file("/content/avengers_cast.jpeg")
plt.imshow(image)
face_locations模块对图像数据进行处理,定位人脸位置:四值 ➡ 两坐标: y1,x1,y2,x2
face_locations = face_recognition.face_locations(image)
#统计出一共多少人脸数
print("图像检测到人脸数:", len(face_locations))
#输出所有人脸定位数据
print (face_locations)
得到以下结果:
图像检测到人脸数: 7
[(118, 197, 154, 161), (98, 325, 134, 289), (98, 253, 134, 217), (103, 415, 146, 371), (84, 544, 127, 501), (78, 481, 114, 445), (118, 103, 161, 59)]
利用cv2的rectangle函数进行画框:
参考函数讲解OpenCV Python 2D绘制矩形
#为第一个人脸画框(注意xy轴数值输入顺序)
img_test = cv2.rectangle(image, (face_locations[0][1], face_locations[0][0]), (face_locations[0][3], face_locations[0][2]), (255,0,0),5)
#输出效果图像
plt.imshow(img_test)
编写循环语句,为所有人脸画框:
#为所有人脸画框
for i in face_locations:
img1_detect = cv2.rectangle(image, (i[1], i[0]), (i[3], i[2]), (255,0,0),5)
#输出效果图像
plt.imshow(img1_detect)
接下来,我再找多个案例来试试:马爸爸与校友合照
#案例2:下载图片
!wget http://5b0988e595225.cdn.sohucs.com/images/20180513/0b958761ba0f4b99b35747ac656f4ec4.jpeg -O Jack_Ma_schoolmates.jpeg
#将图片数据化赋值到img2
img2 = face_recognition.load_image_file("/content/Jack_Ma_schoolmates.jpeg")
#识别人脸数据
face_locations_img2 = face_recognition.face_locations(img2)
#为所有人脸画框
for i in face_locations_img2:
img2_detect = cv2.rectangle(img2, (i[1], i[0]), (i[3], i[2]), (255,0,0), 5)
#输出效果图像
plt.imshow(img2_detect)
#统计出一共多少人脸数
print("图像总人脸数:", len(face_locations_img2))
以上例子就能发现,这人脸识别并不完美:
部分同学未被识别入框,且前排蓝色衣服同学某衣服处竟然被错认为是人脸!
为什么会这样子?是因为本项目的人脸识别是基于C++开源库dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行训练,这个库的人脸数据几乎都是外国成人…… 因此,
此人脸识别模型对亚洲人和小孩脸的识别准确率尚待提升。