Keras显示来自数据生成器的图像

时间:2017-01-17 11:23:03

标签: python image matplotlib neural-network keras

我正在使用像这样的keras的图像生成器:

 var sb = new StringBuiler();
 foreach (DataRepeaterItem c in dataRepeater1.Controls)
 {
    sb.AppendLine(((Label)c.Controls["label5"]).Text);
 }

 ss+= sb;

这显示错误的颜色: enter image description here

我有两个问题。

  1. 如何解决问题

  2. 如何获取文件的文件名(以便我可以自己从matplotlib中读取)

  3. 编辑:这就是我的datagen的样子

    val_generator = datagen.flow_from_directory(
            path+'/valid',
            target_size=(224, 224),
            batch_size=batch_size,)
    
    x,y = val_generator.next()
    for i in range(0,1):
        image = x[i]
        plt.imshow(image.transpose(2,1,0))
        plt.show()
    

    编辑2:

    跟随Marcin的回答:

    datagen = ImageDataGenerator(
        rotation_range=3,
    #     featurewise_std_normalization=True,
        fill_mode='nearest',
        width_shift_range=0.2,
        height_shift_range=0.2,
        horizontal_flip=True
    )
    

    我得到了正常的颜色,但仍有一些奇怪的颜色:

    enter image description here

6 个答案:

答案 0 :(得分:4)

图像数组的dtype是'float32',只需将其转换为'uint8':

plt.imshow(image.astype('uint8'))

答案 1 :(得分:2)

  1. 至少有三种方法可以使用这种扭曲的颜色。所以:

    • 一个选项是您需要切换颜色排序,如此question
    • 第二,你可能会把你的照片变成负片(每个通道都会被255 - x转换变换)这有时会发生在使用某些GIS库时。
    • 您还可以使用score/255转换。

    您需要检查案件中发生的选项。

  2. 为了自己获取图片我经常使用(当你的文件夹的格式适合Keras flow_from_directory时)我通常使用os.listdir和{{1的混合通过:

    os.path.join

答案 2 :(得分:2)

我遇到与OP相同的问题,并通过将像素从0-255重新调整为0-1来解决它。

Keras' ImageDataGenerator采用了' rescale'参数,我设置为(1/255)。这产生了具有预期颜色的图像

image_gen = ImageDataGenerator(rescale=(1/255))

答案 3 :(得分:1)

颜色问题很奇怪。 一旦我可以访问我的linux机器,我会尝试重现它。

对于问题的文件名部分,我想对Keras源代码提出一个小改动:

您可能需要查看此文件: https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py 它包含图像预处理例程。

查看第820行next()的{​​{1}}函数:调用此函数从目录中获取新图像。

在该函数内部,查看第838行,如果已将DirectoryIterator设置为路径,则生成器会将增强图像输出到此路径,以进行调试。 增强图像的名称是索引和散列的混合。对你没用。

但是你可以很容易地改变代码:

save_to_dir

现在,使用原始文件名保存增强图像。

这应该允许您将图像保存在其原始文件名下。 好吧,你怎么把它注入Keras源?

这样做:

  1. clone Keras:filenames=[] #<-------------------------------------------- new code for i, j in enumerate(index_array): fname = self.filenames[j] img = load_img(os.path.join(self.directory, fname), grayscale=grayscale, target_size=self.target_size) x = img_to_array(img, dim_ordering=self.dim_ordering) x = self.image_data_generator.random_transform(x) x = self.image_data_generator.standardize(x) filenames.append(fname) # <-----------------------------store the used image's name batch_x[i] = x # optionally save augmented images to disk for debugging purposes if self.save_to_dir: for i in range(current_batch_size): img = array_to_img(batch_x[i], self.dim_ordering, scale=True) #fname = '{prefix}_{index}_{hash}.{format}'.format(prefix=self.save_prefix, # index=current_index + i, # hash=np.random.randint(1e4), # format=self.save_format) fname=filenames[i] # <------------------------------ use the stored code instead img.save(os.path.join(self.save_to_dir, fname))
  2. 转到我上面链接的源文件。做出改变。
  3. 欺骗你的python代码以导入更改的代码,而不是pip安装的版本。
  4. git clone https://github.com/fchollet/keras

    现在# this is the path to the cloned repository # if you cloned it next to your script # then just use keras/ # if it's one folder above # then use ../keras/ sys.path.insert(0, os.getcwd() + "/path/to/keras/") import keras 是您的修补版本。

    我希望这有效,我目前正在使用Windows。我的python堆栈只在linux机器上。可能存在小的语法错误。

答案 4 :(得分:1)

如果您使用目录中的test_batches=Imagedatagenerator().flow,请稍作建议。如果使用它来馈送预测生成器,请确保设置shuffle=false来保持文件与关联的预测之间的相关性。如果目录中的文件带有数字标签,例如 1.jpg 2.jpg 等。图像可能不会被提取。它们按以下顺序获取: 1.jpg 10.jpg 2.jpg 20.jpg 等。这很难将预测匹配到特定文件。您可以使用0填充来解决此问题,例如 01.jpg 02.jpg 等。

答案 5 :(得分:0)

from skimage import io

def imshow(image_RGB):
  io.imshow(image_RGB)
  io.show()

x,y = train_generator.next()

for i in range(0,11):
    image = x[i]
    imshow(image)

对我有用。