使用image_dataset_from_directory加载灰度png会返回3通道张量 所以现在我要么需要告诉image_dataset_from_directory将这些文件作为灰度加载,要么需要将3通道张量Dataset对象转换为1通道张量我该怎么办?

问题描述

我有一组灰度png图像,分为2个目录。根据文档,我已经使用image_dataset_from_directory将它们作为数据集对象加载。当我使用element_spec检查已加载的内容时,它说图像具有3个通道:

from tensorflow.keras.preprocessing import image_dataset_from_directory
Dataset = image_dataset_from_directory('path/to/files')
Dataset.element_spec

返回:

找到了14000个文件,属于2类。

(TensorSpec(shape =(None,256,256,3),dtype = tf.float32,name = None),TensorSpec(shape =(None,),dtype = tf.int32,name = None))

使用MATLAB将图像保存为灰度png,我已经使用Linux命令文件确认了它们为灰度:

$ file path/to/files/class_1/file_1.png

path / to / files / class_1 / file_1.png:PNG图片数据,256 x 256、8位灰度,非隔行扫描

所以现在我要么需要告诉image_dataset_from_directory将这些文件作为灰度加载,要么需要将3通道张量Dataset对象转换为1通道张量。我该怎么办?

编辑:

有关使用identify的磁盘上文件的更多信息(来自ImageMagick):

$ identify -verbose path/to/files/class_1/file_1.png
Image: AI_Optrap/Samples/Set4/relaxed/HL60_normoxia_1_1.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: PseudoClass
  Geometry: 256x256+0+0
  Units: Undefined
  Type: Grayscale
  Base type: Grayscale
  Endianess: Undefined
  Colorspace: Gray
  Depth: 8-bit
  Channel depth:
    gray: 8-bit
  Channel statistics:
    Pixels: 65536
    Gray:
      min: 0 (0)
      max: 255 (1)
      mean: 135.92 (0.533021)
      standard deviation: 36.3709 (0.142631)
      kurtosis: 1.51412
      skewness: 0.035325
      entropy: 0.87207
  Colors: 256

解决方法

默认情况下,image_dataset_from_directory转换为3个通道。查看documentation

tf.keras.preprocessing.image_dataset_from_directory(
    directory,labels='inferred',label_mode='int',class_names=None,color_mode='rgb',batch_size=32,image_size=(256,256),shuffle=True,seed=None,validation_split=None,subset=None,interpolation='bilinear',follow_links=False
)

色彩模式:“灰度”,“ rgb”,“ rgba”之一。默认值:“ rgb”。图像是否将转换为具有1、3或4个通道。

所以只需使用这一行:

Dataset = image_dataset_from_directory('path/to/files',color_mode='grayscale')

现在您的图像将被转换为(None,256,1)