图像预处理之减去RGB均值

在计算机视觉领域,图像预处理通常包括减去RGB均值,以实现数据标准化。这样做是为了去除图像中的共性部分,突出个体差异,便于模型学习。减去训练集均值并在验证和测试集上应用是关键,遵循深度学习原则。减去RGB均值的效果明显,如移除天空纹理,增强主要特征的识别。RCAN模型的代码示例展示了这一过程。
摘要由CSDN通过智能技术生成

减去RGB均值(实例以DIV2K数据集为例)

在计算机视觉领域中,一定免不了的就是图像预处理中的 逐个样本减去mean值的过程,那么为什么一定要做这一步呢?

为什么每张图片都要减去数据集均值呢?

原因:为了进行数据特征标准化,即像机器学习中的特征预处理那样对输入特征向量各维去均值再除以标准差,但由于自然图像各点像素值的范围都在0-255之间,方差大致一样,只要做去均值(减去整个图像数据集的均值或各通道关于图像数据集的均值)处理即可。

主要原理:我们默认自然图像是一类平稳的数据分布(即数据每一维的统计都服从相同分布),此时,在每个样本上减去数据的统计平均值可以移除共同的部分,凸显个体差异。

其效果如下所示:
在这里插入图片描述
可以看到天空的纹理被移除了,凸显了汽车和高楼等主要特征。

最值得注意的一点是,在计算均值之前就要预先划分好训练集验证集和测试集,然后只针对训练集计算均值,否则就违背了深度学习的原则:模型训练过程仅能从训练模型中获取信息。得到训练集的均值后,对训练集验证集和测试集分别减去该均值。

以RCAN中代码为例:

class MeanShift(nn.Conv2d):
    def __init__(self, rgb_range, rgb_mean, rgb_std, sign=-1):
        super(MeanShift, self).__init__(3, 3, kernel_size=1)
        
        std = torch.Tensor(rgb_std)
        self.weight.data = torch.eye(3).view(3, 3, 1, 1) # #第一维为输出通道,第二维为输入通道
        self.weight.data.div_(std.view(3, 1, 1, 1)) # torch.eye(3).view(3, 3, 1, 1) / std.view(3, 1, 1, 1)
        self.bias.data = sign * rgb_range * torch.Tensor(rgb_mean)
        self.bias.data.div_(std) # sign * rgb_range * torch.Tensor(rgb_mean) / std
        # (w*x+b)/std
        self.requires_grad = False

rgb_mean = (0.4488, 0.4371, 0.4040)
rgb_std = (1.0, 1.0, 1.0)
sub_mean = MeanShift(255, rgb_mean, rgb_std)
add_mean = MeanShift(255, rgb_mean, rgb_std, sign=1)
print(sub_mean)
print('sub_mean的所有属性方法', dir(sub_mean)) # dir(Object)可以获得对象的所有属性和方法
print('stride', getattr(sub_mean,'stride')) # getattr(object, name)获取对象object的属性或者方法
print('判断是否有weight属性', hasattr(sub_mean, 'weight')) # hasattr(Object, "name")可以判断对象是否有某个属性

x = imageio.imread('322878.jpg') # 载入图片
np_transpose = np.ascontiguousarray(x.transpose((2, 0, 1)))
tensor = torch.from_numpy(np_transpose).float()
tensor = tensor.unsqueeze(0)
tensor.mul_(255. / 255)
print('input',tensor, tensor.shape)
tensor = sub_mean(tensor)
print('output',tensor, tensor.shape)
tensor = add_mean(tensor)
print('reoutput', tensor, tensor.shape)

输出

MeanShift(3, 3, kernel_size=(1, 1), stride=(1, 1))
sub_mean的所有属性方法 ['__call__', '__class__', '__constants__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_apply', '_backend', '_backward_hooks', '_buffers', '_forward_hooks&
  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值