树莓派实时人脸识别

树莓派实时人脸识别

最近在研究 face_recognition ,这个一个人脸识别的库,可以通过python调用。作者在电脑上用摄像头实现了一个实时人脸识别的效果,如下图所示。

example

我想在树莓派上实现这个效果。如果嵌入式设备也能做的这样,那就太好玩了。就像电影里的那种效果。

安装过程

我们可以直接参考项目页面上的安装指引 Raspberry Pi 2+ installation instructions 。我使用的是树莓派2B,CPU是4核900MHz,内存1GB(不过face_recognition只会用到单核),并且我将CPU超频到1050MHz。(关于树莓派超频,可以看我另一篇博客 树莓派超频后性能与功耗的研究

下面我说一下我的安装步骤。(怎么装系统就不说了,网上大把。装完记得修改源,我在学校,用中科大的源。)

先安装一大堆需要的库:

sudo apt-get update
sudo apt-get install 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 \
    python3-numpy \
    python3-pip \
    zip

如果使用树莓派的摄像头(CSI接口的那个),执行下面的命令:

sudo apt-get install python3-picamera
sudo pip3 install --upgrade picamera[array]

下载安装dlib:

mkdir -p dlib
git clone -b 'v19.6' --single-branch https://github.com/davisking/dlib.git dlib/
cd ./dlib
sudo python3 setup.py install --compiler-flags "-mfpu=neon"

安装face_recognition

sudo pip3 install face_recognition

下载示例代码并尝试运行:

git clone --single-branch https://github.com/ageitgey/face_recognition.git
cd ./face_recognition/examples
python3 facerec_on_raspberry_pi.py

到这里我出现了报错,说缺少了一个库。一般缺少库的话,我们会先用apt-cache search 库名来搜索到那个库的安装包,然后用sudo apt-get install 包名来安装。

这里报错说缺少了libatlas.so.3,那我们就用apt-cache search libatlas来搜索,发现它的包名叫libatlas3-base,所以我们用sudo apt-get install libatlas3-base来安装。后面测试摄像头的时候也会遇到这样的问题,解决办法是一样的。

安装完之后,代码正常运行。

我们的目标是树莓派实时人脸识别,所以我们把树莓派的摄像头(CSI接口的那个)装上,并且在raspi-config中启用摄像头,然后重启。(如果不懂的话请搜索一下“树莓派摄像头使用”)

然后我们运行一下实时人脸识别的代码:

python3 facerec_from_webcam_faster.py

会报错,在import cv2的时候缺少什么库,然后根据提示用之前安装方法安装就好了。装完一个库再运行的时候,发现又提示缺少别的库,然后再安装缺少的库,这样反复个三四次,就把缺少的库都装好了,然后就不再报缺少库的错误了。(库名我都忘了,反正很快就弄好的了)

不过再次运行的时候,会报别的错误,出错的代码是small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25),这是因为video_capture.read()没有读到图片。摄像头都装了,为什么会读不出图片呢?难道摄像头坏了?不是。

这是因为树莓派中的camera module是放在/boot/目录中以固件形式加载的,不是一个标准的V4L2的摄像头驱动,所以加载起来之后会找不到/dev/video0的设备节点。 来源:【树莓派】在OpenCV中调用CSI摄像头

所以我们可以使用下面的命令来加载驱动模块,就没问题了:

sudo modprobe bcm2835-v4l2

如果想开机自动加载,我们可以修改/etc/modules文件,添加一行:

bcm2835-v4l2

如下图所示:

开机自动加载模块示意图

然后,我们再运行代码进行测试:

python3 facerec_from_webcam_faster.py

现在代码能正常运行了。会弹出一个图像框,里面显示出摄像头的拍摄内容。下面是我的测试图片:

奥巴马测试

普京测试