Caffe中怎样准备训练数据
用Caffe训练自己的数据,首先要准备数据,使得数据能够输入到训练网络中,Caffe支持多种方式的数据输入
1 Caffe中训练数据的输入方式
(1)数据来自于数据库(LevelDB或LMDB格式的数据)
层类型(layertype):Data
必须设置的参数:
source:包含数据库的目录名称,如examples/mnist/mnist_train_lmdb
batch_size:每次处理的数据个数,如64
可选的参数:
rand_skip:在开始的时候,路过某个数据的输入。通常对异步的SGD很有用
backend:选择是采用LevelDB还是LMDB,默认是LevelDB.
示例:
layer{
name:"mnist"
type:"Data"
top:"data"
top:"label"
include{
phase:TRAIN
}
transform_param{
scale:0.00390625
}
data_param{
source:"examples/mnist/mnist_train_lmdb"
batch_size:64
backend:LMDB
}
}
(2)数据来自于内存
层类型:MemoryData
必须设置的参数:
batch_size:每一次处理的数据个数,比如2
channels:通道数
height:高度
width:宽度
示例:
layer{
top:"data"
top:"label"
name:"memory_data"
type:"MemoryData"
memory_data_param{
batch_size:2
height:100
width:100
channels:1
}
transform_param{
scale:0.0078125
mean_file:"mean.proto"
mirror:false
}
}
(3)数据来自于图片
层类型:ImageData
必须设置的参数:
source:一个文本文件的名字,每一行给定一个图片文件的名称和标签(label)
batch_size:每一次处理的数据个数,即图片数
可选参数:
rand_skip:在开始的时候,路过某个数据的输入。通常对异步的SGD很有用。
shuffle:随机打乱顺序,默认值为false
new_height,new_width:如果设置,则将图片进行resize
示例:
layer{
name:"data"
type:"ImageData"
top:"data"
top:"label"
transform_param{
mirror:false
crop_size:227
mean_file:"data/ilsvrc12/imagenet_mean.binaryproto"
}
image_data_param{
source:"examples/_temp/file_list.txt"
batch_size:50
new_height:256
new_width:256
}
}
(4)数据来自于HDF5
层类型:HDF5Data
必须设置的参数:
source:读取的文件名称
batch_size:每一次处理的数据个数
示例:
layer{
name:"data"
type:"HDF5Data"
top:"data"
top:"label"
hdf5_data_param{
source:"examples/hdf5_classification/data/train.txt"
batch_size:10
}
}
(5)数据来源于Windows
层类型:WindowData
必须设置的参数:
source:一个文本文件的名字
batch_size:每一次处理的数据个数,即图片数
示例:
layer{…
window_data_param…
}
输入层常用的层类型是Data和ImageData
2.2如何将训练数据转换为数据库格式(LMDB或LevelDB)的输入数据
第一步:创建图片文件列表清单,一般为一个txt文件,其中每一行对应着一张图片,格式为:
图片文件名 类别
例如:
mark@ubuntu:~/study/caffe/image$cat train_list.txt
train/male/0056.jpg 1
train/male/0071.jpg 1
train/male/0150.jpg 1
train/male/0210.jpg 1
train/male/0245.jpg 1
train/male/0290.jpg 1
train/male/0339.jpg 1
train/male/0408.jpg 1
train/male/0453.jpg 1
train/male/0523.jpg 1
train/female/0599.jpg 0
train/female/0801.jpg 0
train/female/0922.jpg 0
train/female/1044.jpg 0
train/female/1251.jpg 0
train/female/1729.jpg 0
train/female/1910.jpg 0
train/female/2204.jpg 0
train/female/2573.jpg 0
train/female/3130.jpg 0
名字后面的数字是类别标签
第二步:使用Caffe工具命令(是个可执行程序,是由Caffe中的源码文件convert_imageset.cpp经过编译后生产的)
convert_imageset[FLAGS] [ROOTFOLDER/] [LISTFILE] [DB_NAME]
需要带四个参数:
FLAGS:图片参数组
-gray:是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
-shuffle:是否随机打乱图片顺序。默认为false
-backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
-resize_width/resize_height:改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片
大小。程序调用opencv库的resize()函数来对图片放大缩小,默认为
0,不改变
-check_size:检查所有的数据是否有相同的尺寸。默认为false,不检查
-encoded:是否将原图片编码放入最终的数据中,默认为false
-encode_type:与前一个参数对应,将图片编码为哪一个格式:‘png','jpg'......
ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片
DB_NAME: 最终生成的db文件存放目录
例如:
mark@ubuntu:~/study/caffe/image$ convert_imageset /home/mark/study/caffe/image/
./train_list.txt t_train_lmdb
成功后,在~/study/caffe/image下生成目录t_train_lmdb
注意:ROOTFOLDER和第一步中的图片文件名连接起来是个的访问到该图片文件的绝对路径
2.3创建均值文件
根据需要可以用下面的命令来所有训练数据的均值保存为文件,图片减去均值后,再进行训练,会提高训练的速度和精度
compute_image_mean[train_lmdb] [mean.binaryproto]
例如:
mark@ubuntu:~/study/caffe/image$ compute_image_mean t_train_lmdb train.mean.binaryproto
I111610:23:11.811018 18283 db_lmdb.cpp:35] Opened lmdb t_train_lmdb
I111610:23:11.811309 18283 compute_image_mean.cpp:70] Starting iteration
I111610:23:11.811520 18283 compute_image_mean.cpp:101] Processed 20 files.
I111610:23:11.811661 18283 compute_image_mean.cpp:108] Write totrain.mean.binaryproto
I111610:23:11.811934 18283 compute_image_mean.cpp:114] Number of channels:3
I111610:23:11.811954 18283 compute_image_mean.cpp:119] mean_value channel[0]: 222.026
I111610:23:11.811982 18283 compute_image_mean.cpp:119] mean_value channel[1]: 224.084
I111610:23:11.811998 18283 compute_image_mean.cpp:119] mean_value channel[2]: 220.869
mark@ubuntu:~/study/caffe/image$