如何训练darknet模型:修改官网已有模型训练自己图片

目录

1.修改cfg文件

2.裁剪权重*.weights文件

3.配置自己的meta.data文件

操作步骤:

实例:

1.进入cygdriver路径

2.生产abnor.list和normal.list文件

3.打乱abnor.list文件列表的顺序,生产abnor_rand.list

4.分割abnor_rand.list文件

5.合并部分分割出来的文件与normal.lsit,生产data.list

6.将data.list乱序

7.分割data_rand.list文件

8.得到train.list和test.list


darknet分类官网教程:https://pjreddie.com/darknet/imagenet/

1.修改cfg文件

cfg文件是darknet架构的网络结构定义文件

搭建darknet深度学习运行编译环境GPU版本CUDA10.0.130+cuDNN7.6.0+OpenCV3.4.0+VS2015+Win10

有关cfg文件的说明见:Darknet模型中cfg文件理解与说明

一文中下载的darknet包已经包含cfg文件,cfg文件都包含在下面路径下:

E:\MyCode\fushikang2019\darknet-master20190829\darknet-master\build\darknet\x64\cfg

本文使用darknet19_448.cfg

[net]
#batch=128
#subdivisions=4
batch=1
subdivisions=1
height=448
width=448
max_crop=512
channels=3
momentum=0.9
decay=0.0005

learning_rate=0.001
policy=poly
power=4
max_batches=100000

angle=7
hue = .1
saturation=.75
exposure=.75
aspect=.75

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

[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
filters=128
size=3
stride=1
pad=1
activation=leaky

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

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

[maxpool]
size=2
stride=2

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

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

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

[maxpool]
size=2
stride=2

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

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

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

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

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

[maxpool]
size=2
stride=2

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

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

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

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

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

[convolutional]
filters=1000
size=1
stride=1
pad=1
activation=linear

[avgpool]

[softmax]
groups=1

[cost]
type=sse

  将 batch 设为 batch=64   

  将 subdivisions 设为 subdivisions=8 

  如果显卡内存较小(即后面运行时报 out of memory 的错时) 可以 将 batch 改成 32 16 8 等 (保证 batch 是 subdivisions  的整数倍),同时取消多尺度训练 即 设置 random = 0 

   将 max_batches 改为 max_batches = 2000 max_batches 的数量为检测的目标数 * 2000 ,如果数据量比较小的时候,max_batches是因该设置大一些,要不然感觉像是闪退一样,还没有训练就已经结束了。

   最后一个卷积filter的1000改为2,ImageNet分类任务是区分1000个类别,但是本文中只需要区分2类

batch,subdivisions,max_batches

It's how many mini batches you split your batch in.
Batch=64 -> loading 64 images for this "iteration".
Subdivision=8 -> Split batch into 8 "mini-batches" so 64/8 = 8 images per "minibatch" and this get sent to the gpu for process.
That will be repeated 8 times until the batch is completed and a new itereation will start with 64 new images.

max_batches:最大迭代次数

修改后的cfg文件为:

[net]
batch=8
subdivisions=4
height=448
width=448
max_crop=512
channels=3
momentum=0.9
decay=0.0005

learning_rate=0.001
policy=poly
power=4
max_batches=3000

angle=7
hue = .1
saturation=.75
exposure=.75
aspect=.75

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

[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
filters=128
size=3
stride=1
pad=1
activation=leaky

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

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

[maxpool]
size=2
stride=2

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

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

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

[maxpool]
size=2
stride=2

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

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

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

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

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

[maxpool]
size=2
stride=2

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

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

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

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

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

[convolutional]
filters=2
size=1
stride=1
pad=1
activation=linear

[avgpool]

[softmax]
groups=1

   

2.裁剪权重*.weights文件

./darknet partial cfg文件 权重文件 输出名字 层数

linux系统:

./darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23

windows系统:

darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23

yolo partial提取已经训练好的网络中的部分权重

3.配置自己的meta.data文件

操作步骤:

1.    分别获得正常图片和异常图片的文件清单:abnor.list和normal.list
2.    把正常图片normal.list的顺序打乱
3.    因为正常图片数据远远大于异常图片,所以我们需要对正常图片下采样,按行采样把normal.list分成若干等分
4.    选择normal.list若干等分中的一份与abnor.list合并成all.list,即all.list中包含所有需要训练图片的路径列表
5.    把all.list中的所有图片顺序打乱
6.    把all.list中分成train.list和test.list,其中四分之三图片用来做train.list,四分之一图片用来做test.list
7.    配置train.list和test.list路径的E:/darknet_win/x64/data/METAL/metal.data文件中
Metal.data文件说明:

classes=2;表示结果分两类
train  = data/METAL/train.list;训练数据集,此处配置train.list的路径
valid  = data/METAL/test.list;验证数据集,此处配置test.list的路径
test  = data/METAL/test.list;测试数据集,此处配置test.list的路径
labels = data/METAL/labels.txt;分类的类别,配置在labels.txt文件中,我们的实例包括normal和abnor类别
backup = backup/;训练好的权重放在当前路径下的backup文件夹下。
top=1;显示分类概率最高的一个结果。

   我们把train.list的绝对路径配置到train=后面;test.list的绝对路径配置到test=后面。
8.    打开cmd.exe,进入到E:\darknet_win\x64路径下,输入训练指定开始训练模型,
训练指令:darknet classifier train data/METAL/metal.data data/METAL/darknet19_448.cfg backup/_darknet19_448_final.weights
注意,此处的权重是你基于训练模型的权重,一盘选择上次训练完成最后生成的模型权重。

实例:

主要是使用cygwin配置train.list和test.list文件,如果你的电脑没有安装cygwin可以参考下面这篇文章:window安装cygwin教程。

得到trian.list和test.list命令主要使用了find,文本合成,文本分割,文本乱序等命令。

1.进入cygdriver路径

进入cygwin的cygdrive路径下,才能使用linux命令:
打开cygwin软件,依次输入如下三个命令:

Cd ../
Cd ../
Cd cygdrive


2.生产abnor.list和normal.list文件

在cygwin中输入命令:

find d:/darknet_rdm/data/abnor -name \*.jpg>abnor.list

其中,d:/darknet_rdm/data/abnor是标注后所有正常图片存放的路径。
-name \*.jpg:查找文件名中包含.jpg的图片
find命令更详细的解释见:linux find命令详解
同理输入命令:
find d:/darknet_rdm/data/normal -name \*.jpg>normal.list
就可以得到normal.list文件。

3.打乱abnor.list文件列表的顺序,生产abnor_rand.list

输入命令:

awk 'BEGIN{ 100000*srand();}{ printf "%s %s\n", rand(), $0}' abnor.list |sort -k1n | awk '{gsub($1FS,""); print $0}' > abnor_rand.list

4.分割abnor_rand.list文件

输入命令:

split -l 302 abnor_rand.list train_split


 

split -l 302 abnor_rand.list

split是linux命令,-l是按行分割,
302:每302行分割成一个文本,
abnor_rand.list是被分割的文本,
train_split是分割后文本文件名前缀,也可以不要。即输入命令:split -l 302 abnor_rand.list
建议使用:split -l 302 abnor_rand.list

5.合并部分分割出来的文件与normal.lsit,生产data.list

cat xaa normal.list>data.list

将xaa和normal.list合成为data.list

6.将data.list乱序

awk 'BEGIN{ 100000*srand();}{ printf "%s %s\n", rand(), $0}' data.list |sort -k1n | awk '{gsub($1FS,""); print $0}' > data_rand.list

7.分割data_rand.list文件

因为训练集与测试集比例一般为7:3,所以把data_rand.list分成十份,总共604行所以每60行分割成一个文件:

split -l 60 data_rand.list

8.得到train.list和test.list

选择这十个文件中的其中一个文件重命名为test.list
剩余的九个文件合并为train.list输入命令:

Cat xa*>train.list


 

 

你可能感兴趣的:(#,darknet,darknet,迁移学习,图像分类,深度学习,模型训练)