class DarkChannel(nn.Module): def __init__(self, kernel_size=15): super(DarkChannel, self).__init__() self.kernel_size = kernel_size self.pad_size = (self.kernel_size - 1) // 2 self.unfold = nn.Unfold(self.kernel_size) def forward(self, x): # x : (B, 3, H, W), in [-1, 1] # x = (x + 1.0) / 2.0 H, W = x.size()[2], x.size()[3] # maximum among three channels x, _ = x.min(dim=1, keepdim=True) # (B, 1, H, W) x = nn.ReflectionPad2d(self.pad_size)(x) # (B, 1, H+2p, W+2p) x = self.unfold(x) # (B, k*k, H*W) x = x.unsqueeze(1) # (B, 1, k*k, H*W) # maximum in (k, k) patch dark_map, _ = x.min(dim=2, keepdim=False) # (B, 1, H*W) x = dark_map.view(-1, 1, H, W) return x
时间: 2023-12-14 20:04:06 浏览: 171
Python RuntimeError: thread.__init__() not called解决方法
5星 · 资源好评率100%
这段代码实现了一个名为DarkChannel的类,该类继承自nn.Module。DarkChannel的作用是生成一个暗通道图像,该图像可以用于估计原始图像中的大气光照强度。
DarkChannel类的初始化函数有一个参数kernel_size,默认值为15。pad_size是一个计算得到的值,表示使用ReflectionPad2d函数进行填充时需要填充多少个像素。unfold是一个函数,它将输入张量展开为指定形状的张量。
DarkChannel类的前向函数有一个输入参数x,它是一个4D张量,形状为(B, 3, H, W),表示批次大小为B,有三个通道,高度为H,宽度为W。在前向函数中,我们首先使用min函数获取x中每个像素点在三个通道中的最小值,得到一个形状为(B, 1, H, W)的张量。然后使用ReflectionPad2d函数对图像进行填充,使其在边缘处也可以计算得到暗通道。接着使用unfold函数将填充后的图像展开为一个形状为(B, k*k, H*W)的张量。再通过unsqueeze函数将该张量的形状变为(B, 1, k*k, H*W)。此时,我们可以将该张量的第三个维度看作是一个二维矩阵,大小为k*k,对于每个这样的矩阵,我们使用min函数获取其中的最小值,得到一个形状为(B, 1, H*W)的暗通道图像。最后,我们将该张量变形为形状为(-1, 1, H, W)的张量并返回。
阅读全文