软硬件环境
- 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-10和CIFAR-100,前者包含10种物体,每种物体6000张图片;后者有100个物体,每个类别600张图片,它们是由Alex Krizhevsky, Vinod Nair和Geoffrey Hinton收集的,非常感谢。
在CIFAR-10训练classifier
首先,拉取最新的darknet源码,编译生成darknet可执行程序,后面需要用到
git clone https://github.com/pjreddie/darknet
cd darknet
make然后准备CIFAR-10数据,darknet的作者pjreddie准备了适用darknet的数据集供大家下载,CIFAR官方只提供了二进制文件,是没有图片的
cd data
wget https://pjreddie.com/media/files/cifar.tgz
tar xzf cifar.tgz压缩包解压之后是一个文本文件labels.txt(包含的class的名称)、文件夹train(训练用的图片)和文件夹test(测试用的图片)。图片有了以后,还需要2个类似索引的文件,存放的是图片的地址
cd cifar
find `pwd`/train -name \*.png > train.list
find `pwd`/test -name \*.png > test.list
cd ../..同训练模型一样,我们也需要创建一个数据配置文件cfg/cifar.data
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可以参考下
[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]一切准备就绪,我们就开始训练了
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg我用1070Ti训练的,不一会就结束了,如果训练过程中中断过,可以使用下面命令从中断点继续训练,就不用从头开始了
./darknet classifier train cfg/cifar.data cfg/cifar_small.cfg backup/cifar_small.backup验证模型
模型训练好了,使用valid命令看看,模型工作的如何,执行下面命令
./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。
# -*- 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()
将处理完后的train和test文件夹存放到data/cifar_mouse下,labels.txt只有一个mouse,然后用老方法生成train.list和test.list,要注意这里的图片格式是jpg而不是png
cd cifar_mouse
find `pwd`/train -name \*.jpg > train.list
find `pwd`/test -name \*.jpg > test.list接下来准备cfg/cifar_mouse.data文件
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的值
开始训练
./darknet classifier train cfg/cifar_mouse.data cfg/cifar_mouse.cfg最后进行图片预测
./darknet classifier predict cfg/cifar_mouse.data cfg/cifar_mouse.cfg backup_mouse/cifar_mouse.weights data/test.jpg
