目录
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/
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
./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提取已经训练好的网络中的部分权重
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,文本合成,文本分割,文本乱序等命令。
进入cygwin的cygdrive路径下,才能使用linux命令:
打开cygwin软件,依次输入如下三个命令:
Cd ../
Cd ../
Cd cygdrive
在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文件。
输入命令:
awk 'BEGIN{ 100000*srand();}{ printf "%s %s\n", rand(), $0}' abnor.list |sort -k1n | awk '{gsub($1FS,""); print $0}' > 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
cat xaa normal.list>data.list
将xaa和normal.list合成为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:3,所以把data_rand.list分成十份,总共604行所以每60行分割成一个文件:
split -l 60 data_rand.list
选择这十个文件中的其中一个文件重命名为test.list
剩余的九个文件合并为train.list输入命令:
Cat xa*>train.list