Advertisement

yolov3不同尺寸图片训练_目标检测 | 在自己数据集上利用YOLOv3实现目标检测训练全流程...

阅读量:

01

构建YOLOv3网络的cfg文件

该文件表示的是你的检测网络的结构,类似caffe的prototxt文件。

[YOLOv3的cfg文件](https://github.com/qiu931110/darknet/blob/master/cfg/yolov3.cfg

[无上采样YOLOv3的cfg文件]

https://github.com/qiu931110/darknet/blob/master/cfg/yolov3_change.cfg

02

准备hs.data文件

如下文件中明确设置了目标检测网络中分类的数量为4个。具体而言, 训练数据集所在的具体位置是train.txt文件, 配置文件hs.names的具体位置设置在相应的目录下, 并且经过训练后生成的模型参数存储位置设置在指定的工作目录下以供后续使用.

9603d5900db87ea54dbe5e4ee0498b19.png
  • train.txt文件

在train.txt文件中存储的内容如图所示表示训练数据集图片存储位置的路径

f9197ec710f0e5e0bc1b881cc5e5b05a.png
  • hs.names文件

在hs.names文件中展示的内容如图所示,则表示当前被检测网络识别并关注的关键分类名称集合。

49c0423b8af3db6c4c8d6d319967d9ee.png

03

训练数据准备

训练数据存储的位置必须与步骤2中train.txt文件指定的路径保持一致;此外,在处理每张图片时还需要准备其目标位置及其类别信息的数据。即每张图片都必须有一个对应的标签文件,并按照特定方式组织存储内容。具体来说,请按照以下方式组织相关数据:

ceeafa2d5b94c53096e7c0c4f25c7bec.png

而上图中的txt文件中的格式如下:

每一条记录对应当前图像中的一个目标,并由五个字段组成。第一个字段标识该目标所属的类别(数值类型),具体取值范围为:0对应"people"(人)、1对应"car"(汽车)、2对应"bicycle"(自行车)、3对应"truck"(卡车),这些分类标识与hs.names文件一一对应。后两个字段指示了当前目标在图像中的中心坐标位置(x,y)。接下来两个数值代表了该目标在图像中的宽度与高度(均为百分比值)。值得注意的是,在回归网络训练过程中这些比例参数通常小于1,在一定程度上有助于加快模型收敛速度。

f4192d3ae4c38be99c8b47b23ab1bcd8.png

以下是给出的代码能够处理jpg和txt文件,并能够在大量图片中提取出所需的小图像块。需要注意的是这段代码与YOLOv3模型的训练过程无关。将其放置在此处的目的在于帮助理解txt文件中的各个字段及其含义。

2f61ed85a74496b1c4fa9f04c09f2163.png

04

若有预训练权重,准备预训练权重

如果需要预训练权重,则从网上下载相应的配置文件,并将这些权重保存至指定的位置。

05

构建train.sh批处理脚本

该批处理脚本示例如下,请注意以下关键设置:首先需要配置好用于进行检测网络训练的主要参数设置;其次,在操作流程中将重点围绕detector参数与train参数展开;此外还需要关注一些必要的路径信息包括:如cfg目录和weights文件等基本路径配置;最后darknet架构中负责解析配置文件以执行训练任务的核心函数将发挥关键作用

8c01a9b26c18a832254c2502b0acc084.png

06

在命令行运行sh train.sh开始训练YOLOv3

在命令行中启动sh train.sh的进程后,在此之后运用YOLOv3模型对自身数据集进行彻底的训练工作。

07

训练过程中打印出的log的含义

在进行网络训练的过程中(如图所示),每个批次都会输出以下信息:Batch ID、高度H、宽度W以及层数N等数据。值得注意的是,在原始基于darknet框架实现的YOLOv3网络中是不会输出诸如l.batch 16, l.h 11, l.w 20, l.n 3等数据的(这些数据是为了便于观察模型运行过程而添加)。为了便于理解,在源码中添加了这些数据以便于观察。

dbaa13818d8ccc818cefbab6cd8736d9.png

将输出日志分为两个部分,并主要依据cfg文件中的batch=32和subdivisions=2参数进行划分,在第一部分中使用了16张图像,在第二部分也使用了另外的16张图像。每个部分都生成了三个区域(共六个区域),其中每个区域对应于一种特征图上的检测结果。通过使用如l.batch 16等打印语句(如l.batch=16, l.h=11, l.w=20, l.n=3)来更好地区分每个区域所对应的尺度检测。

755cd2b04137d32845bf8ed10c6e31c7.png
94dc3c277f46a06d1238ecf45f5a9201.png

08

cfg参数介绍

简单介绍下cfg文件中的一些参数:

  • 实际batchsize为16
6bddfa0d4830f46119abdf9b2e624008.png
  • 相关增强操作
68371457cab392d8c4429797a36f477d.png
  • 优化策略

采用step策略将问题划分为三个递减阶段,并通过steps参数来调节下降的时间点;同时通过scales参数来决定每次学习率变化时相乘的系数。

671e883cca938d0bdab85eb1d76dba3c.png
  • 特殊参数burn_in

当update_num小于burn_in时,不是使用配置的学习速率更新策略,而是按照公式lr = base_lr * power(batch_num/burn_in,pwr)更新。其背后的假设是:全局最优点就在网络初始位置附近,所以训练开始后的burn_in次更新,学习速率从小到大变化。update次数超过burn_in后,采用配置的学习速率更新策略从大到小变化,显然在finetune时可以尝试使用该参数。

767342f5e5539571b0be351f19ed8810.png
  • yolo层中的参数
43fa366c7c2689601573b9ecbca46ca8.png
  • mask

该参数用于确定当前尺度的detection中使用哪三个anchors。其中6、7、8号 anchor表示选择当前尺度下最后三组较大的 anchors。其余情况则按相同的方式处理

433a7f75db33813ab637831beafa95ee.png
  • random

random设置为1时会激活Multi-Scale Training功能,并采用多尺度图像进行随机训练;若设置为0,则每次仅使用与输入图像等大的样本进行训练

  • jitter

通过抖动增加噪声来抑制过拟合

全部评论 (0)

还没有任何评论哟~