在上一篇博客写了安装 caffe,这里讲一下如何使用 caffe训练自己的数据。
1. 准备数据
首先要准备自己的数据,就是你的图片,不同类别的图片,这些图片要分成两部分,一部分多,一部分少,比例自己把握,5:1
或6:1
都可以,多的部分作为训练集,少的部分作为测试集,然后留几张图片用来做最后的分类测试的。
首先!新建一个
imgs
的文件夹,然后再里面新建一个data
文件夹,用来存放数据!以下数据都是在这个文件夹下的。
例如我的图片是一些动作图片,分别是:down, sitdown, standup, handup
这四类:
新建四个文件夹
down, sitdown, standup, handup
, 放数量比较多的那部分的图片,然后再新建一个train
的文件夹,存放这四个文件夹。然后同理再新建一个
val
的文件夹,这里面也是down, sitdown, standup, handup
这四个文件夹,存放的是数量少的那部分图片。新建一个
train.txt
里面是图片名字还有对应的图片类别。- 新建一个
val.txt
同理是val
文件夹里面的图片还有对应类别。
文件夹结构如下:
data 文件夹
上面的暂时只看 train, val, train.txt, val.txt
这四个就可以了。
train.txt 文件
这里是对应的 train.txt 文件的内容,图片后面一个空格然后写上对应类别的数字,下标从0开始。
val.txt 文件
这个是 val.txt 文件内容,和 train.txt 基本一样。就是图片不一样。
2. 数据转换
把图片转换成lmdb
格式,这是caffe 使用的输入格式,使用的是caffe/examples/imagenet/create_imagenet.sh
脚本文件。
- 新建一个文件夹
imgsnet
,路径caffe/examples/
用来存放自己的网络和脚本文件等等。 - 把
create_imagenet.sh
脚本拷贝到imgsnet
(刚才新建的文件夹)下。 - 修改
create_imagenet.sh
文件。
EXAMPLE=/home/alps/caffe/examples/imgsnet/
//刚才新建的文件夹
DATA=/home/alpps/caffe/examples/imgs/data/
//存放图片数据的文件夹
TRAIN_DATA_ROOT=/home/alps/caffe/examples/imgs/data/train
//训练图片文件夹
VAL_DATA_ROOT=/home/alps/caffe/examples/imgs/data/val
//测试图片文件夹
RESIZE=true
//让图片resize 为同样大小,下面大小自己修改就行。
create_imagenet.sh
然后执行脚本./create_imagenet.sh
,等到输出Done.
的时候就 OK 了。刚才生成的两个文件在你输入的:EXAMPLE
里。我这里是/home/alps/caffe/examples/imgsnet/
3. 生成 meanfile 均值文件
利用刚才生成的 lmdb 文件生成均值文件,计算图像均值,使用的是examples/imagenet/make_imagenet_mean.sh
这个脚本,把它拷贝到自己的目录下:
cp examples/imagenet/make_imagenet_mean.sh examples/imgsnet/
然后修改该脚本:
EXAMPLE=/home/alps/caffe/examples/imgsnet
DATA=/home/alps/caffe/examples/imgs/data
make_imagenet_mean.sh文件
然后执行./make_imagenet_mean.sh
脚本,出现Done.
就好了。
3.配置网络
可是使用自己喜欢的网络,LeNet啊或者其他网络都行,这里使用 AlexNet网络,其网络模型比 LeNet略复杂。首先拷贝AlexNet网络:
cp -r caffe/models/bvlc_alexnet caffe/examples/imgsnet
然后进入到这个网络文件夹下:
cd caffe/examples/imgsnet/bvlc_alexnet
要修改:
solver.prototxt
train_val.prototxt
这两个文件。
3.1 修改 solver.prototxt
打开这个文件:
vim solver.prototxt
修改:
net: "/home/alps/caffe/examples/imgsnet/bvlc_alexnet/train_val.prototxt"
test_iter : 50 //测试迭代次数
test_interval : 100 //多少次迭代测试一次
base_lr : 0.01 //基础学习率
lr_policy : "step"
gamma: 0.1
stepsize : 100000
display: 20 //多少次迭代显示一次
max_iter : 700 //一共迭代多少次
momentum : 0.9
weight_decay : 0.0005
snapshot : 700 //多少次迭代保存一次快照
snapshot_prefix : "/home/alps/caffe/examples/imgsnet/bvlc_alexnet/caffe_alexnet_train" //快照保存位置(也是结果的位置)
solver_mode : CPU
3.2 修改 train_val.prototxt
打开 train_val.prototxt文件:
vim train_val.prototxt
修改里面的:
//记得两个参数不止一个!全部修改了!别只修改一个
mean_file : "/home/alps/caffe/examples/imgs/data/imagenet_mean.binaryproto
//这个是上面生成的均值文件位置
source : "/home/alps/caffe/examples/imgsnet/ilsvrc12_train_lmdb"
//这个是上面生成的 lmdb文件位置
//然后如果你自己要定义类别个数(嫌麻烦就别改这里了!不会影响!),请在最后一层里面
name : "fc8" //这个名字的代表 alexnet的最后一层,其他的网络自己找
num_output: 1000 //alexnet默认1000个 改成你自己的个数,我改成: num_output: 4 //也可以不改,训练不影响
4.训练网络
cd /home/alps/caffe //cd 到caffe根目录
输入如下命令
./build/tools/caffe train --solver=/home/alps/caffe/caffe/examples/imgsnet/bvlc_alexnet/solver.prototxt
然后运行就可以了!
出现类似的图就好了!