darknet框架中YOLOv3对数据集进行训练和预测详解

目录
  • 1. 下载darknet源码
  • 2. 修改darknet的Makefile文件
  • 3. 准备数据集
  • 4. 修改voc_label.py
  • 5. 下载预训练模型
  • 6. 修改./darknet/cfg/voc.data文件
  • 7. 修改./darknet/data/voc.name文件
  • 8. 修改./darknet/cfg/yolov3-voc.cfg文件
  • 9. 开始训练
  • 10.训练终止后继续训练方法

1. 下载darknet源码

在命令窗口(terminal)中进入你想存放darknet源码的路径,然后在该路径下输入依次输入以下命令:

git clone https://github.com/pjreddie/darknet
cd darknet

上述命令首先从darknet的源码地址复制一份源码到本地,下载下来的是一个名为darknet的文件。然后进入这个名为darknet的文件夹。

2. 修改darknet的Makefile文件

Note:如果不需要darknet在GPU上运行,则略过此步骤,只需执行make命令。 在命令窗口输入以下命令打开Makefile文件:

    vi Makefile

将Makefile文件开头的GPU=0改为GPU=1,如下所示:

GPU=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0

修改完之后,需要执行make命令才可以生效。

make

3. 准备数据集

在./darknet/scripts文件夹下创建文件夹,命名为VOCdevkit,然后再在VOCdevkit文件夹下创建一系列文件夹,整个目录结构如下所示:

VOCdevkit
-VOC2019 # 这个文件夹的年份可以自己取
--Annotations # 在这个文件夹下存放所有的xml文件
--ImageSets
---Main # 在这个文件夹下新建两个TXT文件
----train.txt
----val.txt
--JPEGImages # 在这个文件夹下存放所有的图片文件

上述文件及文件夹创建好之后,下面来对我们的数据集生成train.txt和val.txt,这两个文件中存放训练图像和测试图像的文件名(不含.jpg后缀)。 新建一个creat_train_val_txt.py文件(名字可以自己随便取),然后将以下代码复制进去(注意相应路径的修改)

#coding:utf-8
import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':           # 只有在文件作为脚本文件直接执行时才执行下面代码
    source_folder='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/JPEGImages/'           #图片保存的路径
    dest='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/train.txt'          #写有图片的名字的路径
    dest2='/home/tukrin/zhl/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/val.txt'           #写有图片的名字的路径
    file_list=os.listdir(source_folder)  #获取各图片的名称
    train_file=open(dest,'a')     #追加写打开
    val_file=open(dest2,'a')       #追加写打开
    count = 0
    for file_obj in file_list:
        count += 1
        file_path=os.path.join(source_folder,file_obj) #路径拼接  指向 图片文件的路径
        file_name,file_extend=os.path.splitext(file_obj) #分离文件名与扩展名 file_name为去掉扩展名的图片名称
        # file_num=int(file_name)
        if(count<800):
            train_file.write(file_name+'\n')  #写入去掉扩展名的文件名名称  前800个作为 训练集数据
        else :
            val_file.write(file_name+'\n')    #写入去掉扩展名的文件名名称   后面的作为  验证集数据
    train_file.close() #关闭文件
val_file.close()   #关闭文件

制作好creat_train_val_txt.py文件后,在命令行执行该文件:

python creat_train_val_txt.py

执行完毕之后可以看到刚刚我们新建的train.txt和val.txt文件中被写进了我们的数据集图片的文件名。

4. 修改voc_label.py

打开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=[('2019', 'train'), ('2019', 'val')]  # 此处的2019对应前面新建文件夹时的2019,train和val对应两个TXT文件的文件名
#要修改的地方
classes =["car", "people"] # 此处为数据集的类别名称,一定要与xml文件中的类别名称一致,有几类就写几类
def convert(size, box):#size是图片的尺寸 box是矩形的四个点
    dw = 1./size[0] # 归一化的时候就是使用宽度除以整个image_size的宽度
    dh = 1./size[1] # 归一化的时候就是使用高度除以整个image_size的高度
    x = (box[0] + box[1])/2.0 # 使用(xmin+xmax)/2得到x的中心点
    y = (box[2] + box[3])/2.0 # 使用(ymin+ymax)/2得到y的中心点
    w = box[1] - box[0] # 然后宽度就是使用xmax-xmin计算得到
    h = box[3] - box[2] # 然后高度就是使用ymax-ymin计算得到
    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')#此时文件是如何形成的?    open的时候自动建立
    root = tree.getroot()#获得root节点
    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))#创建这个路径 来存放txt标签
    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')#这个文件可能是自己建的? open的时候自动建立
    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 2019_train.txt 2019_val.txt > train.txt") # 此处是将两个txt连接成一个txt,如果你训练时不用val.txt中的数据,可以注释掉这句话。
 # os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")# 另外,删除另外一条os.system(...)语句。

保存修改后,运行该文件:

python voc_label.py

执行完毕之后,会生成2018_train.txt、2018_val.txt、train.txt 三个文件,如下图:

在labels文件夹下会生成图片对应的txt形式的图片标注信息

5. 下载预训练模型

为了加速训练过程,可以在darknet官网上下载预训练模型,在该预训练模型上再进行训练。 在命令窗口输入以下命令:

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

文件保存在script文件夹下即可

6. 修改./darknet/cfg/voc.data文件

classes= 2  # 你的数据集的类别数
train  =  /home/tukrin/zhl/darknet/scripts/2019_train.txt  # 第4步中生成的txt文件路径
valid  =  /home/tukrin/zhl/darknet/scripts/2019_val.txt  # 第4步中生成的txt文件路径
names  =  /home/tukrin/zhl/darknet/data/voc.names # voc.names 的文件路径
backup =  /home/tukrin/zhl/darknet/backup/  #backup文件夹的路径 训练的权重将保存在这

7. 修改./darknet/data/voc.name文件

将voc.name文件做如下修改:

car
people

内容为你的数据集的类别名称,注意和xml文件中的类别名称一致。

8. 修改./darknet/cfg/yolov3-voc.cfg文件

该文件为网络结构文件。 首先修改开头处如下:

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=16

即,将训练模式打开,将测试模式的语句注释掉。

其中subdivisions为将一个batch(此处为64)分成多大的小batch。如果训练时提示超出内存,则可以相应的改小这两个参数的值。

接着视情况修改开头处的超参数(学习率,迭代次数等):

width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 50200 # 迭代次数
policy=steps
steps=40000,45000 # 在指定迭代次数时进行学习率衰减
scales=.1,.1  # 学习率衰减率 此处是0.1

然后再该文件的底部部分,找到如下语句进行如下修改:

......
[convolutional]
size=1
stride=1
pad=1
filters=21 ....................# 修改为 3 * (类别数 + 5),此处类别数为2,所以设置为 3*(2+5)=21
activation=linear
[yolo]
mask = 6,7,8
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=1
......
[convolutional]
size=1
stride=1
pad=1
filters=21 .....................# 同上
activation=linear
[yolo]
mask = 3,4,5
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=1
......
[convolutional]
size=1
stride=1
pad=1
filters=21 .....................# 同上
activation=linear
[yolo]
mask = 0,1,2
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=1

有三处[yolo]的上面的[convolutional]的filters要改 和[yolo]的classes要改开始训练

9. 开始训练

在 ./darknet 目录下,在命令窗口中执行以下命令,其中 -gpus 0, 1 用来指定参与训练的GPU编号,可以省略。填0 或1

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg scripts/darknet53.conv.74 -gpus 0,1

10.训练终止后继续训练方法

假如训练由于意外情况,如显存不够终止了,可以通过加载中间权重文件,进而继续训练 中间权重文件在backup文件夹中

把9步权重文件的路径换为backup中文件即可

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights -gpus 0,1

backup里文件保存规则: 训练1000次之前每100次保存一次。所以上面图片出现了100~900的权重中间文件。 训练1000次之后每10000次保存一次。 yolov3-voc.backup 会保持100整数倍的训练结果。 所以在1000次之后想继续训练的话应该加载 yolov3-voc.backup文件。注意此文件不能作为检查模型使用。

以上就是darknet框架中YOLOv3对数据集进行训练和预测详解的详细内容,更多关于darknet YOLOv3数据集训练预测的资料请关注我们其它相关文章!

(0)

相关推荐

  • 保姆级官方yolov7训练自己的数据集及项目部署详解

    目录 前言 第一步 数据集准备 第二步 train.py载入自己的数据集并训练 第三步 将训练好的pt文件做成接口调用 总结 前言 首先,先说明我只是初步接触yolov7,写这篇文章的主要目的是可以让大家快速应用自己的数据集进行训练.没有接触过yolov5也没有关系,该篇文章会逐步进行演示如何训练. 第一步 数据集准备 首先确保你有labelimg标图软件,若无,需要自行去下一个并看一下标图教程. 当你已经标注完成,获得了img以及相对应的xml之后(如图) 接下来就是可选择项:是否需要图像增强

  • YOLOv8训练自己的数据集(详细教程)

    目录 官网链接 参数配置 训练 训练命令 检测 评价 总结 等了好久终于等到了V8,赶紧测测效果,放张官网的比对图 官网链接 https://github.com/ultralytics/ultralytics 再下载自己所需要的权重 https://github.com/ultralytics/assets/releases 使用pycharm打开之后,需要在命令行输入下面命令 pip install ultralytics 参数配置 打开目录下的文件夹 ultralytics->yolo->

  • darknet框架中YOLOv3对数据集进行训练和预测详解

    目录 1. 下载darknet源码 2. 修改darknet的Makefile文件 3. 准备数据集 4. 修改voc_label.py 5. 下载预训练模型 6. 修改./darknet/cfg/voc.data文件 7. 修改./darknet/data/voc.name文件 8. 修改./darknet/cfg/yolov3-voc.cfg文件 9. 开始训练 10.训练终止后继续训练方法 1. 下载darknet源码 在命令窗口(terminal)中进入你想存放darknet源码的路径,

  • PHP的Yii框架中创建视图和渲染视图的方法详解

    视图是 MVC 模式中的一部分. 它是展示数据到终端用户的代码,在网页应用中,根据视图模板来创建视图,视图模板为PHP脚本文件, 主要包含HTML代码和展示类PHP代码,通过yii\web\View应用组件来管理, 该组件主要提供通用方法帮助视图构造和渲染,简单起见,我们称视图模板或视图模板文件为视图. 创建视图 如前所述,视图为包含HTML和PHP代码的PHP脚本,如下代码为一个登录表单的视图, 可看到PHP代码用来生成动态内容如页面标题和表单,HTML代码把它组织成一个漂亮的HTML页面.

  • Python的Django框架中forms表单类的使用方法详解

    Form表单的功能 自动生成HTML表单元素 检查表单数据的合法性 如果验证错误,重新显示表单(数据不会重置) 数据类型转换(字符类型的数据转换成相应的Python类型) Form相关的对象包括 Widget:用来渲染成HTML元素的工具,如:forms.Textarea对应HTML中的<textarea>标签 Field:Form对象中的一个字段,如:EmailField表示email字段,如果这个字段不是有效的email格式,就会产生错误. Form:一系列Field对象的集合,负责验证和

  • SSM框架整合JSP中集成easyui前端ui项目开发示例详解

    目录 前言 EasyUI下载与配置 页面美化 运行结果 总结与问题 前言 前端的UI框架很多,如bootsrap.layui.easyui等,这些框架提供了大量控件供开发人员使用,我们无需花费太大的精力,使得我们的页面具有专业标准,使用起来也很简单.所有的前端框架使用方式基本上大同小异,以下使用easyui作为UI框架做一演示,个人认为easyui提供的控件比较好看. EasyUI下载与配置 使用EasyUI,必须下载其js包,下载官网地址:https://www.jeasyui.cn/ 下载j

  • opencv调用yolov3模型深度学习目标检测实例详解

    目录 引言 建立相关目录 代码详解 附源代码 引言 opencv调用yolov3模型进行深度学习目标检测,以实例进行代码详解 对于yolo v3已经训练好的模型,opencv提供了加载相关文件,进行图片检测的类dnn. 下面对怎么通过opencv调用yolov3模型进行目标检测方法进行详解,付源代码 建立相关目录 在训练结果backup文件夹下,找到模型权重文件,拷到win的工程文件夹下 在cfg文件夹下,找到模型配置文件,yolov3-voc.cfg拷到win的工程文件夹下 在data文件夹下

  • 对YOLOv3模型调用时候的python接口详解

    需要注意的是:更改完源程序.c文件,需要对整个项目重新编译.make install,对已经生成的文件进行更新,类似于之前VS中在一个类中增加新函数重新编译封装dll,而python接口的调用主要使用的是libdarknet.so文件,其余在配置文件中的修改不必重新进行编译安装. 之前训练好的模型,在模型调用的时候,总是在 lib = CDLL("/home/*****/*******/darknet/libdarknet.so", RTLD_GLOBAL)这里读不到darknet编译

  • 人工智能学习Pytorch数据集分割及动量示例详解

    目录 1.数据集分割 2.正则化 3.动量和学习率衰减 1.数据集分割 通过datasets可以直接分别获取训练集和测试集. 通常我们会将训练集进行分割,通过torch.utils.data.random_split方法. 所有的数据都需要通过torch.util.data.DataLoader进行加载,才可以得到可以使用的数据集. 具体代码如下: 2. 2.正则化 PyTorch中的正则化和机器学习中的一样,不过设置方式不一样. 直接在优化器中,设置weight_decay即可.优化器中,默认

  • thinkphp中的多表关联查询的实例详解

    thinkphp中的多表关联查询的实例详解 在进行后端管理系统的编程的时候一般会使用框架来进行页面的快速搭建,我最近使用比较多的就是thinkphp框架,thinkphp框架的应用其实就是把前端和后端进行分割管理,前端用户登录查询系统放在thinkphp中的home文件夹中进行管理,后端管理系统放在thinkphp中的admin文件夹中进行管理.对了,在使用thinkphp框架的时候是是要用到mvc架构的,mvc架构就是model(数据模型).view(视图).controller(控制器)的结

  • Python在信息学竞赛中的运用及Python的基本用法(详解)

    前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在<算法竞赛入门经典-训练指南>中所说的一样,如果会用Python,在进行一些小程序的编写,如数据生成器时将会非常方便,它的语法决定了其简约性.本文主要介绍一下简单的Python用法,不会深入. Python的安装和实用 Linux(以Ubuntu系统为例) 一般的Linux都自带了Python,在命令行中输入Python即可进入 如果没有出现上图的文字,可以使

  • ssm框架下web项目,web.xml配置文件的作用(详解)

    1. web.xml中配置了CharacterEncodingFilter,配置这个是拦截所有的资源并设置好编号格式. encoding设置成utf-8就相当于request.setCharacterEncoding("UTF-8"); foreEncoding设置成true就相当于response.setCharacterEncoding("UTF-8"); <filter> <filter-name>CharacterEncodingFi

随机推荐