深度学习框架用的是caffe;网络模型是CaffeNet(AlexNet的变形)。
1.准备数据
我用的是Fish4knowledge数据集,数据集内总共有27370张图片,23类,每一类的数量不等且差异大。将其按照5:1:1的比例分为训练集、验证集、测试集。(记住由于每类的数据不均衡,所以一定要随机分配)
- 训练集:19550张图片
- 验证集:3910张图片
- 测试集:3910张图片
2.生成filelist的txt文件
接下来要生成三个文件列表,train.txt、val.txt、test.txt。文件中的每一行存放的是一张图片的文件名(包含相对路径)和类别号,中间用空格隔开。我的类别号从1开始,到23。
可以用python\matlab\shell,任意挑一种你熟练的语言遍历整个数据集,获取文件名列表以及每个文件的类别。
3.转换为lmdb格式
在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。因此我们可以调用caffe里的convert_imageset工具来将图片文件转换成caffe框架中能直接使用的db文件。create_lmdb.sh 且数据集中的图片大小根据情况统一成47*47。
#!/usr/bin/en sh
rm -rf img_lmdb_train
/home/zh/caffe/build/tools/convert_imageset --shuffle \ # "\" 是另起一行的意思
--resize_height=47 --resize_width=47 \
Image/train/ \
ImageSets/train.txt img_lmdb_train
rm -rf img_lmdb_val
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/val/ \
ImageSets/val.txt img_lmdb_val
rm -rf img_lmdb_test
/home/zh/caffe/build/tools/convert_imageset --shuffle \
--resize_height=47 --resize_width=47 \
Image/test/ \
ImageSets/test.txt img_lmdb_test
convert_imageset的使用格式:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
FLAGS: 图片参数 # --shuffle是打乱数据顺序,--backend设置生成的数据形式:lmdb或者leveldb,默认生成lmdb。
ROOTFOLDER/: 图片存放路径
LISTFILE: 图片文件列表清单
DB_NAME: 最终生成的db文件存放目录
4.计算均值并保存
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的可执行文件compute_image_mean,我们直接使用就可以了。
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,会在 设定的保存路径下面生成一个mean.binaryproto的均值文件。
5.创建模型并编写配置文件
模型就用caffe自带的"CaffeNet"模型( AlexNet的一个变体),位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件solver.prototxt,train_val.prototxt 复制到自己的工程文件夹下;在models/文件夹下,除了CaffeNet还有AlexNet、GoogleNet、R-CNN等网络。
- 修改solver.prototxt
3910个测试数据,测试集的batch_size为50,因此test_iter设置为80,就能全cover了。
net: "/home/zh/data/fish4knowledge/Fish_species_recognition/train_val.prototxt"
test_iter: 80 # 测试集的迭代次数
test_interval: 80 #训练的时候,每迭代test_interval次就进行一次测试,得到准确率值。
base_lr: 0.01 #初始的学习率
lr_policy: "step"
gamma: 0.1
stepsize: 5000 #每隔stepsize次,学习率降低gamma倍
display: 20 #每隔20次打印一次loss
max_iter: 25000 #训练的最大迭代次数
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000 #每迭代10000次备份一次中间caffemodel
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" #中间模型的保存地址和命名前缀
solver_mode: GPU
2.修改train_val.prototx
只需要修改train和test的data层就可以了,其它可以不用管。
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN #这个层仅在train阶段
}
transform_param { #数据的预处理
mirror: true
crop_size: 47 ##change
mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto" ##change
}
data_param {
source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_train" ##change
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST #这个层仅在test阶段
}
transform_param {
mirror: false
crop_size: 47 ##change
mean_file: "/home/zh/data/fish4knowledge/Fish_species_recognition/mean.binaryproto" ##change
}
data_param {
source: "/home/zh/data/fish4knowledge/Fish_species_recognition/img_lmdb_test" ##change
batch_size: 50 #测试集的batch_size
backend: LMDB
}
}
6.训练和测试
如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。
build/tools/caffe train -solver 绝对路径/solver.prototxt
实验结果截图
网友评论