2020系统综合实践7 使用树莓派/Docker与OpenCV实现人脸识别(face_recognition)

在树莓派中安装OpenCV库

安装依赖

# 更新软件源,更新软件
sudo apt-get update && sudo apt-get upgrade

# Cmake等开发者工具
sudo apt-get install build-essential cmake pkg-config

# 图片I/O包
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

# 视频I/O包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev

# OpenCV用于显示图片的子模块需要GTK
sudo apt-get install libgtk2.0-dev libgtk-3-dev

# 性能优化包
sudo apt-get install libatlas-base-dev gfortran

# 安装 Python2.7 & Python3
sudo apt-get install python2.7-dev python3-dev

下载OpenCV源代码

推荐使用新版。我们尝试过3.3.0和4.3.0两个版本,3.3.0在编译过程中遇到了4次错误(所幸重新编译会保留之前的进度,不用从头开始),修改相应文件可解决。后续为Docker容器编译4.3.0版本时,发现编译过程中没有出现错误。

下载完成后,分别解压到同一目录下。

准备编译环境

# 安装pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo python3 get-pip.py
# 安装虚拟环境,防止依赖冲突
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

# > 重定向输出流 >> 表示追加
echo -e "\n# virtualenv and virtualenvwrapper" >> ~/.profile
echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.profile
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile

# 每次新开终端,需要虚拟环境时都要运行
source ~/.profile

# 创建虚拟环境cv
mkvirtualenv cv -p python3

# 进入虚拟环境
workon cv
# 安装numpy,较耗时
pip install numpy

编译OpenCV

要确保已经进入了cv虚拟环境,命令提示符开头有(cv)。

# 这里我们用的是3.3.0版本
cd ~/opencv-3.3.0/
mkdir build
cd build
# 设置CMake构建选项
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
    -D BUILD_EXAMPLES=ON ..

为了避免编译时内存不足导致的CPU挂起,调整swap交换文件大小:

# CONF_SWAPSIZE由100改为1024,编译完成后改回来
sudo nano /etc/dphys-swapfile
# 重启swap服务
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start

到这里就完成了大部分准备工作,开始编译:

# 开始编译,很耗时
make -j4

如果使用的是3.3.0版本,可能会出现一些编译错误,参见OpenCV 3.3.0编译错误及解决

编译完成后的输出:

编译成功

安装OpenCV

sudo make install
sudo ldconfig

改名

# 更名
cd /usr/local/lib/python3.7/site-packages/
sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so

测试OpenCV

source ~/.profile
workon cv
python
import cv2
cv2.__version__

opencv版本查看

使用OpenCV和Python控制树莓派的摄像头

source ~/.profile
workon cv
pip install "picamera[array]"

拍照测试

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
rawCapture = PiRGBArray(camera)
time.sleep(5) # 感光时间需要长一些
camera.capture(rawCapture, format="bgr")
image = rawCapture.array
cv2.imshow("Image", image)
cv2.waitKey(0)

普通拍照

视频流测试

使用PiRGBArray可以避免压缩成JPEG格式的大量开销。

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    image = frame.array
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF
    rawCapture.truncate(0)
    if key == ord("q"):
        break

普通视频流

利用树莓派的摄像头实现人脸识别

准备好需要用到的代码文件和图片,都可以在face_recognition的Github仓库中找到

目录结构

安装依赖库

pip install dlib face_recognition numpy

facerec_on_raspberry_pi.py

得拿张图对着摄像头,虽然没有画面。

识别单人

facerec_from_webcam_faster.py

识别双人

结合微服务的进阶任务

原本自己写了个Dockerfile在容器中构建OpenCV 4.3.0,编译N久后终于完成,但是始终无法连接到PiCamera(提示缺少libbcm_host.so,排查失败),不想再经历一次那么长的编译时间遂放弃。最后在DockerHub上淘了个基于树莓派镜像,并且已经安装好OpenCV的镜像,稍作修改就跑了起来。

DockerHub

为了让Docker由访问图形化界面的能力,在宿主机上允许访问显示接口:

# 允许所有用户访问显示接口
xhost +
# 只允许Docker用户访问显示接口 (两者选其一即可)
xhost +local:docker

Dockerfile

FROM demosense/raspberrypi3-opencv
RUN pip install picamera dlib face_recognition numpy \
    && apt install x11-xserver-utils # 利用xserver提供图形化界面
docker build -t my-cv .
docker run -it --rm \                  # 交互式界面、用完即删
    --device /dev/vchiq \              # 提供摄像头,也可以用–-privileged提供所有设备
    -e DISPLAY=unix$DISPLAY \          # 提供显示输出
    -v /tmp/.X11-unix:/tmp/.X11-unix \ # 宿主机xserver的socket
    -v /home/pi/Desktop/codes:/codes \ # 挂载所需的文件
    my-cv \
    bash

facerec_on_raspberry_pi.py

还是熟悉的味道。

docker单人

(选做)facerec_from_webcam_faster.py

在容器中运行似乎比较慢,大概要等半分钟才会出预览画面,也比较卡顿。

docker双人

换了好几个姿势才让两个人同时被识别到 Orz

遇到的问题及解决

OpenCV3.3.0编译错误及解决

限于篇幅新开了一篇博文

Unable to stop the stream: Device or resource busy

这是因为摄像头被上一个程序使用并且没有释放。用完摄像头要及时cameara.close()/video_capture.release(),或者用ps -u查看正在运行的python,然后kill -9 PID结束进程来解除占用。

协作

第24组

学号 姓名 贡献
031702422 朱宏 查阅资料 部分博客
031702419 姚彬锟 查阅资料 错误总结
031702420 张庆焰 实际操作 博客撰写

我们通过腾讯会议共享屏幕和语音的方式,进行了长达12个小时的协(liao)作(tian),也许这就是996吧🌚。

参考

第7次实践作业 - 作业 - 2017级系统综合实践 - 班级博客 - 博客园

Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi - PyImageSearch

Accessing the Raspberry Pi Camera with OpenCV and Python - PyImageSearch

树莓派实现简单的人脸识别_人工智能_yonglisikao的博客-CSDN博客

ageitgey/face_recognition: The world's simplest facial recognition api for Python and the command line

Docker 挂载摄像头并显示图像_运维_I'm George 的博客-CSDN博客

我是如何用树莓派 + Docker 轻松实现人脸识别应用的? - 云+社区 - 腾讯云

demosense/raspberrypi3-opencv - Docker Hub

janza/docker-python3-opencv: 🐋 🐍 👁 Docker image with python 3 and opencv 4.1

What is /tmp/.X11-unix/? - Unix & Linux Stack Exchange

[docker]privileged参数_运维_追寻神迹-CSDN博客

picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resource_python_RX.Geng的博客-CSDN博客

posted @ 2020-05-31 05:16  zaqny  阅读(2935)  评论(1编辑  收藏  举报