YOLOv5快速训练目标检测模型记录


刚完成智能小车比赛视觉模型训练,将模型训练中遇到的问题和过程记录如下

训练准备

环境配置

使用的是win10系统,显卡为3060,环境配置Anaconda+python3.8+cuda11.4+cudnn对应版本
CUDA下载
cudnn下载

图片标注

数据集:根据官方文档要求制作数据集,图像标注这里采用的是Github上开源的labelImg,可以按照需求制作voc或yolo格式数据集,这里采用的是YOLO模式输出数据,标注后会生成一个含图像分类和坐标的txt文件,当所有图像标注完成后可以在文件下下classes文件内查看所有分类。

标注工具链接: labellmg
labellmg界面展示
tips:软件包含快捷键 Q,E为翻图,W为标注框选定,在右侧设置好默认标签后可以实现快速标注。

标注完成后会获得一个标签文件,文件中包含:标签类别序号和对应的坐标位置,每张图片会生成一个标签文件
在这里插入图片描述
以及一个classes文件,该文件中包含所有的类别标签,且与标签文件中的数字相对应。
在这里插入图片描述

数据集制作

这里用了最简单的方式制作数据集,按照官方示例中的介绍,将图像文件和标签文件划分整理,放进不同名字的文件夹中。注意图像文件和标签文件应在文件夹中一一对应。

文件夹格式:
--datasets
	--images
	  		--train
  			--val
  	--labels
  			--train
  			--val

下载YOLOv5Gituhub代码

下载YOLOv5Gituhub代码至本地,链接: YOLOv5.

模型训练

文件修改

开始训练前,需要对配置文件进行简单的修改,以适应我们的数据集。
需要修改的文件 yolov5/train.py

train.py   485-490行 其他参数感兴趣的可以自选搜索修改
def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path') #加载的权重文件,这里选择的是 yolov5s.pt 轻量模型权重。
    parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml', help='model.yaml path')#选取对应的模型配置文件和网络结构位置。
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='dataset.yaml path')#数据集配置文件位置
    parser.add_argument('--hyp', type=str, default='data/hyps/hyp.scratch.yaml', help='hyperparameters path')#超参  选默认未修改
    parser.add_argument('--epochs', type=int, default=100)#训练轮数
    parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')#每批量输入图片数量,根据显存大小设定即可
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')#图像输入大小,测试中发现小于640时会出现训练结果不预测情况,建议640*640输入
 

接下来修改 yolov5\models\yolov5s.yaml 文件,修改后记得保存

# parameters  修改类别,其他参数感兴趣同样可以自行研究修改
nc: 8  # number of classes   将此处修改为我们需要检测的分类数量 
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

接下来修改 yolov5\data/coco128.yaml 文件,可以直接在文件中修改,也可以自己重写

# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to YOLOv5:
#   /parent
#     /datasets/coco128
#     /yolov5

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco  # 选择数据集位置
train: images/train  # train images 位置
val: images/val  # val images 位置
test:  # test images (optional)  #测试集可选,我没用

# Classes
nc: 8  # 类别数
names: ['magiccube','redbull','ball','red','beer','blue','qingdao','dp' ]  # class names  #每个类别对应的标签

开始训练

修改完成后,可以直接运行train.py文件启动训练,当然也可以如同官方示例一样,在终端中用代码的方式为参数赋值训练,参考链接: Train Custom Data.

这里把训练日志贴出来,为了方便展示只训练了10轮,训练完成后模型会保存在
runs\train\exp35\weights中,可以在该文件夹下看到训练中模型的各种拟合曲线。

train: weights=yolov5s.pt, cfg=models/yolov5s.yaml, data=data/coco128.yaml, hyp=data/hyps/hyp.scratch.yaml, epochs=10, batch_size=16, img_size=[640, 640], rect=False, resume=False, nosave=False, notest=False, noautoanchor=False, evolve=False, bucket=, cache_images=False, image_weights=False, device=, multi_scale=False, single_cls=False, adam=False, sync_bn=False, workers=8, project=runs/train, entity=None, name=exp, exist_ok=False, quad=False, linear_lr=False, label_smoothing=0.0, upload_dataset=False, bbox_interval=-1, save_period=-1, artifact_alias=latest, local_rank=-1
YOLOv5  v5.0-250-g02719dd torch 1.9.0+cu111 CUDA:0 (NVIDIA GeForce RTX 3060, 12288.0MB)
hyperparameters: lr0=0.01, lrf=0.2, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0
tensorboard: Start with 'tensorboard --logdir runs/train', view at http://localhost:6006/
wandb: Install Weights & Biases for YOLOv5 logging with 'pip install wandb' (recommended)

                 from  n    params  module                                  arguments                     
  0                -1  1      3520  models.common.Focus                     [3, 32, 3]                    
  1                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  2                -1  1     18816  models.common.C3                        [64, 64, 1]                   
  3                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  4                -1  1    156928  models.common.C3                        [128, 128, 3]                 
  5                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
  6                -1  1    625152  models.common.C3                        [256, 256, 3]                 
  7                -1  1   1180672  models.common.Conv                      [256, 512, 3, 2]              
  8                -1  1    656896  models.common.SPP                       [512, 512, [5, 9, 13]]        
  9                -1  1   1182720  models.common.C3                        [512, 512, 1, False]          
 10                -1  1    131584  models.common.Conv                      [512, 256, 1, 1]              
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 12           [-1, 6]  1         0  models.common.Concat                    [1]                           
 13                -1  1    361984  models.common.C3                        [512, 256, 1, False]          
 14                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 16           [-1, 4]  1         0  models.common.Concat                    [1]                           
 17                -1  1     90880  models.common.C3                        [256, 128, 1, False]          
 18                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]              
 19          [-1, 14]  1         0  models.common.Concat                    [1]                           
 20                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 21                -1  1    590336  models.common.Conv                      [256, 256, 3, 2]              
 22          [-1, 10]  1         0  models.common.Concat                    [1]                           
 23                -1  1   1182720  models.common.C3                        [512, 512, 1, False]          
 24      [17, 20, 23]  1     35061  models.yolo.Detect                      [8, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
D:\Anaconda3\lib\site-packages\torch\nn\functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at  ..\c10/core/TensorImpl.h:1156.)
  return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)
Model Summary: 283 layers, 7082421 parameters, 7082421 gradients, 16.4 GFLOPs

Transferred 354/362 items from yolov5s.pt
Scaled weight_decay = 0.0005
Optimizer groups: 62 .bias, 62 conv.weight, 59 other
train: Scanning '..\datasets\coco\labels\train.cache' images and labels... 216 found, 0 missing, 0 empty, 0 corrupted: 100%|██████████| 216/216 [00:14<?, ?it/s]
val: Scanning '..\datasets\coco\labels\val.cache' images and labels... 10 found, 0 missing, 0 empty, 0 corrupted: 100%|██████████| 10/10 [00:01<?, ?it/s]
Plotting labels... 

autoanchor: Analyzing anchors... anchors/target = 5.70, Best Possible Recall (BPR) = 1.0000
Image sizes 640 train, 640 test
Using 8 dataloader workers
Logging results to runs\train\exp35
Starting training for 10 epochs...

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       0/9     3.68G    0.1092   0.08215   0.06769     0.259        91       640: 100%|██████████| 14/14 [00:08<00:00,  1.68it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  4.03it/s]
                 all         10         60    0.00131     0.0417   0.000303   3.03e-05

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       1/9     3.68G    0.1002   0.09305    0.0653    0.2586        75       640: 100%|██████████| 14/14 [00:02<00:00,  5.05it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  5.26it/s]
                 all         10         60    0.00867      0.265    0.00592   0.000931

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       2/9     3.68G   0.08899   0.09878   0.06223      0.25        77       640: 100%|██████████| 14/14 [00:02<00:00,  5.06it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  5.01it/s]
                 all         10         60     0.0709      0.258     0.0691     0.0167

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       3/9     3.68G   0.07895   0.09372   0.06002    0.2327        90       640: 100%|██████████| 14/14 [00:02<00:00,  5.04it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  4.54it/s]
                 all         10         60      0.107      0.358      0.147     0.0488

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       4/9     3.68G   0.06797    0.0914   0.05765     0.217        76       640: 100%|██████████| 14/14 [00:02<00:00,  5.03it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  4.82it/s]
                 all         10         60      0.237      0.615      0.214     0.0938

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       5/9     3.68G   0.06103   0.07479   0.05627    0.1921        69       640: 100%|██████████| 14/14 [00:02<00:00,  5.03it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  5.63it/s]
                 all         10         60      0.195      0.772      0.308      0.148

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       6/9     3.68G    0.0548    0.0687   0.05505    0.1786       114       640: 100%|██████████| 14/14 [00:02<00:00,  5.02it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  6.82it/s]
                 all         10         60      0.183      0.807      0.347      0.196

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       7/9     3.68G   0.05074    0.0619   0.05347    0.1661        69       640: 100%|██████████| 14/14 [00:02<00:00,  5.03it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  7.65it/s]
                 all         10         60      0.442      0.369      0.447      0.204

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       8/9     3.68G   0.04818     0.058    0.0527    0.1589        72       640: 100%|██████████| 14/14 [00:02<00:00,  4.92it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  8.43it/s]
                 all         10         60      0.815      0.375      0.484      0.291

     Epoch   gpu_mem       box       obj       cls     total    labels  img_size
       9/9     3.68G   0.04369   0.05591   0.05179    0.1514        93       640: 100%|██████████| 14/14 [00:02<00:00,  4.90it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  5.31it/s]
                 all         10         60      0.613        0.4       0.56      0.368
           magiccube         10          1      0.372          1      0.995      0.697
             redbull         10         10      0.488        0.2       0.54      0.363
                ball         10          1      0.988          1      0.995      0.498
                 red         10         10      0.747        0.9      0.935      0.758
                beer         10         10      0.306        0.1      0.278      0.178
                blue         10         10          0          0      0.144     0.0721
             qingdao         10          9          1          0      0.345      0.234
                  dp         10          9          1          0      0.245      0.149
10 epochs completed in 0.011 hours.

Optimizer stripped from runs\train\exp35\weights\last.pt, 14.4MB
Optimizer stripped from runs\train\exp35\weights\best.pt, 14.4MB

模型预测

这里点击文件夹下yolov5\detect.py,对文件进行修改后即可进行模型预测。

具体修改第187-188行,其他参数有兴趣的可另行修改,比如cpu预测,图像大小等

    parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp33/weights/best.pt', help='model.pt path(s)')#将模型位置替换为你训练得到的模型位置
    parser.add_argument('--source', type=str, default='VID_20210705_185429.mp4', help='file/dir/URL/glob, 0 for webcam')#输入预测文件的位置,这里可以输入图片,视频等,输入视频会进行逐帧数预测

修改完成后运行代码即可
预测结束后文件会保存在yolov5\runs\detect中。

YOLOv5目标检测

遇到的问题

图片无法读入

再训练时数据读入环节会出现问题,可能会出现图像无法读入的问题,或者爆内存。
这里修改虚拟内存可以解决问题,找一个大点的盘,在设置中修改下虚拟内存大小,就可以实现图像的读入。当然显存要够,否则训练的时候还是会报错。

train: Scanning '..\datasets\coco\labels\train.cache' images and labels... 216 found, 0 missing, 0 empty, 0 corrupted: 100%|██████████| 216/216 [00:14<?, ?it/s]
val: Scanning '..\datasets\coco\labels\val.cache' images and labels... 10 found, 0 missing, 0 empty, 0 corrupted: 100%|██████████| 10/10 [00:01<?, ?it/s]
Plotting labels... 

训练模型后预测没效果

这个问题可能是因为数据集标注不对导致的,可能各种图片里有好几种东西,有些图片有标有些图片没标,导致最后啥都没训练出来,修改下数据集就好了。 还有就是输入图像大小设置最好是640,小了好像总是出现模型训练失败的问题。

no moddule named ‘nn.mobilenetv3’ 问题

类似的问题大多都是pytorch安装出问题导致的,pip卸载后重装即可,注意不要重复安装torch的CPU和GPU版本,会导致冲突,这里记不到报错啥样了,会提示有俩个版本不知道用哪个,卸载掉其中之一即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值