david8862 / keras-YOLOv3-model-set

end-to-end YOLOv4/v3/v2 object detection pipeline, implemented on tf.keras with different technologies
MIT License
640 stars 222 forks source link

YOLO v4是否已经可以训练train?需要什么版本的tensorflow? #38

Open wsypy opened 4 years ago

wsypy commented 4 years ago

谢谢作者

使用本代码需要什么版本的tensorflow。支持tf 2.x版本吗? 使用YOLO v4可以了吗?效果如何?

万分感谢

david8862 commented 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的使用以及数据集的情况

wsypy commented 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的使用以及数据集的情况

谢谢你的讲解。但在我生成好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'。不知道两种错误是否是一个原因,能帮忙解答吗?谢谢,希望这对使用本代码的其他人也有帮助。

wsypy commented 4 years ago

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 main(args) File "train.py", line 141, in main callbacks=callbacks) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/util/deprecation.py", line 324, in new_func return func(*args, kwargs) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py", line 1306, in fit_generator initial_epoch=initial_epoch) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py", line 819, in fit use_multiprocessing=use_multiprocessing) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/trainingv2.py", line 397, in fit prefix='val') File "/home/work/conda3/envs/yolo/lib/python3.7/contextlib.py", line 130, in exit self.gen.throw(type, value, traceback) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 771, in on_epoch self.callbacks.on_epoch_end(epoch, epoch_logs) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/callbacks.py", line 302, in on_epoch_end callback.on_epoch_end(epoch, logs) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/callbacks.py", line 992, in on_epoch_end self._save_model(epoch=epoch, logs=logs) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/callbacks.py", line 1011, in _save_model filepath = self._get_file_path(epoch, logs) File "/home/work/conda3/envs/yolo/lib/python3.7/site-packages/tensorflow_core/python/keras/callbacks.py", line 1055, in _get_file_path return self.filepath.format(epoch=epoch + 1, logs) KeyError: 'loss'

david8862 commented 4 years ago

感谢反馈。'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。故该设置应该无法得到模型的最优精度

wsypy commented 4 years ago

--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

特别期待您更新和完善,因为我只是个小白,也做不了什么。

david8862 commented 4 years ago

--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预训练权重,训练起来会比较容易

david8862 commented 4 years ago

Hi @wsypy, 我尝试了提取yolov4.h5中的backbone部分作为预训练权重进行迁移学习,但在PascalVOC数据集上的收敛效果并不理想。目前的解决办法是已经在backbone训练模块里增加了对CSPDarknet53的支持,但暂时没有足够的算力完整训练出一个backbone的权重 你如果有条件的话可以参考这里训练出CSPDarknet53作为预加载模型,应该能够得到比较好的结果

wsypy commented 4 years ago

谢谢 @david8862 我是在家中使用的百度AI Studio的Tesla v100 GPU,在其中创建了可以运行tensorflow的环境,但是受存储空间限制,并没有办法训练像imagenet这样大的数据集。再想办法。。。

ajj-cc commented 4 years ago

--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的预训练权重,万分感谢。

david8862 commented 4 years ago

@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 commented 4 years ago

@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%

david8862 commented 4 years ago

@ajj-cc 看起来已经训练的不错了... precision较低应该是因为使用eval.py默认的conf_threshold=0.001(有助于获得更高的AP值)。你可以改用"--conf_threshold=0.1"重新评估,应该可以得到比较合理的结果

ajj-cc commented 4 years ago

@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值提高了

zhiyoujingtian commented 4 years ago

您好,我也是遇到这种问题 yolov4 的loss比yolov3的还要大,现在CSPDarknet53的初始化您有获取到么

david8862 commented 4 years ago

@zhiyoujingtian 还没有...

jialiang99 commented 4 years ago

@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值提高了

能否分享一下您训练的模型

david8862 commented 4 years ago

@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤

wsypy commented 4 years ago

@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤

非常感激

zhiyoujingtian commented 4 years ago

@wsypy @ajj-cc @zhiyoujingtian CSPDarknet53的预训练权重已经可以使用了。可以参考README中更新的有关步骤

谢谢

wsypy commented 4 years ago

@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:还有这个。 不知道其他写的是否正确,很抱歉问您这么多问题,您能帮忙解答一下吗?在您不忙的时间。

david8862 commented 4 years ago

@wsypy

  1. 权重文件的来源可以参考 #42
  2. cspdarknet53.h5在转换生成后会被这里的训练代码自动加载,所以可以不必使用"--weights_path"显式加载。#34 列出了一个我使用较多的训练参数设置供参考,但具体效果还要根据具体模型结构和数据集做相应调整