当前位置: 首页> 教育> 就业 > 杭州营销型网站建设_长春市疫情最新消息_今日头条10大新闻_sem管理工具

杭州营销型网站建设_长春市疫情最新消息_今日头条10大新闻_sem管理工具

时间:2025/7/15 23:35:30来源:https://blog.csdn.net/liugan528/article/details/145788441 浏览次数:0次
杭州营销型网站建设_长春市疫情最新消息_今日头条10大新闻_sem管理工具

深度学习图像预处理可视化:拆解Compose操作的全过程

背景需求
在深度学习图像处理中,我们经常使用torchvision.transforms.Composetimmcreate_transform将多个预处理步骤组合成一个流水线。但在实际调试中,开发者常会遇到以下问题:

  • 无法直观看到每个变换步骤对图像的具体影响
  • 归一化(Normalize)后的张量难以直接可视化
  • 随机增强(如翻转、裁剪)导致结果不可复现时难以定位问题

本文目标
通过代码实现以下功能:

  1. 逐步拆解预处理流水线,记录每个中间步骤的输出
  2. 自动可视化所有变换结果(包括PIL图像和归一化后的张量)
  3. 智能布局子图排列,避免空白区域过多
  4. 动态反归一化处理,还原可读性图像

技术实现亮点

# 关键代码段解析
cols = math.ceil(math.sqrt(total_steps))  # 根据步骤数量动态计算列数
rows = math.ceil(total_steps / cols)      # 计算所需行数# 反归一化处理(以Normalize步骤为例)
if name == "Normalize":tmp = img_step.permute(1,2,0).numpy() * std + mean  # 还原原始像素范围tmp = np.clip(tmp, 0, 1)  # 防止溢出

可视化流程说明

  1. 输入图像处理

    • 原始图像通过create_transform定义的多阶段变换
    • 包含典型操作:随机翻转(hflip=0.3)、中心裁剪(crop_pct=0.8)、归一化等
  2. 中间结果捕获

    intermediate_img = [img]  # 初始化包含原始图像
    for i in range(len(transform_list)):intermediate_img.append(transform_list[i](intermediate_img[i]))
    
    • 通过循环逐步应用每个变换并保存结果
  3. 结果可视化

    处理步骤关键技术
    PIL图像显示直接渲染Image.Image对象
    张量显示使用.permute(1,2,0)调整维度顺序(C×H×W → H×W×C)
    布局优化动态计算行列数,保证接近正方形排列(如5个子图显示为2×3网格)

实际应用场景

  • 代码演示:直观展示每个预处理步骤的效果
  • 算法调试:定位导致图像异常的变换步骤
  • 数据增强验证:检查随机裁剪/翻转是否合理
  • 模型部署:验证预处理与训练时的一致性
import os
import math
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from timm.data.transforms_factory import create_transform
import torchos.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'# Step1: 读取图片
img = Image.open('DJI_20241009083951.jpg')# Step2: 创建图像变换组合
transform = create_transform(input_size=(224, 224),is_training=True,hflip=0.3,vflip = 0.1,crop_mode='border',crop_pct=0.8,mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225)
)# Step3: 显示变换组合
print(transform)
transform_list = transform.transforms  # 将所有变换放到列表中# Step4: 生成中间结果
intermediate_img = [img]
for i in range(len(transform_list)):intermediate_img.append(transform_list[i](intermediate_img[i]))# Step5: 动态计算子图布局
total_steps = len(intermediate_img)
cols = math.ceil(math.sqrt(total_steps))  # 列数
rows = math.ceil(total_steps / cols)      # 行数动态计算# 创建子图(保持二维结构)
fig, axs = plt.subplots(rows, cols, figsize=(cols * 5, rows * 5), squeeze=False)# Step6: 可视化所有中间结果
for i in range(total_steps):# 获取当前步骤的名称和图像name = "Original" if i == 0 else transform_list[i - 1].__class__.__name__img_step = intermediate_img[i]# 转换为可显示格式if isinstance(img_step, Image.Image):tmp = img_stepelif isinstance(img_step, torch.Tensor):if name == "Normalize":# 反归一化处理mean = np.array(transform_list[i - 1].mean)std = np.array(transform_list[i - 1].std)tmp = img_step.permute(1, 2, 0).numpy() * std + meantmp = np.clip(tmp, 0, 1)else:tmp = img_step.permute(1, 2, 0).numpy()# 计算子图位置row = i // colscol = i % cols# 绘制子图axs[row, col].imshow(tmp)axs[row, col].axis('off')axs[row, col].set_title(f"Step {i}: {name}", fontsize=8)# 隐藏多余的空子图
for i in range(total_steps, rows * cols):row = i // colscol = i % colsaxs[row, col].axis('off')plt.tight_layout()
plt.show()

在这里插入图片描述

关键字:杭州营销型网站建设_长春市疫情最新消息_今日头条10大新闻_sem管理工具

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: