2016-01-04 4 views
0

Теперь я делаю leveldb для тренировки структуры caffe. Поэтому я использую «convert_imageset.cpp». Этот файл cpp записывает данные типа char только в leveldb. Но у меня есть данные с плавающей точкой, чтобы записать его в leveldb. Эти данные представляют собой предварительные данные изображения, поэтому это данные типа float. Как я могу написать или преобразовать эти данные с float в leveldb. Данные с плавающей точкой представляют собой набор векторов с размерами 4096. Пожалуйста, помогите мне. Или не как преобразовать его в HDF5Data?Как написать или преобразовать данные типа float в leveldb в caffe

+0

Почему вы не используете '' HDF5Data''? – Shai

+0

Что такое "HDF5Data"? и как их конвертировать? –

+0

как его использовать? Я никогда не использовал его. Пожалуйста, напишите мне, как его использовать. –

ответ

2

HDF5 обозначает формат иерархических данных. Вы можете управлять таким форматом данные, например, с R (RHDF5 documentation)

Другого программным обеспечением, которое может обрабатывать HDF5 является Matlab и Mathematica.

EDIT

Новый набор инструментов под названием HDFql был недавно выпущен для упрощения «Управление файлами HDF через язык высокого уровня, как C/C++». Вы можете проверить это here

+0

На самом деле, я нашел код как [this] (https://github.com/s9xie/DSN/blob/master/cifar-float-extra/convert_cifar_float_data.cpp). Но у меня есть часть, которую я не понимаю. что такое datum.add_float_data (0) и datum.set_float_data (...). и какова разница между меткой и ключом? –

+0

Я не знаю человека, я действительно не знаю, в чем разница – Manfredo

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 «s answer на вопрос, который утверждает, что lmdb оленья кожа данные поплавкового типа поддержки. Но это работает для меня с последней версией Caffe и LMDB и с использованием этого фрагмента кода. Поскольку его ответ слишком стар, весьма вероятно, что более старые версии могут не поддерживать данные типа float.

+1

Вы называете меня «старым»!? ;) – Shai

+0

lol! : D Infact ваш ответ был всего 5 месяцев, но с нынешним темпом в deeplayning, даже эта цифра должна быть названа «слишком старой». Это тяжело, но здорово! :) –

+0

Спасибо, но я не знаю python. Поэтому я не могу понять python и использую C++. У вас есть код C++ вместо python. Мне это нужно. –