如何获取生成增强数据标签并自定义增强图像命名
解决Keras ImageDataGenerator的两个问题:标签匹配与有序命名增强图像
针对你遇到的两个问题,这里给出具体的解决思路和修改后的代码:
一、生成增强图像对应的标签文件
每个string2列表中的数值f就是对应类别的标签,增强后的图像和原始图像属于同一类别。可以在生成增强图的同时,将文件名-标签的对应关系写入文本文件,方便后续训练时读取匹配。
二、自定义有序命名增强图像
ImageDataGenerator.flow()的save_prefix参数会自动追加随机后缀,无法直接关闭该行为。因此放弃使用它的save_to_dir参数,改用手动保存增强后的图像,这样就能完全控制文件名格式。
修改后的完整代码
import glob import cv2 import os from keras.preprocessing.image import ImageDataGenerator import numpy as np string2 = [1000, 137, 166, 220, 226, 42, 49, 51, 55, 66, 68, 750, 800, 850, 900, 950] # 定义每张原始图要生成的增强图数量,可按需调整 AUGMENT_NUM_PER_IMG = 5 # 创建标签文件,记录增强图文件名与对应标签 label_file = open('augmented_labels.txt', 'w', encoding='utf-8') label_file.write('filename,label\n') for f in string2: normal_dir = f'D:\\Images\\Metodologia\\SAUDAGoaVEIS\\{f}\\Segmentadas' dir1 = os.path.join(normal_dir, "*.png") datagen = ImageDataGenerator(rotation_range=30, zoom_range=0.02) # 遍历当前文件夹下所有原始图像(修正原代码仅处理第一张图的问题) for img_idx, img_path in enumerate(glob.glob(dir1)): cv_img = cv2.imread(img_path) cv_resize = cv2.resize(cv_img, (200, 200)) cv_norm_img = cv_resize / 255.0 input_batch = cv_norm_img.reshape((1, *cv_norm_img.shape)) # 生成指定数量的增强图像 for aug_idx in range(AUGMENT_NUM_PER_IMG): # 获取单张增强后的图像 output_batch = datagen.flow(input_batch, batch_size=1).next() aug_img = output_batch[0] # 将归一化的图像转回0-255的uint8格式 aug_img = (aug_img * 255).astype(np.uint8) # 自定义有序文件名:aug_原始图索引_增强序号.png aug_filename = f'aug_{img_idx}_{aug_idx}.png' aug_save_path = os.path.join(normal_dir, aug_filename) # 注意通道转换:ImageDataGenerator输出RGB,cv2保存需要BGR aug_img_bgr = cv2.cvtColor(aug_img, cv2.COLOR_RGB2BGR) cv2.imwrite(aug_save_path, aug_img_bgr) # 写入标签记录 label_file.write(f'{aug_filename},{f}\n') label_file.close()
关键修改说明
- 遍历所有原始图像:移除了原代码中遍历png文件时的
break,确保每个文件夹下的所有图像都能被处理。 - 手动控制文件名:放弃
flow()的自动保存逻辑,自定义aug_原始图索引_增强序号.png格式的文件名,彻底避免随机后缀。 - 同步生成标签文件:在保存增强图的同时,将文件名和对应标签写入
augmented_labels.txt,后续训练时可直接读取该文件匹配数据与标签。 - 通道格式修正:处理
ImageDataGenerator输出的RGB图像与cv2默认BGR格式的转换,保证保存的图像颜色正常。
内容的提问来源于stack exchange,提问作者Eda
相关产品推荐
相关产品推荐

