赞
踩
目标分类图像增强是一种用于提高深度学习模型泛化能力的技术,通过在训练过程中对原始图像进行各种变换来增加模型所见数据的多样性。以下是几种常见的图像增强方法及其原理:
几何变换:
颜色空间变换:
噪声注入:
混合模式:
仿射变换(Affine Transformation) :包括平移、旋转、缩放以及剪切等综合变换,保证变换后图像的局部形状不变。
随机擦除(Random Erasing) :随机选择图像区域并用均值或者随机像素填充,以此来模拟目标部分遮挡的情况。
Cutout 或 CutMix:
MixUp:线性插值两张图像和它们的标签,生成新的训练样本,旨在创建两个类别间的中间过渡样本。
以上这些增强技术通常在深度学习框架如TensorFlow、PyTorch中通过相应的库实现,例如tf.image
、torchvision.transforms
等,可以在训练前实时应用于每一批次的训练数据,无需预先处理整个数据集。
旋转(Rotation) :
原理:随机旋转图像,增加模型对目标物体不同角度的识别能力。
示例(使用albumentations
):
import albumentations as A
transform = A.Compose([
A.Rotate(limit=30, p=0.5) # 随机旋转0到30度
])
翻转(Flip) :
原理:水平或垂直翻转图像,模拟镜像效果,提高模型对左右对称性的识别能力。
示例(使用torchvision.transforms
):
from torchvision.transforms import RandomHorizontalFlip, RandomVerticalFlip
transforms = Compose([
RandomHorizontalFlip(p=0.5), # 水平翻转概率为0.5
RandomVerticalFlip(p=0.5) # 垂直翻转概率为0.5
])
# 或者使用单一的RandomFlip
from torchvision.transforms import RandomFlip
transforms = Compose([
RandomFlip( # 可以指定方向,不指定则默认考虑水平和垂直
horizontal=True,
vertical=True,
p=0.5,
)
])
亮度调整(Brightness Adjustment) :
原理:通过改变像素的亮度值来模拟光照变化。
示例(使用albumentations
):
import albumentations as A
transform = A.Compose([
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5)
])
# 或者使用torchvision.transforms.ColorJitter单独调整亮度
from torchvision.transforms import ColorJitter
transforms = Compose([
ColorJitter(brightness=0.2)
])
对比度调整(Contrast Adjustment) :
albumentations
中的RandomBrightnessContrast):RandomResizedCrop:
原理:随机裁剪并缩放图像的一部分。
示例(使用torchvision.transforms
):
from torchvision.transforms import RandomResizedCrop
transforms = Compose([
RandomResizedCrop(size=(224, 224), scale=(0.08, 1.0))
])
随机擦除(RandomErasing) :
原理:随机擦除图像的部分区域,训练模型关注缺失信息时也能正确分类。
示例(使用albumentations
):
import albumentations as A
transform = A.Compose([
A.RandomErasing(p=0.5)
])
CutMix:
原理:将一张图像的一部分替换为另一张图像的相应部分,并更新标签,促进类别间的边界学习。
示例(使用albumentations
的CutMix类):
from albumentations.augmentations.mixup import CutMix
transform = A.Compose([
CutMix(num_classes=num_classes, alpha=1.0)
])
MixUp:
torchvision
自身没有直接提供MixUp实现,但可以自定义一个。下面是一个使用Python和OpenCV实现图像增强的代码示例:
import cv2 import numpy as np def random_flip(image, prob=0.5): if np.random.rand() < prob: image = cv2.flip(image, 1) return image def random_scale(image, scale_range=(0.8, 1.2), prob=0.5): if np.random.rand() < prob: scale = np.random.uniform(scale_range[0], scale_range[1]) h, w = image.shape[:2] new_h, new_w = int(h * scale), int(w * scale) image = cv2.resize(image, (new_w, new_h)) return image def random_rotate(image, angle_range=(-30, 30), prob=0.5): if np.random.rand() < prob: angle = np.random.uniform(angle_range[0], angle_range[1]) h, w = image.shape[:2] M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1) image = cv2.warpAffine(image, M, (w, h)) return image def random_shift(image, shift_range=(-10, 10), prob=0.5): if np.random.rand() < prob: h, w = image.shape[:2] dx = np.random.randint(shift_range[0], shift_range[1]) dy = np.random.randint(shift_range[0], shift_range[1]) M = np.float32([[1, 0, dx], [0, 1, dy]]) image = cv2.warpAffine(image, M, (w, h)) return image def random_crop(image, crop_size=(224, 224), prob=0.5): if np.random.rand() < prob: h, w = image.shape[:2] new_h, new_w = crop_size start_x = np.random.randint(0, w - new_w) start_y = np.random.randint(0, h - new_h) image = image[start_y:start_y + new_h, start_x:start_x + new_w] return image def random_color_jitter(image, brightness=0.1, contrast=0.1, saturation=0.1, hue=0.1, prob=0.5): if np.random.rand() < prob: alpha = 1 + np.random.uniform(-brightness, brightness) beta = np.random.uniform(-contrast, contrast) gamma = np.random.uniform(-saturation, saturation) hue_delta = np.random.uniform(-hue, hue) image = cv2.addWeighted(image, alpha, image, 0, beta) image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) image[:, :, 1] = image[:, :, 1] * (1 + gamma) image[:, :, 0] = (image[:, :, 0] + hue_delta) % 180 image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR) return image def random_noise_injection(image, noise_level=0.05, prob=0.5): if np.random.rand() < prob: noise = np.random.randn(*image.shape) * noise_level image = image + noise image = np.clip(image, 0, 255).astype(np.uint8) return image
在训练过程中随机应用这些函数,以提高模型的泛化能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。