PaddlePaddle学习之使用PaddleDetection在树莓派4B进行模型部署(一)— 项目环境搭建
PaddlePaddle学习之使用PaddleDetection在树莓派4B进行模型部署(二)— 深度学习模型训练
PaddlePaddle学习之使用PaddleDetection在树莓派4B进行模型部署(三)— 树莓派4B部署
此项目已公开,包括数据集在内已经打包上传,欢迎Fork!传送门:Paddle_ssd_mobilenet_v1_pascalvoc
本文将使用ssd_mobilenet_v1_voc算法,以一个例子为说明如何利用paddleDetection完成一个项目----从准备数据集到完成树莓派部署,项目用到的工具是百度的AI Studio在线AI开发平台和树莓派4B
全部资料已经都打包在这里(PaddleDetection、Paddle-Lite-Demo、Paddle-Lite、opt)
链接:https://pan.baidu.com/s/1IKT-ByVN9BaVxfqQC1VaMw
提取码:mdd1
Paddle-Lite目前支持三种编译的环境:
本次项目仅涉及到树莓派的ARMLinux环境编译,其他编译环境请参考Paddle-Lite官方文档
编译环境要求
gcc、g++、git、make、wget、python
cmake(建议使用3.10或以上版本)
官方安装流程如下:
# 1. Install basic software
apt update
apt-get install -y --no-install-recomends \
gcc g++ make wget python unzip
# 2. install cmake 3.10 or above
wget https://www.cmake.org/files/v3.10/cmake-3.10.3.tar.gz
tar -zxvf cmake-3.10.3.tar.gz
cd cmake-3.10.3
./configure
make
sudo make install
此环境树莓派应该是会有的,可以自行检查,没有的包安装上即可。
至此完成所有的编译环境配置。
将 Paddle-Lite 和 Paddle-Lite-Demo 移动至树莓派中,放在自己方便的目录下即可,在这里我的 Paddle-Lite 放在了 /home/pi/ 下,将 Paddle-Lite-Demo 放在了 /home/pi/Desktop/ 下,并且将 /home/pi/Paddle/Paddle-Lite/lite/tools/build.sh 加上执行权限
所有工作完成后,即可开始编译Paddle-Lite
cd /home/pi/Paddle/Paddle-Lite
sudo ./lite/tools/build.sh \
--build_extra=OFF \
--arm_os=armlinux \
--arm_abi=armv7hf \
--arm_lang=gcc \
tiny_publish
虽然树莓派4B已经是 ARMv8 的CPU架构,但官方系统为32位,还是需要使用ARMv7架构的编译方式
编译结束,结果如下:
整体文件结构如下:
object_detection_demo
Paddle-Lite:
include (编译好的Paddle—Lite的头文件)
libs(存放armv7hf)
armv7hf(编译好的Paddle—Lite的库文件)
code:
models(模型文件:model.nb)
images(测试图片)
CMakeLists.txt
mask_detection.cc
run.sh
对于 Paddle-Lite 的编译结果,我们需要使用的东西在 /home/pi/Paddle/Paddle-Lite/build.lite.armlinux.armv7hf.gcc/inference_lite_lib.armlinux.armv7hf/cxx 文件夹下
将 include 和 lib 中的头文件和库文件提取出来,分别放入 include 和 armv7hf 文件夹中
至此已做好文件结构的搭建
接下来就是最后一步了,将模型放进文件中,稍作修改就大功告成了!
#!/bin/bash
# configure
#TARGET_ARCH_ABI=armv8 # for RK3399, set to default arch abi
TARGET_ARCH_ABI=armv7hf # for Raspberry Pi 3B
PADDLE_LITE_DIR=/home/pi/Desktop/Paddle-Lite-Demo/PaddleLite-armlinux-demo/object_detection_demo/Paddle-Lite
if [ "x$1" != "x" ]; then
TARGET_ARCH_ABI=$1
fi
# build
rm -rf build
mkdir build
cd build
cmake -DPADDLE_LITE_DIR=${PADDLE_LITE_DIR} -DTARGET_ARCH_ABI=${TARGET_ARCH_ABI} ..
make
#run
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PADDLE_LITE_DIR}/libs/${TARGET_ARCH_ABI} ./object_detection_demo ../models/model.nb ../labels/pascalvoc_label_list ../images/2001.jpg ./result.jpg
修改完run.sh文件后,就算是完成了所有的配置内容,可以开始放心的 RUN 了!!
/home/pi/Desktop/Paddle-Lite-Demo/PaddleLite-armlinux-demo/object_detection_demo/code
sudo ./run.sh
最后的输出结果如下:
图片的预测结果就是这样了,虽然一个类别只有300张图,但是总的来说结果还算不错!
关于视频流的实时监测,在源代码的主函数中可以看到
if (argc > 3) {
WARMUP_COUNT = 1;
REPEAT_COUNT = 5;
std::string input_image_path = argv[3];
std::string output_image_path = argv[4];
cv::Mat input_image = cv::imread(input_image_path);
cv::Mat output_image = process(input_image, word_labels, predictor);
cv::imwrite(output_image_path, output_image);
cv::imshow("Object Detection Demo", output_image);
cv::waitKey(0);
} else {
cv::VideoCapture cap(-1);
cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
if (!cap.isOpened()) {
return -1;
}
while (1) {
cv::Mat input_image;
cap >> input_image;
cv::Mat output_image = process(input_image, word_labels, predictor);
cv::imshow("Object Detection Demo", output_image);
if (cv::waitKey(1) == char('q')) {
break;
}
}
cap.release();
cv::destroyAllWindows();
}
当我们在 run.sh
文件中设置小于三个参数时,即可使用视频流实时监测
#run
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PADDLE_LITE_DIR}/libs/${TARGET_ARCH_ABI} ./object_detection_demo ../models/ssd_mobilenet_v1_pascalvoc_for_cpu/best.nb ../labels/pascalvoc_label_list
#../images/2.jpg ./result.jpg
注:如果有用 Opencv-4.1.0 版本的,可能在编译 object_detection_demo.cc 时在 267、268 行会报错
源代码如下:
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
由于新版本的API发生了变化。需要修改为如下代码:
cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
Paddle-Lite官方文档