[rk3566AI模型部署]泰山派buildroot部署yolov5 使用rknn_model_zoo

YOLOV5部署

训练

网上训练教程很多, 这里主要记录模型转换

使用python train.py --data=./data/my_dest.yaml进行训练

导出

导出的时候需要更改一下模型的样式

使用下面的函数代替原本的forward函数在yolov5/models/yolo.py文件里面(只有导出的时候使用, 记得改回去), 原本的函数会在这个函数里面处理模型输出到实际的图片坐标转换, 这里不使用

python 复制代码
# RKNN 使用的forward
def forward(self, x):
    z = []
    for i in range(self.nl):
        # 只使用一个激活函数 sigmoid, 对每一个输出通道使用相同的激活函数
        # 直接获取预测结果
        # 输出 (bs, na*ny*nx, no) 的"原始预测值"(还没乘 grid、没乘 anchor、没算 xywh 到像素坐标)
        x[i] = torch.sigmoid(self.m[i](x[i]))
    return x

使用python export.py --opset=12, 如此即可获取到beat.onnx模型(需要根据你训练的模型位置设置权重文件)

可以使用工具再次简化模型

bash 复制代码
python -m onnxsim weights/best.onnx weights/best-sim.onnx

导出的模型记录在best-sim.onnx

模型转换

使用的工具是airockchip/rknn_model_zoo

手册在rknn_model_zoo/examples/yolov5 at main · airockchip/rknn_model_zoo

bash 复制代码
cd model
./download_model.sh

可以使用这个下载默认的模型, 使用的模型是yolov5s_relu.onnx

python 复制代码
python convert.py ../model/yolov5s_relu.onnx rk3566

使用自己模型的时候量化使用的图片文件要改一下

python 复制代码
DATASET_PATH = '../../../datasets/mydataset/dataset.txt'
DEFAULT_RKNN_PATH = '../model/yolov5_my.rknn'
DEFAULT_QUANT = True

examples/yolov5/python/convert.py文件里面, 这个txt文件里面记录的一系列的图片目录, 下面的参数是输出的模型名字

模型转换, 自己的模型使用的时候需要自己转换

使用的编译工具是aarch64-linux-gnu-gcc, 直接使用apt-get安装即可sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

python 复制代码
export GCC_COMPILER=/usr/bin/aarch64-linux-gnu
./build-linux.sh -t rk3566 -a aarch64 -d yolov5

输出的文件在./install/rk356x_linux_aarch64/rknn_yolov5_demo/

板级文件

examples/yolov5/cpp/postprocess.cc这个文件里面有加载的label文件

cpp 复制代码
#define LABEL_NALE_TXT_PATH "./model/coco_80_labels_list.txt"

修改cpp代码examples/yolov5/cpp/postprocess.h里面的实际的分类的类型

cpp 复制代码
#define OBJ_NAME_MAX_SIZE 64
#define OBJ_NUMB_MAX_SIZE 128
#define OBJ_CLASS_NUM 3 // 你实际使用的类型数量
#define NMS_THRESH 0.45 // 置信度
#define BOX_THRESH 0.25 // 非极大值抑制
![请添加图片描述](https://i-blog.csdnimg.cn/direct/eb2d40e347854e188e6c7fb5469bfd9f.png)
#define PROP_BOX_SIZE (5 + OBJ_CLASS_NUM)

默认的CMake复制的文件是coco的分类

cmake 复制代码
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../model/coco_80_labels_list.txt DESTINATION ./model)

可以改成自己的分类文件

buildroot使用gcc11

需要更改buildroot系统

复制代码
-> Toolchain
	-> GCC compiler Version (<choice> [=y])
bash 复制代码
# 在SDK/buildroot目录里面使用下面的命令进入配置界面
make savedefconfig
# 手动将生成在 buildroot/defconfig 文件内容复制到 ./configs/rockchip_rk3566_defconfig 文件里面

# 回到SDK根目录
./build.sh rootfs
./mkfirmware.sh
./build.sh updateimg

测试

./install/rk356x_linux_aarch64/rknn_yolov5_demo/放到板子上, 加载一个自己测试用的图片

bash 复制代码
root@RK356X:/userdata/install/rk356x_linux_aarch64/rknn_yolov5_demo# ./rknn_yolov5_demo /userdata/yolov5_my.rknn /userdata/test.jepg

使用自己的模型以及测试图片

改一下BOX_THRESH 可以避免边框重叠

相关推荐
图形学爱好者_Wu2 小时前
每日一个C++知识点|const和static的区别
c++
aini_lovee2 小时前
基于 OpenCV 的模板匹配算法的 C 语言实现
c语言·opencv·算法
xUxIAOrUIII2 小时前
【数据库原理】期末复习(初稿)
数据库·笔记
进击的小头2 小时前
02_嵌入式C与控制理论入门:自动控制理论核心概念拆解
c语言·单片机·算法
郝学胜-神的一滴2 小时前
Linux 多线程编程:深入理解 `pthread_join` 函数
linux·开发语言·jvm·数据结构·c++·程序人生·算法
客梦2 小时前
数据结构--排序
数据结构·笔记
Trouvaille ~2 小时前
【C++篇】C++11新特性详解(二):右值引用与移动语义
c++·stl·基础语法·右值引用·默认成员函数·完美转发·移动语义
罗湖老棍子2 小时前
瑞瑞的木板(洛谷P1334 )
c++·算法·优先队列·贪心·哈夫曼树
黎雁·泠崖2 小时前
C 语言底层核心:数据在内存中的存储(大小端 + 整数 + 浮点型全解析)
c语言·开发语言