yolov3训练自定义数据集

目标

使用yolov3训练自己的数据集,数据集大概一千张图,两个类别。

数据准备

  1. 环境准备。确保 darknet环境已经make和测试OK,可参考我的上一篇配置
  2. 下载安装标注数据软件labelimg。 pip install labelimg
  3. 控制台输入 labelimg 即可启动。
  4. 使用labelimg 标注数据。如对 aaa.jpg 文件进行标注,画一个框,类别为person,标注的结果是生成一个 aaa.txt 文件,内容为  class ,x,y,w,h。 如图1
  5. yolov3训练自定义数据集_第1张图片 图1
  6. 创建model目录,复制darknet/cfg目录下的yolov3.cfg到darknet/model目录,并重新命名为yolo-obj.cfg
  7. 在 地址 下载预置权重文件,把下载的 darknet53.conv.74 文件放也放进darknet/model目录(文件结构如下图2)
  8. yolov3训练自定义数据集_第2张图片 图2
  9. 修改yolo-obj.cfg 文件内容。batch 和 subdivisions 等 改动如下:(针对自己的机器性能和分类需求改动可能所有不同)
  10. # 1080这样带的动,再大就会内存溢出报错
    batch=32
    subdivisions=8
    # max_batches = classes*2000 = 2*2000 = 4000
    max_batches = 4000  
    # steps= max_batches*0.8, max_batches*0.89
    steps=3200,3600
  11. 替换 classes=80   为 classes = 2 ,共3处;(因为我是2分类)
  12. 替换 filters=255   为  filters=21  ,共3处;   (classes + 5)*3 = (2+5)*3= 21
  13. 创建如下文件结构。其中img中放着.jpg 和 .txt文件,这些.jpg 和 .txt是步骤4中生成的。

yolov3训练自定义数据集_第3张图片

 img文件夹内长这样

yolov3训练自定义数据集_第4张图片

其他几个文件的内容 如下,分别为 obj.data  ,train.txt    ,val.txt   , obj.names ,其中train.txt  放的是.jpg的相对路径 , val 和 train 随机 2 :8 划分即可。

 

yolov3训练自定义数据集_第5张图片

执行训练

./darknet detector train data/obj.data model/yolo-obj.cfg model/darknet53.conv.74 

运行起来如下:一千张图,我这个配置一般几小时就跑完了。

yolov3训练自定义数据集_第6张图片

预测

  1. 在backup目录中,会生成训练的权重文件,记住它的位置。
  2. 参考我上一篇博客中 darknet.py  ,按照如下修改:(可看到,注释处是使用原来的权重,非注释出用的是这次的新权重文件,同时把classes names的指定从coco.data 改成新的即可。)
  3. 执行darknet.py
    # net = load_net(b"../cfg/yolov3.cfg", b"../yolov3.weights", 0)
    # meta = load_meta(b"../cfg/coco.data")

    net = load_net(b"../model/yolo-obj.cfg", b"../backup/yolo-obj_final.weights", 0)
    meta = load_meta(b"../data/obj.data")

    b_path = b"/home/jiantang/pic_test/hat_sougou2.jpg"
    raw_path = "/home/jiantang/pic_test/hat_sougou2.jpg"
    save_path = "/home/jiantang/pic_test/hat_sougou2_new.jpg"
    detect_and_boxing(net, meta, b_path=b_path, raw_path=raw_path, save_path=save_path)

一些参考

.cfg的一些解释

[net]
batch=64                           每batch个样本更新一次参数。
subdivisions=8                     如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。
                                   在darknet代码中,会将batch/subdivisions命名为batch。
height=416                         input图像的高
width=416                          Input图像的宽
channels=3                         Input图像的通道数
momentum=0.9                       动量
decay=0.0005                       权重衰减正则项,防止过拟合
angle=0                            通过旋转角度来生成更多训练样本
saturation = 1.5                   通过调整饱和度来生成更多训练样本
exposure = 1.5                     通过调整曝光量来生成更多训练样本
hue=.1                             通过调整色调来生成更多训练样本

learning_rate=0.0001               初始学习率
max_batches = 45000                训练达到max_batches后停止学习
policy=steps                       调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
steps=100,25000,35000              根据batch_num调整学习率
scales=10,.1,.1                    学习率变化的比例,累计相乘

[convolutional]
batch_normalize=1                  是否做BN
filters=32                         输出多少个特征图
size=3                             卷积核的尺寸
stride=1                           做卷积运算的步长
pad=1                              如果pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/2
activation=leaky                   激活函数:
                                   logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair

[maxpool]
size=2                             池化层尺寸
stride=2                           池化步进

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

......
......


#######

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[route]                            the route layer is to bring finer grained features in from earlier in the network
layers=-9

[reorg]                            the reorg layer is to make these features match the feature map size at the later layer. 
                                   The end feature map is 13x13, the feature map from earlier is 26x26x512. 
                                   The reorg layer maps the 26x26x512 feature map onto a 13x13x2048 feature map 
                                   so that it can be concatenated with the feature maps at 13x13 resolution.
stride=2

[route]
layers=-1,-3

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=125                        region前最后一个卷积层的filters数是特定的,计算公式为filter=num*(classes+5) 
                                   5的意义是5个坐标,论文中的tx,ty,tw,th,to
activation=linear

[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52          预选框,可以手工挑选,
                                                                                也可以通过k means 从训练样本中学出
bias_match=1
classes=20                         网络需要识别的物体种类数
coords=4                           每个box的4个坐标tx,ty,tw,th
num=5                              每个grid cell预测几个box,和anchors的数量一致。当想要使用更多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝试调大object_scale
softmax=1                          使用softmax做激活函数
jitter=.2                          通过抖动增加噪声来抑制过拟合
rescore=1                          暂理解为一个开关,非0时通过重打分来调整l.delta(预测值与真实值的差)

object_scale=5                     栅格中有物体时,bbox的confidence loss对总loss计算贡献的权重
noobject_scale=1                   栅格中没有物体时,bbox的confidence loss对总loss计算贡献的权重
class_scale=1                      类别loss对总loss计算贡献的权重                      
coord_scale=1                      bbox坐标预测loss对总loss计算贡献的权重

absolute=1
thresh = .6
random=0                           random为1时会启用Multi-Scale Training,随机使用不同尺寸的图片进行训练。

 

你可能感兴趣的:(yolov3训练自定义数据集)