树莓派 + Docker 轻松实现人脸识别应用
2018-01-12 00:00
751 查看
人脸识别技术已经被广泛应用在众多场景中。今天我们将利用Docker容器在树莓派上快速打造一个人脸识别应用。
本文使用 https://github.com/ageitgey/facerecognition 开源框架,基于 dlib(Deep Metric Learning)支持人脸识别功能。dlib 在Labeled Faces in the Wild 测试基准上的准确率达到 99.38%。facerecognition的应用开发极为简单,只用几行 Python 命令行就可以轻松实现人脸识别应用,而且也提供了树莓派的支持。
在Raspberry Pi 2+ 平台安装face_recognition的指南如下:https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65树莓派是Geek们最爱的开发板,其原因就在于成熟的软件生态和丰富的I/O接口,然而在树莓派上搞深度学习应用开发并非易事。
很多包需要下载编译,以孱弱的Raspberry Pi编译应用,需要极大的耐心。
然而开源的深度学习框架很多,不同类库的依赖不同,有些会互相冲突,比如有些需要Python 2.7,有些则依赖 3.x。虽然我们可以用virtualenv对Python环境进行隔离,但是对于一些系统级的依赖冲突就不好办了。在漫长构建中遇到依赖导致编译失败,让人非常有挫败感。
如果需要在另外一块板上部署相同应用,整个过程需要重新来过。
下面我们将利用Docker来构建打包应用镜像,这样可以一次构建到处运行,也可以充分利用Dockerfile自带的分层能力,可以方便地调整依赖包,这样在开发部署过程中格外高效。树莓派上部署人脸识别应用
得益于树莓派和Docker安装部署人脸识别开发环境非常简单:
1、在 Raspberry PI 3 安装最新的 Raspbian。
2、执行如下命令安装最新的 Docker Engine 社区版。
# Install Docker curl -sSL https://get.docker.com | sh # Add pi to Docker group sudo usermod pi -aG docker # config cgroup for Docker echo Adding " cgroup_enable=cpuset cgroup_enable=memory" to /boot/cmdline.txt sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt # if you encounter problems, try changing cgroup_memory=1 to cgroup_enable=memory. orig="$(head -n1 /boot/cmdline.txt) cgroup_enable=cpuset cgroup_memory=1" echo $orig | sudo tee /boot/cmdline.txt sudo reboot
3、安装 Raspberry Camera ,我用的是Camera Module2 注意蓝色胶带对着以太网接口方向。并通过 raspi-config 命令来开启 camera 模块。
4、在容器中开发、运行facerecognition应用,我们可以利用如下的命令来启动容器。其包含了facerecognition 的完整开发环境和示例应用。下文会介绍镜像的具体信息。
docker run -it \ --name face_recognition \ --device /dev/vchiq \ registry.cn-hangzhou.aliyuncs.com/denverdino/face_recognition \ bash
其中关键之处就在于将摄像头设备/dev/vchiq挂载到容器内部,这样就可以让容器中的应用来拍摄照片和视频。
大家可以利用 docker cp 命令,向容器中拷贝文件,比如照片,或者在容器中利用 nano 等命令来编辑代码。人脸识别应用解析
基于 examples/facereconraspberry_pi.py 我修改了一个面部识别应用供参考,其实现如下:
# This is a demo of running face recognition on a Raspberry Pi. # This program will print out the names of anyone it recognizes to the console. # To run this, you need a Raspberry Pi 2 (or greater) with face_recognition and # the picamera[array] module installed. # You can follow this installation instructions to get your RPi set up: # https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65 import face_recognition import picamera import numpy as np known_face_encodings = [] names = [] def load_face_encoding(name, file_name): image = face_recognition.load_image_file(file_name) face_encoding = face_recognition.face_encodings(image)[0] known_face_encodings.append(face_encoding) names.append(name) # Get a reference to the Raspberry Pi camera. # If this fails, make sure you have a camera connected to the RPi and that you # enabled your camera in raspi-config and rebooted first. camera = picamera.PiCamera() camera.resolution = (320, 240) output = np.empty((240, 320, 3), dtype=np.uint8) # Load a sample picture and learn how to recognize it. print("Loading known face image(s)") load_face_encoding("Yi Li", "yili.jpg") load_face_encoding("Zhang Kai", "zhangkai.jpg") load_face_encoding("Che Yang", "cheyang.jpg") # Initialize some variables face_locations = [] face_encodings = [] while True: print("Capturing image.") # Grab a single frame of video from the RPi camera as a numpy array camera.capture(output, format="rgb") # Find all the faces and face encodings in the current frame of video face_locations = face_recognition.face_locations(output) print("Found {} faces in image.".format(len(face_locations))) face_encodings = face_recognition.face_encodings(output, face_locations) # Loop over each face found in the frame to see if it's someone we know. for face_encoding in face_encodings: # See if the face is a match for the known face(s) matches = face_recognition.face_distance(known_face_encodings, face_encoding) name = "<Unknown Person>" min_distance = min(matches) if min_distance < 0.6: i = matches.argmin() name = names[i] print("I see someone named {}!".format(name))首先,代码中通过如下方法,加载指定人名的头像照片,您可以把自己、好基友的照片加入人脸库。
load_face_encoding("Yi Li", "yili.jpg")
然后,摄像头持续拍摄照片,如下方法会检测到照片中的面部信息。
face_locations = face_recognition.face_locations(output) ... face_encodings = face_recognition.face_encodings(output, face_locations)
然后,对比面部信息和已知人脸信息的相似度,如果超过一个阈值,返回最为相近的同学名称,这样一个简单的人脸识别应用就完成了,是不是非常简单?
matches = face_recognition.face_distance(known_face_encodings, face_encoding)
运行的结果如下:
# python3 facerec_on_raspberry_pi.py Loading known face image(s) Found 0 faces in image. Capturing image. Found 0 faces in image. Capturing image. Found 1 faces in image. I see someone named Yi Li! ...
效果符合预期,但是受限于树莓派的处理能力,还远远达不到实时的效果,识别出人脸需要几秒的延迟。但是已经可以应用于一些简单的场景了,大家自己去开脑洞自己开发吧。
大家如果需要定制自己的人脸识别应用,可以从 https://github.com/denverdino/facerecognitionpi 获得相关的Dockerfile,来根据自己的需要构建一个完整的应用。
FROM resin/raspberry-pi-python:3 COPY pip.conf /root/.pip/pip.conf RUN apt-get -y update RUN apt-get install -y --fix-missing \ build-essential \ cmake \ gfortran \ git \ wget \ curl \ graphicsmagick \ libgraphicsmagick1-dev \ libatlas-dev \ libavcodec-dev \ libavformat-dev \ libboost-all-dev \ libgtk2.0-dev \ libjpeg-dev \ liblapack-dev \ libswscale-dev \ pkg-config \ python3-dev \ zip \ && apt-get clean && rm -rf /tmp/* /var/tmp/* RUN python3 -m ensurepip --upgrade && pip3 install --upgrade picamera[array] dlib # The rest of this file just runs an example script. # If you wanted to use this Dockerfile to run your own app instead, maybe you would do this: # COPY . /root/your_app_or_whatever # RUN cd /root/your_app_or_whatever && \ # pip3 install -r requirements.txt # RUN whatever_command_you_run_to_start_your_app RUN git clone --single-branch https://github.com/ageitgey/face_recognition.git RUN cd /face_recognition && \ pip3 install -r requirements.txt && \ python3 setup.py install CMD cd /face_recognition/examples && \ python3 recognize_faces_in_pictures.py
大家如果希望将自己应用打包到Docker镜像中,可以添加修改Dockerfile,我就不多说了。
最后来晒一下我的树莓派3配置,除了Camera之外还加装了一个液晶显示屏,通过GPIO驱动,可以方便地通过编程来显示CPU/Memory/温度等各种信息。
总结
容器技术已经越来越多运用于IoT、边缘计算等场景,利用容器可以极大地简化智能设备的应用生命周期管理。今天我们演示了一个运行在树莓派上的人脸识别应用。本文实例代码可以从 https://github.com/denverdino/facerecognitionpi 获取。
2017我们见证了容器技术的快速发展,Kubernetes,Containerd/OCI等容器技术标准得到了生态的共识,这也将催生更多的应用创新。2018我们不但可以看见容器在企业用户的生产环境中被广泛应用,容器技术也将无处不在,给我们更多的惊喜。
原文链接:https://yq.aliyun.com/articles/346459
基于Kubernetes的DevOps实践培训
本次培训包含:Kubernetes核心概念;Kubernetes集群的安装配置、运维管理、架构规划;Kubernetes组件、监控、网络;针对于Kubernetes API接口的二次开发;DevOps基本理念;微服务架构;微服务的容器化等,点击识别下方二维码加微信好友了解具体培训内容。
点击阅读原文链接即可报名。
相关文章推荐
- 在树莓派上实现face++人脸识别
- FullPage.js – 轻松实现全屏滚动(单页网站)效果的应用
- 人脸检测和识别及python实现系列(2)-- 相关API介绍与数据采集
- 国内外有名的人脸识别技术专家和企业及应用场景
- iOS利用CoreImage实现人脸识别详解
- 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别
- face++实现人脸识别
- OpenCV中人脸识别代码实现
- MP算法、OMP算法及其在人脸识别的应用
- 【Caffe实践】基于Caffe的人脸识别实现
- C#实现人脸识别【SqlHelper】
- 利用Emgu.CV实现人脸识别详解 (C#)--附源码
- 人脸识别应用face+
- 在ArcGIS 10中轻松实现将应用移植到云计算平台
- Kubernetes 分布式应用部署实战:以人脸识别应用为例
- CNN卷积神经网络应用于人脸识别(详细流程+代码实现)和相应的超参数解释
- 利用Docker轻松实现云原生应用
- 人脸识别之人脸检测(八)--HOG特征原理及实现
- 【图像识别】 Python+Opencv调用摄像头实现人脸识别并保存视频
- 【Caffe实践】基于Caffe的人脸识别实现