使用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
//   ....

首先,最关键的三个参数:

  1. ROOTFOLDER:是包含所有要处理图片的文件夹,为绝对路径。
  2. LISTFILE:是图像名字和对应label的txt文件。非常要注意每一行的格式问题。
  3. ROOTFOLDER/LISTFILE即构成每一张图像的绝对路径!
  4. DB_NAME :生成的db文件存放的文件夹(程序自动生成)
  5. 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’

首先生成图像文件的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

参考博客网址:https://www.cnblogs.com/denny402/p/5082341.html

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐