真锋
永远保持一颗学习和专注的心
嵌入式视觉笔记

数据扩充与数据预处理

数据扩充

数据扩充是深度学习模型训练的第一步。在kaggle比赛中,我常用imgaug做图像在线增强以达到数据扩充的目的,实际项目中可能用numpy和imgaug库做离线增强较多。

一般的数据扩充

常用的数据扩充方式有:图像水平翻转(horizontally flipping)和随机扣取(random crops),随机抠取操作一般用较大(约 0.8 至 0.9 倍原图大小)的正方形 
在原图的随机位置处抠取图像块(image patch/crop),每张图像随机抠取的次数决定了数据集扩充的倍数。其他的数据扩充方式还有尺度变换(scaling)、旋转(rotating)等,从而增加卷积神经网络对物体尺度和方向上的鲁棒性。 
在此基础上,对原图或已变换的图像(或图像块)进行色彩抖动(color jittering)也是一种常用的数据扩充手段。色彩抖动是在 RGB 颜色空间对原有 RGB 色彩分布进行轻微的扰动,也可在 HSV 颜色空间尝试随机改变原有的饱和度和明度(即,改变 S 和 V 通道的值)或对色调进行微调(小范围改变该通道的值)。 
在实际项目中,往往会将上述几种方式叠加使用,将图像数据扩充至原有数量的数倍甚至数十倍。

特殊的数据扩充方式

Fancy PCA

Alex-Net作者提出的数据扩充方法。

监督式数据扩充

国内海康威视研究院提出了一种监督式-利用图像标记信息-的新型数据扩充方式。 
区别于“以物体为中心”(object-centric)的图像分类任务,场景分类(scene-centric image classification)往往依靠图像整体所蕴含的高层语义(high-level semantic)进行图像分类。因此随机扣取的简单数据扩增方式,可能会得到与场景无关的扣取图像块结果。

对场景分类问题,可以尝试借助图像标记信息解决上述问题。首先根据原数据训练一个分类的初始模型。而后,利用该模型,对每张图生成对应的特征图(activation map)或热力图(heat map) 。这张特征图可指示图像区域与场景标记间的相关概率。之后,可根据此概率映射回原图选择较强相关的图像区域作为扣取的图像块。上述过程如图 8Xj所示,图 8Xj#展示了对应该场景图像的热力图,按照此热力图指示,我们选取了两个强响应区域作为扣取的扩充图像块。由于一开始利用了图像标记训练了一个初始分类模型,因此这样的过程被称作“监督式数据扩充”。同样的数据扩充方式适用于高层语义图像分类任务,如场景分类和基于图像的节日分类等问题。

总结

  • 数据扩充是深度学习模型训练前的必须一步,此操作可扩充训练数据集,增强数据多样性,防止模型过拟合
  • 一些简单的数据扩充方法为:图像水平翻转、随即扣取、尺度变换、旋转变换、色彩抖动等

数据预处理

在计算机视觉和数据挖掘领域,着手处理数据前,首先要观察、分析数据并获取一些特性。在上一步的数据扩充后,进行数据预处理是模型训练前必不可少的一步。

机器学习中,对输入特征做归一化normalization)预处理操作时常见的步骤,图像处理中,图像的每个像素信息可以看作是一种特征。 
在实践中,对每个个特征减去平均值来中心化数据是非常重要的,这种归一化处理方式被称作“中心式归一化”(mean normalization)。卷积神经网络中的数据预处理通常是计算训练集图像像素均值,之后在处理训练集、验证集和测试集图像时需要分别减去该均值。 
减均值操作的原理是,我们默认自然图像是一类平稳的数据分布(即数据每一个维度的统计都服从相同分布),此时,在每个样本上减去数据的统计平均值(逐样本计算)可以移除共同部分,凸显个体差异。代码如下:

import cv2
import numpy as np
target_size = (512,512,3)
img = cv.imread('xxx.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2读取通道顺序为BGR,所以要转换成RGB
img = cv2.resize(img, target_size[:2])
# Normalize to zero mean and unit variance
img -= np.mean(img, keepdims=True)
img /= np.std(img, keepdims=True) + K.epsilon()

参考资料

魏秀参-CNN解析神经网络

赞赏

发表回复

textsms
account_circle
email

嵌入式视觉笔记

数据扩充与数据预处理
数据扩充 数据扩充是深度学习模型训练的第一步。在kaggle比赛中,我常用imgaug做图像在线增强以达到数据扩充的目的,实际项目中可能用numpy和imgaug库做离线增强较多。 一般的数据…
扫描二维码继续阅读
2019-07-22