数据增强方法--Cutout实现及结果分析

数据增强方法--Cutout实现及结果分析

    • 问题背景
    • Cutout简介
    • 实现细节
    • 实验设置
    • 代码实现
    • 结果展示
    • 参考文献

问题背景

近年来,深度学习在计算机视觉领域取得了相当大的进展,并且在许多具有挑战性的任务中取得了最新的性能,如对象识别、语义分割、图像字幕等等。这些改进在很大程度上可以归因于卷积神经网络的使用,它能够学习图像的复杂层次特征表示。但是随着要解决的任务的复杂性的增加,模型的资源利用率也在增加:内存占用、参数数量、推理时间和功耗。现代网络通常包含数千万到数亿个的学习参数,这些参数为此类任务提供了必要的表达能力,但是随着表达能力的增加,过拟合的可能性也在增加,这导致了模型的较差的泛化能力。
最常见的挑战是缺乏高质量的数据或数据集中的类别不平衡。如今,最有效的dnn非常复杂,因此需要大量的数据,而这在很多情况下可能很难提供。例如,非常流行的CNN架构VGG16由16层神经元组成,包含1.38亿个参数。此外,新架构的性能通常在ImageNet上进行测试,该数据集包含来自1000个非重叠类别的100多万张图像。
由于数据增强的易于实现和有效性,因此数据增强几乎无处不在。同时也产生了许多数据增强的方法。
数据增强方法--Cutout实现及结果分析_第1张图片

Cutout简介

Cutout是一种卷积神经网络的正则化技术,它包括去除输入图像的连续部分,有效地用现有样本的部分遮挡版本来增强数据集。这种技术可以解释为输入空间中dropout的扩展。
数据增强方法--Cutout实现及结果分析_第2张图片
Cutout的主要灵感来自于在许多计算机视觉任务中都很常见的物体遮挡的问题,如物体识别、跟踪等。通过生成模拟遮挡实例的新图像,不仅能更好地为现实世界中遇到遮挡做准备,而且在决策时还要考虑更多的图像上下文。

实现细节

在训练阶段在输入图片的随机位置使用一个固定大小的矩形区域,使用0进行填充。然后对数据集进行归一化。注意区域大小参数的设置,论文指出这在很大程度上会影响性能。值得注意的是,进行Cutout的区域可以不在图像中,这也是Cutout能取得较好效果的重要的地方。同时论文指出Cutout的操作可以在CPU上执行,从而可以与在GPU上的训练任务并行执行,并不会增加运行时间。

实验设置

  • 数据集:Tiny-imagenet-200.Tiny
    Imagenet是斯坦福大学提供的图像分类数据集,其中包含200个类别,每个类别包含500张训练图像,50张验证图像及50张测试图像
  • 模型:Resnet-18,Resnet-50
  • 实验设计:先实现Cutout方法,然后仿照论文中的实验采用对比的形式,构建网络模型,比较采用与不采用Cutout的分类结果,评价指标使用准确率,通过分类结果分析Cutout的效果。
  • 实验对比方法:做了4个实验,分别是不使用Cutout,使用Cutout,使用随机旋转+水平翻转,使用Cutout+随机旋转+水平翻转,比较4个实验的表现情况。
  • 参数设置:随机旋转20度,水平翻转概率为0.5,Cutout大小为16*16的矩形区域。训练15个epoch,学习率初始为0.01,在5,10,14个epoch缩小5倍。

代码实现

import torch
import numpy as np

## 实现了圆形与矩形的遮挡区域
class Cutout(object):
    """Randomly mask out one or more patches from an image.

    Args:
        n_holes (int): Number of patches to cut out of each image.
        length (int): The length (in pixels) of each square patch.
        radius (int): The radius (in pixels) of each square patch
        option(str): The type of hole
    """
    def __init__(self, n_holes = 1, length = 0, radius = 0, option = 'rectangle'):
        
        self.n_holes = n_holes
        self.length = length
        self.radius = radius
        self.option = option
        
    def __call__(self, img):
        """
        Args:
            img (Tensor): Tensor image of size (C, H, W).
        Returns:
            Tensor: Image with n_holes of dimension length x length cut out of it.
        """
        
        h = img.size(1)         
        w = img.size(2)

        mask = np.ones((h, w), np.float32)
        if self.option == 'rectangle':
            for n in range(self.n_holes):
                y = np.random.randint(h)         # Random location
                x = np.random.randint(w)

                y1 = np.clip(y - self.length // 2, 0, h)  #The clipping area can be out of the picture
                y2 = np.clip(y + self.length // 2, 0, h)
                x1 = np.clip(x - self.length // 2, 0, w)
                x2 = np.clip(x + self.length // 2, 0, w)

                mask[y1: y2, x1: x2] = 0.

            mask = torch.from_numpy(mask)
            mask = mask.expand_as(img)
            img = img * mask
        if self.option == 'circle':
            for n in range(self.n_holes):
                y1 = np.random.randint(h)
                x1 = np.random.randint(w)            
                # Find all the pixels
                circle = [(x1-x,x2-y) for x in range(-self.radius,self.radius+1) for y in range(-self.radius,self.radius+1)  if x**2 + y**2 <= self.radius**2 ]
            for i in range(len(circle)): 
                mask[circle[i][0]][circle[i][1]] = 0.
            mask = torch.from_numpy(mask)
            mask = mask.expand_as(img)
            img = img * mask
        return img

结果展示

数据增强方法--Cutout实现及结果分析_第3张图片
数据增强方法--Cutout实现及结果分析_第4张图片

参考文献

Improved Regularization of Convolutional Neural Networks with Cutout.Terrance DeVries1and Graham W. Taylor1,21University of Guelph2 Canadian Institute for Advanced Research and Vector Institute

你可能感兴趣的:(计算机视觉,人工智能)