自定义数据训练的rknn模型部署 踩坑记录

探讨了将Yolov8模型部署到RKNN平台时遇到的类别数调整和量化参数影响,强调转换时数据集一致性的重要性。

自己训练了一个只有2种类别的yolov8模型之后,部署到瑞芯微RKNN。

踩坑一:类别的变化

之前用COCO数据集训练的.pt模型转rknn后,output0的shape为8400 x 176.
而把自定义数据集训练的模型转rknn后,output0的shape为8400 x 98.
为什么会不一样?一度以为模型或代码有问题,拿图片测了下发现模型没问题,能检测出来。

分析一下8400x176,其中8400是proposal的个数,176是box相关的64+80个类别+32的mask coefficient.
现在类别变成了2,自然要变成64+2+32=98.

所以,如果后处理中用到类别数=80,画图中的类别标签用了80个的,这里需要修改一下。

踩坑二:模型转化(.pt 转 .rknn)

用转化后的rknn模型检测,只能检测出一种类别,另一种检测不出来。

于是从后处理出发找原因,
现输入图片中有两种物体,每种一个,理论上应该检测出2个物体。
先看NMS之前检测了多少个物体。

std::vector<int> picked;
nms_sorted_bboxes(proposals, picked); //picked里面保存的是proposals的下标

int count = picked.size();

这里NMS之前 picked.size() = 1, 说明NMS之前就只检测出一个,已经不对了。

回到NMS之前的处理,
这里选择较大概率的类别作为label,保存label, score和box坐标。

int label = -1;
float score = -FLT_MAX;
//找到最大score和对应的label
for (int k = 0; k < num_class; k++) {
   
   
    float confidence = deqnt_affine_to_f32(score_ptr[k], zp,
                                           scale);  //反量化
将ONNX模型换为RKNN模型的过程涉及使用Rockchip提供的RKNN Toolkit,通过该工具加载ONNX模型、配置参数并导出为RKNN格式。以下是一个完整的代码实现流程,涵盖了模型加载、配置、构建和导出等关键步骤。 ### 模型换流程 ```python import rknn # 创建RKNN对象 rknn = rknn.RKNN() # 加载ONNX模型 onnx_model_path = 'best-sim.onnx' # 指定ONNX模型路径 rknn.load_onnx(model=onnx_model_path) # 加载模型[^1] # 配置模型参数 # 例如设置通道均值、通道顺序等 rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2') # 配置模型参数 # 构建RKNN模型 # 可以选择是否量化(quantize)以及是否使用设备预编译(target_platform) rknn.build(do_quantization=True, dataset='./DATASET') # 构建模型并启用量化[^2] # 导出RKNN模型 rknn_model_path = 'best-sim.rknn' # 指定RKNN模型输出路径 rknn.export_rknn(rknn_model_path) # 导出为RKNN文件[^3] ``` ### 模型推理与测试 完成模型换后,可以使用RKNN Toolkit进行推理测试,以下是一个简单的推理代码示例: ```python # 初始化运行时环境 rknn.init_runtime() # 加载测试图片 img_path = 'IMG' # 替换为实际测试图片路径 img = cv2.imread(img_path) # 输入预处理(根据模型要求进行调整) # 例如归一化、尺寸调整等 input_data = preprocess(img) # 执行推理 outputs = rknn.inference(inputs=[input_data]) # 后处理并保存结果 result_img = postprocess(outputs) cv2.imwrite('out2.jpg', result_img) # 保存检测结果[^2] ``` ### 注意事项 - `dataset`路径应包含用于量化校准的图像数据集,通常为验证集。 - `channel_mean_value`和`reorder_channel`应根据训练时的数据预处理方式进行设置。 - 如果目标平台是`rv1109`或`rk1808`,可以在构建模型时指定平台以优化性能[^3]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值