Как записать или преобразовать данные типа float в leveldb в caffe

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


person guochan zhang    schedule 04.01.2016    source источник
comment
почему бы тебе не использовать "HDF5Data"?   -  person Shai    schedule 04.01.2016
comment
что такое HDF5Data? и как на них конвертировать?   -  person guochan zhang    schedule 04.01.2016
comment
как это использовать? Я никогда не использовал его. Пожалуйста, напишите мне, как его использовать.   -  person guochan zhang    schedule 04.01.2016
comment
Вы можете увидеть пример python о том, как подготовить набор данных в формате hdf5 для caffe и как установить соответствующий уровень данных. .   -  person Shai    schedule 04.01.2016


Ответы (2)


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

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

ИЗМЕНИТЬ

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

person Manfredo    schedule 04.01.2016
comment
На самом деле я нашел такой код, как это. Но в нем есть часть, которую я не понимаю. что такое datum.add_float_data(0) и datum.set_float_data(...). и в чем разница между ярлыком и ключом? - person guochan zhang; 05.01.2016

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

Примечание. Я видел Шая ответ на вопрос, в котором утверждается, что lmdb не поддерживает данные типа float. Но у меня это работает с последней версией Caffe и LMDB и с использованием этого фрагмента кода. Поскольку его ответ слишком старый, весьма вероятно, что более старые версии могли не поддерживать данные типа с плавающей запятой.

person Anoop K. Prabhu    schedule 05.01.2016
comment
Ты называешь меня старым!? ;) - person Shai; 05.01.2016
comment
смешной! :D На самом деле вашему ответу было всего 5 месяцев, но с нынешними темпами глубокого обучения даже эту цифру можно назвать «слишком старой»... это сложно, но здорово! :) - person Anoop K. Prabhu; 05.01.2016
comment
Спасибо, но я не знаю python. Поэтому я не могу понять python и использую c++. У вас есть код C++ вместо python. Мне это надо. - person guochan zhang; 05.01.2016
comment
Месяц назад я использовал C++ и совершенно не имел ни малейшего представления о Python. Сейчас почти всю препроцессинг делаю на питоне и скармливаю на lmdb или hdf5. Приведенный выше код представляет собой почти plug-n-play тип. В конце концов, SO не для кормления с ложки. Намерение SO состоит в том, чтобы вводить данные всякий раз, когда программист застревает :) - person Anoop K. Prabhu; 05.01.2016
comment
Спасибо, но я не знаю python. Поэтому я не могу понять python и использую c++. У вас есть код C++ вместо python. Мне это надо. На самом деле я нашел такой код, как это. Но в нем есть часть, которую я не понимаю. что такое datum.add_float_data(0) и datum.set_float_data(...). и в чем разница между ярлыком и ключом? - person guochan zhang; 05.01.2016