2016-08-10 2 views
0

У меня есть изображения 1750 * 1750, и я хотел бы пометить их и поместить в файл в том же формате, что и CIFAR10. Я видел аналогичный ответ раньше дал ответ:Как создать набор данных с несколькими изображениями в том же формате, что и CIFAR10?

label = [3] 
im = Image.open(img) 
im = (np.array(im)) 
print(im) 

r = im[:,:,0].flatten() 
g = im[:,:,1].flatten() 
b = im[:,:,2].flatten() 
array = np.array(list(label) + list(r) + list(g) + list(b), np.uint8) 

array.tofile("info.bin") 

но не включает в себя, как добавить несколько изображений в одном файле. Я посмотрел на CIFAR10 и попытался добавить массивы таким же образом, но все, что я получил следующее сообщение об ошибке:

E tensorflow/core/client/tensor_c_api.cc:485] Read less bytes than requested 

Обратите внимание, что я использую Tensorflow делать свои вычисления, и я был в состоянии изолировать проблема из данных.

ответ

2

CIFAR-10 двоичный формат представляет каждый пример в качестве фиксированной длиной записи в следующем формате:

  • 1-байтовой этикетка.
  • 1 байт на пиксель для красного канала изображения.
  • 1 байт на пиксель для зеленого канала изображения.
  • 1 байт на пиксель для синего канала изображения.

Если у вас есть список имен файлов изображений, называемых images, и список целых чисел (менее 256), называемые labels, соответствующие их этикетки, следующий код будет написать один файл, содержащий эти изображения в формате CIFAR-10 :

with open(output_filename, "wb") as f: 
    for label, img in zip(labels, images): 
    label = np.array(label, dtype=np.uint8) 
    f.write(label.tostring()) # Write label. 

    im = np.array(Image.open(img), dtype=np.uint8) 
    f.write(im[:, :, 0].tostring()) # Write red channel. 
    f.write(im[:, :, 1].tostring()) # Write green channel. 
    f.write(im[:, :, 2].tostring()) # Write blue channel.