【darknet-yolo系列】yolov3 训练模型操作流程(包含所有资源下载)

全程参考官方文档:https://github.com/AlexeyAB/darknet
非常详细!

其他相关链接:
yolov4 训练模型操作流程(包含所有资源下载)
在window10下安装GPU版的darknet
Windows下在c++中调用darknet-yolo进行检测
下载coco数据集并训练自己的模型
(利用谷歌提供的虚拟盘)在colab上训练yolo模型(详细操作流程)

1.标注数据集,并转为yolo模式(txt格式):

标注的方式很多,这边只针对labelImg工具标注来做的,没有的可自行网上下载;
标注完成后,会生成xml文件,这里需要转换成yolo需要的txt格式:
txt的格式:

<object-class> <x_center> <y_center> <width> <height>

第一个:分类数
第二个:检测框 (中心横坐标x的值 / 图像宽度)
第三个:检测框 (中心标y的值 / 图像高度)
第四个:检测框 (检测框宽度/ 图像宽度)
第五个:检测框 (检测框高度/ 图像高度)
目的:使后四个数值控制在0~1之间
for example:
<x> = <absolute_x> / <image_width> or <height> = <absolute_height> / <image_height>
atention: <x_center> <y_center> - are center of rectangle (are not top-left corner)
txt的格式类似于:

1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667

labelImg生成的xml转换为yolo指定格式的txt文件,转换脚本(python):

import glob
import xml.etree.ElementTree as ET


#类名
class_names=['bottle','paper_box','foam']
#选择输入路径
#path = 'D:/database/629_train/train_images/'   
path = 'D:/database/629_train/val_images/'
#转换一个xml文件为txt
def single_xml_to_txt(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    #保存txt文件路径
    txt_file = xml_file.split('.')[0] + '.txt'
    with open(txt_file, 'w') as txt_file:
        for member in root.findall('object'):
	        #从xml获取图像的宽和高
            picture_width = int(root.find('size')[0].text)
            picture_height = int(root.find('size')[1].text)
            class_name = member[0].text

            #类名对应的index
            class_num = class_names.index(class_name)
            box_x_min = int(member[4][0].text)  # 左上角横坐标
            box_y_min = int(member[4][1].text)  # 左上角纵坐标
            box_x_max = int(member[4][2].text)  # 右下角横坐标
            box_y_max = int(member[4][3].text)  # 右下角纵坐标

            # 转成相对位置和宽高(所有值处于0~1之间)
            x_center = (box_x_min + box_x_max) / (2 * picture_width)
            y_center = (box_y_min + box_y_max) / (2 * picture_height)
            width = (box_x_max - box_x_min) / picture_width
            height = (box_y_max - box_y_min) / picture_height
            print(class_num, x_center, y_center, width, height)
            txt_file.write(str(class_num) + ' ' + str(x_center) + ' ' + str(y_center) + ' ' + str(width) + ' ' + str(
                height) + '\n')



#  转换文件夹下的所有xml文件为txt
def dir_xml_to_txt(path):
    for xml_file in glob.glob(path + '*.xml'):
        print(xml_file)
        single_xml_to_txt(xml_file)


dir_xml_to_txt(path)

(可选)此时已经不需要xml文件了,可以将所有xml文件移动到其他文件夹内:

#function:移除文件中的xml文件


import os
from os import listdir, getcwd
from os.path import join
import shutil
in_path = 'D:/database/629_train/val_images'  #输入路径
out_xml_path = 'D:/database/629_train/val_xml'#将找到的xml文件放到该路径里

def get_files(inPath,out_xml_path):
    for filepath,dirnames,filenames in os.walk(inPath):   #在多级目录下找文件
        for filename in filenames:
            str1 = filename.split('.')[0]
            str1_1 = filename.split('.')[1]
            if str1_1 == "xml":
                shutil.move(filepath + "\\" + filename, out_xml_path)
            else:
                continue

get_files(in_path,out_xml_path)

数据集文件夹结构:
在这里插入图片描述

最后,生成train.txt文件和test.txt,里面包含所有图像路径,
利用python脚本生成:

import glob

path = 'D:/database/629_train/'

def generate_train_and_val(image_path,txt_file):
    with open(txt_file,'w') as tf:
        for jpg_file in glob.glob(image_path + '*.jpg'):
            tf.write(jpg_file + '\n')


generate_train_and_val(path + 'train_images/', path + 'train.txt')
#generate_train_and_val(path + 'val_image/'),path + 'val.txt'

2.制作cfg文件

复制yolov4-custom.cfg的副本,可重命名,并修改yolov4-custom.cfg的参数:
可在darknet主文件夹下搜索yolov4-custom.cfg,新下载的darknet都会有
修改:
1.修改batch和subdivisions,官方推荐:
change line batch to batch=64
change line subdivisions to subdivisions=16
但是,显卡显存不足会报错:out of memory
可以修改为batch=16 subdivisions=16
在这里插入图片描述

2.width 和height 可以根据自己的需求做调整,但只能是yolo指定的尺寸(32的公倍数);

3.修改 max_batches 数值为classes*2000
并且满足,不少于训练图像的样本数;
举例:如果classes=3,那么max_batches不少于6000且不少于训练图像的样本数;
也可以不修改默认参数。
官方文档:
change line max_batches to (classes*2000 but not less than number of training images, but not less than number of training images and not less than 6000), f.e. max_batches=6000 if you train for 3 classes

4.修改steps ,数值等于max_batches的百分之80,max_batches的百分之90
举例:如果classes=3,max_batches=6000,那么step=steps=4800,5400
官方文档:
change line steps to 80% and 90% of max_batches, f.e. steps=4800,5400
在这里插入图片描述
5.修改classses数,根据自己的数据集修改,共三处,在[yolo]-layers

6.修改每个[yolo]-layers之前的[convolutional]中的filters,共三处
filters=255的数值修改 filters=(classes + 5)x3
举例:

[convolutional]
filters=21

[region]
classes=2

官方文档:
change line classes=80 to your number of objects in each of 3 [yolo]-layers:
change [filters=255] to filters=(classes + 5)x3 in the 3 [convolutional] before each [yolo] layer, keep in mind that it only has to be the last [convolutional] before each of the [yolo] layers.
So if classes=1 then should be filters=18. If classes=2 then write filters=21.

3.下载yolov3预权重文件darknet53.conv.74

链接:https://pan.baidu.com/s/12HVwHEj8ppQSsQpiePDZXQ
提取码:w71r

4.生成names文件

每一行写一个类名
(类名序号就会从0开始,从上往下排)
在这里插入图片描述

5.生成data文件

classes= 2
train  = data/train.txt
valid  = data/test.txt
names = data/obj.names
backup = backup/

第一行:多少分类
第二行:train.txt路径
第三行:vaild.txt路径
第四行:names文件的路径
第五行:backup文件夹的路径,用于保存训练过程中生成的weight文件

推荐用绝对路径,不要放在darknet/build/x64下,太多太乱
在这里插入图片描述

6.开始训练:

目前的文件夹结构:
在这里插入图片描述

训练需要data文件cfg文件,和weight文件;并且data文件中包含train.txt,val.txt,names文件,backup文件夹的路径
打开cmd控制台:
进入darknet.exe所在目录:(一般在······/darknet/build/darknet/x64目录下)
输入:

darknet.exe detector train data路径 cfg路径 darknet53.conv.74路径

然后就开始训练了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值