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博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM