Python中国社区  »  docker

树莓派 + Docker 轻松实现人脸识别应用

Docker • 4 天前 • 17 次点击  


人脸识别技术已经被广泛应用在众多场景中。今天我们将利用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接口,然而在树莓派上搞深度学习应用开发并非易事。

  1. 很多包需要下载编译,以孱弱的Raspberry Pi编译应用,需要极大的耐心。

  2. 然而开源的深度学习框架很多,不同类库的依赖不同,有些会互相冲突,比如有些需要Python 2.7,有些则依赖 3.x。虽然我们可以用virtualenv对Python环境进行隔离,但是对于一些系统级的依赖冲突就不好办了。在漫长构建中遇到依赖导致编译失败,让人非常有挫败感。

  3. 如果需要在另外一块板上部署相同应用,整个过程需要重新来过。


下面我们将利用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 = ""
       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基本理念;微服务架构;微服务的容器化等,点击识别下方二维码加微信好友了解具体培训内容



点击阅读原文链接即可报名。

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/vDuCOFPQIL
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/5274
 
17 次点击  
分享到微博
分享
社区所有版块导航
Python
python开源   pycharm   Django   Python   DjangoApp  
DATA
docker   Elasticsearch  
WEB开发
linux   Git   zookeeper   MongoDB   bottle   tornado   Redis   IE   NoSql   DATABASE   MQ   Bootstrap   NGINX   js   其他Web框架   peewee   Jquery   web工具  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广