YOLOv5-v6.1训练自己的数据速成---pytorch(GPU实现)

1、源码获取

ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)

点击master,点击Tags,选中v6.1

选中Code,选中Download ZIP下载

 将文件下载至本地,然后解压到自己的工作文件夹。

2、环境配置

默认已经安装好pytorch,且配置好了GPU环境,或CPU版本(CPU跑图像不如GPU)

torch安装:Pytorch05_torch安装(GPU版) - Haozi_D17 - 博客园 (cnblogs.com)

配置解释器

接下来安装yolov5所需要的包

此前建议先配置好源,一般在安装anaconda时已经配置好了, 

若未配置,参考下面文章。

(72条消息) Anaconda配置国内镜像源_小猫不会去楼兰捉虫的博客-CSDN博客_anaconda源

接下来,打开终端,安装requirements里的包(建议使用)

先复制路径

 

我们可以直接在PyCharm的终端中运行,但比较慢,建议使用系统终端,先进入自己的环境,再安装包

conda activate pytorch

pip install -r C:\Users\86139\Desktop\yolov5-6.1\requirements.txt

 接下来,测试环境

直接运行detect文件,首先他会下载权重,weights=yolov5s.pt,coco数据

你也可以自行下载,权重下载:Releases · ultralytics/yolov5 (github.com)

成功的话,将出现runs文件夹,里面有测试结果,

成品图:

3、准备自己的数据集

yolo要求yolo格式的标签,所以建议使用 labelImg进行标签,它可以直接进行yolo格式的标注。

获取网址:heartexlabs/labelImg: 🖍️ LabelImg is a graphical image annotation tool and label object bounding boxes in images (github.com)

标注:(72条消息) labelImg标注数据集(yolov5篇)_xz_godlike的博客-CSDN博客_labelimg yolov5

注意:labelImg有闪退的风险,若遇到闪退,请参考下方处理方式:(72条消息) labelImg闪退【解决方案】_lazerliu的博客-CSDN博客_labelimg闪退

标注时,建议将images和labels放到不同文件夹,便于后面处理

标注完成后,在yolov5-6.1文件夹下创建mydata文件夹及子文件夹,如下

接着就是对自己处理好的images和labels进行划分,注释地方需要修改,其他不用

注意,lables文件中会默认生成classes文件,各位先取出来,避免影响。

import os
import random
import shutil

images_path = 'C:\\Users\\86139\\Desktop\\new_images'    # 图片路径
labels_path = 'C:\\Users\\86139\\Desktop\\new_labels'    # 标注路径

images = os.listdir(images_path)
labels = os.listdir(labels_path)

train_percent = 0.75 # 训练集占比75%

num = len(images)
list_index = range(num)
train = random.sample(list_index,int(train_percent * num))

image_target = 'D:\\Pycharm\\yolov5-6.1\\mydata\\images'    # 目标路径
label_target = 'D:\\Pycharm\\yolov5-6.1\\mydata\\labels'    # 目标路径

for i in images:
    if images.index(i) in train:
        source = os.path.join(images_path,i)
        target = os.path.join(image_target,'train',i)
        shutil.copy(source,target)
    else:
        source = os.path.join(images_path,i)
        target = os.path.join(image_target,'val',i)
        shutil.copy(source,target)

for i in labels:
    if labels.index(i) in train:
        source = os.path.join(labels_path,i)
        target = os.path.join(label_target,'train',i)
        shutil.copy(source,target)
    else:
        source = os.path.join(labels_path,i)
        target = os.path.join(label_target,'val',i)
        shutil.copy(source,target)

 4、yaml文件的修改(两个)

1.data中复制VOC.yaml生成自己的yaml文件,我这里是生成了demo.yaml文件

接着修改里面的数据,或者直接自己编写,源文件中提取出重点,就是下面这些,根据自己的需求修改.

# 自己图片数据的地址
train: D:\\Pycharm\\yolov5-6.1\\mydata\\images\\train\\
val: D:\\Pycharm\\yolov5-6.1\\mydata\\images\val\\
# 注意空格,类的个数
nc: 20         
# 每个类的类名
names: [ 'M00001','M00002','M00004','M00005','M00007',
         'M00011','M00012','M00015','M00019','M00020',
         'M00024','M00027','M00045','M00050','M00054',
         'M00055','M00057','M00058','M00059','M00064' ]

2. model中yaml文件,根据自己选择的权重取选择复制,然后修改 nc: 值就行,只用修改nc

 5、train文件的修改

train文件中parse_opt函数,可以看我下面的,有详细注释.

def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    # 指定预训练权重路径
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5x.pt', help='initial weights path')
    # 指定模型配置文件路径, model 中 提供了5个配置文件
    parser.add_argument('--cfg', type=str, default=r'D:\Pycharm\yolov5-6.1\models\yolov5x_SE.yaml', help='model.yaml path')
    # 数据集对应的参数文件,里面存放主要存放数据集的类别和路径信息
    # 源码提供了9中数据集配置文件
    parser.add_argument('--data', type=str, default=r'D:\Pycharm\yolov5-6.1\data\mydemo02.yaml', help='dataset.yaml path')
    # 指定超参数文件路径,源码提供了5个
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
    # 训练的轮数
    parser.add_argument('--epochs', type=int, default=300)
    # 每批次输入的数据量
    parser.add_argument('--batch-size', type=int, default=2, help='total batch size for all GPUs, -1 for autobatch')
    # 训练集和测试集图片像素大小,选择大一点的权重时,应当进行一 定的调整 32 的倍数
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
    # 否采用矩阵推理的方式去训练模型
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    # 断点续训,是否在上一次训练的基础上继续训练 --resume=True 加上一次的last.pt路径
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    # 是否只保存最后一轮的pt文件,默认保存 best和last
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    # 只在最后一轮测试,不建议开启
    parser.add_argument('--noval', action='store_true', help='only validate final epoch')
    # 是否禁用自动锚框,默认开启,简化训练过程
    parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
    # 遗传超参数进化,不建议乱动,这个超参数进化会耗费大量资源和时间
    parser.add_argument('--evolve', type=int, default=False, nargs='?', const=300, help='evolve hyperparameters for x generations')
    # 谷歌云盘,可以下载谷歌云盘的一些东西,没什么必要
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    # 是否将图片提前缓存到内存,加快训练速度,默认False
    parser.add_argument('--cache', type=str, default=True, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
    # 是否启用加权图像策略,默认不开启,
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    # 设备选择
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    # 是否启用多尺度训练,默认不开启,设置几种不同的图片输入尺度,训练时每个一定iterations随机选取一种训练尺度,开启后,模型的鲁棒型更强
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    # 设定训练集时单类别,还是多类别,默认多类别
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    # 选择优化器,默认SGD 可以选择 SGD Adam AdamW
    parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
    # 是否开启跨卡同步BN;开启参数后即可使用SyncBatchNorm多GPU进行分布式训练
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    # 最大worker数量,建议设为0
    parser.add_argument('--workers', type=int, default=4, help='max dataloader workers (per RANK in DDP mode)')
    # 指定训练好的模型的保存轮径,默认runs/train
    parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
    # 设置保存的模型的文件名
    parser.add_argument('--name', default='exp', help='save to project/name')
    # 每次预测的结果是否保存在原来的文件夹,不指定,则新键一个文件夹
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    # 功能参数,开启后,在比默认640大的数据集上训练效果更好,640大小的数据集上效果和差一些
    parser.add_argument('--quad', action='store_true', help='quad dataloader')
    # 是否开启余弦学习率
    parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
    # 是否对标签进行平滑处理,默认不启用
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
    # 早停,模型在default值轮数里没有提升,则停止训练
    parser.add_argument('--patience', type=int, default=60, help='EarlyStopping patience (epochs without improvement)')
    # 指定冻结层数量,可以在yolov5s.yaml中查看主干网络层数 , 注意不要超过9层
    parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
    # 设置多少个epoch保存一下checkpoint
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
    # 单GPU设备不需要设置
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')

    # Weights & Biases arguments
    # 在线可视化工具,类似tensorboard
    parser.add_argument('--entity', default=None, help='W&B: Entity')
    # 是否上传dataset到wandb tabel,默认False
    parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='W&B: Upload data, "val" option')
    # 设置界框图像记录间隔,
    parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')
    #
    parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')

    opt = parser.parse_known_args()[0] if known else parser.parse_args()
    return opt

需要修改的地方:default中进行路径的修改即可

 注意:

epochs 迭代次数,根据自己需求设置,默认300代

batch-size 一般要修改小一点,默认是32,根据自己电脑配置设置

workers 一般也要设置小一点,他需要很大的虚拟内存,实在不行设置为0.

 6、train

运行train,等待模型跑完,可以中断,他会生成一个runs文件夹,

若要继续跑则,将这里的default改为True运行时,可以通过终端查看,点击链接,进入tensorboard页面查看曲线 训练结束后,你就可以进行预测了,当然,未结束,中断后也可以采用现有模型进行预测

7、detect

同样,放上我的注释

def parse_opt():
    parser = argparse.ArgumentParser()
    # 指定网络权重的路径
    parser.add_argument('--weights', nargs='+', type=str, default=r'D:\Pycharm\yolov5-6.1\runs\train\exp\weights\best.pt', help='model path(s)')
    # 指定网络输入的路径,默认文件夹,可以是具体文件或扩展名 :   path/   path/*.jpg
    parser.add_argument('--source', type=str, default=r'C:\Users\86139\Desktop\mp4\M00045.mp4', help='file/dir/URL/glob, 0 for webcam')
    # 配置文件的一个路径,配置文件包含下载路径和一些数据集基本信息,若不指定数据集,则自动下载coco128数据集
    parser.add_argument('--data', type=str, default=r'D:\Pycharm\yolov5-6.1\data\mydemo02.yaml', help='(optional) dataset.yaml path')
    # 模型在检测图片前会把图片resize成640的size,必须是32的倍数,最后返回原始图片
    parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='inference size h,w')
    # 置信度的阈值
    parser.add_argument('--conf-thres', type=float, default=0.25, help='confidence threshold')
    # 调节IOU的阈值  避免同一对象被多次框出
    parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS IoU threshold')
    # 最大检测数量
    parser.add_argument('--max-det', type=int, default=1000, help='maximum detections per image')
    # 指定GPU数量,不指定则自动检测
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    # 检测时是否把实时检测结果显示出来
    # action='store_true' 启动----功能
    parser.add_argument('--view-img', action='store_true', help='show results')
    # 是否把检测结果保存成一个 txt 格式
    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
    # 是否以 txt 格式保存目标的置信度 必须和  --save-txt 一起使用,单独指定无效
    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
    # 是否把模型检测的物体裁剪下来
    parser.add_argument('--save-crop', action='store_true', help='save cropped prediction boxes')
    # 不保存预测的结果
    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
    # 我们可以给多个变量指定赋值,即可以把'0'赋值给classes 也可以把'0','2','4'都赋值给classes ,指定检测那些类别
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --classes 0, or --classes 0 2 3')
    # 增强版nms
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    # 增强参数
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    # 是否把特征图可视化出来, npy格式,使用numpy读写 png图片
    parser.add_argument('--visualize', action='store_true', help='visualize features')
    # 对所有模型进行strip_optimizer,取出pt文件中的优化器等信息
    parser.add_argument('--update', action='store_true', help='update all models')
    # 预测结果保存的路径
    parser.add_argument('--project', default=ROOT / 'runs/detect', help='save results to project/name')
    # 预测结果保存文件夹的名字
    parser.add_argument('--name', default='exp', help='save results to project/name')
    # 每次预测模型的结果是否保存在原来的文件夹里,指定了,则本次预测结果保存在上一次保存的文件夹里
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    # 这个参数就是调节预测框调粗细
    parser.add_argument('--line-thickness', default=2, type=int, help='bounding box thickness (pixels)')
    # 隐藏标签
    parser.add_argument('--hide-labels', default=False, action='store_true', help='hide labels')
    # 隐藏置信度
    parser.add_argument('--hide-conf', default=False, action='store_true', help='hide confidences')
    # 是否使用FP16半精度推理
    parser.add_argument('--half', action='store_true', help='use FP16 half-precision inference')
    # 是否使用opencv dnn 进行推理
    parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')

    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    print_args(FILE.stem, opt)
    return opt

 你需要修改的地方:也就是这里的default值,

 接着运行即可,他将在runs文件夹下生成detect文件夹,exp文件下会有你的预测结果。

 8、结语

我也是刚刚开始学习,希望能帮到大家,这是最简单的模板,仅供初学者学习,若要深入学习,我帮不到大家,希望和大家一同学习,共同进步。

文章内容是我的总结,我没有全部重新测试一遍,若有问题,请大家指出,我尽快修改,避免误导其他学友,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值