TA的每日心情 | 开心 2019-11-4 13:48 |
---|
签到天数: 14 天 连续签到: 1 天 [LV.3]偶尔看看II
|
最近准备系统地学习一下深度学习和TensorFlow,就以人脸识别作为目的。
十年前我做过一些图像处理相关的项目和研究,涉及到图像检索。记得当时使用的是SIFT特征提取,该特征算子能很好地抵抗图像旋转、仿射变换等变化。可以说SIFT是图像特征工程方面做得很出色的算子。
现如今深度学习特别是CNN,ResNet等模型被研究者发明之后,图像特征工程似乎已经很“没有必要”了。深度神经网络通过多层表示能够更抽象地表示图像的特征(称作embedding)。
在人脸识别也得益于深度学习,其中facenet的性能非常出色。facenet基于triplet loss训练模型输出128维embedding。训练时准备M个人,每个人N张图像,目标使得同一个人的不同人脸的embedding距离尽量小,而不同人的人脸图像的embedding尽量大。
本文将描述基于raspberry 3B + movidius作为硬件平台,TensorFlow facenet作为模型实现人脸识别。后续将基于这套edge computing做一套完整的人脸识别系统,例如考勤系统。【AI入门学习套件】raspberry 3B + movidius在爱板商城也有卖,有兴趣的可以点击>商城购买链接
本文将不涉及在线人脸检测过程。
raspberry 3B
当前的系统:
- pi@raspberrypi:~ $ uname -a
- Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux
复制代码
相关外设:
TensorFlow准备
首先在raspberry上安装TensorFlow。目前raspberry上预装了python2.7和python3.5.我们选择python3.5.
从https://github.com/lhelontra/tensorflow-on-arm/releases下载tensorflow-1.3.1-cp35-none-linux_armv7l.whl并安装:
- pip3 install tensorflow-1.3.1-cp35-none-linux_armv7l.whl
复制代码
可能需要pip3一些别的:
- # numpy issue
- sudo apt-get install libatlas-base-dev
- # opencv cv2
- pip3 install opencv-python
- sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
- pip3 install sklearn
- pip3 install scipy
- # qt issue
- sudo apt-get install libqtgui4 libqt4-test
复制代码
测试:
- pi@raspberrypi:~ $ python3
- Python 3.5.3 (default, Jan 19 2017, 14:11:04)
- [GCC 6.3.0 20170124] on linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import tensorflow
- >>> tensorflow.__version__
- '1.3.1'
复制代码
pi上运行facenet
有了TensorFlow之后我们可以编译facenet并在pi上运行。https://github.com/davidsandberg/facenet/tree/tl_revisited
基于模型20170512-110547运行compare.py来比较多张图像中人脸的距离。发现速度非常慢。
具体说,首先检测图像中的人脸,这里运行了mtnet网络,然后再通过facenet网络inference。单独测试inference的时间开销20+秒(inference时人脸图像都是160x160)。相比之下用dlib的开销在2秒左右。这样的性能很让人沮丧?
为了将facenet进行到底,我选择加速,movidius是神经计算神器,inference速度非常快。
movidius sdk 安装
clone代码
- git clone -b ncsdk2 https://github.com/movidius/ncsdk.git
复制代码
因为我们事先安装了TensorFlow,所以修改ncsdk.conf,不再安装TensorFlow,但是还需要caffe
- INSTALL_DIR=/opt/movidius
- INSTALL_CAFFE=yes
- CAFFE_FLAVOR=ssd
- CAFFE_USE_CUDA=no
- INSTALL_TENSORFLOW=no
- INSTALL_TOOLKIT=yes
- PIP_SYSTEM_INSTALL=no
- VERBOSE=yes
- USE_VIRTUALENV=no
- #MAKE_NJOBS=1
复制代码 make install
ncs model编译
clone代码:
- git clone -b ncsdk2 https://github.com/movidius/ncappzoo.git
复制代码 在tensorflow/facenet下,根据README一步一步编译。最终得到facenet_celeb_ncs.graph文件,这个文件是movidius识别的图模型文件。
Movidius人脸识别
这里我先不考虑在线人脸检测。先准备一张照片,离线人脸检测并保存人脸图像作为比对目标。先以一张人脸为例,多个人脸图像其实是一样的。
在线检测时我们将摄像头的resolution设置小一些,例如280x280。在线识别是,人脸尽量靠近摄像头,这样可以认为这张照片就是人脸照片。或者也可以限定人脸在显示屏上给定的一个区域。
目前inference的速度~100ms,当前对ncs还不是很了解,待进一步研究后再优化。
代码如下(保存在ncappzoo/tensorflow/facenet)
- VALIDATED_IMAGES_DIR + '/my1.png'
复制代码 是一张人脸图像,通过人脸检测得到后保存的结果
本文作者 wlu,转载自cnblogs
|
|