caffe读取多标签的lmdb数据
问题描述:
lmdb文件支持数据+标签的形式,但是却只能写入一个标签,引入多标签的解决方法有很多,这儿详细说一下我的办法:制作多个data数据,分别加入一个标签。我的方法只适用于标签数量较少的情况,标签数量比较多的话建议修改源码支持。下面介绍详细步骤。以下均以两个标签作为介绍。
生成两个含单标签的list:
img1 0 img2 0 img3 1 img4 1
img1 10 img2 11 img3 10 img4 11
按照同一顺序做shuffle处理,caffe训练数据shuffle处理是有必要的,虽然caffe的lmdb转换工具能够直接做shuffle,但是不能保证两个list的顺序一致。文本按行乱序的命令可以参考http://www.cnblogs.com/zhaojunjie/p/6735713.html。处理后的文件如下:
img1 0
img3 1
img4 1
img2 0
img1 10
img3 10
img4 11
img2 11
接下来就可以对他们生成两个lmdb了,值得注意的是如果图像数据较大,生成lmdb时可以将第二个list的图像resize到1*1,如下(前面已经shuffle,这里不再加入shuffle参数):
pathtocaffe/build/tools/convert_imageset --resize_height=256 --resize_width=256 "" list1 lmdb_data_1 pathtocaffe/build/tools/convert_imageset --resize_height=1 --resize_width=1 "" list2 lmdb_data_2
生成好了lmdb,如何用呢?prototxt文件参考如下:
name: "CaffeNet" layer { name: "data" type: "Data" top: "data" top: "label1" include { phase: TRAIN } transform_param { mirror: true mean_file: "train_VGG_cub_mean.binaryproto" crop_size: 224 } data_param { source: "lmdb_data_1" backend: LMDB batch_size: 16 } } layer { name: "data2" type: "Data" top: "data_noused" top: "label2" include { phase: TRAIN } data_param { source: "lmdb_data_2" backend: LMDB batch_size: 16 } }
#将data_nousedresize到1位,防止caffe输出过多内容
layer {
name: "reductionx"
bottom: "data_noused"
top: "data_noused"
type: "Reduction"
reduction_param {
axis: 0
}
}
【完】