:::tip
本文主要描述如何训练、测试一个自己的模型。内容参考博客
:::
1 说明
首先我们需要在 ~/caffe/example/
目录下创建一个自己的文件夹,如 /cancer
,后面将会在该目录下创建一些脚本和模型文件,训练的模型也会存储在该目录下。另外,需要在 caffe 根目录下执行这些脚本,主要是因为一些路径问题。下面是本次实验结束时的目录结构:
└── cancer
├── create_lmdb.sh
├── create_mean_value.sh
├── get_filelist.sh
├── image
│ ├── test
│ └── train
├── img_test_lmdb
├── img_train_lmdb
├── mean.binaryproto
├── solver_iter_500.caffemodel
├── solver_iter_500.solverstate
├── solver.prototxt
├── start_train.sh
├── test.txt
├── train.txt
└── train_val.prototxt
2 准备数据
数据集先自己做预处理,不同类别的图片最好是在名称上有区别,便于后面脚本对它的查找,如:img-bike.jpg、img-car.jpg,并将数据分为训练集和测试集,并存储到对应文件夹:image/test/
、image/train/
。
3 预处理数据
:::tip 说明
本次实验中,模型训练需要的格式为 lmdb
,所以需要将 jpg、png 等图像格式转换过来,caffe 里面自带有转换的程序,对应可执行文件在 build/tools/convert_imageset
。不过在使用之前需要给数据集生成一个文件名列表,存放在 .txt 中。
:::
3.1 生成文件名列表
创建 get_filelist.sh
脚本,编写如下:
# /usr/bin/env sh
DATA=examples/cancer
DATA_TRAIN=$DATA/image/train
DATA_TEST=$DATA/image/test
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA_TRAIN -name *P_1_* | cut -d '/' -f 7-10 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA_TRAIN -name *P_2_* | cut -d '/' -f 7-10 | sed "s/$/ 2/">>$DATA/1.txt
cat $DATA/1.txt>>$DATA/train.txt
rm -rf $DATA/1.txt
echo "Create train.txt..."
rm -rf $DATA/test.txt
find $DATA_TEST -name *P_1_* | cut -d '/' -f 7-10 | sed "s/$/ 1/">>$DATA/test.txt
find $DATA_TEST -name *P_2_* | cut -d '/' -f 7-10 | sed "s/$/ 2/">>$DATA/1.txt
cat $DATA/1.txt>>$DATA/test.txt
rm -rf $DATA/1.txt
echo "Done.."
执行脚本后将会生成 train.txt
、test.txt
文件,里面存放了数据集的相对路径和标签。上面的语法根据自身情况修改,其中 cut 命令可以设置字符串剪切范围,这里的 7-10 将它剪切为 /cancer 下的相对路径;sed 命令在后面追加类别标签 1、2 等。也可以使用 python 脚本。
3.2 转换为lmdb格式
创建 create_lmdb.sh
脚本,内容如下:
#!/usr/bin/env sh
DATA=examples/cancer
echo "Create train lmdb.."
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
$DATA/ $DATA/train.txt $DATA/img_train_lmdb
echo "Create test lmdb.."
rm -rf $DATA/img_test_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
$DATA/ $DATA/test.txt $DATA/img_test_lmdb
echo "done."
执行脚本后会生成 img_train_lmdb
、img_test_lmdb
文件夹,里面存放了 lmdb 格式数据。
4 计算均值
图片减去均值再训练,会提高训练速度和精度,所以一般都会有这个操作。同样,caffe 自带有处理程序,可执行程序在 build/tools/compute_image_mean
,指定对应的 lmdb 数据集的路径即可生成均值。
创建 create_mean_value.sh
脚本,内容如下:
#!/usr/bin/env sh
DATA=examples/cancer
build/tools/compute_image_mean \
$DATA/img_train_lmdb \
$DATA/mean.binaryproto
5 创建模型
本实验直接使用 caffe 自带的模型,修改对应配置即可使用。首先,将其拷贝到 /cancer 目录下:
cp models/bvlc_reference_caffenet/solver.prototxt examples/cancer/
cp models/bvlc_reference_caffenet/train_val.prototxt examples/cancer/
- 修改 solver.prototxt
net: "examples/cancer/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
其中,net 改成了当前路径下 train_val.prototxt 的路径,另外还可以更改步长、学习率等。
- 修改 train_val.prototxt
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/cancer/mean.binaryproto"
}
data_param {
source: "examples/cancer/img_train_lmdb"
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "examples/cancer/mean.binaryproto"
}
data_param {
source: "examples/cancer/img_train_lmdb"
batch_size: 50
backend: LMDB
}
}
其中,mean_file 和 source 改成了当前文件夹的路径。
6 运行
创建 start_train.sh
脚本,内容如下:
#!/usr/bin/env sh
build/tools/caffe train -solver examples/cancer/solver.prototxt
然后在 caffe 根目录下执行该脚本即可开始训练。训练完毕后,将会在 /cancer 目下下生成训练的模型:
solver_iter_500.caffemodel
solver_iter_500.solverstate