无法从灰度转换为 RGB 以使用 FER2013 数据集进行迁移学习

Unable to convert to RGB from Grayscale for transfer learning with FER2013 dataset

我这里的 post 也有类似的问题:

本质上,我正在训练使用迁移学习(使用 Inception)在 FER2013 上进行训练,以构建预测图片情绪的模型。不幸的是,图像是灰度的,Inception 模型使用 rgb 作为输入。

我尝试使用建议的解决方案,但是 returns 我出错了,我没有足够的声誉来评论原始解决方案。

这是原始解决方案:

def to_grayscale_then_rgb(image):
    image = tf.image.rgb_to_grayscale(image)
    image = tf.image.grayscale_to_rgb(image)
    return image

我将其插入到我的数据生成器中。我也试过最初只使用灰度到 rgb,但也返回了一个错误。

train_rgb_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,
                                                                    preprocessing_function= to_grayscale_then_rgb ,
                                                                   #preprocessing_function=tf.image.grayscale_to_rgb,
                                                                   vertical_flip= True)

train_dataflow_rgb = train_rgb_datagen.flow_from_directory(train_root,
                                                          target_size = (48,48),
                                                          seed = seed_num)

test_rgb_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,
                                                                   preprocessing_function= to_grayscale_then_rgb,
                                                                   #preprocessing_function=tf.image.grayscale_to_rgb,
                                                                   vertical_flip= True)

test_dataflow_rgb = test_rgb_datagen.flow_from_directory(test_root,
                                                          target_size = (48,48),
                                                         shuffle = False,
                                                          seed = seed_num)

当我尝试训练模型时,出现以下错误:

epochs = 50
steps_per_epoch = 1000

tl_Incept_history = tl_Incept_model.fit(train_dataflow_rgb, 
                                          epochs = epochs, 
                                          validation_data=(test_dataflow_rgb),
                                          #steps_per_epoch=steps_per_epoch,
                                          callbacks=[early_callback, myCallback])

---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_10932/801602138.py in <module>
      2 steps_per_epoch = 1000
      3 
----> 4 tl_Incept_history = tl_Incept_model.fit(train_dataflow_rgb, 
      5                                           epochs = epochs,
      6                                           validation_data=(test_dataflow_rgb),

~\Venv\testpy39\lib\site-packages\keras\utils\traceback_utils.py in error_handler(*args, **kwargs)
     65     except Exception as e:  # pylint: disable=broad-except
     66       filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67       raise e.with_traceback(filtered_tb) from None
     68     finally:
     69       del filtered_tb

~\Venv\testpy39\lib\site-packages\tensorflow\python\eager\execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     56   try:
     57     ctx.ensure_initialized()
---> 58     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     59                                         inputs, attrs, num_outputs)
     60   except core._NotOkStatusException as e:

InvalidArgumentError:  input depth must be evenly divisible by filter depth: 1 vs 3

预处理代码很好,只是尺寸似乎不匹配。它需要 image_size[0], image_size[1], num_channels,其中 num_channels = 3 如果是 rgb(每个 r、g、b 一个),如果是灰度则 = 1。

您有两个 target_size = (48,48), 的实例 - 如果将它们更改为 target_size = (48,48,3), 会起作用吗?

如果不是,要进一步调试,请单独尝试 def to_grayscale_then_rgb(image): 图像并查看返回图像的尺寸。如果它是二维的(例如 image_size[0]、image_size[1]),您可以探索在函数内重塑图像,如下所示:XXX = tf.convert_to_tensor(XXX[:,:,:3]) 如 [=16= 中所示],尽管 grayscale_to_rgb 应该输出最终维度 3...