caffe 将数据(非图像和图像)转成lmdb格式的数据
使用Python API两个参考地址:Creating an LMDB database in PythonTraining Multi-Layer Neural Network with Caffe添加一个我自己使用过得程序,每一个样本是 75*75*3的数组数据,注意,不是图片数据!def load_data_into_lmdb(lmdb_name, features, l
使用Python API
两个参考地址:
Creating an LMDB database in Python
Training Multi-Layer Neural Network with Caffe
添加一个我自己使用过得程序,每一个样本是 75*75*3的数组数据,注意,不是图片数据!
def load_data_into_lmdb(lmdb_name, features, labels=None):
env = lmdb.open(lmdb_name, map_size=features.nbytes*10)
print np.shape(features)
for i in range(features.shape[0]):
datum = caffe.proto.caffe_pb2.Datum()
datum.channels = features.shape[3]
datum.height = features.shape[1]
datum.width = features.shape[2]
if features.dtype == np.int:
datum.data = features[i].tostring()
elif features.dtype == np.float64:
datum.float_data.extend(features[i].flat)
else:
raise Exception("features.dtype unknown.")
if labels is not None:
datum.label = int(labels[i])
str_id = '{:08}'.format(i)
with env.begin(write=True) as txn:
txn.put(str_id, datum.SerializeToString())
def load_data(lmdb_name, X, labels = None):
map_size = X.nbytes * 10
env = lmdb.open(lmdb_name, map_size=map_size)
print np.shape(X)
with env.begin(write=True) as txn:
# txn is a Transaction object
for i in range(X.shape[0]):
datum = caffe.proto.caffe_pb2.Datum()
datum.channels = X.shape[3]
datum.height = X.shape[1]
datum.width = X.shape[2]
datum.data = X[i].tobytes() # or .tostring() if numpy < 1.9
if labels is not None:
datum.label = int(labels[i])
str_id = '{:08}'.format(i)
# The encode is only essential in Python 3
txn.put(str_id.encode('ascii'), datum.SerializeToString())
对图像数据使用caffe工具convert_imageset
此工具由convert_imageset.cpp编译而成的执行文件,此文件位于
cafferoot/tools中,编译的工具位于(一般情况)
caffe_root/build/tools中。
源文件中带有使用的注释:
// This program converts a set of images to a lmdb/leveldb by storing them
// as Datum proto buffers.
// Usage:
// convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
//
// where ROOTFOLDER is the root folder that holds all the images, and LISTFILE
// should be a list of files as well as their labels, in the format as
// subfolder1/file1.JPEG 7
// ....
首先,最关键的三个参数:
- ROOTFOLDER:是包含所有要处理图片的文件夹,为绝对路径。
- LISTFILE:是图像名字和对应label的txt文件。非常要注意每一行的格式问题。
- ROOTFOLDER/LISTFILE即构成每一张图像的绝对路径!
- DB_NAME :生成的db文件存放的文件夹(程序自动生成)
FLAGS参数:
gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为falseshuffle: 是否随机打乱图片顺序。默认为false
backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
encoded: 是否将原图片编码放入最终的数据中,默认为false
encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png’,’jpg’
首先生成图像文件的txt文件
# /usr/bin/env sh
#目录
DATA=examples/images
#训练集文件夹路径(每个文件夹下分正样本文件夹neg和负样本文件夹pos)
DATA_train=examples/images/train
rm -rf $DATA/train.txt
find $DATA_train/pos -name *.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA_trian/neg -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp1.txt
cat $DATA/tmp1.txt>>$DATA/train.txt
rm -rf $DATA/tmp1.txt
echo "Done.."
现在就有了train.txt
利用工具进行转换
首先要将train下的neg文件夹和pos文件夹进行合并,可做好备份,假设合并的文件夹叫Train,同样放在images文件下。
创建create_image_lmdb.sh
#!/usr/bin/en sh
DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/xxx/caffe/examples/images/train $DATA/train.txt $DATA/img_train_lmdb
运行脚本:
sudo sh examples/images/create_image_lmdb.sh
更多推荐
所有评论(0)