搭建MMDeploy的SDK环境并在Rock5a上完成验证

举报
张辉 发表于 2023/08/05 10:38:37 2023/08/05
【摘要】 搭建MMDeploy的SDK环境并在Rock5a上完成验证
MMDeploy 支持把模型部署到瑞芯微芯片的Rock5A上。
需要两个过程:
(1)在X86虚拟机上
(1.1)将 PyTorch 模型转换为 RKNN 模型
(1.2)使用交叉编译工具得到设备所需的 SDK 和 bin
(2)在Rock5A上
(2.1)把转好的模型和编好的 SDK、bin,传到设备
(2.2)执行推理

https://bbs.huaweicloud.com/blogs/407764 一文中,张小白重零开始进行了模型转换。将Python模型转换为onnx模型,再转换为rknn模型。

下面来试下MMDeploy的SDK。

首先我们来尝试HOST交叉编译
下载 RKNN API 包
cd ~
git clone https://github.com/rockchip-linux/rknpu2
export RKNPU2_DEVICE_DIR=~/rknpu2/runtime/RK3588
准备 gcc 交叉编译工具
cd ~
git clone https://github.com/Caesar-github/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu
export RKNN_TOOL_CHAIN=~/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu
export LD_LIBRARY_PATH=$RKNN_TOOL_CHAIN/lib64:$LD_LIBRARY_PATH
下载 opencv 预编译包
cd ~
git clone https://github.com/opencv/opencv --depth=1 --branch=4.x --recursive
cd opencv mkdir -p build_aarch64 && cd build_aarch64 cmake .. -DCMAKE_INSTALL_PREFIX=install -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \ -DBUILD_PERF_TESTS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
make -j $(nproc) && make install
export OpenCV_AARCH64_INSTALL_DIR=~/opencv/build_aarch64/install
编译 mmdeploy SDK
cd ~/mmdeploy mkdir -p build && cd build export LD_LIBRARY_PATH=$RKNN_TOOL_CHAIN/lib64:$LD_LIBRARY_PATH
cmake .. \ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/rknpu2-linux-gnu.cmake \ -DMMDEPLOY_BUILD_SDK=ON \ -DMMDEPLOY_TARGET_BACKENDS="rknn" \ -DMMDEPLOY_BUILD_EXAMPLES=ON \ -DOpenCV_DIR=${OpenCV_AARCH64_INSTALL_DIR}/lib/cmake/opencv4
make -j $(nproc) && make install
仔细查看指南:
那不如试试脚本编译:
bash ./tools/scripts/ubuntu_cross_build_rknn.sh rk3588
看来编译的结果在 ./build_rknpu2/install 目录下:

Device执行推理:
切换到rock5a的开发板:
根据指南:
其实是需要将以上三个目录传输到开发板上。
我们直接在ubuntu虚拟机上执行:
cd ~/mmdeploy
cd mmdeploy_models/mmpretrain/
scp -r resnet50 rock@192.168.199.216:/home/rock/resnet50
scp ~/mmpretrain/demo/demo.JPEG rock@192.168.199.216:/home/rock/
cd ~/mmdeploy/build_rknpu2/
scp -r install rock@192.168.199.216:/home/rock/mmdeploy_sdk
切换到开发板:
cd ~/mmdeploy_sdk
export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}
./bin/image_classification cpu ../resnet50 ../demo.JPEG
看日志, [error] [rknn_net.cpp:174] MMDeploy SDK only supports RKNN-INT8 model
好像sdk认为rknn文件是不是INT8的模型。
我把rknn文件发给群里的老师看了下,他说可能是版本升级后判断有误。
所以等他升级后我们再试验这块吧!

--Day2
今天老师说,代码更新了,可以重试下。
那我们就重试吧。
cd ~
mv mmdeploy mmdeploy.old
git clone https://github.com/open-mmlab/mmdeploy
cd mmdeploy
git submodule update --init --recursive
cd ~/onnxruntime-linux-x64-1.8.1
export ONNXRUNTIME_DIR=~/onnxruntime-linux-x64-1.8.1
export LD_LIBRARY_PATH=$ONNXRUNTIME_DIR/lib:$LD_LIBRARY_PATH
export MMDEPLOY_DIR=~/mmdeploy
cd ${MMDEPLOY_DIR}
编译ONNXRuntime自定义算子
mkdir -p build && cd build
cmake -DCMAKE_CXX_COMPILER=g++-7 -DMMDEPLOY_TARGET_BACKENDS=ort -DONNXRUNTIME_DIR=${ONNXRUNTIME_DIR} ..
make -j$(nproc) && make install
cd ${MMDEPLOY_DIR}
编辑requirements/runtime.txt 去掉onnx
mim install -e .
cd ~/mmpretrain
mim install -e .
cd ${MMDEPLOY_DIR}
mkdir -p mmdeploy_models/mmpretrain/resnet50
编辑 rknn_resnet50.sh文件
python tools/deploy.py \ configs/mmpretrain/classification_rknn-int8_static-224x224.py \ ~/mmpretrain/configs/resnet/resnet50_8xb32_in1k.py \ ~/resnet50_batch256_imagenet_20200708-cfb998bf.pth \ ~/mmpretrain/demo/demo.JPEG \ --work-dir mmdeploy_models/mmpretrain/resnet50 \ --device cpu \ --dump-info
cd ~/mmdeploy
vi configs/_base_/backends/rknn.py 将rv1126改为rk3588
sh ./rknn_resnet50.sh
编辑 ~/mmdeploy/mmdeploy/backend/rknn/onnx2rknn.py 文件,只留下model参数,其他去掉:
重新执行:sh ./rknn_resnet50.sh
cd ~/mmdeploy/mmdeploy_models/mmpretrain/resnet50
rknn模型文件已生成。
cd ~/mmdeploy/
bash ./tools/scripts/ubuntu_cross_build_rknn.sh rk3588
编译的结果在 ./build_rknpu2/install 目录下:
切换到rock5a的开发板:
mv mmdeploy_sdk mmdeploy_sdk.old
mv resnet50 resnet50.old
切换回ubuntu虚拟机:
cd ~/mmdeploy
cd mmdeploy_models/mmpretrain/
scp -r resnet50 rock@192.168.2.216:/home/rock/resnet50
cd ~/mmdeploy/build_rknpu2/
scp -r install rock@192.168.2.216:/home/rock/mmdeploy_sdk
切换到开发板:
cd ~/mmdeploy_sdk
export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}
./bin/image_classification cpu ../resnet50 ../demo.JPEG
错误还是一样。。。55555
又问了下老师,说代码还未合入,需要从老师的pr中找到代码。
于是找到老师的代码:
主要是这一段,我们回到 虚拟机:
vi mmdeploy/csrc/mmdeploy/net/rknn/rknn_net.cpp
到170行左右,将原有的代码替换成上面那段。
if (!(attr.type == RKNN_TENSOR_UINT8 || attr.type == RKNN_TENSOR_INT8)) { MMDEPLOY_ERROR("MMDeploy SDK only supports RKNN-INT8 model"); return Status(eInvalidArgument); }
重新编译SDK:
bash ./tools/scripts/ubuntu_cross_build_rknn.sh rk3588
可以看到更新的代码已被编译:
这次仅需要拷贝 install的目录:
登陆到rock5a,重新执行device端推理:
cd ~/mmdeploy_sdk
export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}
./bin/image_classification cpu ../resnet50 ../demo.JPEG
终于成功执行了SDK。
label: 65, score: 0.9590
结果跟预计的一致。



我们再来试一下别的模型。
检测模型mmdet:
cd ~/mmdeploy
修改 vi ./configs/mmdet/detection/detection_rknn-int8_static-320x320.py 文件:
打开这段注释:
pip install mmdet
cd ~
git clone https://github.com/open-mmlab/mmdetection
wget https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_320_300e_coco/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth --no-check-certificate
cd ~/mmdeploy
mkdir -p mmdeploy_models/mmdet/yolov3
vi rknn_yolov3.sh
python tools/deploy.py \ configs/mmdet/detection/detection_rknn-int8_static-320x320.py \ ~/mmdetection/configs/yolo/yolov3_mobilenetv2_8xb24-320-300e_coco.py \ ~/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth \ ~/mmdetection/demo/demo.jpg \ --work-dir mmdeploy_models/mmdet/yolov3 \ --device cpu \ --dump-info
sh ./rknn_yolov3.sh
好像是配置文件出了问题。
修改下:
vi configs/mmdet/detection/detection_rknn-int8_static-320x320.py
是的,配置文件要顶格写。
重新执行:sh ./rknn_yolov3.sh
同样执行成功,但是adb失败。不要紧,查看rknn是否生成:
cd mmdeploy_models/mmdet/yolov3
显然,model.rknn已经生成。
将其传输到rock5a上去。
scp -r yolov3 rock@192.168.2.216:/home/rock/yolov3
将demo图片也拷贝过去:
scp ~/mmdetection/demo/demo.jpg rock@192.168.2.216:/home/rock/yolov3_demo.JPEG
登陆到rock5a,重新执行device端推理:
cd ~/mmdeploy_sdk
export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}
./bin/object_detection cpu ../yolov3 ../yolov3_demo.JPEG
也成功执行了。
这个目录下有检测的结果文件生成,将其传到windows打开查看:
可见相关的椅子、车子什么的都被圈了起来。
(全文完,谢谢阅读)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。