Конвертировать массив CIFAR 1d из маринада в изображение (RGB) - PullRequest
1 голос
/ 09 ноября 2019

РЕДАКТИРОВАТЬ: разделение классов . Исходный файл pickle содержит словарь с метками, данными (массивом) и именами файлов. Я просто отфильтровал массивы по меткам классов и добавил все массивы, чтобы сформировать список, а затем собрал этот список вместе.

class_index= 9 #gives the corresponding class label in the dataset
images = [] #empty list 
for i in range(len(labels)):
    if labels[i]==class_index:
        images.append(data[i])

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

with open('name.pkl', 'wb') as f:
    pickle.dump(images0, f)

Когда я загружаю файл рассылки, он выдает мне выходные массивы, каждый из которых имеет форму (3072,).

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

#Load the pickle
images = np.load('name.pkl',allow_pickle=True) 

Мне нужно получить их как изображения RGB (32,32,3). Эти подходы были опробованы

image = images[0]
img = np.reshape(image,(32,32,3))
im = Image.fromarray(img)

. Это дает очень искаженное изображение, похожее на 9 изображений одного и того же предмета, которое, я думаю, связано с изменением формы

image distorted

* 1019. * Есть ли способ избежать этого? Я также попытался
image = image.reshape(-1,1)
pict = Image.fromarray(image,'L')
plt.imshow(pict)

, который дает следующее изображение в качестве вывода empty image

Может кто-нибудь, пожалуйста, помогите мне? Другие подходы также приветствуются

1 Ответ

1 голос
/ 09 ноября 2019

Проблема, по сути, заключается в изменении команды. Поскольку при глубоком обучении входные изображения определяются как [batchsize, channels, height, width], поэтому, чтобы увидеть изображение в его правильной форме, вы должны изменить его размер, чтобы придать ему (3,32,32).

Вот минимальный код для получения желаемого результата:

import pickle
import numpy as np
import matplotlib.pyplot as plt

with open('pickleFile.pkl', 'rb') as f:
    imgList= pickle.load(f)

img = np.reshape(imgList[0],(3,32,32)) # get the first element from list

# inorder to view in imshow we need image of type (height,width, channel) rather than (channel, height,width)
imgView=np.transpose(img, (1,2,0))

plt.imshow(imgView)
...