如何在caffe中将float类型数据写入或转换为leveldb

时间:2016-01-04 13:13:04

标签: c++ machine-learning deep-learning caffe leveldb

现在我正在制作leveldb以训练caffe framework.So我使用“convert_imageset.cpp”。此cpp文件仅将char类型数据写入leveldb。 但我有浮动数据将其写入leveldb。该数据是预先进行的图像数据,因此它是浮点型数据。 如何将此浮点数据写入或转换为leveldb。 此浮动数据是一组具有4096维度的向量。 请帮我。 或者不是如何将其转换为HDF5Data?

2 个答案:

答案 0 :(得分:2)

HDF5代表分层数据格式。您可以使用RRHDF5 documentation

来处理此类数据格式

可以处理HDF5的其他软件包括MatlabMathematica

修改

最近发布了一组名为HDFql的新工具,以简化“通过C / C ++等高级语言管理HDF文件”。您可以查看here

答案 1 :(得分:1)

def del_and_create(dname):
    if os.path.exists(dname):
        shutil.rmtree(dname)
    os.makedirs(dname)

def get_img_datum(image_fn):
    img = cv.imread(image_fn, cv.IMREAD_COLOR)
    img = img.swapaxes(0, 2).swapaxes(1, 2)
    datum = caffe.io.array_to_datum(img, 0)
    return datum

def get_jnt_datum(joint_fn):
    joint = np.load(joint_fn)
    datum = caffe.io.caffe_pb2.Datum()
    datum.channels = len(joint)
    datum.height = 1
    datum.width = 1
    datum.float_data.extend(joint.tolist())

    return datum

def create_dataset():
    img_db_fn = 'img.lmdb'
    del_and_create(img_db_fn)
    img_env = lmdb.Environment(img_db_fn, map_size=1099511627776)
    img_txn = img_env.begin(write=True, buffers=True)

    jnt_db_fn = 'joint.lmdb'
    del_and_create(jnt_db_fn)
    jnt_env = lmdb.Environment(jnt_db_fn, map_size=1099511627776)
    jnt_txn = jnt_env.begin(write=True, buffers=True)

    img_fns = glob.glob('imageData/*.jpg')
    fileCount = len(img_fns)
    print 'A total of ', fileCount, ' images.'
    jnt_fns = glob.glob('jointData/*.npy')
    jointCount = len(jnt_fns)
    if(fileCount != jointCount):
        print 'The file counts doesnot match'
        exit()

    keys = np.arange(fileCount)
    np.random.shuffle(keys)

    for i, (img_fn, jnt_fn) in enumerate( zip(sorted(img_fns), sorted(jnt_fns)) ):
        img_datum = get_img_datum(img_fn)
        jnt_datum = get_jnt_datum(jnt_fn)
        key = '%010d' % keys[i]

        img_txn.put(key, img_datum.SerializeToString())
        jnt_txn.put(key, jnt_datum.SerializeToString())

        if i % 10000 == 0:
            img_txn.commit()
            jnt_txn.commit()
            jnt_txn = jnt_env.begin(write=True, buffers=True)
            img_txn = img_env.begin(write=True, buffers=True)

        print '%d'%(i), os.path.basename(img_fn), os.path.basename(jnt_fn)

    img_txn.commit()
    jnt_txn.commit()
    img_env.close()
    jnt_env.close()

上面的代码需要来自给定路径的图像,以及每个图像的标签为.npy文件。

致谢:https://github.com/mitmul/deeppose/blob/caffe/scripts/dataset.py

注意:我看过Shai answer个问题,声称lmdb不支持浮点型数据。但是,使用最新版本的Caffe和LMDB并使用此代码片段,它确实对我有用。由于他的答案过于陈旧,旧版本很可能不支持浮点型数据。