AlibabaResearch / efficientteacher

A Supervised and Semi-Supervised Object Detection Library for YOLO Series
GNU General Public License v3.0
836 stars 151 forks source link

模型转换问题 #20

Open Ma-Liang-hub opened 1 year ago

Ma-Liang-hub commented 1 year ago

我用标准yolov5模型转成ET模型训练完成后,如何再转回yolov5模型呢?

BowieHsu commented 1 year ago

试试脚本里面的convert_efficient_to_yolov5函数,需要同时抓一下您训好的ET模型和您原来的那个yolov5模型,重新存成一份新的yolov5可以识别的模型

Ma-Liang-hub commented 1 year ago

试试脚本里面的convert_efficient_to_yolov5函数,需要同时抓一下您训好的ET模型和您原来的那个yolov5模型,重新存成一份新的yolov5可以识别的模型

转换的时候报错:ModuleNotFoundError: No module named 'models.detector.yolo_ssod' 我传的参数convert_efficient_to_yolov5(mula_path='best.pt', map_path='map.txt', yolov5_path='/share/disk1/ml/code/yolov5-master/runs/train/exp3/weights/best.pt', save_path='./finish_model/yolov5x.pt') 第一个是训好的ET模型,第三个是原本的yolo模型

BowieHsu commented 1 year ago

知道您的状态了,我来修一下代码 @Ma-Liang-hub

BowieHsu commented 1 year ago

@Ma-Liang-hub 您好,我这边用我们上传的模型转出到标准YOLOv5的格式,用6.2版本的val.py推出来的coco mAP是一致的,您试试。

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,我这边用我们上传的模型转出到标准YOLOv5的格式,用6.2版本的val.py推出来的coco mAP是一致的,您试试。

可以是可以了,但转出之后map[50:95]从0.618降到了0.478.。。。。。。。太惨了

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,我这边用我们上传的模型转出到标准YOLOv5的格式,用6.2版本的val.py推出来的coco mAP是一致的,您试试。

我用的也是6.2版本的val.py测的

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,我这边用我们上传的模型转出到标准YOLOv5的格式,用6.2版本的val.py推出来的coco mAP是一致的,您试试。

我用的也是6.2版本的val.py测的

BowieHsu commented 1 year ago

@Ma-Liang-hub 可能是anchor没有转出来,我转的时候跳过anchor了,您的anchor是重新聚的么,因为我验过coco上的准确率是一模一样的

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 可能是anchor没有转出来,我转的时候跳过anchor了,您的anchor是重新聚的么,因为我验过coco上的准确率是一模一样的

我用的默认的anchor

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 可能是anchor没有转出来,我转的时候跳过anchor了,您的anchor是重新聚的么,因为我验过coco上的准确率是一模一样的

我用的默认的anchor

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 可能是anchor没有转出来,我转的时候跳过anchor了,您的anchor是重新聚的么,因为我验过coco上的准确率是一模一样的

您觉得还可能是因为什么原因呢?我训练测试ET模型和标准yolo模型的conda环境不一样(pytorch版本不一样),这会有影响吗

BowieHsu commented 1 year ago

@Ma-Liang-hub 不太会有影响,我用了两个torch版本的容器分别测过,您两边用的验证时用的conf_thresh和iou_thresh是一样的吗?还有更多的细节能提供给我吗

BowieHsu commented 1 year ago

@Ma-Liang-hub 您好,请问这个问题解决了吗?精度能对上吗

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,请问这个问题解决了吗?精度能对上吗

您好,还是不太行,我说我的val过程: ET模型val命令:python val.py --cfg configs/ssod/custom/yolov5l_custom_ssod.yaml --weights yolov5_ssod/exp3/weights/best.pt --val-ssod 【参数为默认:nms_conf_thres: 0.1 nms_iou_thres: 0.65】 转出yolov5后val: python val.py --weights ..../yolov5x.pt --data ..../data/coco128.yaml --img 640 --conf-thres 0.1 --iou-thres 0.65 val结果:前者为61.8%;后者为50.2%

BowieHsu commented 1 year ago

@Ma-Liang-hub 您好,我们val的默认参数conf是0.001,所以val.py里也需要加上--conf-thres 0.1 --iou-thres 0.65的命令,完整的命令 是 python val.py --cfg configs/ssod/custom/yolov5l_custom_ssod.yaml --weights yolov5_ssod/exp3/weights/best.pt --val-ssod --conf-thres 0.1 --iou-thres 0.65

PHI6kai commented 1 year ago

您好想问一下您导出的时候出现过这样的情况吗? image

BowieHsu commented 1 year ago

您好,日志显示您用来存的那个yolov5模型有80个类,而efficientteacher的模型类别不是80,您需要用标准yolov5在自己数据集上训的pt作为导出时的引导pt

PHI6kai commented 1 year ago

@BowieHsu 您好,我的训练后的类别是2类,我尝试了一下,如果nc=80那么转ET或者转pt都可以,但是目前我的模型只能是nc=2,想问一下这种情况如何转到pt

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,我们val的默认参数conf是0.001,所以val.py里也需要加上--conf-thres 0.1 --iou-thres 0.65的命令,完整的命令 是 python val.py --cfg configs/ssod/custom/yolov5l_custom_ssod.yaml --weights yolov5_ssod/exp3/weights/best.pt --val-ssod --conf-thres 0.1 --iou-thres 0.65

这下差距变更大了,ET模型上升到64.5%的map

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,请问这个问题解决了吗?精度能对上吗

当初转ET模型的时候,map转成ET上升了0.7%,半监督训练完成后,相比刚转完的ET模型map提升0.8%,最终转回yolo模型后map狂降13.6%............

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好,请问这个问题解决了吗?精度能对上吗

转出yolo模型这里有个疑惑: yolov5_ckpt['model'] = deepcopy(yolov5_model) yolov5_ckpt['ema'] = deepcopy(yolov5_model)

ckpt['updates'] = 0

torch.save(yolov5_ckpt, save_path) 为啥要拷贝两份模型导出呢?

PHI6kai commented 1 year ago

@Ma-Liang-hub 您好想问一下您ET转PT的是怎么操作的?

Ma-Liang-hub commented 1 year ago

@Ma-Liang-hub 您好想问一下您ET转PT的是怎么操作的?

就是执行convert_pt_to_efficient.py:convert_efficient_to_yolov5(efficient_path='./best.pt', yolov5_path='./weights/best.pt', save_path='./yolov5x.pt')

PHI6kai commented 1 year ago

您的这个yolov5_path='./weights/best.pt'是之前跑有监督的时候生成的模型吗?我导出之后发现直接放入yolov5的detect无法运行

BowieHsu commented 1 year ago

截屏2023-03-13 下午9 30 17 @Ma-Liang-hub 您好,我参考的是运行完对ckpt的操作,在训练时,会存下每个epoch的model和ema,然后在训练结束后,会把ema的权重赋给model

Ma-Liang-hub commented 1 year ago

截屏2023-03-13 下午9 30 17 @Ma-Liang-hub 您好,我参考的是运行完对ckpt的操作,在训练时,会存下每个epoch的model和ema,然后在训练结束后,会把ema的权重赋给model

目前这个代码中有伪标签阈值自适应的功能吗,动态计算的过程在哪里呀,我看了半天代码貌似没找到

delicate00 commented 1 year ago

image 请问我转换权重文件这里是不是理解有问题:best.py指官方v5转ET;yolov5s_custom.yaml指只修改过depth_multiple、width_multiple、nc和classes的此代码文件;efficient_v5.pt是转换成ET的权重文件

BowieHsu commented 1 year ago

@delicate00 您好,您的理解是正确的

delicate00 commented 1 year ago

@delicate00 您好,您的理解是正确的

您好,我需要根据我在官方上改进后训练的配置文件去修改一下 下载et源码中的yolov5s_custom.yaml文件吗?还是说我只需要修改一下“depth_multiple、width_multiple、nc和classes”这些参数即可呢?因为我标准转ET后,用val.py文件验证,各项指标都为0,是跟我用标准训练出来的权重有关系吗?

hytxx commented 1 year ago

@BowieHsu 您好,直接进行半监督训练,训练完成后转onxx, 1、直接使用 python export.py --weights yolov5_ssod/exp/weights/best.pt --imgsz 640 --simplify --opset 11 --device 1 --include 'onnx' 2、报错:ONNX: export failure: ONNX export failed: Couldn't export Python operator GradReverse,请问怎么解决? 3、et模型需要先转标准yolov5 然后转onnx?

ZAntonyH commented 3 months ago

试试脚本里面的convert_efficient_to_yolov5函数,需要同时抓一下您训好的ET模型和您原来的那个yolov5模型,重新存成一份新的yolov5可以识别的模型

转换的时候报错:ModuleNotFoundError: No module named 'models.detector.yolo_ssod' 我传的参数convert_efficient_to_yolov5(mula_path='best.pt', map_path='map.txt', yolov5_path='/share/disk1/ml/code/yolov5-master/runs/train/exp3/weights/best.pt', save_path='./finish_model/yolov5x.pt') 第一个是训好的ET模型,第三个是原本的yolo模型

老铁,这个报错你怎么解决的

试试脚本里面的convert_efficient_to_yolov5函数,需要同时抓一下您训好的ET模型和您原来的那个yolov5模型,重新存成一份新的yolov5可以识别的模型

转换的时候报错:ModuleNotFoundError: No module named 'models.detector.yolo_ssod' 我传的参数convert_efficient_to_yolov5(mula_path='best.pt', map_path='map.txt', yolov5_path='/share/disk1/ml/code/yolov5-master/runs/train/exp3/weights/best.pt', save_path='./finish_model/yolov5x.pt') 第一个是训好的ET模型,第三个是原本的yolo模型

大佬这个你怎么解决的

DashBear commented 2 weeks ago

image_245 image_245 跑完半监督学习后,用生成的ET.pt模型跑预测是正常的,但是经过convert_efficient_to_yolov5转换后,在yolov5里跑出来就不对了,我核对了转换结构、权重赋值都没问题,这还有可能是什么造成的?