Yolov3训练自己数据的步骤
安装并配置yolov3
官网链接:https://pjreddie.com/darknet/yolo/
1、下载并安装yolo:
git clone https://github.com/pjreddie/darknet
cd darknet
修改darknet文件夹中的Makefile文件,使用GPU训练令GPU=1,CUDNN=1
GPU=1
CUDNN=1
...
编译源文件
sudo make -j
测试安装是否正确
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
darknet文件夹中会保存这张图片
2、给数据打标签制作voc格式数据集
使用labelimg给图片打标签
接着构建voc数据集样式的目录结构
----VOCdevkit
—VOC2007
—Annotations
—ImageSets
—Main
—JPEGImages
Annotations中存放打标签产生的xml文件
JPEGImages中存放用来打标签的训练图片
Main中是几个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集(需要自己创建TXT文件,并填写图片文件的文件名前缀,如1.jpg,则填写1,需要用空格隔开)
生成路径文件:
构建好层级目录,将文件放入相应目录中,然后分好训练集、验证集和测试集以后,将VOCdevkit文件夹放入darknet/scripts目录中
修改scripts文件夹中的voc_label.py文件,因为没用到2012的数据集,只保留带2007字样的
修改第7行
sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
将“(‘2012’, ‘train’), (‘2012’, ‘val’),”删除掉,改为
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
修改类别名字:
classes = ["aeroplane",...],将其修改为自己的标签:
classes = [“0”,”1”,”2”]
修改最后几行
os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
将 2012_train.txt 2012_val.txt删除掉,改为:
os.system("cat 2007_train.txt 2007_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")
在这里打开终端,运行scripts文件夹中的voc_label.py文件,scripts文件夹中会生成几个TXT文件。
python voc_label.py
3:修改yolov3的训练配置文件
打开cfg/voc.data文件,进行如下修改:
classes= 3 # 自己数据集的类别数
train = /home/xxx/darknet/train.txt # train文件的路径
valid = /home/xxx/darknet/2007_val.txt # test文件的路径
names = data/voc.names
backup = backup
在darknet文件夹下面新建文件夹backup,用于存放训练中生成的模型,1000次以前,是每训练100次保存一次,1000次以后,每训练1000次保存一次,10000次以后,每训练10000次保存一次
分别修改data/voc.name,data/coco.name为样本集的标签名
0
1
2
修改cfg/yolov3-voc.cfg
最开始需要将Testing的配置注释掉,并解除Training配置的注释
batch/subdivisions配置足够可以设置的大一些,可以是64/4
如果不收敛,可以将batch设置的大些,学习率可以设置的小点
其中width、height设置为32的倍数,需要相同越大准确率越高
每个yolo层及其前一层都需要设置,共3个需要修改的地方
filters设置为3*(类别数+1+3),这里类别数是3,所以设置为3*(3+1+3)=24
class设置为类别数,这里是3
以3类目标检测为例主要有以下几处调整:
[net]
# Testing ### 测试模式
# batch=1
# subdivisions=1
# Training ### 训练模式,每次前向的图片数目 = batch/subdivisions
batch=100
subdivisions=64
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.0001 ### 学习率
burn_in=1000 ### 学习率控制的参数
max_batches = 50200 ### 迭代次数
policy=steps ### 学习率策略
steps=40000,45000 ### 学习率变动步长
scales=.1,.1 ### 学习率变动因子
[convolutional]
batch_normalize=1 ### BN
filters=32 ### 卷积核数目
size=3 ### 卷积核尺寸
stride=1 ### 卷积核步长
pad=1 ### pad
activation=leaky ### 激活函数
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #3*(3+4+1)
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=3 #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #3*(3+4+1) 4是坐标数量 1是置信度
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=3 #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
......
[convolutional]
size=1
stride=1
pad=1
filters=24 #3*(1+4+1)
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=3 #类别
num=9
jitter=.3 # 数据扩充的抖动操作
ignore_thresh = .5
truth_thresh = 1
random=1 #如果显存很小,将random设置为0,关闭多尺度训练;
4:下载预训练权重文件开始训练检测模型
#下载预训练权重文件
wget https://pjreddie.com/media/files/darknet53.conv.74
#开始训练检测模型
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
训练好以后的模型在darknet/backup文件夹当中
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.
- 人工智能时代的艺术
- asp.net生成静态页
- Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成
- 照虎画猫写自己的Spring
- 照虎画猫写自己的Spring
- mybatis 框架实战,实现数据库的增删改查
- CodeSmith 创建Ado.Net自定义模版(一)
- CodeSmith 创建Ado.Net自定义模版(二)
- 一文读懂卷积神经网络CNN
- NVIDIA张建中:自主学习芯片,推动人工智能发展
- CodeSmith 创建Ado.Net自定义模版(三)
- Android注解学习(2)
- Android注解学习(2)
- 机器学习之——距离度量学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python实现卷积神经网络】损失函数的定义(均方误差损失、交叉熵损失)
- 【python实现卷积神经网络】优化器的实现(SGD、Nesterov、Adagrad、Adadelta、RMSprop、Adam)
- 用C++跟你聊聊“策略模式”
- 【python实现卷积神经网络】卷积层Conv2D反向传播过程
- 【python实现卷积神经网络】全连接层实现
- 来我们聊聊“简单工厂模式”
- 【python实现卷积神经网络】批量归一化层实现
- 【python实现卷积神经网络】池化层实现
- srand()和rand(),生成随机数,留给我自己看
- 【python实现卷积神经网络】padding2D层实现
- mybatis之全局配置文件中的标签
- 【python实现卷积神经网络】Flatten层实现
- Shiro框架学习笔记(二)基于内置ini文件的身份认证
- 【python实现卷积神经网络】上采样层upSampling2D实现
- mybatis映射文件之获取自增的主键