从0到1复现sample仓库01-yolov5s的yolov5s.onnx文件
收藏回复举报
从0到1复现sample仓库01-yolov5s的yolov5s.onnx文件
发表于2024-06-24 02:17:32
0 查看
  • 写这篇文章的立意是讲清楚sample仓库01-yolov5的onnx文件的来源
  • 同时要讲清楚与当前使用的Ultralytics 的 yolov5s 的区别
  • 如果要自己训练并且使用200I dk A2 或者 香橙派进行模型移植,一定要注意到这个差异性
  • 否则就会识别框识别不准而且完全混乱

  • 有看过sample仓代码的一定很熟悉这个ATC代码,无论是哪个仓库都是直接ATC转换onnx 到 om,然后运行
  • 就相当于告诉你1+1等于2,但是1是什么?他那里来的,为什么他就是1?我们都不知道

cke_12289.png

  • 仓库里的这两个文件就是我们最熟悉的陌生人
  • 这个时候熟悉yolov系列的同学要说了,这不简单吗?
  • 直接去github 下载 Ultralytics的源码,然后用Python export.py 转换pt 为onnx
  • 或者直接选取最新releases V7.0提供的 yolov5s就可以,然后再用ATC转换 

cke_46860.png

  • 嗯,思路是这个思路,可你怎么能够确认Ultralytics的逻辑跟仓库提供的逻辑一样呢?
  • 你们有没有亲自动手用Ultralytics导出的onnx文件试过呢?我试过,结果惨不忍睹,一开始 我还怀疑是ATC转换的om出问题了 
  • 但是后来我就明白并非如此。下图就是我提高conf_thres 到0.999 ,iou_thres到0.99的结果

cke_130196.png

cke_131717.png

  • 这个时候我就怀疑模型不一致了,所以用netron看下两个模型层次
  • 发现samples仓库多了一个1 * 1卷积层,我就奇怪了,这个1 * 1卷积层什么作用?

cke_152895.png

  • 仔细看下具体的结构,恍然大悟
  • 考下大家1 * 3 * 640 * 640 卷 3 *  1 * 1 *  1,stride = 1, 1 pad = 0, 0, 0, 0 得到最终shape是多少?
  • 考下大家3 * 3 * 640 * 640 卷 32 *  3 * 6 *  6  ,stride = 2,2 pad = 2,2,2,2 得到最终shape是多少?

cke_208113.png

  • normalize 字眼已出现,em~~开始有种灵感,为了验证想法,我查了Ultralytics的源码
  • samples仓库的det_utils.py 基本与 Ultralytics的源码一致
  • 只是在Ultralytics的源码 中 多了这么一句 /255 ,与层结构一对照,哦吼,是这样

cke_276181.png

  • 打开normalize_weight 
  • 0.003921568859368563 这个数字很熟悉呀
  • 1/255 = 0.0039215686274509803921568627451
  • 验证上了

cke_288291.png

  • 如果不做任何修改,按照源码进行编译成Onnx,再去用这个model套用sample 的调用算法,就会少了一个 /255归一化的步骤
  • 导致最后的乱框问题,修改下调用算法就OK了

本帖最后由 匿名用户2024/06/24 15:51:06 编辑

我要发帖子