You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中YOCO可视化DataLoader图像批次异常问题咨询

YOCO可视化结果异常的原因及解决办法

问题核心原因

你遇到的输出不稳定问题,是代码里的双重随机逻辑导致的:

  1. torch.rand(1) > 0.5 随机选择横向/纵向切分图像,但这不是主要问题;
  2. 关键在于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:10:28