训练自己的yolov3模型

  1.前面已经准备好了自己的数据集,这里就不再赘述了,具体参考 Ubuntu下制作VOC数据集(包含LabelImg的使用).
  2. 将准备好的VOCdevkit放到在ubuntu20.04下yolov3-darknet简单测试中克隆下来的项目下的scripts目录下
  3.在项目的scripts目录下,有个voc_label.py文件,修改这个文件为如下代码所示

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]  #将所有与2012有关的内容删除

classes = ["0", "1", "2", "3"]  #修改为自己的类即标注过的标签名


def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2007_train.txt 2007_val.txt > train.txt")   #将所有与2012有关的内容删除
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt") #将所有与2012有关的内容删除

  执行这个python文件,将会把在数据集下的labels下生成若干txt文件,这个txt文件与xml文件名是一一对应的,这就将voc数据集转为了yolo数据集。同时,在scripts文件夹下会生成几个txt文件,打开文件会发现记录了一些图片的绝对路径,在训练的时候会直接使用这几个文件中的两个,如何设置会在后面提到
  4.修改Makefile文件,具体的参数设置在ubuntu20.04下yolov3-darknet简单测试中介绍过了,按照这个修改就可以
  5.修改data下的voc.names文件,将其修改为自己的类名,每个类名占一行
  6.修改cfgf文件下的voc.data文件

classes= 4   
train  = /root/darknet/scripts/train.txt
valid  = /root/darknet/scripts/2007_test.txt
names = data/voc.names
backup = /root/darknet/backup/

  classes代表了类别数,train写训练集的绝对路径,valid写验证集的绝对路径,names写刚修改过的names文件的路径,backup写训练完的模型的保存路径
  7.修改cfg文件下的yolov3-voc.cfg,修改的主要参数以及说明如下

[net]
# Testing        # 测试模式,在训练的时候关闭
 #batch=1
# subdivisions=1
# Training      #训练模式,在训练的时候打开
 batch=64       
 subdivisions=16
 #在训练过程中,batch与subdivision协同工作,batch代表示训练的过程中将一次性加载64张图片进内存,然后分16次完成前向传播。batch越大,训练效果越好,subdivision越大,占用内存压力越小。如果内存和显存不足,可以适当调小batch,调大subdivisions
width=416
height=416   #resize的大小,必须是32的倍数,width和height的值越大,对于小目标的识别 效果越好

channels=3    
momentum=0.9   # 动量,深度学习中用于避免局部最小的一种方法,他的大小影响梯度下降的速度

decay=0.0005
#数据增强选项,自动生成更多的训练样本 
angle=0           #旋转角度增强
saturation = 1.5  #饱和度增强
exposure = 1.5    #曝光量增强
hue=.1            #色调增强

learning_rate=0.001   #学习率,一次更新权重的大小,一般来说保持默认就好,学习率与gpu个数有关,如果你有两块gpu,那么学习率为0.002
burn_in=1000          #在迭代次数小于burn_in时,其学习率的更新有一种方式,大于burn_in时,才采用policy的更新方式
max_batches = 50200   #训练次数,这个数的值等于类别数×2000,最低4000次
policy=steps          #大于burn_in时采取的学习率调整方式,学习率调整有constant, steps, exp, poly, step, sig, RANDOM,constant等方式
steps=40000,45000     #这两个数一般为max_batches×0.8,max_batches×0.9
scales=.1,.1

  除此之外,在这个文件中还有三个需要修改的地方,按住Ctrl+F,搜索yolo,可以发现有三个结果,每个结果大致如图所示
在这里插入图片描述
  需要修改的在上图也标注出来了,filters=3×(5+类别数),classes=类别数,random表示多尺度训练,显卡性能不太好的情况下可以设置为0。注意,搜索结果有三个,所以一共需要修改三次这三个参数。上图中还有一个比较重要的参数anchors,即候选框的大小,这9 个数是通过K-means聚类算法在训练集上得到的,分别用于三个yolo层进行预测用的,当然,一般训练这个anchor可以不修改
  8.下载预训练权重(在darknet目录下执行如下命令下载)

wget https://pjreddie.com/media/files/darknet53.conv.74

  9.编译,训练

make clean
make
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

  执行完上述语句就可以开始训练了,可以看到过程中的一些参数,参数的解释如下

Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 
Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8
9002: 0.211667, 0.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

IOU:预测框与真实框的交并比,这个值衡量了预测框的准确性,越接近于1代表框预测的越准
class:越接近1越好
obj:越接近1越好
No Obj:越小越好,但不等于0
9002:迭代次数
0.60730 avg:平均损失,这个数在多次迭代过程中如果不再下降,应该停止训练
rate:当前的学习率

  如果在训练过程中出现nan不要着急,这是正常的,只要不都是nan即可
  如果你在训练中想停止训练,直接按住ctrl+c进行取消,下次再进行训练的时候,直接执行下述语句继续训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_final.weights #yolov3-voc_final.weights指最近训练得到的权重

  10.评估模型。由于模型可能会发生过拟合的现象,所以需要在测试集上测试所有的权重文件,选取其中准确度最高的一个作为最优模型用于以后的测试与移植
  11.使用训练完的权重进行检测(opencv安装配置的教程可以参考链接: ubuntu20.04编译安装并配置opencv3.4.5核心库以及贡献库

./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_4500.weights data/1.jpg   #检测图片
./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_5000.weights video.mp4 #检测视频(使用此命令需安装opencv)
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值