Billio比利奥
Billio比利奥

目录

CoLab – 图像人脸检测_框出人脸

CoLab – 图像人脸检测_框出人脸

此文章教你如何使用谷歌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人脸数据集进行训练,这个库的人脸数据几乎都是外国成人…… 因此,

此人脸识别模型对亚洲人和小孩脸的识别准确率尚待提升