如何在以NumPy数组存储的图像数据集上执行图像增强且无需为每张增强图像手动添加标签
针对序列图像数据集的自动标签匹配增强方案
嘿,针对你这种带序列帧的图像数据集(1100个样本,每个样本含22张64×64图像)做增强,核心就是让增强后的样本自动继承原样本的标签,不用手动挨个对应。我给你两种实用的实现思路,你可以根据需求选:
方案一:手动自定义增强(灵活可控)
这种方式适合你需要定制增强逻辑的场景,比如要加一些特定的变换(比如针对动作识别的时序一致增强)。
首先写一个单帧的增强函数,再批量处理每个样本的所有帧,同时自动复制标签:
import numpy as np import cv2 def augment_single_frame(frame): # 随机水平翻转(时序一致:同一个样本的所有帧翻转状态一致) flip_flag = np.random.rand() > 0.5 if flip_flag: frame = cv2.flip(frame, 1) # 随机调整亮度(注意如果你的图像是归一化到0-1的,要把clip范围改成0-1) brightness = np.random.uniform(0.8, 1.2) frame = np.clip(frame * brightness, 0, 255).astype(np.uint8) # 还可以加其他增强:比如小角度旋转、高斯模糊等,按需调整 return frame def augment_full_sample(sample): # 对单个样本的22帧统一做增强(保证时序一致性) return np.array([augment_single_frame(frame) for frame in sample]) # 初始化增强后的数据集容器 X_augmented_list = [] y_augmented_list = [] # 遍历每个原样本,同时加入原样本和增强样本 for idx in range(len(X_train)): # 先加入原样本和对应标签 X_augmented_list.append(X_train[idx]) y_augmented_list.append(y_train[idx]) # 生成增强样本并加入,标签和原样本一致 augmented_sample = augment_full_sample(X_train[idx]) X_augmented_list.append(augmented_sample) y_augmented_list.append(y_train[idx]) # 转换为NumPy数组 X_train_aug = np.array(X_augmented_list) y_train_aug = np.array(y_augmented_list) # 检查结果:应该是(2200, 22, 64, 64)和(2200,) print(X_train_aug.shape) print(y_train_aug.shape)
方案二:用Keras ImageDataGenerator快速实现
如果你不想自己写太多逻辑,可以用Keras的内置增强器,只需要稍微调整数据形状来适配:
from tensorflow.keras.preprocessing.image import ImageDataGenerator # 定义增强参数,按需添加 datagen = ImageDataGenerator( horizontal_flip=True, brightness_range=[0.8, 1.2], # zoom_range=0.1, # 可选:随机缩放 # rotation_range=5 # 可选:小角度旋转 ) # 把原数据集的序列帧平铺:从(1100,22,64,64)转成(1100*22,64,64) X_flattened = X_train.reshape(-1, 64, 64) # 标签对应重复22次,保证每个帧都和原样本标签绑定 y_flattened = np.repeat(y_train, 22) # 生成增强后的帧数据 augmented_frames, _ = next(datagen.flow(X_flattened, y_flattened, batch_size=len(X_flattened), shuffle=False)) # 把增强后的帧重新组合成序列样本:(1100*22,64,64) -> (1100,22,64,64) X_augmented = augmented_frames.reshape(1100, 22, 64, 64) # 合并原数据集和增强数据集,标签直接复制原标签即可 X_train_final = np.concatenate([X_train, X_augmented], axis=0) y_train_final = np.concatenate([y_train, y_train], axis=0) # 检查结果 print(X_train_final.shape) # (2200, 22, 64, 64) print(y_train_final.shape) # (2200,)
几个关键注意点
- 如果你的图像是归一化到0-1的浮点数,记得把增强后的数值clip到0-1范围,而不是示例中的0-255。
- 要是想生成多份增强数据(比如每个样本增强3次),只需要在循环里重复执行增强逻辑,每次都把样本和对应标签加入数据集即可。
- 针对序列帧数据集(比如动作识别),增强要保证时序一致性:同一个样本的所有帧要做相同的变换(比如要么都翻转,要么都不翻转),别给不同帧随机做不同变换,否则会破坏时序逻辑。
内容的提问来源于stack exchange,提问作者Ritesh Prasad Singh
相关产品推荐
相关产品推荐

