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版本时,发现编译过程中没有出现错误。
-
官方 opencv 与 opencv/opencv_contrib (版本号需要一致,下载速度慢)
-
或 3.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和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的镜像,稍作修改就跑了起来。
为了让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
还是熟悉的味道。
(选做)facerec_from_webcam_faster.py
在容器中运行似乎比较慢,大概要等半分钟才会出预览画面,也比较卡顿。
换了好几个姿势才让两个人同时被识别到 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博客
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步