现象
使用非官方代码,在DJL框架内载入YOLOv5模型时报错,错误内容为”detect layer output is not supported yet, check correct YoloV5 export format”,采用不同格式包括Torchscript和ONNX格式均不能解决。调用原版YOLOv5模型能够正常运行,查看DJL源码以及模型输出发现是检测模型输出的张量大小不正确而报错。
问题原因
按照YOLO模型的结构,最后一层输出应该是包含对预测框的变换以及非极大值抑制,而这个版本的非官方代码并没有把这部分转换整合进入导出的模型中。
根据在YOLOv3的原始论文中提到,模型会在原始输入的32倍下采样,16倍下采样以及8倍下采样三个尺度上进行预测输出,每个尺度包含三个预测方框,而其中每个方框的参数包括方框位置和大小(左上角坐标以及长宽),是否存在物体(objectness)以及物体类别输出。以官方原版的YOLOv5为例,640*640的图像输入,共检测80类物体,则三个尺度的输出分别为(640/32)*(640/32)*(3*(4+1+80)),(640/16)*(640/16)*(3*(4+1+80)),(640/8)*(640/8)*(3*(4+1+80)),即输出的张量大小为20*20*255,40*40*255,80*80*255。这几个张量的值不能作为图像中的最终输出方框的坐标和大小,原版YOLOv5的模型会将这三个尺度的输出经过处理得到真实的方框,最终输出的经过拼接张量大小(忽略batch dim)为
(3*(640/32)*(640/32))*(4+1+80)+(3*(640/16)*(640/16))*(4+1+80)+(3*(640/8)*(640/8))*(4+1+80)=1200*85+4800*85+19200*85=25200*85。而DJL框架报错则是由于直接将未经过变换的三个尺度拼接(255*20*20+255*40*40+255*80*80),得到错误的张量大小,在检测到缺少detect layer后报错。