目录
PixelShuffle 上采样原理
PixelShuffle是一种用于上采样(即增加空间分辨率)的操作,主要用于图像超分辨率任务中。其核心思想是将通道维度的信息重新排列到空间维度,从而实现分辨率的提升。
原理
假设我们有一个输入张量,其形状为 (𝑁,𝐶×𝑟2,𝐻,𝑊),其中:
- 𝑁 是批量大小。
- 𝐶 是通道数。
- 𝐻 和 𝑊 分别是高度和宽度。
- 𝑟 是上采样因子。
PixelShuffle操作将这个张量重新排列为形状为 (𝑁,𝐶,𝐻×𝑟,𝑊×𝑟) 的张量。具体步骤如下:
- 将输入张量的通道数分解为 𝐶×𝑟2,然后将其视为形状为 (𝑁,𝐶,𝑟,𝑟,𝐻,𝑊) 的张量。
- 重新排列张量,使其形状变为 (𝑁,𝐶,𝐻×𝑟,𝑊×𝑟)。
数学公式
设输入张量为 𝑋,其形状为 (𝑁,𝐶×𝑟2,𝐻,𝑊)。PixelShuffle操作可以表示为: 𝑌𝑛,𝑐,ℎ×𝑟+𝑖,𝑤×𝑟+𝑗=𝑋𝑛,𝑐×𝑟2+𝑖×𝑟+𝑗,ℎ,𝑤 其中 0≤𝑖,𝑗<𝑟,0≤ℎ<𝐻,0≤𝑤<𝑊,0≤𝑐<𝐶。
程序实现
在PyTorch中,PixelShuffle已经被封装为一个简单的操作。以下是一个示例程序,展示如何使用PixelShuffle进行上采样:
import torch
import torch.nn as nn
# 定义输入张量
N, C, H, W = 1, 4, 2, 2 # 批量大小、通道数、高度、宽度
r = 2 # 上采样因子
input_tensor = torch.randn(N, C * r * r, H, W)
# 定义PixelShuffle层
pixel_shuffle = nn.PixelShuffle(r)
# 进行上采样
output_tensor = pixel_shuffle(input_tensor)
print("Input shape: ", input_tensor.shape)
print("Output shape: ", output_tensor.shape)
手动实现PixelShuffle,可以使用以下代码:
import torch
def pixel_shuffle(input_tensor, upscale_factor):
N, C, H, W = input_tensor.size()
r = upscale_factor
assert C % (r * r) == 0, "通道数必须是上采样因子平方的整数倍"
C //= (r * r)
# 重新排列张量
output_tensor = input_tensor.view(N, C, r, r, H, W)
output_tensor = output_tensor.permute(0, 1, 4, 2, 5, 3).contiguous()
output_tensor = output_tensor.view(N, C, H * r, W * r)
return output_tensor
# 测试自定义实现
input_tensor = torch.randn(N, C * r * r, H, W)
output_tensor = pixel_shuffle(input_tensor, r)
print("Input shape: ", input_tensor.shape)
print("Output shape: ", output_tensor.shape)
解释
- 输入张量:形状为 (𝑁,𝐶×𝑟2,𝐻,𝑊)。
- 重新排列:使用
view
将输入张量重新排列为 (𝑁,𝐶,𝑟,𝑟,𝐻,𝑊)。 - 转置维度:使用
permute
将张量转置为 (𝑁,𝐶,𝐻,𝑟,𝑊,𝑟)。 - 调整形状:使用
view
将张量调整为目标形状 (𝑁,𝐶,𝐻×𝑟,𝑊×𝑟)。
应用示例
例如,对于一个448×448的输入图像,patch size为14,总共有32×32=1024个令牌。设置上采样系数 𝑟=2 后,该图像可以表示为256个令牌。
在Intern-VL 1.5中的应用
在Intern-VL 1.5模型中,PixelShuffle操作用于减少视觉令牌的数量,同时保持图像表示的完整性。这使得模型在处理高分辨率图像时更加高效。具体来说:
- 减少令牌数量:通过PixelShuffle操作,可以将图像表示的视觉令牌数量减少到原始数量的四分之一,从而提高计算效率。
- 支持高分辨率输入:即使在测试阶段图像瓦片的数量增加到40个(即4K分辨率),模型也能高效地处理高分辨率输入,实现对高分辨率图像的零样本适应性。
- 动态分辨率操作:使得Intern-VL 1.5能够灵活地处理不同尺寸和宽高比的图像,同时提高处理高分辨率图像时的计算效率。