自己训练了一个只有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); //反量化

探讨了将Yolov8模型部署到RKNN平台时遇到的类别数调整和量化参数影响,强调转换时数据集一致性的重要性。
最低0.47元/天 解锁文章
1063





