挑战学院科创项目——训练自己的数据集(一)
两种方式:
- 本地训练
- 云端GPU训练
乐乐新买的幻14也是有显卡的,所以可以先用自己的rtx3060训练少量数据试一试。。
基础知识
-
超参数(hyper-parameter):是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值,它不是通过系统学习得到的。
- 超参\(\rightsquigarrow\)在开始机器学习之前,就人为设置好的参数
- 模型参数\(\rightsquigarrow\)通过训练得到的参数数据
通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果
-
锚框(anchor box):锚框就是在目标检测算法中,围绕中心点,由算法预定义的多个不同长宽比的先验框。锚框的长宽比是一个在已有数据集上的先验值,是一个超参数,可以在模型的配置文件中配置。
-
TensorBoard是TensorFlow 提供的实用工具(utility),可以将TensorFlow程序的执行步骤都显示出来,非常直观。还可以对训练的参数(比如loss值)进行统计,用图的方式来查看变化的趋势。
训练文件train.py
opt参数解析:
参数名 | 作用 |
---|---|
weights | 选用的模型权重,训练时一般置为空值 |
cfg | 模型配置文件,指定网络结构.yaml文件 |
data | 数据集配置文件,数据集路径,类名等 |
hyp | 超参数文件 |
epochs | 训练总轮次 |
batch-size | 批次大小 |
img-size | 输入图片分辨率大小 |
rect | 是否采用矩形训练(只填充有必要的矩形部分,加快推理速度),默认False |
resume | 接着打断训练上次的结果接着训练(需要指定位置) |
nosave | 不保存模型,默认False |
notest | 不进行test,默认False |
noautoanchor | 不自动调整anchor,默认False |
evolve | 是否进行超参数进化(用于超参数调优),默认False |
bucket | 谷歌云盘bucket,一般不会用到 |
cache-images | 是否提前缓存图片到内存,以加快训练速度,默认False |
weights | 加载的权重文件 |
name | 数据集名字,如果设置:results.txt to results_name.txt,默认无 |
device | 训练的设备,cpu;0(表示一个gpu设备cuda |
multi-scale | 是否进行多尺度训练,默认False |
single-cls | 数据集是否只有一个类别,默认False |
adam | 是否使用adam优化器(否则采用随机梯度下降) |
sync-bn | 是否使用跨卡同步BN,在DDP模式使用 |
local_rank | gpu编号 |
entity | W&B Entity |
quad | 可能让图像在大于640时效果更好 |
linear-lr | 线性方式进行学习速率的处理(否则采用余弦退火) |
label-smoothing | 标签平滑,用来防止过拟合 |
logdir | 存放日志的目录 |
workers | dataloader的最大worker数量,可以先设置为0 |
调试小技巧:可以通过 ctrl+f 查找同名参数位置
,如果查找不到其他位置,有可能因为程序中还没有实现。
训练方法
官方文档:Train Custom Data · ultralytics/yolov5 Wiki (github.com)
- 标注
- 人工——手工标注
- 半人工——先用模型检测,再手工调整
- 仿真数据集(GAN,数字图像处理方式)——”自己造数据“
- 工具:CVAT或Make Sense(在线工具:Make Sense)
- 创建dataset.yaml配置文件,指定训练集(train),验证集(val)和测试集(test),指定类别(nc)和类别列表(names)
# hotpot.yaml
# 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, ..]
train: hotpot/images/train # train images (relative to 'path') 128 images
val: hotpot/images/test # val images (relative to 'path') 128 images
# Classes
nc: 3 # number of classes
names: [ 'yudoufu', 'qinqinchang','xiebang'] # class names
- 修改train.py中的参数,开始训练。时间比较久,但也不算太慢。
训练完成后再调整detect.py中的参数进行检测。。。好吧或许是因为我只给了16张图片做训练集,或许是这些鱼豆腐亲亲肠和蟹棒太密集了以至于什么都检测不出来。。????
降低了置信度和iou阈值后也只是出现一些乱七八糟的框框,好在还认识这图里有亲亲肠。。
好吧它连这么大一个鱼豆腐都不认识,心好累快结束吧下次换多一点数据再玩,午睡去了。。????
待续。。