利用Python+OpenCV在树莓派上轻松实现人脸识别
上次在什么值得买发布了一篇关于人工智能认知服务的初级文章,是关于如何利用微软的云平台打造自己的QnA/FAQ自动应答聊天机器人,其实实现功能还是挺简单,如果对于流程熟悉的话,基本上十分钟就可以搭建完成了。
这回想实现一个相对复杂一些的功能,就是基本的人脸识别。
认知服务——人脸识别技术综述
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。目前这项技术已经全面应用在人们的日常生活、出行、安防当中,带来了许多便利。
目前有很多平台可以实现人脸识别的技术,比如微软的Microsoft Azure上的人脸。
我们可以在程序中调用微软的人脸API,通过返回的JSON信息判断人脸特征、表情等等。其实调用的过程并不是复杂,微软提供了详细的文档,Github上也有各种官方示例。
调用人脸API首先需要Azure账号并且申请Subscription Key,试用过后需要按调用次数购买套餐。
当然除了微软的人脸API,也有很多本地的应用可以实现类似的功能,比如本文中调用的OpenCV应用。
人脸识别的过程基本上可以总结如下:
1 人脸图像采集及检测
2 人脸图像预处理
3 人脸图像特征提取以及匹配与识别
OpenCV提供了本地的分类训练器,可以在没有网络连接的情况下,实现基本的人脸识别功能。
树莓派的开箱和准备工作
这个示例准备通过树莓派来实现。我之前也没有树莓派的把玩经验,但是之前也安装过Debian的系统,之前还曾经获取过RHCE的认证,不过因为工作中较少接触Linux系统,基本上都还给老师了。
要实现人脸识别,除了要有树莓派,还有要配套的摄像头,最好还有个液晶屏。
还在大淘宝上啥都有,我就按照“树莓派+人脸识别”的关键字进行搜索,就找到了合适的套餐,省了我不少事情。
整个套件的内容包括:
树莓派3代B型号主板板载蓝牙无线
系统16G闪迪卡
高清HDMI触摸屏幕3.5寸最大支持1920像素,送触摸笔
高清摄像头500万像素
散热片两铜一铝
电源和开关线1.5米
3D打印定制精美外壳
下面开箱看看:
实物深灰色的外观有点丑,略显粗糙,要是提供多种颜色的彩壳可选就好了。树莓派开发板上GPIO口上接了HDMI的显示屏和迷你摄像头,通过热熔胶组合。外壳基本上还算是严丝合缝。如果是需要自己拆卸的,也可以和店家说先不要粘合起来。右上角的摄像头位置可以稍微调整方位。
一侧是网口和四个USB接口,可以接驳普通的USB设备如键盘鼠标等等。
另一端有音频输入输出口和电源口。
下图可见16GB迷你SD卡已经接上去了,外壳还有散热口。
电源线有独立的开关按钮,使用还是挺方便的。
然后做一些树莓派上的准备工作:
首先当然是安装树莓派的操作系统了,淘宝卖家已经在树莓派上预装好了系统。如果想要自己安装,可以通过Win32 Disk Imager这款软件将img文件烧录至SD卡内。
成功开机,桌面会提示一个警告,因为账号pi的密码未修改 。
不过,3.5寸的显示屏实在是太小了,接上了键盘鼠标也不容易操作,所以我们还是利用传统的远程连接吧。
当然,首先要保证网络连接正常。可以ping一下确认连接成功。
通过PuTTY连接这个IP地址的22端口。
出现登录界面。
树莓派的默认管理员账号是pi,密码是raspberry。
如果习惯使用root账号的话,也可按照如下方法设置root账号。
人脸识别Python程序实现
下面就是要准备Python程序了,这里我不会深入探讨程序中的每个Python语句,因为这里不是技术论坛,再说我对Python也不熟......淘宝卖家提供了程序文件,打包放到了百度云盘上。不过再问一些技术细节就不回复了,我只好自己搜索到了github上的源代码。
其实,卖家已经在售出的树莓派上做好了所有的准备工作,如果你要重新开始的话,也可以按照github上的流程一步步实现。
sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig unzip
1. 启用v4l2
sudo nano /etc/modules
# 增加一行记录
bcm2835-v4l2
# 重启后可以找到/dev/video0
# 编译v4l2-util
apt-get install autoconf gettext libtool libjpeg8 libjpeg8-dev
git clone git://git.linuxtv.org/v4l-utils.git
cd v4l-utils/
sudo ./bootstrap.sh
./configure
make
sudo make install
2. 编译OpenCV 2.4.9
wget https://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
unzip opencv-2.4.9.zip
cd opencv-2.4.9/
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF
# 要使OpenCV开启对v4l2的支持 cmake之后要有以下输出
# V4L/V4L2: Using libv4l (ver 1.13.0)
sudo make
sudo make install
3. 安装PyQt4
sudo apt-get install python-qt4
准备工作完毕,将程序代码上传到树莓派上。方法有很多,这里我是使用SFTP协议的软件WinSCP。
使用非常方便,输入IP地址,用户名和密码连接。
第一次使用会有一个警告,直接忽略即可。
将程序文件夹拷贝至右侧目录下,注意,不要放在/tmp下面,重启之后文件会被删除。放在用户的home目录下即可。(截图中的目录不正确,大家注意哦~)
通过CD命令切换到Python程序所在的文件夹,然后运行sudo python main.py
结果收到了cannot connect to X server的错误。仔细想想就知道原因了,程序是有UI界面的,而Putty是纯命令行界面。
所以呢,我准备安装一个VNC以继续我的实验。
命令是sudo apt-get install realvnc-vnc-server
然后我们在配置界面将VNC启用,方法是首先输入sudo raspi-config
然后依次选择Interfacing Options
VNC点击Select,选择Yes启用。
然后在命令行中输入systemctl enable vncserver-virtuald.service确保服务开机自动运行
然后在另一台Window的电脑中打开VNC Viewer尝试连接。
输入pi用户名和密码
可以看到已经可以在VNC中看到树莓派的桌面了,显示效果比那个迷你屏要清晰多了。
对了,还有一步要做,示例程序的运行分辨率是竖屏的480x800,而树莓派的默认界面是横屏,不做修改的话程序的按钮是不能正常显示的。所以我们要修改树莓派的分辨率,方法是到/boot/config.txt,添加以下内容。
hdmi_cvt=800 480 60 6
hdmi_group=2
hdmi_mode=87# 设置屏幕旋转角度display_rotate=3
重启树莓派,可以看到变化。
再次运行main.py,程序就可以正常运行了。(我发现摄像头保持在原来的位置拍出来的视频是反的,所以拆下来重新安装了下)
点击人脸录入按钮,可以输入人名
然后程序会自动开始连拍,直至进度变成100%。
随后会跳出连拍的照片,可以选择面部特征明显不模糊的照片,并且将其他的照片删除,我发觉如果保留太多照片的情况下,程序运行时间会比较长,如果只是作为实验目的,保留一张照片即可。
点击返回,并且点击主界面的人脸识别按钮,将人脸对准摄像头,可以看到系统已经识别出了我的人脸,显示出了我的名字(user:XXX)和准确率(confidence:XXX)。
程序的改进建议
功能已经实现,我们还可以对程序做一些改进。比如我想让程序在识别出人脸之后,自动发邮件给我。
直接在ui.py文件中添加以下代码。目前主流Internet邮箱供应商都提供SMTP协议邮件发送方式,具体可以参见网站的使用说明。
然后当程序识别出人脸的时候通过smtp协议发送邮件。
测试了一下,效果还不错。这样我就可以将这个设备放在一个实际的应用场景中,比如公司的机房门口,我就可以知道哪些员工进出过机房,并且给我发送邮件通知。
还有就是现在需要手工运行main.py打开人脸识别程序,如果遇到断电或者树莓派重启程序就关闭了。所以,现在我希望能够让树莓派开机之后自动运行这个Python程序。
这也有很多种方法,一种是在/etc/rc.local中添加一条命令,不过我没有成功...不知道原因
还有一个方法是创建启动器(.Desktop文件):具体方法为到/home/pi/.config/autostart下创建一个任意命名的.desktop文件
然后利用vi或者nano等文本编辑器输入以下格式的文本命令行。这里最关键的一行是Exec=sh /home/pi/shell/facerec.sh,其他内容无所谓。
发张动图给大家看一下完整的启动流程。
因为这个程序还是几年前的OpenCV+Python范例,所以功能上还有不少可以改进的空间,通过这个实例,我也第一次上手接触了树莓派,了解到了人脸识别这一看似高大上的功能其实可以轻松地在树莓派上实现;下次准备做个环境监测的树莓派,用于检测环境温湿度信息,下次再和大家分享。
值友2853292317
校验提示文案
Ergo
校验提示文案
值友8522358942
校验提示文案
billygo
校验提示文案
foxholes
校验提示文案
kxbs
校验提示文案
ztwgh
校验提示文案
值友7203511797
校验提示文案
兼哲
校验提示文案
值友3452678027
校验提示文案
值友1265074342
校验提示文案
值友1265074342
校验提示文案
值友1265074342
校验提示文案
Yee11eeY
校验提示文案
值友1265074342
校验提示文案
值友3500360784
校验提示文案
值友3500360784
校验提示文案
值友2853292317
校验提示文案
值友1265074342
校验提示文案
Yee11eeY
校验提示文案
值友1265074342
校验提示文案
值友1265074342
校验提示文案
值友1265074342
校验提示文案
值友7203511797
校验提示文案
值友3452678027
校验提示文案
billygo
校验提示文案
值友8522358942
校验提示文案
kxbs
校验提示文案
兼哲
校验提示文案
Ergo
校验提示文案
ztwgh
校验提示文案
foxholes
校验提示文案