我们经常使用YOLOV2做目标检测,在检测的时候进行分类,但我们只做分类的情况下,使用YOLOV2原框架会使得速度变得很慢,因此Darknet为我们提供了分类的模型。本文使用YOLO网络进行预训练,找到好的分类器。
具体参考:https://pjreddie.com/darknet/train-cifar/
1.下载Darknet并进行编译
git clone https://github.com/pjreddie/darknet
cd darknet
make
2. 数据集的整理
如图所示:两个文件夹:训练集与测试集,而label.txt是label的集合,如下图所示:
其格式如下图所示,而我们在训练与测试的时候需要将训练集测试集的名称进行更改为label(名称)_****.jpg这样的格式,前面的必要的,_后面可以是任意数字,但不能是label名称,否则变认为其为两类。
3. train.list以及test.list的生成
find `pwd`/train -name \*.png > train.list
find `pwd`/test -name \*.png > test.list
这样我们就能生成.list,也可以自己写脚本生成,而.list里存储的是图片的绝对路径,如下图所示
4.修改配置文件
我们可以自己创建.data,.name,.cfg文件,比如我们做分类,那我们就在cfg/文件夹中创建obj_class.data,obj_class.names(里面放的跟label.txt相同只是改了后缀名而已),obj_class.cfg。每个文件具体放什么,如下图所示。
4.1 obj_class.data
classes=7
train = ./scripts/vehicle_color_data/train.list 自己存放train.list的路径
valid = ./scripts/vehicle_color_data/test.list 自己存放test.list的路径
labels = cfg/obj_class.names 自己存放test.list的路径
backup = backup/
top=2 top=2 把类别最高的两个显示出来
4.2 obj_class.cfg
根据自己的网络结构,定义自己的网络配置文件。
[net]
batch=128
subdivisions=1
height=56
width=56
max_crop=512
channels=3
momentum=0.9
decay=0.0005
learning_rate=0.001
policy=poly
power=4
max_batches=10000
angle=7
hue = .1
saturation=.75
exposure=.75
aspect=.75
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
......
......
[convolutional]
filters=10 //一定要修改,否则会出错
size=1
stride=1
pad=1
activation=linear
[avgpool]
[softmax]
groups=1
[cost]
type=sse
5. 训练模型
进入darknet根目录下运行:
./darknet classifier train cfg/obj_class.data cfg/obj_class.cfg
接下来就可以看到训练过程
6. 测试模型
./darknet classifier predict cfg/obj_class.data cfg/obj_class.cfg obj_class_final.weights data/car.jpg
接着就可以看到该图片的结果,输出个数跟top个数相同。