目录
0. 环境
硬件:3588Demo板 × 1;Linux调试机 × 1;Demo板和调试机之间保证网络连通以及ADB接口连通。
1. 准备工作
1.1 【调试机】下载RKNPU2工程
cd <your-proj-path>
git clone https://github.com/rockchip-linux/rknpu2.git
1.2 【Demo板】更新rknn_server和librknnrt.so
详情参考rknpu2仓库目录下的rknn_server_proxy.md文件
1.3 【调试机】安装交叉编译工具
sudo apt-get install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu
1.4【调试机】下载交叉编译工具链
cd <your-proj-dir>
git clone https://gitlab.com/firefly-linux/prebuilts/gcc/linux-x86/aarch64/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu.git
此时,你的【调试机】上已有两个目录,分别为rknpu2的仓库目录以及交叉编译工具链目录,如下图:
1.5 【调试机】更改build脚本
进入RKNPU2项目内,如下路径
cd rknpu2/examples/rknn_yolov5_demo/
修改build-linux_RK3588.sh,原脚本有点问题,需注意,修改的内容需要与1.3相符,我按照文档推荐装的是9,如果装其他的版本,本步骤需要同步变更。
# Step 1: Edit your build script
sudo nano build-linux_RK3588.sh
# Step 2: 添加交叉编译工具链的绝对路径
export TOOL_CHAIN=<your-proj-path>/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu
# Step 3: 修改交叉编译工具的名称,原脚本此处有问题,以下两句:
# export CC=${GCC_COMPILER}-gcc
# export CXX=${GCC_COMPILER}-g++
export CC=${GCC_COMPILER}-gcc-9
export CXX=${GCC_COMPILER}-g++-9
1.6 【调试机】编译
#执行以下脚本,会得到rknn_yolov5_demo
./build-linux_RK3588.sh
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc-9
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc-9 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++-9
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++-9 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /mnt/sde/rknpu2/examples/3rdparty/opencv/opencv-linux-aarch64 (found version "3.4.5")
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/build/build_linux_aarch64
Scanning dependencies of target rknn_yolov5_demo
[ 33%] Building CXX object CMakeFiles/rknn_yolov5_demo.dir/src/main.cc.o
[ 66%] Building CXX object CMakeFiles/rknn_yolov5_demo.dir/src/postprocess.cc.o
[100%] Linking CXX executable rknn_yolov5_demo
[100%] Built target rknn_yolov5_demo
[100%] Built target rknn_yolov5_demo
Install the project...
-- Install configuration: ""
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/./rknn_yolov5_demo
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/librknnrt.so
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/lib/librga.so
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/coco_80_labels_list.txt
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RV110X
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RV110X/yolov5s-640-640.rknn
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RK3588
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RK3588/yolov5s-640-640.rknn
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RK356X
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/RK356X/yolov5s-640-640.rknn
-- Installing: /mnt/sde/rknpu2/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux/.//model/bus.jpg
2. 上板准备
2.1 【Demo板】/data目录下新建一个"rknn_yolov5"的目录
mkdir -p /data/rknn_yolov5
cd /data/rknn_yolov5
2.2 【调试机】上传必要文件至【Demo板】
# Step 1 : 进入rknpu2仓库的example、demo目录
cd <your-proj-path>/rknpu2/examples/rknn_yolov5_demo/
# Step 2 :将刚编好的可执行文件上传至Demo板
adb push ./build/build_linux_aarch64/rknn_yolov5_demo /data/rknn_yolov5/
# Step 3 :将模型文件上传至Demo板
adb push ./model/RK3588/yolov5s-640-640.rknn /data/rknn_yolov5/
# Step 4 :将与模型文件匹配的类别文本文件上传至Demo板
adb push ./model/coco_80_labels_list.txt /data/rknn_yolov5/
# Step 5 :将需要推理的输入图片文件上传至Demo板
adb push ./model/bus.jpg /data/rknn_yolov5/
3. 【Demo板】上板运行
# Step 1: 进入Demo板的运行目录,即刚才上传必要文件所在目录
cd /data/rknn_yolov5
# Step 2: 使用格式为 rknn_yolov5_demo <your-model-file> <your-input-img>
./rknn_yolov5_demo ./yolov5s-640-640.rknn ./bus.jpg
post process config: box_conf_threshold = 0.25, nms_threshold = 0.45
Read ./bus.jpg ...
img width = 640, img height = 640
Loading mode...
sdk version: 1.4.0 (a10f100eb@2022-09-09T09:07:14) driver version: 0.8.2
model input num: 1, output num: 3
index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
index=0, name=output, n_dims=5, dims=[1, 3, 85, 80], n_elems=1632000, size=1632000, fmt=UNDEFINED, type=INT8, qnt_type=AFFINE, zp=77, scale=0.080445
index=1, name=371, n_dims=5, dims=[1, 3, 85, 40], n_elems=408000, size=408000, fmt=UNDEFINED, type=INT8, qnt_type=AFFINE, zp=56, scale=0.080794
index=2, name=390, n_dims=5, dims=[1, 3, 85, 20], n_elems=102000, size=102000, fmt=UNDEFINED, type=INT8, qnt_type=AFFINE, zp=69, scale=0.081305
model is NHWC input fmt
model input height=640, width=640, channel=3
once run use 26.747000 ms
loadLabelName ./model/coco_80_labels_list.txt
person @ (114 235 212 527) 0.819099
person @ (210 242 284 509) 0.814970
person @ (479 235 561 520) 0.790311
bus @ (99 141 557 445) 0.693320
person @ (78 338 122 520) 0.404960
loop count = 10 , average run 34.551800 ms