挑战学院科创项目——训练自己的数据集(一)


两种方式:

  • 本地训练
  • 云端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阈值后也只是出现一些乱七八糟的框框,好在还认识这图里有亲亲肠。。

好吧它连这么大一个鱼豆腐都不认识,心好累快结束吧下次换多一点数据再玩,午睡去了。。????


待续。。