Теперь я делаю leveldb для тренировки структуры caffe. Поэтому я использую «convert_imageset.cpp». Этот файл cpp записывает данные типа char только в leveldb. Но у меня есть данные с плавающей точкой, чтобы записать его в leveldb. Эти данные представляют собой предварительные данные изображения, поэтому это данные типа float. Как я могу написать или преобразовать эти данные с float в leveldb. Данные с плавающей точкой представляют собой набор векторов с размерами 4096. Пожалуйста, помогите мне. Или не как преобразовать его в HDF5Data?Как написать или преобразовать данные типа float в leveldb в caffe
ответ
HDF5 обозначает формат иерархических данных. Вы можете управлять таким форматом данные, например, с R
(RHDF5 documentation)
Другого программным обеспечением, которое может обрабатывать HDF5 является Matlab
и Mathematica
.
EDIT
Новый набор инструментов под названием HDFql
был недавно выпущен для упрощения «Управление файлами HDF через язык высокого уровня, как C/C++». Вы можете проверить это here
На самом деле, я нашел код как [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 (...). и какова разница между меткой и ключом? –
Я не знаю человека, я действительно не знаю, в чем разница – Manfredo
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.
Вы называете меня «старым»!? ;) – Shai
lol! : D Infact ваш ответ был всего 5 месяцев, но с нынешним темпом в deeplayning, даже эта цифра должна быть названа «слишком старой». Это тяжело, но здорово! :) –
Спасибо, но я не знаю python. Поэтому я не могу понять python и использую C++. У вас есть код C++ вместо python. Мне это нужно. –
Почему вы не используете '' HDF5Data''? – Shai
Что такое "HDF5Data"? и как их конвертировать? –
как его использовать? Я никогда не использовал его. Пожалуйста, напишите мне, как его использовать. –