软硬件环境
- 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