ZJU-lishuang / yolov5_prune

yolov5 prune,Support V2, V3, V4 and V6 versions of yolov5
Apache License 2.0
559 stars 137 forks source link

使用不同工程的脚本测试剪枝后微调的模型mAP@0.5指标不一致 #47

Closed HouBiaoLiu closed 3 years ago

HouBiaoLiu commented 3 years ago

1、使用prune_finetune.py微调训练,取某一轮训练好的模型,用这个脚本计算测试集的mAP@0.5,与保存的results.txt是一致的 2、但是使用slim_prune_yolov5s.py脚本,取上面步骤的模型,计算测试集的mAP@0.5,比前者低6个点

ZJU-lishuang commented 3 years ago

测试集评估map的代码是直接继承原有的,且并不影响剪枝实际效果,只确保能跑通。 如果需要评估map,可以使用模型直接生成检测结果,然后输入第三方评估代码中去

HouBiaoLiu commented 3 years ago

1、我已查到原因了,这两个脚本的区别在于,有没有initialize_weights(model),slim_prune_yolov5s.py脚本原先没加这个,于是低6个点 2、这个函数中 elif t is nn.BatchNorm2d: m.eps = 1e-3,而默认加载权重就是1e-5,所引起的 image @ZJU-lishuang

ZJU-lishuang commented 3 years ago

:+1::+1::+1:

ZJU-lishuang commented 3 years ago
  1. BatchNorm2d这里初始化的值继承自yolov5,和函数默认的初始化值不同
  2. 剪枝代码里面模型都是直接复制继承权重的,判断后面可能有地方覆盖修改了该值
HouBiaoLiu commented 3 years ago

执行export_prune_onnx.py 导出onnx时报错,在于attempt_load函数中fuse操作,去掉fuse操作可正常导出,这个fuse操作也将bn层的eps也fuse到卷积中了