赞
踩
本节将进行yolov4-pytorch版本的实践~
源码地址:https://github.com/bubbliiiing/yolov4-pytorch
ubuntu18.04,pytorch1.7.0,python=3.8,cuda=11.0
1、配置其他版本的python
- # 构建一个虚拟环境名为:my-env,Python版本为3.6
- conda create -n my-env python=3.6
-
- # 更新bashrc中的环境变量
- conda init bash && source /root/.bashrc
- # 切换到创建的虚拟环境:my-env
- conda activate my-env
-
- # 验证
- 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,更改参数如下:
- '''
- annotation_mode用于指定该文件运行时计算的内容
- annotation_mode为0代表整个标签处理过程,包括获得VOCdevkit/VOC2007/ImageSets里面的txt以及训练用的2007_train.txt、2007_val.txt
- annotation_mode为1代表获得VOCdevkit/VOC2007/ImageSets里面的txt
- annotation_mode为2代表获得训练用的2007_train.txt、2007_val.txt
- '''
- annotation_mode = 0
- '''
- 必须要修改,用于生成2007_train.txt、2007_val.txt的目标信息
- 与训练和预测所用的classes_path一致即可
- 如果生成的2007_train.txt里面没有目标信息
- 那么就是因为classes没有设定正确
- 仅在annotation_mode为0和2的时候有效
- '''
- classes_path = 'model_data/voc_classes.txt'
- '''
- trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
- train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
- 仅在annotation_mode为0和1的时候有效
- '''
- trainval_percent = 0.9
- train_percent = 0.9
- '''
- 指向VOC数据集所在的文件夹
- 默认指向根目录下的VOC数据集
- '''
- VOCdevkit_path = 'VOCdevkit'
第2步、更改classes_path用于指向检测类别所对应的txt
以voc数据集为例,我们用的txt为:
第3步、生成2007_train.txt以及2007_val.txt文件
1、参数修改
- #---------------------------------#
- # Cuda 是否使用Cuda
- # 没有GPU可以设置成False
- #---------------------------------#
- Cuda = True
- #----------------------------------------------#
- # Seed 用于固定随机种子
- # 使得每次独立训练都可以获得一样的结果
- #----------------------------------------------#
- seed = 11
- #---------------------------------------------------------------------#
- # distributed 用于指定是否使用单机多卡分布式运行
- # 终端指令仅支持Ubuntu。CUDA_VISIBLE_DEVICES用于在Ubuntu下指定显卡。
- # Windows系统下默认使用DP模式调用所有显卡,不支持DDP。
- # DP模式:
- # 设置 distributed = False
- # 在终端中输入 CUDA_VISIBLE_DEVICES=0,1 python train.py
- # DDP模式:
- # 设置 distributed = True
- # 在终端中输入 CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py
- #---------------------------------------------------------------------#
- distributed = False
- #---------------------------------------------------------------------#
- # sync_bn 是否使用sync_bn,DDP模式多卡可用
- #---------------------------------------------------------------------#
- sync_bn = False
- #---------------------------------------------------------------------#
- # fp16 是否使用混合精度训练
- # 可减少约一半的显存、需要pytorch1.7.1以上
- #---------------------------------------------------------------------#
- fp16 = False
- #---------------------------------------------------------------------#
- # classes_path 指向model_data下的txt,与自己训练的数据集相关
- # 训练前一定要修改classes_path,使其对应自己的数据集
- #---------------------------------------------------------------------#
- classes_path = '/root/yolov4/model_data/voc_classes.txt'
- #---------------------------------------------------------------------#
- # anchors_path 代表先验框对应的txt文件,一般不修改。
- # anchors_mask 用于帮助代码找到对应的先验框,一般不修改。
- #---------------------------------------------------------------------#
- anchors_path = '/root/yolov4/model_data/yolo_anchors.txt'
- anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]]
- #----------------------------------------------------------------------------------------------------------------------------#
- # 权值文件的下载请看README,可以通过网盘下载。模型的 预训练权重 对不同数据集是通用的,因为特征是通用的。
- # 模型的 预训练权重 比较重要的部分是 主干特征提取网络的权值部分,用于进行特征提取。
- # 预训练权重对于99%的情况都必须要用,不用的话主干部分的权值太过随机,特征提取效果不明显,网络训练的结果也不会好
- #
- # 如果训练过程中存在中断训练的操作,可以将model_path设置成logs文件夹下的权值文件,将已经训练了一部分的权值再次载入。
- # 同时修改下方的 冻结阶段 或者 解冻阶段 的参数,来保证模型epoch的连续性。
- #
- # 当model_path = ''的时候不加载整个模型的权值。
- #
- # 此处使用的是整个模型的权重,因此是在train.py进行加载的,下面的pretrain不影响此处的权值加载。
- # 如果想要让模型从主干的预训练权值开始训练,则设置model_path = '',下面的pretrain = True,此时仅加载主干。
- # 如果想要让模型从0开始训练,则设置model_path = '',下面的pretrain = Fasle,Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
- #
- # 一般来讲,网络从0开始的训练效果会很差,因为权值太过随机,特征提取效果不明显,因此非常、非常、非常不建议大家从0开始训练!
- # 从0开始训练有两个方案:
- # 1、得益于Mosaic数据增强方法强大的数据增强能力,将UnFreeze_Epoch设置的较大(300及以上)、batch较大(16及以上)、数据较多(万以上)的情况下,
- # 可以设置mosaic=True,直接随机初始化参数开始训练,但得到的效果仍然不如有预训练的情况。(像COCO这样的大数据集可以这样做)
- # 2、了解imagenet数据集,首先训练分类模型,获得网络的主干部分权值,分类模型的 主干部分 和该模型通用,基于此进行训练。
- #----------------------------------------------------------------------------------------------------------------------------#
- model_path = '/root/yolov4/yolo4_voc_weights.pth'
- #------------------------------------------------------#
- # input_shape 输入的shape大小,一定要是32的倍数
- #------------------------------------------------------#
- input_shape = [416, 416]
- #----------------------------------------------------------------------------------------------------------------------------#
- # pretrained 是否使用主干网络的预训练权重,此处使用的是主干的权重,因此是在模型构建的时候进行加载的。
- # 如果设置了model_path,则主干的权值无需加载,pretrained的值无意义。
- # 如果不设置model_path,pretrained = True,此时仅加载主干开始训练。
- # 如果不设置model_path,pretrained = False,Freeze_Train = Fasle,此时从0开始训练,且没有冻结主干的过程。
- #----------------------------------------------------------------------------------------------------------------------------#
- pretrained = False
- #------------------------------------------------------------------#
- # mosaic 马赛克数据增强。
- # mosaic_prob 每个step有多少概率使用mosaic数据增强,默认50%。
- #
- # mixup 是否使用mixup数据增强,仅在mosaic=True时有效。
- # 只会对mosaic增强后的图片进行mixup的处理。
- # mixup_prob 有多少概率在mosaic后使用mixup数据增强,默认50%。
- # 总的mixup概率为mosaic_prob * mixup_prob。
- #
- # special_aug_ratio 参考YoloX,由于Mosaic生成的训练图片,远远脱离自然图片的真实分布。
- # 当mosaic=True时,本代码会在special_aug_ratio范围内开启mosaic。
- # 默认为前70%个epoch,100个世代会开启70个世代。
- #
- # 余弦退火算法的参数放到下面的lr_decay_type中设置
- #------------------------------------------------------------------#
- mosaic = True
- mosaic_prob = 0.5
- mixup = True
- mixup_prob = 0.5
- special_aug_ratio = 0.7
- #------------------------------------------------------------------#
- # label_smoothing 标签平滑。一般0.01以下。如0.01、0.005。
- #------------------------------------------------------------------#
- label_smoothing = 0
-
- #----------------------------------------------------------------------------------------------------------------------------#
- # 训练分为两个阶段,分别是冻结阶段和解冻阶段。设置冻结阶段是为了满足机器性能不足的同学的训练需求。
- # 冻结训练需要的显存较小,显卡非常差的情况下,可设置Freeze_Epoch等于UnFreeze_Epoch,此时仅仅进行冻结训练。
- #
- # 在此提供若干参数设置建议,各位训练者根据自己的需求进行灵活调整:
- # (一)从整个模型的预训练权重开始训练:
- # Adam:
- # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)
- # Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)
- # SGD:
- # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)
- # Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)
- # 其中:UnFreeze_Epoch可以在100-300之间调整。
- # (二)从主干网络的预训练权重开始训练:
- # Adam:
- # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 100,Freeze_Train = True,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(冻结)
- # Init_Epoch = 0,UnFreeze_Epoch = 100,Freeze_Train = False,optimizer_type = 'adam',Init_lr = 1e-3,weight_decay = 0。(不冻结)
- # SGD:
- # Init_Epoch = 0,Freeze_Epoch = 50,UnFreeze_Epoch = 300,Freeze_Train = True,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(冻结)
- # Init_Epoch = 0,UnFreeze_Epoch = 300,Freeze_Train = False,optimizer_type = 'sgd',Init_lr = 1e-2,weight_decay = 5e-4。(不冻结)
- # 其中:由于从主干网络的预训练权重开始训练,主干的权值不一定适合目标检测,需要更多的训练跳出局部最优解。
- # UnFreeze_Epoch可以在150-300之间调整,YOLOV5和YOLOX均推荐使用300。
- # Adam相较于SGD收敛的快一些。因此UnFreeze_Epoch理论上可以小一点,但依然推荐更多的Epoch。
- # (三)从0开始训练:
- # Init_Epoch = 0,UnFreeze_Epoch >= 300,Unfreeze_batch_size >= 16,Freeze_Train = False(不冻结训练)
- # 其中:UnFreeze_Epoch尽量不小于300。optimizer_type = 'sgd',Init_lr = 1e-2,mosaic = True。
- # (四)batch_size的设置:
- # 在显卡能够接受的范围内,以大为好。显存不足与数据集大小无关,提示显存不足(OOM或者CUDA out of memory)请调小batch_size。
- # 受到BatchNorm层影响,batch_size最小为2,不能为1。
- # 正常情况下Freeze_batch_size建议为Unfreeze_batch_size的1-2倍。不建议设置的差距过大,因为关系到学习率的自动调整。
- #----------------------------------------------------------------------------------------------------------------------------#
- #------------------------------------------------------------------#
- # 冻结阶段训练参数
- # 此时模型的主干被冻结了,特征提取网络不发生改变
- # 占用的显存较小,仅对网络进行微调
- # Init_Epoch 模型当前开始的训练世代,其值可以大于Freeze_Epoch,如设置:
- # Init_Epoch = 60、Freeze_Epoch = 50、UnFreeze_Epoch = 100
- # 会跳过冻结阶段,直接从60代开始,并调整对应的学习率。
- # (断点续练时使用)
- # Freeze_Epoch 模型冻结训练的Freeze_Epoch
- # (当Freeze_Train=False时失效)
- # Freeze_batch_size 模型冻结训练的batch_size
- # (当Freeze_Train=False时失效)
- #------------------------------------------------------------------#
- Init_Epoch = 0
- Freeze_Epoch = 50
- Freeze_batch_size = 32
- #------------------------------------------------------------------#
- # 解冻阶段训练参数
- # 此时模型的主干不被冻结了,特征提取网络会发生改变
- # 占用的显存较大,网络所有的参数都会发生改变
- # UnFreeze_Epoch 模型总共训练的epoch
- # SGD需要更长的时间收敛,因此设置较大的UnFreeze_Epoch
- # Adam可以使用相对较小的UnFreeze_Epoch
- # Unfreeze_batch_size 模型在解冻后的batch_size
- #------------------------------------------------------------------#
- UnFreeze_Epoch = 100
- Unfreeze_batch_size = 32
- #------------------------------------------------------------------#
- # Freeze_Train 是否进行冻结训练
- # 默认先冻结主干训练后解冻训练。
- #------------------------------------------------------------------#
- Freeze_Train = True
-
- #------------------------------------------------------------------#
- # 其它训练参数:学习率、优化器、学习率下降有关
- #------------------------------------------------------------------#
- #------------------------------------------------------------------#
- # Init_lr 模型的最大学习率
- # Min_lr 模型的最小学习率,默认为最大学习率的0.01
- #------------------------------------------------------------------#
- Init_lr = 1e-2
- Min_lr = Init_lr * 0.01
- #------------------------------------------------------------------#
- # optimizer_type 使用到的优化器种类,可选的有adam、sgd
- # 当使用Adam优化器时建议设置 Init_lr=1e-3
- # 当使用SGD优化器时建议设置 Init_lr=1e-2
- # momentum 优化器内部使用到的momentum参数
- # weight_decay 权值衰减,可防止过拟合
- # adam会导致weight_decay错误,使用adam时建议设置为0。
- #------------------------------------------------------------------#
- optimizer_type = "sgd"
- momentum = 0.937
- weight_decay = 5e-4
- #------------------------------------------------------------------#
- # lr_decay_type 使用到的学习率下降方式,可选的有step、cos
- #------------------------------------------------------------------#
- lr_decay_type = "cos"
- #------------------------------------------------------------------#
- # focal_loss 是否使用Focal Loss平衡正负样本
- # focal_alpha Focal Loss的正负样本平衡参数
- # focal_gamma Focal Loss的难易分类样本平衡参数
- #------------------------------------------------------------------#
- focal_loss = False
- focal_alpha = 0.25
- focal_gamma = 2
- #------------------------------------------------------------------#
- # iou_type 使用什么iou损失,ciou或者siou
- #------------------------------------------------------------------#
- iou_type = 'ciou'
- #------------------------------------------------------------------#
- # save_period 多少个epoch保存一次权值
- #------------------------------------------------------------------#
- save_period = 10
- #------------------------------------------------------------------#
- # save_dir 权值与日志文件保存的文件夹
- #------------------------------------------------------------------#
- save_dir = 'logs'
- #------------------------------------------------------------------#
- # eval_flag 是否在训练时进行评估,评估对象为验证集
- # 安装pycocotools库后,评估体验更佳。
- # eval_period 代表多少个epoch评估一次,不建议频繁的评估
- # 评估需要消耗较多的时间,频繁评估会导致训练非常慢
- # 此处获得的mAP会与get_map.py获得的会有所不同,原因有二:
- # (一)此处获得的mAP为验证集的mAP。
- # (二)此处设置评估参数较为保守,目的是加快评估速度。
- #------------------------------------------------------------------#
- eval_flag = True
- eval_period = 10
- #------------------------------------------------------------------#
- # num_workers 用于设置是否使用多线程读取数据
- # 开启后会加快数据读取速度,但是会占用更多内存
- # 内存较小的电脑可以设置为2或者0
- #------------------------------------------------------------------#
- num_workers = 4
-
- #------------------------------------------------------#
- # train_annotation_path 训练图片路径和标签
- # val_annotation_path 验证图片路径和标签
- #------------------------------------------------------#
- train_annotation_path = '/root/yolov4/2007_train.txt'
- 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,运行结果如下图所示:
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。