Open wsypy opened 4 years ago
原则上TF1.14以上及TF2.x都可以支持 YOLOv4的训练相关代码已经ready。但由于未得到正式的CSPDarknet53 backbone预训练权重,所以对于使用原版YOLOv4模型结构在中小规模数据集上进行迁移学习的任务而言,需要在训练参数中增加"--weights_path=weights/yolov4.h5"手动加载YOLOv4 COCO预训练权重,同时修改model.py 使用"skip_mismatch=True" 避免加载时报错(需TF 2.1以上版本)。具体的训练效果取决于各种Trick的使用以及数据集的情况
原则上TF1.14以上及TF2.x都可以支持 YOLOv4的训练相关代码已经ready。但由于未得到正式的CSPDarknet53 backbone预训练权重,所以对于使用原版YOLOv4模型结构在中小规模数据集上进行迁移学习的任务而言,需要在训练参数中增加"--weights_path=weights/yolov4.h5"手动加载YOLOv4 COCO预训练权重,同时修改model.py 使用"skip_mismatch=True" 避免加载时报错(需TF 2.1以上版本)。具体的训练效果取决于各种Trick的使用以及数据集的情况
谢谢你的讲解。但在我生成好VOC数据之后想要开始训练却出现了问题。 一、当我不使用weights,我运行如下代码: python train.py --model_type=yolo4_darknet --anchors_path=configs/yolo4_anchors.txt --annotation_file=tools/trainval.txt --classes_path=configs/voc_classes.txt --eval_online --save_eval_checkpoint 训练可以开始,loss也在下降,但到394步,出现了: 394/931 [===========>..................] - ETA: 4:43 - loss: nan - location_loss: nan - confidence_loss: nan - class_loss: nan Traceback (most recent call last) 最终: KeyError: 'val_loss'
二、当我使用weights,我运行如下代码: python train.py --model_type=yolo4_darknet --anchors_path=configs/yolo4_anchors.txt --weights_path=weights/yolov4.h5 --annotation_file=tools/trainval.txt --classes_path=configs/voc_classes.txt --eval_online --save_eval_checkpoint
并且按照你的提示修改了model.py中: 198:model_body.load_weights(weights_path, by_name=True, skip_mismatch=True) 我不知道第243行是否也需要修改 243:model_body.load_weights(weights_path, by_name=False)#, skip_mismatch=True)
但无论如何,最终报错输出:KeyError: 'loss'
上述两种错误一个是KeyError: 'val_loss',一个是KeyError: 'loss'。不知道两种错误是否是一个原因,能帮忙解答吗?谢谢,希望这对使用本代码的其他人也有帮助。
Function call stack: distributed_function
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "train.py", line 258, in
感谢反馈。'val_loss' 或 'loss'错误通常是由于loss值出现nan导致训练过程跑飞而产生。因为目前手边缺少较大显存的GPU和TF2.1等环境,所以我暂时没有完整复现yolo4_darknet的训练过程及相关参数设置,只使用以下配置在PascalVOC数据集上测试了训练代码的可用性
python train.py --model_type=yolo4_darknet --anchors_path=configs/yolo4_anchors.txt --annotation_file=voc_trainval.txt --classes_path=configs/voc_classes.txt --batch_size=4 --transfer_epoch=0
训练2个epoch后未遇到nan loss问题。 实际有效的训练设置通常需要基于一个在分类数据集上训练出的backbone权重,对head部分进行迁移学习后再进一步做完整的tuning。故该设置应该无法得到模型的最优精度
--batch_size=4
谢谢,根据你的提示我可以训练了,但最终效果很差。我设置batch_size=2,训练到第6个epoch时出现了KeyError: 'val_loss',第5个epoch的val_loss没有降低,所以最终保存了 ep004-loss38.304-val_loss35.249.h5。 我使用yolo.py将他生成model.h5,然后使用yolo.py在一张图片上测试,生成了毫不相干的100个框: Input image filename:./example/dog.jpg Found 100 boxes for img
特别期待您更新和完善,因为我只是个小白,也做不了什么。
--batch_size=4
谢谢,根据你的提示我可以训练了,但最终效果很差。我设置batch_size=2,训练到第6个epoch时出现了KeyError: 'val_loss',第5个epoch的val_loss没有降低,所以最终保存了 ep004-loss38.304-val_loss35.249.h5。 我使用yolo.py将他生成model.h5,然后使用yolo.py在一张图片上测试,生成了毫不相干的100个框: Input image filename:./example/dog.jpg Found 100 boxes for img
特别期待您更新和完善,因为我只是个小白,也做不了什么。
我已联系YOLOv4作者尝试获取CSPDarknet53 backbone的预训练权重,也会尝试从yolov4.h5中提取或者从头训练。同时你可以试试换用yolo4_mobilenetv3large之类不同backbone的模型结构,虽然不完全符合YOLOv4原有的设计,但因为可以利用keras官方的Imagenet预训练权重,训练起来会比较容易
Hi @wsypy, 我尝试了提取yolov4.h5中的backbone部分作为预训练权重进行迁移学习,但在PascalVOC数据集上的收敛效果并不理想。目前的解决办法是已经在backbone训练模块里增加了对CSPDarknet53的支持,但暂时没有足够的算力完整训练出一个backbone的权重 你如果有条件的话可以参考这里训练出CSPDarknet53作为预加载模型,应该能够得到比较好的结果
谢谢 @david8862 我是在家中使用的百度AI Studio的Tesla v100 GPU,在其中创建了可以运行tensorflow的环境,但是受存储空间限制,并没有办法训练像imagenet这样大的数据集。再想办法。。。
--batch_size=4
谢谢,根据你的提示我可以训练了,但最终效果很差。我设置batch_size=2,训练到第6个epoch时出现了KeyError: 'val_loss',第5个epoch的val_loss没有降低,所以最终保存了 ep004-loss38.304-val_loss35.249.h5。 我使用yolo.py将他生成model.h5,然后使用yolo.py在一张图片上测试,生成了毫不相干的100个框: Input image filename:./example/dog.jpg Found 100 boxes for img 特别期待您更新和完善,因为我只是个小白,也做不了什么。
我已联系YOLOv4作者尝试获取CSPDarknet53 backbone的预训练权重,也会尝试从yolov4.h5中提取或者从头训练。同时你可以试试换用yolo4_mobilenetv3large之类不同backbone的模型结构,虽然不完全符合YOLOv4原有的设计,但因为可以利用keras官方的Imagenet预训练权重,训练起来会比较容易
根据大佬的讲解,我使用yolo4_mobilenetv3large进行训练,但是效果不是很好,精确度比较低,召回率还可以,恳请作者可以尽快提供CSPDarknet53 backbone的预训练权重,万分感谢。
@ajj-cc , 有详细的evaluation结果么?CSPDarknet53的训练需要较大显存的GPU或者分布式训练环境。目前不确定何时可以安排到相关资源...
--batch_size=4
谢谢,根据你的提示我可以训练了,但最终效果很差。我设置batch_size=2,训练到第6个epoch时出现了KeyError: 'val_loss',第5个epoch的val_loss没有降低,所以最终保存了 ep004-loss38.304-val_loss35.249.h5。 我使用yolo.py将他生成model.h5,然后使用yolo.py在一张图片上测试,生成了毫不相干的100个框: Input image filename:./example/dog.jpg Found 100 boxes for img 特别期待您更新和完善,因为我只是个小白,也做不了什么。
我已联系YOLOv4作者尝试获取CSPDarknet53 backbone的预训练权重,也会尝试从yolov4.h5中提取或者从头训练。同时你可以试试换用yolo4_mobilenetv3large之类不同backbone的模型结构,虽然不完全符合YOLOv4原有的设计,但因为可以利用keras官方的Imagenet预训练权重,训练起来会比较容易
根据大佬的讲解,我使用yolo4_mobilenetv3large进行训练,但是效果不是很好,精确度比较低,召回率还可以,恳请作者可以尽快提供CSPDarknet53 backbone的预训练权重,万分感谢。
@ajj-cc , 有详细的evaluation结果么?CSPDarknet53的训练需要较大显存的GPU或者分布式训练环境。目前不确定何时可以安排到相关资源...
--batch_size=4
谢谢,根据你的提示我可以训练了,但最终效果很差。我设置batch_size=2,训练到第6个epoch时出现了KeyError: 'val_loss',第5个epoch的val_loss没有降低,所以最终保存了 ep004-loss38.304-val_loss35.249.h5。 我使用yolo.py将他生成model.h5,然后使用yolo.py在一张图片上测试,生成了毫不相干的100个框: Input image filename:./example/dog.jpg Found 100 boxes for img 特别期待您更新和完善,因为我只是个小白,也做不了什么。
我已联系YOLOv4作者尝试获取CSPDarknet53 backbone的预训练权重,也会尝试从yolov4.h5中提取或者从头训练。同时你可以试试换用yolo4_mobilenetv3large之类不同backbone的模型结构,虽然不完全符合YOLOv4原有的设计,但因为可以利用keras官方的Imagenet预训练权重,训练起来会比较容易
根据大佬的讲解,我使用yolo4_mobilenetv3large进行训练,但是效果不是很好,精确度比较低,召回率还可以,恳请作者可以尽快提供CSPDarknet53 backbone的预训练权重,万分感谢。
两种类别的目标,第一类AP为0.92(precision=0.38;recall=0.95),第二类AP为0.86(precision=0.33;recall=0.92),总的mAP=89.21%
@ajj-cc 看起来已经训练的不错了... precision较低应该是因为使用eval.py默认的conf_threshold=0.001(有助于获得更高的AP值)。你可以改用"--conf_threshold=0.1"重新评估,应该可以得到比较合理的结果
@ajj-cc 看起来已经训练的不错了... precision较低应该是因为使用eval.py默认的conf_threshold=0.001(有助于获得更高的AP值)。你可以改用"--conf_threshold=0.1"重新评估,应该可以得到比较合理的结果
修改--conf_threshold=0.1之后,两种类别的目标,第一类AP为0.92(precision=0.92;recall=0.93),第二类AP为0.89(precision=0.85;recall=0.91),总的mAP=90.14%。precision值提高了
您好,我也是遇到这种问题 yolov4 的loss比yolov3的还要大,现在CSPDarknet53的初始化您有获取到么
@zhiyoujingtian 还没有...
@ajj-cc 看起来已经训练的不错了... precision较低应该是因为使用eval.py默认的conf_threshold=0.001(有助于获得更高的AP值)。你可以改用"--conf_threshold=0.1"重新评估,应该可以得到比较合理的结果
修改--conf_threshold=0.1之后,两种类别的目标,第一类AP为0.92(precision=0.92;recall=0.93),第二类AP为0.89(precision=0.85;recall=0.91),总的mAP=90.14%。precision值提高了
能否分享一下您训练的模型
@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤
@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤
非常感激
@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤
谢谢
@david8862 你好,很抱歉再打扰你,请教你一些问题。 一、我从Google云端硬盘下载了csdarknet53-omega_final.weights,关于csdarknet53后面的omega_final有什么含义吗?他是使用Imagenet数据集训练的主干部分权重,训练使用的图片输入尺寸是256×256?使用它进行迁移学习时输入416、512、608尺寸的图片可以吗?
二、根据您的提示,将csdarknet53-omega_final.weights转换成cspdarknet53.h5,用此来做迁移训练。我该怎样更好的写一行指令运行进行训练? python train.py --model_type=yolo4_darknet --anchors_path=configs/yolo4_anchors.txt --model_image_size=416x416 --weights_path=weights/cspdarknet53.h5 --transfer_epoch=?? --freeze_level=0 --init_epoch=?? --rescale_interval=?? --enhance_augment=mosaic --label_smoothing=1 --save_eval_checkpoint
--model_image_size:对于图片尺寸,我选择416,512,608都是可以的吗? --transfer_epoch:我不知道该如何选取这个数值。 --init_epoch:这里的数值选取也不理解。 --rescale_interval:还有这个。 不知道其他写的是否正确,很抱歉问您这么多问题,您能帮忙解答一下吗?在您不忙的时间。
谢谢作者
使用本代码需要什么版本的tensorflow。支持tf 2.x版本吗? 使用YOLO v4可以了吗?效果如何?
万分感谢