图像预处理之减去RGB均值

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

减去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', '_forward_pre_hooks', '_get_name', '_load_from_state_dict', '_load_state_dict_pre_hooks'
### 猫狗图片预处理方法 在猫狗图像分类任务中,数据预处理是一个至关重要的环节。它直接影响模型的性能和泛化能力。以下是几种常见的图像预处理技术及其应用: #### 1. 文件路径获取 为了加载图像数据,首先需要构建一个包含所有图像文件路径的列表。例如,在训练集中,可以找到如下形式的文件路径: - 训练集中的猫图像是 `'training_data/cats/cat.1000'`[^2]。 - 训练集中的狗图像是 `'training_data/dogs/dog.1000'`。 可以通过 Python 的 `os` 或 `glob` 库轻松生成这样的路径列表。 #### 2. 图像读取与转换 使用库如 TensorFlow、PyTorch 或 OpenCV 来读取并转换图像为张量或 NumPy 数组格式。例如,OpenCV 是一种强大的工具,支持多种图像处理操作,包括但不限于滤波、特征提取和目标检测[^4]。 ```python import cv2 import numpy as np def load_image(image_path, target_size=(128, 128)): image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换颜色空间 image = cv2.resize(image, target_size) # 统一尺寸 return image / 255.0 # 归一化像素值至 [0, 1] # 示例调用 image_array = load_image('path_to_image.jpg') ``` #### 3. 数据增强 (Data Augmentation) 数据增强是一种有效提升模型鲁棒性的手段,尤其当数据集较小时尤为重要。常用的数据增强方式包括旋转、翻转、缩放和平移等。以下是一些具体实现示例: ##### 使用 PyTorch 中的 `transforms` ```python from torchvision import transforms transform = transforms.Compose([ transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.RandomRotation(20), # 随机旋转 [-20, 20] 度 transforms.Resize((128, 128)), # 缩放到固定大小 transforms.ToTensor(), # 转换为 Tensor 并归一化到 [0, 1] ]) ``` ##### 使用 Keras/TensorFlow 中的 `ImageDataGenerator` ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) train_generator = datagen.flow_from_directory( 'training_data', target_size=(128, 128), batch_size=32, class_mode='binary' ) ``` #### 4. 图像标准化 为了让神经网络更好地收敛,通常会对输入图像进行标准化处理。这一步骤涉及减去均值并将标准差调整为单位尺度。如果使用的是预训练模型,则需遵循其特定的标准参数(如 ImageNet 均值和方差)。 ```python mean = [0.485, 0.456, 0.406] std = [0.229, 0.224, 0.225] normalize_transform = transforms.Normalize(mean=mean, std=std) ``` #### 5. 清洗损坏图片 在实际项目中,可能会遇到一些无法正常打开或者不完整的图片文件。因此,在正式开始前应先清理掉这些问题样本[^3]。 --- ### 总结 以上介绍了从基础的文件路径管理到复杂的数据增强等一系列针对猫狗图像分类任务的有效预处理策略。每种方法都有助于提高最终模型的表现力。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值