徐高翔的个人网站

Darknet训练CIFAR分类器

2019-03-15

软硬件环境

  • Intel(R) Xeon(R) CPU E5-1607 v4 @ 3.10GHz
  • GTX 1070 Ti 32G
  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • darknet git version
  • cuda 8.0
  • opencv 3.1.0

CIFAR数据集

CIFAR数据集包括CIFAR-10CIFAR-100,前者包含10种物体,每种物体6000张图片;后者有100个物体,每个类别600张图片,它们是由Alex Krizhevsky, Vinod NairGeoffrey Hinton收集的,非常感谢。

在CIFAR-10训练classifier

首先,拉取最新的darknet源码,编译生成darknet可执行程序,后面需要用到

1
2
3
git clone https://github.com/pjreddie/darknet
cd darknet
make

然后准备CIFAR-10数据,darknet的作者pjreddie准备了适用darknet的数据集供大家下载,CIFAR官方只提供了二进制文件,是没有图片的

1
2
3
cd data
wget https://pjreddie.com/media/files/cifar.tgz
tar xzf cifar.tgz

压缩包解压之后是一个文本文件labels.txt(包含的class的名称)、文件夹train(训练用的图片)和文件夹test(测试用的图片)。图片有了以后,还需要2个类似索引的文件,存放的是图片的地址

1
2
3
4
cd cifar
find `pwd`/train -name \*.png > train.list
find `pwd`/test -name \*.png > test.list
cd ../..

同训练模型一样,我们也需要创建一个数据配置文件cfg/cifar.data

1
2
3
4
5
6
classes=10
train = data/cifar/train.list
valid = data/cifar/test.list
labels = data/cifar/labels.txt
backup = backup/
top=2

最后就是书写网络配置文件了cfg/cifar_small.cfg,这个是官方提供的极简版的,源码中有个cfg/cifar.test.cfg可以参考下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
[net]
batch=128
subdivisions=1
height=28
width=28
channels=3
max_crop=32
min_crop=32

hue=.1
saturation=.75
exposure=.75

learning_rate=0.1
policy=poly
power=4
max_batches = 5000
momentum=0.9
decay=0.0005

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

[maxpool]
size=2
stride=2

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

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

[maxpool]
size=2
stride=2

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

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

[avgpool]

[softmax]

一切准备就绪,我们就开始训练了

1
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg

我用1070Ti训练的,不一会就结束了,如果训练过程中中断过,可以使用下面命令从中断点继续训练,就不用从头开始了

1
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg backup/cifar_small.backup

验证模型

模型训练好了,使用valid命令看看,模型工作的如何,执行下面命令

1
./darknet classifier valid cfg/cifar.data cfg/cifar_small.cfg backup/cifar_small.backup

训练CIFAR-100

我把CIFAR-100中的所有图片解析出来了,打了个包,放在了CSDN下载频道上,https://download.csdn.net/download/djstavav/10956219,需要的话去下载。我这里只是训练了一个class老鼠,简单写了个python脚本,用来给图片进行重命名,命名的规则是编号_所属类别.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*-


"""
@author: Xu Gaoxiang
@license: Apache V2
@email: xugx.ai@gmail.com
@site: https://www.xugaoxiang.com
@software: PyCharm
@file: cifar_rename.py
@time: 3/14/2019 10:58 AM
"""

import os
import click
import shutil


@click.command()
@click.option('--path', help = 'cifar image dir.')
def main(path):

for i in os.listdir(path):
print(i)
shutil.move(i, '{}_mouse.jpg'.format(i.split('.')[0]))


if __name__ == '__main__':

main()

将处理完后的traintest文件夹存放到data/cifar_mouse下,labels.txt只有一个mouse,然后用老方法生成train.listtest.list,要注意这里的图片格式是jpg而不是png

1
2
3
cd cifar_mouse
find `pwd`/train -name \*.jpg > train.list
find `pwd`/test -name \*.jpg > test.list

接下来准备cfg/cifar_mouse.data文件

1
2
3
4
5
train = data/cifar_mouse/train.list
test = data/cifar_mouse/test.list
labels = data/cifar_mouse/labels.txt
backup = backup_mouse/
top = 2

网络训练文件还是使用cfg/cifar_small.cfg中的配置,将其重命名为cfg/cifar_mouse.cfg,只是需要改动下filter=1,这个值其实是指class的值

开始训练

1
./darknet classifier train cfg/cifar_mouse.data cfg/cifar_mouse.cfg

最后进行图片预测

1
./darknet classifier predict cfg/cifar_mouse.data cfg/cifar_mouse.cfg backup_mouse/cifar_mouse.weights data/test.jpg

参考资料

本文链接 https://xugaoxiang.com/2019/03/15/Darknet训练CIFAR分类器/

推荐文章(由hexo文章推荐插件驱动)

使用支付宝打赏
使用微信打赏

请博主喝咖啡!