Darknet训练CIFAR分类器

原文出处: https://blog.xugaoxiang.com/ai/darknet-cifar-classifier.html

软硬件环境

  • Intel® Xeon® 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可执行程序,后面需要用到

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: [email protected]
@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

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

参考资料

  • https://www.cs.toronto.edu/~kriz/cifar.html
  • https://www.kdnuggets.com/2018/09/object-detection-image-classification-yolo.html
  • https://blog.xugaoxiang.com/ai/darknet.html
  • https://blog.xugaoxiang.com/ai/yolov3-train-custom-detector.html

你可能感兴趣的:(人工智能)