从0到1复现sample仓库01-yolov5s的yolov5s.onnx文件

  • 写这篇文章的立意是讲清楚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了
  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值