Darknet YOLOv3数据及配置文件准备

        上一篇我们已经安装好了环境,下面我们将介绍模型如何使用

1.数据准备

        如图:train_images和val_images 存放的是我们需要训练图片的文件夹;

                   trainImageId.txt和valImageId.txt为遍历train_images和val_images文件夹下所有图片名,形如:

        

                   trainImagePath.txt和valImagePath.txt为遍历图片路径文件,形如:

        

可以使用以下脚本生成:

        根据需要修改下面文件夹的路径

import os

# 指定需遍历的文件夹路径
folder = './train_images'

# 获取文件夹下的所有文件名
files = os.listdir(floder_path)

# 打印所有的文件名
with open("./trainImagePath.txt",'w') as f:
    for file in files:

        # 生成trainImagePath.txt文件
        f.write("绝对路径" + file + '\n')

with open("./trainImageId.txt", 'w') as f:
    for file in files

        # 生成trainImageId.txt
        f.wirte(file + '\n')

2.权重和网络配置文件的准备

  • 进入你的数据集文件夹下,使用下面命令下载yolov3-tiny.weights文件
wget https://pjreddie.com/media/files/yolov3-tiny.weights
  • 下载网络配置文件

         进入https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg 下载配置
文件到数据集目录下。

3.创建数据集配置文件

在数据集目录下,新建一个voc.names和voc.data文件

  • 修改voc.name

        写入所有类别的名称,如下

class_1
class_2
  • 修改voc.data文件,n是类别是数量,train和valid是数据集的路径,names为类别名称文件,backup为生成的结果文件
classes = n
train = datasets/trainImagePath.txt
valid = datasets/validateImagePath.txt
names = dataset/voc.names
backup = dataset/backup

4.修改模型配置文件yolov3-tiny.cfg

        修改所有的yolo层的classes参数,为数据集的类别数n;

        修改yolo层前一层的filters参数,为3*(n+1+4);

        修改max_batches迭代次数;

注释掉Testing模式(没有test数据集,有的话不要注释)

具体解释这篇文章。

[net]
# Testing ### 测试模式
# batch=1
# subdivisions=1

# Training       ### 训练模式,每次前向的图片数目 = batch/subdivisions
batch=64         ### 训练的一批数据的个数,batch 越大,训练效果越好
subdivisions=16  ### 在训练模型过程中,一批 batch 样本又被平均分成 subdivision 次送入网络参与训练,以减轻内存占用的压力,subdivision 越大,占用内存压力越小
width=416        ### 网络的输入宽、高、通道数(可以直接修改,但是要修改网络避免深层网络的浪费)
height=416       ### 宽高比的比例可依据输入图像的尺寸进行设置(但需要为 32 的倍数)
channels=3       ### 训练数据的通道数 彩色图
momentum=0.9     ### 动量: DeepLearning1 中最优化方法中的动量参数,这个值影响着梯度下降到最优值得速度。
decay=0.0005     ### 权重衰减:权重衰减正则项,防止过拟合.每一次学习的过程中,将学习后的参数按照固定比例进行降低,为了防止过拟合,decay 参数越大对过拟合的抑制能力越强。
angle=0          ###旋转角度(单位:度)
saturation = 1.5 ### 饱和度
exposure = 1.5   ### 曝光度
hue=.1           ### 色调
learning_rate=0.001 ### 学习率的调整
burn_in=1000     ### 模型预热,小于 1000batch 时采用(0-learning_rate)递增的方式。
max_batches = 50200 ### 迭代次数
policy=steps     ### 学习率策略: 这个是学习率调整的策略,有 policy:constant, steps, exp, poly, step, sig, RANDOM,constant 等方式参考
[https://nanfei.ink/2018/01/23/YOLOv2%E8%B0%83%E5%8F%82%E6%80%BB%E7%BB%93/#more](https://nanfei.i
nk/2018/01/23/YOLOv2 调参总结/#more)
steps=40000,45000 ### 学习率变动步长
scales=.1,.1      ### 学习率变动因子

[convolutional]
batch_normalize=1 ### BN
filters=32        ### 卷积核数目
size=3            ### 卷积核尺寸
stride=1          ### 卷积核步长
pad=1             ### pad
activation=leaky  ###激活函数的类型:linear(线性:不做改变)relu(值>0 时保持不变,小于零时置零)    leaky(值>0 时保持不变,小于零时*0.1)

......
[convolutional]
size=1
stride=1
pad=1
filters=45         #每一个[region/yolo]层前的最后一个卷积层中的 filters=(classes+cords+1)*anchors_num,其中 anchors_num 是该层 mask 的数量。如果没有maskanchors_num=num。coords+1:论文中的 tx,ty,tw,th,to
activation=linear

[yolo]
mask = 6,7,8       #预测 anchors[]中的后三个较大尺寸的 anchor。因为其感受野较大
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
                   #(width, height)通过聚类脚本计算样本宽高
classes=2          #类别
num=9              #如果在配置文件中 anchors 的数量大于 num 时,仅使用前 num 个,小于时内存越界。
jitter=.3          #利用数据抖动产生更多数据, jitter 就是 crop 的参数, jitter=.3,就是在 0~0.3 中进行 crop(具体的裁剪方式请参考 src/data.c 中的 load_data_detection()函数)
ignore_thresh = .5 #参数解释:ignore_thresh 指得是参与计算的 IOU 阈值大小。当预测的检测框与
ground true 的 IOU 大于 ignore_thresh 的时候,参与 loss 的计算,否则,检测框的不参与损失计算。参数目的和理解:
    目的是控制参与 loss 计算的检测框的规模,当 ignore_thresh 过于大,接近于 1 的时候,那么参与检测框回归 loss 的个数就会比较少,同时也容易造成过拟合;而如果 ignore_thresh 设置的过于小,那么参与计算的会数量规模就会很大。
    同时也容易在进行检测框回归的时候造成欠拟合。参数设置:一般选取 0.5-0.7 之间的一个值,之前的计算基础都是小尺(13*13)用的是 0.7,(26*26)用的是 0.5。这次先将 0.5 更改为 0.7。 实验结果:AP=0.5121(有明显下降)
truth_thresh = 1
random=0           #1,如果显存很小,将 random 设置为 0,关闭多尺度训练;

......
[yolo]
mask = 3,4,5       #预测 anchors[]中的中间三个较小尺寸的 anchor。因为其感受野适中
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 
# 三个尺寸的预设的 anchor 大小
classes=2          # 数据中的类别数量
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0 ### 每隔几次迭代后就会微调网络的输入尺寸,如果为 1,每次迭代图片大小随机从 320 到 608,步长为 32,
如果为 0,每次训练大小与输入大小

......
[yolo]
mask = 0,1,2 #预测 anchors[]中的前三个较小尺寸的 anchor。因为其感受野较小
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=2
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0

yolo层修改,例如:

[convolutional]
size=1
stride=1
pad=1
filters=18
#每一个[region/yolo]层前的最后一个卷积层中的 
#filters=num(yolo层个数)*(classes+5) ,5的意义是5个坐标,
#代表论文中的tx,ty,tw,th,po
#这里类别个数为1,(1+5)*3=18
activation=linear

[yolo]                  	
mask = 6,7,8 				
#训练框mask的值是0,1,2,			
#这意味着使用第一,第二和第三个anchor
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,\
		  59,119,  116,90,  156,198,  373,326
# 总共有三个检测层,共计9个anchor
# 这里的anchor是由kmeans聚类算法得到的。
classes=1 
#类别个数
num=9     			
#每个grid预测的BoundingBox num/yolo层个数
jitter=.3    		
#利用数据抖动产生更多数据,
#属于TTA(Test Time Augmentation)
ignore_thresh = .5
# ignore_thresh 指得是参与计算的IOU阈值大小。
#当预测的检测框与ground true的IOU大于ignore_thresh的时候,
#不会参与loss的计算,否则,检测框将会参与损失计算。
#目的是控制参与loss计算的检测框的规模,当ignore_thresh过于大,
#接近于1的时候,那么参与检测框回归loss的个数就会比较少,同时也容易造成过拟合;
#而如果ignore_thresh设置的过于小,那么参与计算的会数量规模就会很大。
#同时也容易在进行检测框回归的时候造成欠拟合。
#ignore_thresh 一般选取0.5-0.7之间的一个值
# 小尺度(13*13)用的是0.7,
# 大尺度(26*26)用的是0.5。

 参考:https://zhuanlan.zhihu.com/p/102983626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值