PyTorch中YOCO可视化DataLoader图像批次异常问题咨询
YOCO可视化结果异常的原因及解决办法
问题核心原因
你遇到的输出不稳定问题,是代码里的双重随机逻辑导致的:
torch.rand(1) > 0.5随机选择横向/纵向切分图像,但这不是主要问题;- 关键在于
RandomHorizontalFlip默认是50%概率触发,且你给切分后的两个半区分别独立应用这个增强,就会出现三种情况:- 两个半区都没触发翻转(概率25%):拼接后和原图完全一致;
- 只有一个半区触发翻转(概率50%):拼接后呈现一半翻转、一半正常的裁剪效果;
- 两个半区都触发翻转(概率25%):拼接后等价于全图翻转,和直接翻转原图效果一致。
另外,你设置了batch_size=64但数据集只有单张图,会重复加载这张图64次,保存的图片里是64张相同处理后的图,属于冗余操作。
代码问题拆解
- 增强操作的随机性独立作用于每个图像块,导致结果不符合预期;
- 每次循环都重新定义
aug实例,属于无意义的重复创建; - 单张图数据集用大batch_size没有实际作用,反而生成大量重复图像。
修正方案
如果想要符合YOCO预期的分块增强效果(避免半翻半不翻的怪异情况),可以让切分后的两个半区共用同一个增强状态,同时调整batch_size为1。以下是修正后的代码:
import torch from torchvision.utils import save_image import torchvision.transforms as transforms from torchvision import datasets from torchvision.transforms import ToTensor from torch.utils.data import DataLoader # 单张图数据集,batch_size设为1更合理 training_data = datasets.ImageFolder(root="/media/cvpr/CM_22/dataset/train", transform=ToTensor()) train_loader = DataLoader(training_data, batch_size=1, shuffle=False) def YOCO(images, h, w): # 先统一决定是否翻转,让两个半区用相同状态 need_flip = torch.rand(1) > 0.5 # 定义确定性的翻转增强(要么必翻,要么不翻) flip_transform = transforms.RandomHorizontalFlip(p=1.0) if need_flip else transforms.Lambda(lambda x: x) if torch.rand(1) > 0.5: # 横向切分,两个半区用相同翻转处理 left_block = flip_transform(images[:, :, :, :w//2]) right_block = flip_transform(images[:, :, :, w//2:]) images = torch.cat([left_block, right_block], dim=3) else: # 纵向切分,两个半区用相同翻转处理 top_block = flip_transform(images[:, :, :h//2, :]) bottom_block = flip_transform(images[:, :, h//2:, :]) images = torch.cat([top_block, bottom_block], dim=2) return images for i, (images, target) in enumerate(train_loader): _, _, h, w = images.shape images = YOCO(images, h, w) save_image(images, f'img_{i}.png')
效果说明
- 修正后,要么切分后的两个块都翻转,要么都不翻转,不会出现半翻半不翻的问题;
- 保留了横向/纵向切分的随机性,符合YOCO分块增强的核心逻辑;
- 如果想要每次都强制触发翻转+分块,只需把
need_flip设为True即可。
图像说明
- 输入图像:一张包含对称图案与文字的均匀布局图像;
- 输出图像:切分后的两个块同时翻转或保持原样,拼接后呈现符合YOCO逻辑的增强效果。
内容的提问来源于stack exchange,提问作者Khawar Islam
相关产品推荐
相关产品推荐

