ImageDataGenerator数据增强时RGB图像被转为灰度图如何解决
问题描述
目前正在使用Facenet搭建人脸检测与识别应用:
- 第一阶段从摄像头采集图像,通过MTCNN模型检测画面中的人脸,将裁剪后的人脸图像存储到指定文件夹
- 后续计划使用ImageDataGenerator对文件夹内的图像做数据增强扩充数据集,但实际运行时datagen输出的增强结果均为灰度格式
ImageDataGenerator初始化代码如下:
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest',rescale=False)
数据增强流实现代码如下:
for train_img in train_images: img = image.img_to_array(train_img) # convert image to numpy array img = img.reshape((1,) + img.shape) # reshape image i = 0 datagen.fit(img) for batch in datagen.flow(img, save_format='png',save_to_dir=train_path): i += 1 if i > 10: break
问题原因
增强结果输出为灰度格式的核心原因是输入到datagen.flow()的图像数组通道数不符合RGB三通道要求,常见触发场景:
- 读取已存储的人脸图像时,默认使用灰度模式加载,
img_to_array输出的数组维度为(height, width, 1),单通道数组增强后保存即为灰度图 - MTCNN输出的人脸裁剪结果本身被转为单通道格式,或数组reshape过程中误压缩了通道维度
另外代码中逐张图调用datagen.fit(img)属于冗余操作:该方法仅在配置了featurewise_center、zca_whitening等需要基于全量数据集计算统计参数的增强项时才需要使用,当前参数配置下调用无实际作用,虽不会直接导致灰度问题,但会拖慢运行效率。
解决方案
按以下步骤排查修复:
- 修正图像加载逻辑
若使用tf.keras.preprocessing.image.load_img读取本地存储的人脸图像,必须显式指定color_mode='rgb',不要依赖默认值(部分旧版本Keras的默认加载模式不是RGB):from tensorflow.keras.preprocessing import image # 强制以三通道RGB模式加载图像 train_img = image.load_img(img_path, color_mode='rgb') - 校验输入数组维度
在reshape操作前打印数组形状,确认单张图像转数组后的维度为(height, width, 3),送入datagen.flow()的batch维度为(1, height, width, 3)。如果发现最后一维通道数为1,或数组是二维(无通道维度),手动补全三通道:import numpy as np img = image.img_to_array(train_img) # 打印维度校验 print(img.shape) # 维度异常时补全三通道 if len(img.shape) == 2: img = np.stack([img, img, img], axis=-1) elif img.shape[-1] == 1: img = np.concatenate([img, img, img], axis=-1) img = img.reshape((1,) + img.shape) - 移除冗余代码
删除循环内的datagen.fit(img)语句,逐张图片调用该方法无实际意义,还会增加不必要的计算开销。
修复完成后重新运行增强流程,输出结果即可保留原始RGB彩色格式。
额外排查点:检查MTCNN裁剪人脸后的保存逻辑,确认存储到文件夹的原始人脸图没有被转为单通道灰度,从源头避免色彩信息丢失。
内容的提问来源于stack exchange,提问作者Ishan Sharma
相关产品推荐
相关产品推荐

