输入输出层名称对照表
使用任何模型之前,确保param文件的输入层名称和输出层名称一致。
在onnx转换为ncnn模型文件的时候,如果导出的param文件中输入输出层对应不上,则会出现闪退。为此,我将源码中的输入输出层罗列出来,方便开发者们对照各个版本的输入输出层名称来调整模型转换参数。
| 版本 | input | output | 尺寸 |
|---|---|---|---|
| V5 | images | output、数字、数字 | 320x320 |
| V6 | images | output | 640x640 |
| V7 | in0 | out0、out1、out2 | 640x640 |
| V8 | images | output | 640x640 |
| V9 | images | output0 | 640x640 |
| V10 | in0 | out0、out1、out2 | 640x640 |
| V11 | in0 | out0、out1、out2 | 640x640 |
| V12 | in0 | out0 | 640x640 |
| V13 | in0 | out0 | 640x640 |
YoloV5版本后面输出层的两个"数字"需要看param文件的末尾"Permute"开头的行
例如:
两个Permute行的输出层分别是:781、801 (需要你自己找找看,有一定规律,一般在"0=1"这个字段前一个,或者 1 1 800 801 这里的801就是第三个输出层名称)
那么在脚本开发的过程中如何设置yolo的输入输出层的名称呢?仔细观察输入输出层名称对照表,可以发现输入层的名称是固定的,只有一个,而输出层的名称要么是一个,要么就是三个,因此我提供了三个函数用来配置:
其实将pt或者onnx转为ncnn模型有狠多坑要踩,为了减少一些乱七八糟的坑,我提供了输入输出层名称对照表,方便开发者们配置。
使用'$yolo.config()'即可配置参数,设计这个函数的主要作用是用来调优的,如果不配置则使用默认配置数据。
参数说明:不需要配置的参数填null即可
但是我在开发yolo系列的时候,发现有些版本对于配置参数的支持也是不一样的,所以我在C/C++中尽可能的完善了所有yolo的配置参数, 不过呢还是存在无法完成的配置参数,具体的配置支持度如下:
打Y的表示支持配置此参数,打N表示不支持此参数,如果配置了这个参数也不会生效。
| 版本 | targetSize | meanVals | normVals | useGpu | probThreshold | nmsThreshold |
|---|---|---|---|---|---|---|
| V5 | Y | Y | Y | Y | Y | Y |
| V6 | Y | Y | Y | Y | Y | Y |
| V7 | Y | Y | Y | Y | Y | Y |
| V8 | Y | Y | Y | Y | Y | Y |
| V9 | Y | Y | Y | Y | Y | Y |
| V10 | Y | Y | Y | Y | Y | N |
| V11 | Y | Y | Y | Y | Y | Y |
| V12 | Y | Y | Y | Y | Y | Y |
| V13 | Y | Y | Y | Y | Y | Y |
| VX | Y | Y | Y | Y | Y | Y |
| AIGame默认值 | 640 | [0f, 0f, 0f] | [1 / 255.f, 1 / 255.f, 1 / 255.f] | false | 0.25 | 0.45 |
总的来说,除了YoloV10不支持NMS阈值配置外,其他版本都支持全部配置。
让我们来学习几个param文件是如何查看输出层名称的吧:
在yolo5的param文件后面几行可以在0=1的地方看到781、801这样的名称作为输出层名称,所以yolo5的坑是最隐蔽的,很多人训练完模型后,高高兴兴的用移动端部署运行模型,结果闪退报错等等。

在yolo8的param文件中可以找到最后一行看到output这样的输出层名称

在yolo11的param文件中:可以看见out0、out1、out2这样的输出层名称
