yolov5--完全炼丹指南

2023-11-20

前言

最近在做yolov5识别手势的项目,爬了很多坑,也排除了不少bug,记录一下。参考前人的经验,遇到写得好的文章我会推荐。我主要讲一下这些bug,若有不足之处,欢迎评论指出。

炼丹方法

收集数据集

1、爬取数据
这里主要参考网上爬虫代码就好了,我有一个代码但不是我写的就不分享了。
优点:可以简单获得大量数据
缺点:网上简单爬取的数据质量良莠不齐,基本质量很差

2、使用plotplayer制作
数据集要求:
下面给出两个链接讲得很详细了,我补充一点:根据实际需求灵活应变,贴近使用环境。
参考链接:
添加链接描述
添加链接描述

准备视频,打开potplayer,按快捷键:alt+g。
在这里插入图片描述

自己可以探索plotplayer其他设置。我给出一个推荐方法:
采集数量99999(保证能截取整个视频),按200ms截取。

稍微人工处理一下数据,去除一些模糊的,质量不好的图片。

划分数据集

网上大部分方法是VOC数据集的划分,但我这个是YOLO格式的数据集。

1、先用这位博主的代码对数据集划分,修改源文件路径和新文件路径即可
数据集划分代码

import os
import random
from shutil import copy2
 
# 源文件夹路径
file_path = r"D:/Code/Data/centerlinedata/tem_voc/JPEGImages/"
# 新文件路径
new_file_path = r"D:/Code/Data/GREENTdata/"
# 划分数据比例6:2:2
split_rate = [0.6, 0.2, 0.2]
class_names = os.listdir(file_path)
# 目标文件夹下创建文件夹
split_names = ['train', 'val', 'test']
print(class_names)  # ['00000.jpg', '00001.jpg', '00002.jpg'... ]
 
# 判断是否存在目标文件夹,不存在则创建---->创建train\val\test文件夹
if os.path.isdir(new_file_path):
    pass
else:
    os.makedirs(new_file_path)
for split_name in split_names:
    split_path = new_file_path + "/" + split_name
    print(split_path)   # D:/Code/Data/GREENTdata/train, val, test
    if os.path.isdir(split_path):
        pass
    else:
        os.makedirs(split_path)
 
# 按照比例划分数据集,并进行数据图片的复制
for class_name in class_names:
    current_data_path = file_path  # D:/Code/Data/centerlinedata/tem_voc/JPEGImages/
    current_all_data = os.listdir(current_data_path)
    current_data_length = len(current_all_data)  # 文件夹下的图片个数
    current_data_index_list = list(range(current_data_length))
    random.shuffle(current_data_index_list)
 
    train_path = os.path.join(new_file_path, 'train/')   # D:/Code/Data/GREENTdata/train/
    val_path = os.path.join(new_file_path, 'val/')       # D:/Code/Data/GREENTdata/val/
    test_path = os.path.join(new_file_path, 'test/')     # D:/Code/Data/GREENTdata/test/
 
    train_stop_flag = current_data_length * split_rate[0]
    val_stop_flag = current_data_length * (split_rate[0] + split_rate[1])
 
 
current_idx = 0
train_num = 0
val_num = 0
test_num = 0
# 图片复制到文件夹中
for i in current_data_index_list:
    src_img_path = os.path.join(current_data_path, current_all_data[i])
    if current_idx <= train_stop_flag:
        copy2(src_img_path, train_path)
        train_num += 1
    elif (current_idx > train_stop_flag) and (current_idx <= val_stop_flag):
        copy2(src_img_path, val_path)
        val_num += 1
    else:
        copy2(src_img_path, test_path)
        test_num += 1
    current_idx += 1
print("Done!", train_num, val_num, test_num)
 

划分完成
在这里插入图片描述

2、建立下面的文件结构:
all_split # 这是刚才划分完成的文件夹
  images
    train # 刚才划分的训练图片
    val # 刚才划分的验证图片
  labels
    train # 训练标签,用labelimg打标签的路径
    val # 验证标签,用labelimg打标签的路径
  test # 刚才划分的测试图片
  A.yaml # 配置文件

A.yaml配置如下:
在这里插入图片描述

3、接下来用labelimg对训练集和验证集标注即可
参考链接:
添加链接描述
添加链接描述

yolov5模型训练

炼丹主要参考这个博主的方法,我提出几点注意事项
教程:超详细从零开始yolov5模型训练

1、batch一定要设置的小一点
如果不清楚到底能设多大,可以用auto batch参数,即设置为 -1

python train.py --img 640 --batch -1 --data ./yolo_A/A.yaml --weights yolov5s.pt --cache     

运行这行代码,如下显示,自动选择了15作为batch参数
在这里插入图片描述
这是2080ti的显卡,所以你掂量掂量自己显卡能用多少吧。其实这个参数和网络复杂程度有关,相同数据集,网络越复杂,batch size越小,这里使用yolov5l.pt。之前使用yolov5s.pt的时候,auto batch就显示为47。深度学习,哈哈,算力学习吧

建议:知道了大概batch设置多大,手动设置为2的指数,这样方便GPU运算

一些batch设置过大的错误:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结了一下:和cuDNN有关的报错,内存之类的报错,都可以怀疑一下batch参数。

2、博主没有进行数据集划分,科学的训练数据集是需要的。但博主是带人入门,可以理解。
数据集划分可以参考我上面介绍的方法。
数据集划分意义

简单提升训练效果的措施

1、选择质量高的图片,划分数据集进行交叉验证

2、yolov5l.pt–折中的选择
如图所示,yolov5l速度慢一点,却能换来AP指标的大大提升。
在这里插入图片描述
3、多GPU训练,提高batch size
虽然前面我说到不要设置太高batch size,但这是建立在你硬件设备基础上的。如果实验室有GPU可以利用,那么考虑多GPU训练,提高batch size,这个效果很显著。
关于batch size的理解
没使用多GPU训练前的验证情况:
在这里插入图片描述
使用多GPU训练后的验证情况:
在这里插入图片描述
当然,这仅是特例,但方法值得尝试一下,又不需要知道太多原理性东西。

如下图所示,是多GPU训练batch设置过高的报错。对了,多GPU训练不能使用auto batch。
在这里插入图片描述
3个GPU训练,设置64 batch size会报错,好像是因为不能整除3。设置48就好了。
在这里插入图片描述

官网介绍链接
torch.distributed.run是最新pytorch版本的,旧版本使torch.distributed.launch

4、关于训练策略,这有篇文章写得不错,可以了解一下。
添加链接描述

关于参数的说明

def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
    parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
    parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=100, help='total training epochs')
    parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
    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')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    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('--noplots', action='store_true', help='save no plot files')
    parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/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')
    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')
    parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
    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')
    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')
    parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
    parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
    parser.add_argument('--seed', type=int, default=0, help='Global training seed')
    parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

    # Logger arguments
    parser.add_argument('--entity', default=None, help='Entity')
    parser.add_argument('--upload_dataset', nargs='?', const=True, default=False, help='Upload data, "val" option')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval')
    parser.add_argument('--artifact_alias', type=str, default='latest', help='Version of dataset artifact to use')

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

–weight参数:预训练的权重文件,例如:yolov5s.pt, yolov5l.pt
–cfg:训练的模型文件,默认是yolov5s.yaml(代码默认是空的,如果不指定就根据weight参数决定模型参数。如果指定的话,以指定的模型文件为主。
–data:训练数据的位置
–hyp:超参数,一般不使用
–epochs:训练轮数,默认是100
–batch-size:默认是16
–imgsize or --img or --imgsz:默认640,必须是32的倍速,暂时不需要更改
–resume:断点训练
–nosave:仅保存最后一个检查点数据
–device:使用cuda设备
–cache:利用缓存加速
–workers:cpu加载数据的工作进程,影响训练速度,会占用cpu内存,越大训练速度越快。但是到达瓶颈后,不升反降,也可能超过cpu负载报错。
–hyp:超参数进化,这个可以试试

注意:只要训练参数一致,数据没有更改,无论训练多少次,结果都是一样的,包括提示信息、result.png等,不存在多次训练看平均效果的说法

结语

沉迷炼丹,无法自拔!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolov5--完全炼丹指南 的相关文章

随机推荐

  • 手动切换 Kinect 的驱动程序(for OpenNI 1.* & Microsoft Kinect SDK 1.7)

    微软最近推出了最新版的 Kinect SDK 能够实现实时的 Kinect Fusion 并提供了丰富的手势交互功能 对体感交互开发人员的吸引力越来越大 而 OpenNI 2 0 以上的版本也转为使用微软官方的 Kinect 驱动 也显示了
  • 移动端适配-01-百分比宽度

    1 图片可以在parent中使用 1 line heigh和text align使水平和竖直居中 2 在img标签中加vertical align middle 2 3 background size 1 两个参数 background s
  • Ubuntu18.04安装cuda10.1+cudnn8.0.5+pytorch1.8.1【亲测~】

    Ubuntu18 04安装cuda10 1 cudnn8 0 5 pytorch1 8 1 亲测 目录 第一步 Cuda10 1的安装 第二步 Cudnn8 05的安装 1 进入官网 https developer nvidia com r
  • [思维模式-15]:《复盘》-3- “行”篇 - 操作复盘- 个人复盘

    目录 前言 一 将军不是教出来的 而是打出来的 二 复盘是能力提升的有效方式 三 对什么进行个人复盘 1 新的事 2 重要的事 3 有价值的事 4 按照规范 惯例处置不太奏效的事件 未达预期的事 四 个人复盘的两种操作手法 1 自我简易复盘
  • cisco 小型园区与网络的构建及其应用

    一 实验目的 熟练构建小型区域网络 二 实验设备 Cisco 2811 路由器 6台 cisco 3650 交换机 6台 cisco 2960 交换机7台 pc机8台 服务器6台 数据线缆若干 三 实验拓扑 四 实验步骤
  • applicationContext.xml第一行无缘无故报错!!!

    eclipse的bug 在projects里clean一下 就好了 右键project的validate不管用
  • python实现OCR识别图片验证码

    用cv2模块读取和显示模块 导包cv2拓展模块 import cv2 先给窗体起名字 cv2 namedWindow ShowImage1 cv2 namedWindow ShowImage2 image1 cv2 imread img01
  • 04757信息系统开发与管理2011版考试大纲思维导图

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 不考 思维导图下载地址 MindMaster绘制 链接 https pan baidu com s 1U BRcRyUgZ8QUqlDuOLy w pwd qwzt 提
  • 通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题

    通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题 问题 当 raft group 发生脑裂的情况下 老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来 这时候
  • C语言冒泡排序和选择排序

    一 冒泡排序法 假设从小到大排序 例一数组 int arr 2 1 34 5 arr 0 先跟相邻的arr 1 比较大小 如果比它大则交换两个数值位置 大的数值放在后面 然后比较arr 1 和arr 2 的大小 以此类推 直至第n 2个和第
  • MCDF实验——Lab0

    MCDF实验 一 MCDF功能描述 二 设计结构 三 接口描述 1 系统信号接口 2 通道从端接口 3 整形器接口 4 控制寄存器接口 四 接口时序 1 通道从端接口时序 2 整形器接口时序 3 控制寄存器接口时序 五 寄存器描述 1 地址
  • day4-Django的model

    目录 1 setting文件配置 2 理解models 3 model定义 4 常用字段类型 5 常用属性 6 数据库迁移 7 Meta类 1 setting文件配置 sqlite数据库 DATABASES default ENGINE d
  • AIGC潮水中,重新理解低代码

    如果将一句话生成应用形容成L4级的 无人驾驶 伙伴云的 AI搭建 则更像L2 级的 辅助驾驶 作者 斗斗 出品 产业家 2023年 AIGC下的低代码赛道 暗流涌动 对于 AI搭建 的搭建效果 尤其是在场景覆盖的广度上 连我自己也感觉比较意
  • Qt Creator创建C++(Day1)

    利用Qt Creator创建纯C 项目流程 1 如下图所示 按照序号选择即可 2 更改名字和选择保存路径 3 点击 下一步 4 直接点击 完成 注意事项 如果在控制台输出中文乱码修改过程如下 1 选中 工具 选项 2 将 UTF 8 改为
  • 语音活性检测器 webrtcvad

    目录 概述 安装 使用脚本 1 测试静音片段 2 清理静音片段 概述 WebRTC是一个免费 开放的框架 项目 使web浏览器通过简单的JavaScript api接口实现实时通信功能 WebRTC An open framework fo
  • 动态规划之多重背包模型

    前置知识 01背包问题 动态规划之01背包模型 如何何何的博客 CSDN博客 完全背包问题 动态规划之完全背包模型 如何何何的博客 CSDN博客 多重背包问题 给定一个有一定容量的背包 和 n 个物品 每个物品有 si 件 每个物品有其对应
  • taoCMS v3.0.2 任意文件上传漏洞(CVE-2022-23880)

    靶标介绍 taoCMS v3 0 2 文件管理处存在任意文件上传漏洞 攻击者可执行任意代码 漏洞复现 1 使用御剑扫描后台 或者直接输入 admin 就会跳转到登录界面 弱口令尝试 账号admin 密码tao 2 在文件管理处 新建文件为1
  • CVPR 2023

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉和Transformer 交流群 作者 Oliiiver 源 知乎 编辑 CVer公众号 https zhuanlan zhihu com p
  • 使用TensorFlow Lite将深度学习模型部署到IOT系统

    使用TensorFlow Lite将深度学习模型部署到IOT系统 TensorFlow Lite简介 移动设备深度学习框架是部署在手机或者树莓派等小型移动设备上的深度学习框架 可以使用训练好的模型在手机等设备上完成推理任务 这一类框架的出现
  • yolov5--完全炼丹指南

    目录 前言 炼丹方法 收集数据集 划分数据集 yolov5模型训练 简单提升训练效果的措施 关于参数的说明 结语 前言 最近在做yolov5识别手势的项目 爬了很多坑 也排除了不少bug 记录一下 参考前人的经验 遇到写得好的文章我会推荐