理解每个步骤中图像如何变化对于理解整个网络的工作原理至关重要。下面是详细描述图像经过每个步骤后的变化:
1. 输入图像处理(DownSampling)
输入图像(Input Image)
- 形状:
(batch_size, input_nc, H, W)
,其中input_nc
是输入通道数,H
和W
是图像的高和宽。
卷积层(Initial Convolution)
- 变换:通过
nn.Conv2d
卷积层,输入图像的特征图数量增加(从input_nc
到ngf
),同时图像的空间维度不变(假设填充为3
,步幅为1
)。 - 形状:
(batch_size, ngf, H, W)
。 -
卷积操作原理:
- 卷积核(Kernel/Filter):卷积层使用一组卷积核(或滤波器),每个卷积核有其特定的权重,这些卷积核在输入图像上滑动,并计算加权和,从而生成新的特征图(feature map)。
- 步幅(Stride):步幅决定了卷积核在输入图像上滑动的步幅大小。在此例中,步幅为1,表示卷积核每次移动一个像素。
- 填充(Padding):填充用于控制卷积操作后特征图的空间维度。此例中使用的是3的填充,即在输入图像的边界周围添加了3个像素的零填充,以保持输出图像的空间尺寸与输入图像相同。
其实就是得到某一特征矩阵,对图像每个小块的判定表,根据相似程度打分,详细原理,可参照用手写字识别作例子讲解的。
归一化与激活(Normalization & Activation)
- 变换:
nn.InstanceNorm2d
进行归一化,nn.ReLU
引入非线性特征。 - 形状:仍然是
(batch_size, ngf, H, W)
。
就是这个判定表中的打分>T(阙值)就判定为相似,可以激活
下采样(DownSampling)
- 变换:每次下采样通过
nn.Conv2d
的stride=2
减小空间维度(高和宽都减少一半),特征图的通道数增加(乘以2)。 - 形状:
(batch_size, ngf * 2^i, H / 2^i, W / 2^i)
,i
是当前的下采样层级。
2. 全局池化(Global Pooling)
全局平均池化(Global Average Pooling, GAP)
- 变换:将每个通道的空间特征图压缩成一个标量(平均值)。
- 形状:
(batch_size, ngf * mult, 1, 1)
->gap
->(batch_size, ngf * mult)
(去掉空间维度)。
全局最大池化(Global Max Pooling, GMP)
- 变换:将每个通道的空间特征图压缩成一个标量(最大值)。
- 形状:
(batch_size, ngf * mult, 1, 1)
->gmp
->(batch_size, ngf * mult)
(去掉空间维度)。
其实就是看每个特征,在整张图的层面上能被激活的可能性,从两个角度判断,平均越相似,值越大;或者某个部分越相似,值越大。简单来说就是靠这个值,判断这张图有这个特征的可能性有多大
3. 特征融合与转换(Feature Fusion & Transformation)
拼接(Concatenation)
- 变换:将GAP和GMP结果拼接在通道维度上。
- 形状:
(batch_size, ngf * mult * 2, 1, 1)
。
1x1卷积(1x1 Convolution)
- 变换:通过1x1卷积调整特征图的通道数。
- 形状:
(batch_size, ngf * mult, H / 2^n_downsampling, W / 2^n_downsampling)
。
4. 上采样与图像重建(UpSampling & Image Reconstruction)
上采样(Upsampling)
- 变换:通过
nn.Upsample
逐步恢复特征图的空间维度。 - 形状:
(batch_size, ngf * mult, H / 2^i, W / 2^i)
->(batch_size, ngf * mult, H / 2^(i-1), W / 2^(i-1))
。
ResNet块(ResNet Blocks)
- 变换:
ResnetAdaILNBlock
对特征图进行进一步处理,包括残差连接和自适应实例归一化,增强细节。 - 形状:
(batch_size, ngf * mult, H, W)
(空间尺寸逐步恢复)。
5. 图像生成(Image Generation)
生成图像(Output Image)
- 变换:通过
self.output_image
生成最终图像。 - 形状:
(batch_size, output_nc, H, W)
。
生成散射光(Scattering)
- 变换:通过
self.output_scattering
生成散射光的特征图。 - 形状:
(batch_size, output_nc, H, W)
。
生成噪声(Noise)
- 变换:通过
self.output_noise
生成噪声的特征图。 - 形状:
(batch_size, output_nc, H, W)
。
复原图像(Restored Image)
- 变换:通过将目标图像(
gt
)、散射光和噪声相加,得到复原图像。 - 形状:
(batch_size, output_nc, H, W)
。
6. 图像拼接(Concatenation)
拼接输出(Concatenation Output)
- 变换:将生成图像、散射光和噪声在宽度维度上拼接。
- 形状:
(batch_size, 3 * output_nc, H, W)
(假设output_nc
为通道数)。
拼接复原图像(Concatenation Restored)
- 变换:将生成图像、目标图像和复原图像在宽度维度上拼接。
- 形状:
(batch_size, 3 * output_nc, H, W)
(假设output_nc
为通道数)。
7. 最终图像生成(Residual Learning)
残差学习(Residual Learning)
- 变换:
UpBlock2
通过上采样和卷积恢复图像细节,然后与输入图像相加,tanh
处理生成最终图像。 - 形状:
(batch_size, output_nc, H, W)
。
总结
- 输入图像:
(batch_size, input_nc, H, W)
- 下采样后的特征图:
(batch_size, ngf * mult, H / 2^n_downsampling, W / 2^n_downsampling)
- 全局池化后的特征:
gap
和gmp
,形状为(batch_size, ngf * mult)
- 特征融合后的特征图:
(batch_size, ngf * mult, H / 2^n_downsampling, W / 2^n_downsampling)
- 经过上采样后的特征图:
(batch_size, ngf * mult, H, W)
- 生成的图像、散射光、噪声:
(batch_size, output_nc, H, W)
- 拼接后的图像:
(batch_size, 3 * output_nc, H, W)
- 最终输出图像:
(batch_size, output_nc, H, W)
每一步处理的目的是逐步提取特征、融合信息,并最终生成复原图像。