当前位置:   article > 正文

Yolov4-pytorch训练自己的数据集实践_pytorch和yolo训练

pytorch和yolo训练

前言


本节将进行yolov4-pytorch版本的实践~
源码地址:https://github.com/bubbliiiing/yolov4-pytorch

一、环境配置

ubuntu18.04,pytorch1.7.0,python=3.8,cuda=11.0

1、配置其他版本的python

  1. # 构建一个虚拟环境名为:my-env,Python版本为3.6
  2. conda create -n my-env python=3.6
  3. # 更新bashrc中的环境变量
  4. conda init bash && source /root/.bashrc
  5. # 切换到创建的虚拟环境:my-env
  6. conda activate my-env
  7. # 验证
  8. python

(2)安装包

pip install -r requirements.txt

二、数据集制作

1、将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中

2、将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中

3、数据集处理 

第1步:使用voc_annotation.py对数据集进行下一步的处理

获得训练用的2007_train.txt以及2007_val.txt,分别是annotation_mode、classes_path、trainval_percent、train_percent、VOCdevkit_path,第一次训练可以仅修改classes_path,更改参数如下:

  1. '''
  2. annotation_mode用于指定该文件运行时计算的内容
  3. annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
  4. annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
  5. annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
  6. '''
  7. annotation_mode = 0
  8. '''
  9. 必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
  10. 与训练和预测所用的classes_path一致即可
  11. 如果生成的2007_train.txt里面没有目标信息
  12. 那么就是因为classes没有设定正确
  13. 仅在annotation_mode为0和2的时候有效
  14. '''
  15. classes_path = 'model_data/voc_classes.txt'
  16. '''
  17. trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
  18. train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
  19. 仅在annotation_mode为0和1的时候有效
  20. '''
  21. trainval_percent = 0.9
  22. train_percent = 0.9
  23. '''
  24. 指向VOC数据集所在的文件夹
  25. 默认指向根目录下的VOC数据集
  26. '''
  27. VOCdevkit_path = 'VOCdevkit'

第2步、更改classes_path用于指向检测类别所对应的txt

以voc数据集为例,我们用的txt为:

第3步、生成2007_train.txt以及2007_val.txt文件

三、开始训练

1、参数修改

  1. #---------------------------------#
  2. # Cuda 是否使用Cuda
  3. # 没有GPU可以设置成False
  4. #---------------------------------#
  5. Cuda = True
  6. #----------------------------------------------#
  7. # Seed 用于固定随机种子
  8. # 使得每次独立训练都可以获得一样的结果
  9. #----------------------------------------------#
  10. seed = 11
  11. #---------------------------------------------------------------------#
  12. # distributed 用于指定是否使用单机多卡分布式运行
  13. # 终端指令仅支持Ubuntu。CUDA_VISIBLE_DEVICES用于在Ubuntu下指定显卡。
  14. # Windows系统下默认使用DP模式调用所有显卡,不支持DDP。
  15. # DP模式:
  16. # 设置 distributed = False
  17. # 在终端中输入 CUDA_VISIBLE_DEVICES=0,1 python train.py
  18. # DDP模式:
  19. # 设置 distributed = True
  20. # 在终端中输入 CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py
  21. #---------------------------------------------------------------------#
  22. distributed = False
  23. #---------------------------------------------------------------------#
  24. # sync_bn 是否使用sync_bn,DDP模式多卡可用
  25. #---------------------------------------------------------------------#
  26. sync_bn = False
  27. #---------------------------------------------------------------------#
  28. # fp16 是否使用混合精度训练
  29. # 可减少约一半的显存、需要pytorch1.7.1以上
  30. #---------------------------------------------------------------------#
  31. fp16 = False
  32. #---------------------------------------------------------------------#
  33. # classes_path 指向model_data下的txt,与自己训练的数据集相关
  34. # 训练前一定要修改classes_path,使其对应自己的数据集
  35. #---------------------------------------------------------------------#
  36. classes_path = '/root/yolov4/model_data/voc_classes.txt'
  37. #---------------------------------------------------------------------#
  38. # anchors_path 代表先验框对应的txt文件,一般不修改。
  39. # anchors_mask 用于帮助代码找到对应的先验框,一般不修改。
  40. #---------------------------------------------------------------------#
  41. anchors_path = '/root/yolov4/model_data/yolo_anchors.txt'
  42. anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
  43. #----------------------------------------------------------------------------------------------------------------------------#
  44. # 权值文件的下载请看README,可以通过网盘下载。模型的 预训练权重 对不同数据集是通用的,因为特征是通用的。
  45. # 模型的 预训练权重 比较重要的部分是 主干特征提取网络的权值部分,用于进行特征提取。
  46. # 预训练权重对于99%的情况都必须要用,不用的话主干部分的权值太过随机,特征提取效果不明显,网络训练的结果也不会好
  47. #
  48. # 如果训练过程中存在中断训练的操作,可以将model_path设置成logs文件夹下的权值文件,将已经训练了一部分的权值再次载入。
  49. # 同时修改下方的 冻结阶段 或者 解冻阶段 的参数,来保证模型epoch的连续性。
  50. #
  51. # 当model_path = ''的时候不加载整个模型的权值。
  52. #
  53. # 此处使用的是整个模型的权重,因此是在train.py进行加载的,下面的pretrain不影响此处的权值加载。
  54. # 如果想要让模型从主干的预训练权值开始训练,则设置model_path = '',下面的pretrain = True,此时仅加载主干。
  55. # 如果想要让模型从0开始训练,则设置model_path = '',下面的pretrain = Fasle,Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
  56. #
  57. # 一般来讲,网络从0开始的训练效果会很差,因为权值太过随机,特征提取效果不明显,因此非常、非常、非常不建议大家从0开始训练!
  58. # 从0开始训练有两个方案:
  59. # 1、得益于Mosaic数据增强方法强大的数据增强能力,将UnFreeze_Epoch设置的较大(300及以上)、batch较大(16及以上)、数据较多(万以上)的情况下,
  60. # 可以设置mosaic=True,直接随机初始化参数开始训练,但得到的效果仍然不如有预训练的情况。(像COCO这样的大数据集可以这样做)
  61. # 2、了解imagenet数据集,首先训练分类模型,获得网络的主干部分权值,分类模型的 主干部分 和该模型通用,基于此进行训练。
  62. #----------------------------------------------------------------------------------------------------------------------------#
  63. model_path = '/root/yolov4/yolo4_voc_weights.pth'
  64. #------------------------------------------------------#
  65. # input_shape 输入的shape大小,一定要是32的倍数
  66. #------------------------------------------------------#
  67. input_shape = [416, 416]
  68. #----------------------------------------------------------------------------------------------------------------------------#
  69. # pretrained 是否使用主干网络的预训练权重,此处使用的是主干的权重,因此是在模型构建的时候进行加载的。
  70. # 如果设置了model_path,则主干的权值无需加载,pretrained的值无意义。
  71. # 如果不设置model_path,pretrained = True,此时仅加载主干开始训练。
  72. # 如果不设置model_path,pretrained = False,Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
  73. #----------------------------------------------------------------------------------------------------------------------------#
  74. pretrained = False
  75. #------------------------------------------------------------------#
  76. # mosaic 马赛克数据增强。
  77. # mosaic_prob 每个step有多少概率使用mosaic数据增强,默认50%。
  78. #
  79. # mixup 是否使用mixup数据增强,仅在mosaic=True时有效。
  80. # 只会对mosaic增强后的图片进行mixup的处理。
  81. # mixup_prob 有多少概率在mosaic后使用mixup数据增强,默认50%。
  82. # 总的mixup概率为mosaic_prob * mixup_prob。
  83. #
  84. # special_aug_ratio 参考YoloX,由于Mosaic生成的训练图片,远远脱离自然图片的真实分布。
  85. # 当mosaic=True时,本代码会在special_aug_ratio范围内开启mosaic。
  86. # 默认为前70%个epoch,100个世代会开启70个世代。
  87. #
  88. # 余弦退火算法的参数放到下面的lr_decay_type中设置
  89. #------------------------------------------------------------------#
  90. mosaic = True
  91. mosaic_prob = 0.5
  92. mixup = True
  93. mixup_prob = 0.5
  94. special_aug_ratio = 0.7
  95. #------------------------------------------------------------------#
  96. # label_smoothing 标签平滑。一般0.01以下。如0.01、0.005。
  97. #------------------------------------------------------------------#
  98. label_smoothing = 0
  99. #----------------------------------------------------------------------------------------------------------------------------#
  100. # 训练分为两个阶段,分别是冻结阶段和解冻阶段。设置冻结阶段是为了满足机器性能不足的同学的训练需求。
  101. # 冻结训练需要的显存较小,显卡非常差的情况下,可设置Freeze_Epoch等于UnFreeze_Epoch,此时仅仅进行冻结训练。
  102. #
  103. # 在此提供若干参数设置建议,各位训练者根据自己的需求进行灵活调整:
  104. # (一)从整个模型的预训练权重开始训练:
  105. # Adam:
  106. # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)
  107. # Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)
  108. # SGD:
  109. # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)
  110. # Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)
  111. # 其中:UnFreeze_Epoch可以在100-300之间调整。
  112. # (二)从主干网络的预训练权重开始训练:
  113. # Adam:
  114. # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)
  115. # Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)
  116. # SGD:
  117. # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)
  118. # Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)
  119. # 其中:由于从主干网络的预训练权重开始训练,主干的权值不一定适合目标检测,需要更多的训练跳出局部最优解。
  120. # UnFreeze_Epoch可以在150-300之间调整,YOLOV5和YOLOX均推荐使用300。
  121. # Adam相较于SGD收敛的快一些。因此UnFreeze_Epoch理论上可以小一点,但依然推荐更多的Epoch。
  122. # (三)从0开始训练:
  123. # Init_Epoch = 0,UnFreeze_Epoch >= 300,Unfreeze_batch_size >= 16,Freeze_Train = False(不冻结训练)
  124. # 其中:UnFreeze_Epoch尽量不小于300。optimizer_type = 'sgd',Init_lr = 1e-2,mosaic = True。
  125. # (四)batch_size的设置:
  126. # 在显卡能够接受的范围内,以大为好。显存不足与数据集大小无关,提示显存不足(OOM或者CUDA out of memory)请调小batch_size。
  127. # 受到BatchNorm层影响,batch_size最小为2,不能为1。
  128. # 正常情况下Freeze_batch_size建议为Unfreeze_batch_size的1-2倍。不建议设置的差距过大,因为关系到学习率的自动调整。
  129. #----------------------------------------------------------------------------------------------------------------------------#
  130. #------------------------------------------------------------------#
  131. # 冻结阶段训练参数
  132. # 此时模型的主干被冻结了,特征提取网络不发生改变
  133. # 占用的显存较小,仅对网络进行微调
  134. # Init_Epoch 模型当前开始的训练世代,其值可以大于Freeze_Epoch,如设置:
  135. # Init_Epoch = 60、Freeze_Epoch = 50、UnFreeze_Epoch = 100
  136. # 会跳过冻结阶段,直接从60代开始,并调整对应的学习率。
  137. # (断点续练时使用)
  138. # Freeze_Epoch 模型冻结训练的Freeze_Epoch
  139. # (当Freeze_Train=False时失效)
  140. # Freeze_batch_size 模型冻结训练的batch_size
  141. # (当Freeze_Train=False时失效)
  142. #------------------------------------------------------------------#
  143. Init_Epoch = 0
  144. Freeze_Epoch = 50
  145. Freeze_batch_size = 32
  146. #------------------------------------------------------------------#
  147. # 解冻阶段训练参数
  148. # 此时模型的主干不被冻结了,特征提取网络会发生改变
  149. # 占用的显存较大,网络所有的参数都会发生改变
  150. # UnFreeze_Epoch 模型总共训练的epoch
  151. # SGD需要更长的时间收敛,因此设置较大的UnFreeze_Epoch
  152. # Adam可以使用相对较小的UnFreeze_Epoch
  153. # Unfreeze_batch_size 模型在解冻后的batch_size
  154. #------------------------------------------------------------------#
  155. UnFreeze_Epoch = 100
  156. Unfreeze_batch_size = 32
  157. #------------------------------------------------------------------#
  158. # Freeze_Train 是否进行冻结训练
  159. # 默认先冻结主干训练后解冻训练。
  160. #------------------------------------------------------------------#
  161. Freeze_Train = True
  162. #------------------------------------------------------------------#
  163. # 其它训练参数:学习率、优化器、学习率下降有关
  164. #------------------------------------------------------------------#
  165. #------------------------------------------------------------------#
  166. # Init_lr 模型的最大学习率
  167. # Min_lr 模型的最小学习率,默认为最大学习率的0.01
  168. #------------------------------------------------------------------#
  169. Init_lr = 1e-2
  170. Min_lr = Init_lr * 0.01
  171. #------------------------------------------------------------------#
  172. # optimizer_type 使用到的优化器种类,可选的有adam、sgd
  173. # 当使用Adam优化器时建议设置 Init_lr=1e-3
  174. # 当使用SGD优化器时建议设置 Init_lr=1e-2
  175. # momentum 优化器内部使用到的momentum参数
  176. # weight_decay 权值衰减,可防止过拟合
  177. # adam会导致weight_decay错误,使用adam时建议设置为0。
  178. #------------------------------------------------------------------#
  179. optimizer_type = "sgd"
  180. momentum = 0.937
  181. weight_decay = 5e-4
  182. #------------------------------------------------------------------#
  183. # lr_decay_type 使用到的学习率下降方式,可选的有step、cos
  184. #------------------------------------------------------------------#
  185. lr_decay_type = "cos"
  186. #------------------------------------------------------------------#
  187. # focal_loss 是否使用Focal Loss平衡正负样本
  188. # focal_alpha Focal Loss的正负样本平衡参数
  189. # focal_gamma Focal Loss的难易分类样本平衡参数
  190. #------------------------------------------------------------------#
  191. focal_loss = False
  192. focal_alpha = 0.25
  193. focal_gamma = 2
  194. #------------------------------------------------------------------#
  195. # iou_type 使用什么iou损失,ciou或者siou
  196. #------------------------------------------------------------------#
  197. iou_type = 'ciou'
  198. #------------------------------------------------------------------#
  199. # save_period 多少个epoch保存一次权值
  200. #------------------------------------------------------------------#
  201. save_period = 10
  202. #------------------------------------------------------------------#
  203. # save_dir 权值与日志文件保存的文件夹
  204. #------------------------------------------------------------------#
  205. save_dir = 'logs'
  206. #------------------------------------------------------------------#
  207. # eval_flag 是否在训练时进行评估,评估对象为验证集
  208. # 安装pycocotools库后,评估体验更佳。
  209. # eval_period 代表多少个epoch评估一次,不建议频繁的评估
  210. # 评估需要消耗较多的时间,频繁评估会导致训练非常慢
  211. # 此处获得的mAP会与get_map.py获得的会有所不同,原因有二:
  212. # (一)此处获得的mAP为验证集的mAP。
  213. # (二)此处设置评估参数较为保守,目的是加快评估速度。
  214. #------------------------------------------------------------------#
  215. eval_flag = True
  216. eval_period = 10
  217. #------------------------------------------------------------------#
  218. # num_workers 用于设置是否使用多线程读取数据
  219. # 开启后会加快数据读取速度,但是会占用更多内存
  220. # 内存较小的电脑可以设置为2或者0
  221. #------------------------------------------------------------------#
  222. num_workers = 4
  223. #------------------------------------------------------#
  224. # train_annotation_path 训练图片路径和标签
  225. # val_annotation_path 验证图片路径和标签
  226. #------------------------------------------------------#
  227. train_annotation_path = '/root/yolov4/2007_train.txt'
  228. val_annotation_path = '/root/yolov4/2007_val.txt'

2、运行python train.py

开始训练:

3、训练结果

(1)loss:

(2)mAP

四、训练结果预测

1、训练结果预测需要用到两个文件,分别是yolo.py和predict.py
修改yolo.py里面的model_path以及classes_path,model_path指向训练好的权值文件,在logs文件夹里,classes_path指向检测类别所对应的txt。

2、运行python predict.py

在下面的Input image filename:输入我们需要预测图片的路径,比如:./img/101.jpg,运行结果如下图所示:

参考:

1、睿智的目标检测30——Pytorch搭建YoloV4目标检测平台

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/874997
推荐阅读
相关标签
  

闽ICP备14008679号