目标检测——基本数据增广(旋转、裁剪、缩放、填充、亮暗、对比度等)

本文详细介绍了图像处理中常用的图像增强方法,包括亮度、对比度和颜色调整,随机填充、裁剪、缩放和翻转,以及真实框的处理。通过这些技术,可以有效提升图像数据集的质量和多样性,对训练更鲁棒的计算机视觉模型至关重要。

图像处理的主要函数文件:image_utils.py

# -*- coding: utf-8 -*-

import numpy as np
import cv2
from PIL import Image, ImageEnhance
import random

from box_utils import multi_box_iou_xywh, box_crop

# 随机改变亮暗、对比度和颜色等
def random_distort(img):
    # 随机改变亮度
    def random_brightness(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Brightness(img).enhance(e)
    # 随机改变对比度
    def random_contrast(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Contrast(img).enhance(e)
    # 随机改变颜色
    def random_color(img, lower=0.5, upper=1.5):
        e = np.random.uniform(lower, upper)
        return ImageEnhance.Color(img).enhance(e)

    ops = [random_brightness, random_contrast, random_color]
    np.random.shuffle(ops)

    img = Image.fromarray(img)
    img = ops[0](img)
    img = ops[1](img)
    img = ops[2](img)
    img = np.asarray(img)

    return img

# 随机填充
def random_expand(img,
                  gtboxes,
                  max_ratio=4.,
                  fill=None,
                  keep_ratio=True,
                  thresh=0.5):
    if random.random() > thresh:
        return img, gtboxes

    if max_ratio < 1.0:
        return img, gtboxes

    h, w, c = img.shape
    ratio_x = random.uniform(1, max_ratio)
    if keep_ratio:
        ratio_y = ratio_x
    else:
        ratio_y = random.uniform(1, max_ratio)
    oh = int(h * ratio_y)
    ow = int(w * ratio_x)
    off_x = random.randint(0, ow - w)
    off_y = random.randint(0, oh - h)

    out_img = np.zeros((oh, ow, c))
    if fill and len(fill) == c:
        for i in range(c):
            out_img[:, :, i] = fill[i] * 255.0

    out_img[off_y:off_y + h, off_x:off_x + w, :] = img
    gtboxes[:, 0] = ((gtboxes[:, 0] * w) + off_x) / float(ow)
    gtboxes[:, 1] = ((gtboxes[:, 1] * h) + off_y) / float(oh)
    gtboxes[:, 2] = gtboxes[:, 2
### 视觉数据增广技术及其实现方法 视觉数据增广(Data Augmentation)是一种通过变换现有数据样本的方式,生成更多样化的训练数据的技术。这种方法可以有效缓解过拟合问题并提升模型的泛化能力[^2]。 #### 数据增广的核心原理 数据增广的主要目的是通过对已有数据进行合理的转换操作,使得模型能够接触到更广泛的输入情况,从而更好地适应实际场景中的变化。这些转换通常包括几何变换、颜色空间调整以及其他形式的变化。 --- #### 常见的数据增广技术 1. **几何变换** 几何变换是最常见的数据增广方式之一,主要包括旋转、平移、缩放和翻转等操作。例如,在图像分类任务中,可以通过随机水平或垂直翻转图片来增加数据量。 ```python import torchvision.transforms as transforms # 定义几何变换 transform_geom = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转 transforms.RandomRotation(degrees=30), # 随机旋转 [-30, 30] 度 transforms.Resize((224, 224)), # 调整大小到 (224, 224) transforms.ToTensor() # 转换为张量 ]) ``` 2. **色彩变换** 对图像的颜色通道进行调整也是一种有效的增广手段,比如改变度、对比度、饱和度或者色调。这种变换可以帮助模型学会忽略无关紧要的颜色差异。 ```python # 定义色彩变换 transform_color = transforms.Compose([ transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), transforms.ToTensor() ]) ``` 3. **裁剪填充** 使用随机裁剪或将图像扩展后再裁剪回原尺寸的方法也可以引入更多的变体。这种方式特别适用于对象位置不固定的场景。 ```python # 定义裁剪填充 transform_crop = transforms.Compose([ transforms.RandomResizedCrop(size=(224, 224), scale=(0.7, 1.0)), transforms.Pad(padding=10), transforms.ToTensor() ]) ``` 4. **噪声注入** 向图像中加入高斯噪声或其他类型的扰动,模拟真实世界中的干扰因素,进一步增强模型鲁棒性。 ```python import numpy as np def add_gaussian_noise(image): noise = np.random.normal(loc=0.0, scale=0.1, size=image.shape).astype(np.float32) noisy_image = image + noise return np.clip(noisy_image, 0., 1.) # 自定义噪声处理函数 custom_transforms = transforms.Lambda(lambda img: add_gaussian_noise(img)) ``` 5. **混合策略(Mixup 和 Cutout)** Mixup 是一种将两个不同样本按一定比例线性组合的方法;而 Cutout 则是在图像的一部分区域设置为零值掩码。这两种方法都可以显著改善模型表现。 ```python from torchvision.transforms.functional import mixup_tensor # 实现 Mixup 的简单例子 mixed_img, target_a, target_b, lam = mixup_tensor(img1, label1, img2, label2, alpha=0.2) ``` --- #### PyTorch 中的应用实例 在 PyTorch 中,`torchvision.transforms` 提供了一系列便捷工具支持各种数据增广操作。下面是一个完整的 CIFAR-10 数据加载器配置示例: ```python import torch from torchvision import datasets, transforms from d2l import torch as d2l def load_cifar10(is_train, augs, batch_size): dataset = datasets.CIFAR10(root="../data", train=is_train, transform=augs, download=True) dataloader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, shuffle=is_train, num_workers=d2l.get_dataloader_workers()) return dataloader # 定义增广管道 train_augs = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomCrop(32, padding=4), transforms.ToTensor() ]) test_augs = transforms.Compose([transforms.ToTensor()]) batch_size = 128 train_loader = load_cifar10(True, train_augs, batch_size) test_loader = load_cifar10(False, test_augs, batch_size) ``` 此代码片段展示了如何利用 `RandomHorizontalFlip` 和 `RandomCrop` 来构建训练集上的复杂增广逻辑,同时保持测试集中仅执行基础预处理[^3]。 --- #### 总结 视觉数据增广是一项强大的技术,它不仅增加了可用训练数据的数量,还提高了模型对于未知环境下的预测准确性。合理设计增广方案需考虑具体应用场景的特点及其可能存在的偏差来源[^2]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值