查看原文
其他

树莓派+计算棒2完成实时人脸识别项目

子豪兄&妮mo 达尔闻说 2021-01-17

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我!

我是同济子豪兄,接达尔闻邀约做树莓派项目的时候,刚好在美国,有幸去到英特尔总部更深入的了解了NCS2,于是决定将二者结合起来做人工智能应用。

在intel总部
回国后,翻出了尘封已久的树莓派3B+(当然,最新的Pi4也是完全可以的),准备玩起来。没接触过树莓派的人可以把树莓派当做是1个linux系统的微型电脑,它外表十分小巧精致,但是功能相当强大。树莓派预装 Linux 系统,体积小,搭载 ARM 架构处理器,各种接口齐全,电脑能做的事,它也可以完成。
以前用树莓派做过一些小项目,基本是用OpenCV来完成的。结果发现树莓派无法实现计算机视觉的实时跟踪,跑起来相当吃力。Intel的神经计算棒二代NCS2能很好的支持树莓派,那岂不是可以在树莓派上跑网络了?这在以前根本不敢想像。2个东西都入手后,决定来做个实验:

总结一些关键操作步骤给大家,如果想要完整的一步步学习,点击阅读原文查看。

材料准备

-树莓派3B+主板
- Intel movidius 神经计算棒2代(Intel® Neural Compute Stick 2)
- 摄像头
- 显示屏(不一定非加在板子上,也可连接到常用的显示屏)

- 一台电脑

配置树莓派系统

配置路径:下载镜像->烧录镜像->配置树莓派
下载镜像需要将树莓派默认的下载源从国外切换到国内清华大学开源软件镜像站。
在树莓派的命令行界面输入:
sudo nano /etc/apt/sources.list
使用键盘方向键控制,在第一行开头加一个#,把下面的内容拷贝到最后一行之后,如图中的效果:
debhttp://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contribnon-free rpideb-srchttp://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contribnon-free rpi

先按键盘上的ctrl+o,再按回车保存,再按ctrl+x退出nano编辑器回到命令行界面。再输入以下命令更新到清华大学镜像源最新的软件列表:
sudo apt-get update
这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在树莓派本地。
以上步骤实现了Respbian的包管理器apt-get换源到清华大学软件镜像站,并更新了软件列表,今后在树莓派命令行中执行sudoapt-get install 软件名时便会自动从清华大学开源软件镜像站高速下载。
源文件下载完,接下来就是树莓派内部配置、下载安装常用软件等,详细的步骤可以在“达尔闻说”微信公众号回复:树莓派

这个步骤是无数树莓派玩家多年总结的必由之路,凝聚了无数前人趟坑的血泪和汗水,特别适合新手阅读。

检查

uname -m

输出armv7l说明正常。

换源

sudo nano /etc/apt/sources.list
用#注释掉原文件内容,用以下内容取代:
debhttp://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contribnon-free rpideb-srchttp://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contribnon-free rpi
保存,退出。 
sudo nano /etc/apt/sources.list.d/raspi.list
用#注释掉原文件内容,用以下内容取代:
debhttp://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main uideb-srchttp://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui

保存,退出。使用sudo apt-get update命令更新软件源列表。

安装cmake

sudo apt install cmake

下载OpenVINO toolkit for Raspbian

 
用自己电脑点击下方链接下载2019年10月25日发布的OpenVINO最新版本,再用filezilla传到树莓派的Downloads文件夹下:
https://download.01.org/opencv/2019/openvinotoolkit/R3/l_openvino_toolkit_runtime_raspbian_p_2019.3.334.tgz
cd ~/Downloads/tar -xf l_openvino_toolkit_runtime_raspbian_p_2019.3.334.tgz
给解压之后的文件重命名为:inference_engine_vpu_arm
source inference_engine_vpu_arm/bin/setupvars.shsh inference_engine_vpu_arm/install_dependencies/install_NCS_udev_rules.sh
sed-i "s|<INSTALLDIR>|$(pwd)/inference_engine_vpu_arm|" inference_engine_vpu_arm/bin/setupvars.sh

设置环境变量

sudo nano /home/pi/.bashrc
在最后一行增加以下内容:
source /home/pi/Downloads/inference_engine_vpu_arm/bin/setupvars.sh
重开一个新的命令行窗口,登陆后提示:[setupvars.sh] OpenVINOenvironment initialized则说明配置成功。 

为英特尔神经棒2代配置USB规则

sudo usermod -a -G users"$(whoami)"shinference_engine_vpu_arm/install_dependencies/install_NCS_udev_rules.sh
提示:
Updating udev rules...Udev rules have been successfullyinstalled.
则说明安装成功了。
把英特尔神经棒插在树莓派的USB口上,编译:
cd inference_engine_vpu_arm/deployment_tools/inference_engine/samples
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release-DCMAKE_CXX_FLAGS="-march=armv7-a"
make -j2 object_detection_sample_ssd

下载神经棒模型的模型文件和权重文件

wget --no-check-certificatehttps://download.01.org/openvinotoolkit/2018_R4/open_model_zoo/face-detection-adas-0001/FP16/face-detection-adas-0001.bin
wget --no-check-certificatehttps://download.01.org/openvinotoolkit/2018_R4/open_model_zoo/face-detection-adas-0001/FP16/face-detection-adas-0001.xml

人脸检测


<path_to_image>换成你的人脸图片的绝对路径

pi@raspberrypi:~/Downloads/inference_engine_vpu_arm/deployment_tools/inference_engine/samples/build$ ./armv7l/Release/object_detection_sample_ssd -m face-detection-adas-0001.xml-d MYRIAD -i /home/pi/Downloads/face/1.jpg

Python中调用OpenCV进行人脸检测

import cv2 as cv
print('开始人脸检测')# 载入模型和权重文件net =cv.dnn.readNet('face-detection-adas-0001.xml', 'face-detection-adas-0001.bin')
# Specify target devicenet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
# 读入图片,将图片路径更换为自己的人脸图片frame = cv.imread('./6.jpg')# Prepare input blob and perform aninferenceblob = cv.dnn.blobFromImage(frame,size=(672, 384), ddepth=cv.CV_8U)net.setInput(blob)out = net.forward()# Draw detected faces on the framefor detection in out.reshape(-1, 7): confidence = float(detection[2])
# xmin,ymin-框的左上角点坐标xmin = int(detection[3] * frame.shape[1])ymin = int(detection[4] * frame.shape[0])
#xmax,ymax-框的右下角点坐标xmax = int(detection[5] * frame.shape[1])ymax= int(detection[6] * frame.shape[0]) if confidence > 0.5: cv.rectangle(frame, (xmin, ymin), (xmax, ymax), color=(0, 255, 0))
# 存储检测后画框的人脸图片cv.imwrite('./out.png', frame)print('人脸检测完成,已保存检测结果图像')

配置树莓派摄像头

sudo apt-get install python-opencv
sudo apt-get install fswebcam
插上树莓派摄像头,并配置树莓派摄像头
sudo nano /etc/modules
在这个文件末尾添加一行
bcm2835-v4l2

重启树莓派

输入命令:
vcgencmd get_camera
如果得到下面的结果,则证明摄像头连接成功:
raspistill -o image.jpg
调用摄像头拍一张照片,命名为image.jpg,存储在/pi/home路径,也就是桌面左上角资源管理器一打开显示的那个路径。如果能看到摄像头上红灯亮,目录里面有照片,则进一步说明摄像头配置正确。
ls /dev

右下角的video0即为摄像头。 
fswebcam 10 test.jpg

执行后会 延时10帧 拍摄 (给个准备时间)产生 一张 名称为 test 的图片,存储在/home/pi目录中。

配置展示窗口

打开VNC Viewer,在树莓派命令行中运行这条命令

export DISPLAY=:0.0

树莓派摄像头实时人脸检测

# coding=utf-8# face-detection-camera.pyimport cv2 as cvimport numpy as np

print('开始人脸摄像头实时检测')# 载入模型文件和权重文件net = cv.dnn.readNet('face-detection-adas-0001.xml','face-detection-adas-0001.bin')# Specify target devicenet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

# 从摄像头中读取图像帧cap=cv.VideoCapture(0)while(1): #获取一帧图像 ret,frame=cap.read() #Prepare input blob and perform an inference frame=cv.resize(frame,(480,320),interpolation=cv.INTER_CUBIC) blob = cv.dnn.blobFromImage(frame, size=(672, 384), ddepth=cv.CV_8U) net.setInput(blob) out = net.forward()
#绘制人脸框 for detection in out.reshape(-1, 7): confidence = float(detection[2]) # 获取左上角图片的坐标 xmin = int(detection[3] * frame.shape[1]) ymin = int(detection[4] * frame.shape[0]) # 获取右下角图片的坐标 xmax = int(detection[5] * frame.shape[1]) ymax = int(detection[6] * frame.shape[0]) if confidence > 0.5: cv.rectangle(frame, (xmin, ymin), (xmax, ymax), color=(0, 255, 0)) #展示图像 cv.imshow("capture",frame) if cv.waitKey(1)&0xFF==ord('q'): # 每1毫秒监听一次键盘的动作,按q键结束,并保存图片 cv.imwrite('out.png', frame) print("save one image done!") break# 关闭摄像头及显示窗口cap.release()cv.destroyAllWindows()print('人脸摄像头实时检测完成')

运行这个脚本文件

python3 face-detection-camera.py
在显示屏上就可以看到了实时识别的人脸画面:


树莓派有了NCS2,就如虎添翼,可以尽情的跑你想要的计算机算法应用。当然,前提是你已经学会了最基础的应用。以下是子豪兄为新手准备的详细的课程,可点击阅读原文查看。


END

达尔闻联合全球知名元器件分销商Digi-Key陪伴大家大学生涯的最重要也是最后一堂课:毕设!

毕设课程共17讲:从“选题——基础知识点补足——项目拆分讲解——优秀作品分享”逐个帮你解决从开题到最终答辩过程中的各个问题。

得捷-毕业设计17节免费课程高能回顾:

开篇介绍:毕业设计“包过”秘籍,附板卡白piao

毕设第1课:如何选题,哪类毕设适合自己 

毕设第2课:毕设读题案例分析

毕设第3课:毕设开发平台选择

毕设第4/5课:2小时用AD19画STM32核心板

毕设第6课:C语言/Verilog语言基础补给

毕设第7课:用Tensorflow搭建神经网络(阅读原文,进毕设第7课查看)

毕设第8课:系统调试技巧之仪器的用法

毕设第9课:利用仪器加快设计开发

毕设第10课:电源电路设计

毕设第11课:常用传感器分析与设计

毕设第12课:常用数据总线分析(阅读原文,进毕设第12课查看)

毕设第13课:通信接口设计

毕设第14课:教你设计电机驱动电路

毕设第15课:STM32物联网智能家居项目开源


戳原文,学习课程!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存