背景引入

在训练图像识别的深度神经网络时,使用大量更多的训练数据,可能会使网络得到更好的性能,例如提高网络的分类准确率,防止过拟合等。人为扩展训练数据时对数据的操作最好能反映真实世界的变化。人为扩充数据集之后如果分类准确率有明显的提升,说明我们对数据所做的拓展操作是良性的,能够“反映真实世界的变化”,就会被用到整个数据集的扩展。反之,则说明不能用此操作对数据集进行拓展。

例如在2003年Patrice Simard等人所著的一篇论文中[1]他们把MNIST手写数字数据集通过旋转,转换和扭曲进行扩展。通过在这个扩展后的数据集上的训练,他们把MNIST手写数字识别的准确率提升到了98.9%。然后还在“弹性扭曲”的数据集上进行了实验,这是一种特殊的为了模仿手部肌肉的随机抖动的图像扭曲方法。通过使用弹性扭曲扩展的数据,他们最终达到了99.3%的分类准确率。

具体方法

原图

图像强度变换

亮度变化

lightness

darkness

图像整体加上一个随机偏差,或整体进行尺度的放缩

  • 亮度增强

  • 亮度减弱

brightness = 1 + np.random.randint(1, 9) / 10
brightness_img = img.point(lambda p: p * brightness)

不影响label的位置

对比度变化

contrast

扩展图像灰度级动态范围,对两极的像素进行压缩,对中间范围的像素进行扩展

range_contrast=(-50, 50)
contrast = np.random.randint(*range_contrast)
contrast_img = img.point(lambda p: p * (contrast / 127 + 1) - contrast)

不影响label的位置

图像滤波

锐化

sharpen

增强图像边缘信息

identity = np.array([[0, 0, 0],[0, 1, 0],[0, 0, 0]])
sharpen = np.array([[ 0, -1,  0],[-1,  4, -1],[ 0, -1,  0]]) / 4
max_center = 4
sharp = sharpen * np.random.random() * max_center
kernel = identity + sharp
sharpen_img = cv2.filter2D(img, -1, kernel)

不影响label的位置

高斯模糊

blur

图像平滑

kernel_size = (7, 7)
blur_img = cv2.GaussianBlur(img,kernel_size,0)

不影响label的位置

透视变换

镜像翻转

flip

使图像沿长轴进行翻转

flip_img = cv2.flip(cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR), 1)

第一个位置的参数 pos = 1 - pos,其他信息不变,可以采用脚本自动生成

with open(name + "_flip.txt", "w") as outfile:with open(name + ".txt", "r") as infile:for line in infile.readlines():words = line.split(" ")horizontal_coord = float(words[1])outfile.write(words[0] + " " + str(format(1-horizontal_coord, ".6f")) + " " + words[2] + " " + words[3] + " " + words[4])

图像裁剪

crop

裁剪原图80%大小的中心图像,并进行随机移动

kernel_size = list(map(lambda x: int(x*0.8), size))
shift_min, shift_max = -50, 50
shift_size = [np.random.randint(shift_min, shift_max), np.random.randint(shift_min, shift_max)]crop_img = img[(size[0]-kernel_size[0])//2+shift_size[0]:(size[0]-kernel_size[0])//2+kernel_size[0]+shift_size[0],(size[1]-kernel_size[1])//2+shift_size[1]:(size[1]-kernel_size[1])//2+kernel_size[1]+shift_size[1]
]

可能将目标对象裁减掉,因此采用手工重新标注

图像拉伸

deform

拉伸成长宽为原始宽的正方形图像

deform_img = img.resize((int(w), int(w)))

原图中比例信息改变,最好重新手工标注

镜头畸变

distortion

对图像进行透视变化,模拟鱼眼镜头的镜头畸变

通过播放径向系数k1,k2,k3和切向系数p1,p2实现

d_coef= np.array((0.15, 0.15, 0.1, 0.1, 0.05))
# get the height and the width of the image
h, w = img.shape[:2]
# compute its diagonal
f = (h ** 2 + w ** 2) ** 0.5
# set the image projective to carrtesian dimension
K = np.array([[f, 0, w / 2],[0, f, h / 2],[0, 0,   1  ]])
d_coef = d_coef * np.random.random(5) # value
d_coef = d_coef * (2 * (np.random.random(5) < 0.5) - 1) # sign
# Generate new camera matrix from parameters
M, _ = cv2.getOptimalNewCameraMatrix(K, d_coef, (w, h), 0)
# Generate look-up tables for remapping the camera image
remap = cv2.initUndistortRectifyMap(K, d_coef, None, M, (w, h), 5)
# Remap the original image to a new image
distortion_img = cv2.remap(img, *remap, cv2.INTER_LINEAR)

最好重新手工标注

注入噪声

椒盐噪声

noise

在图像中随机添加白/黑像素

for i in range(5000):x = np.random.randint(0,rows)y = np.random.randint(0,cols)noise_img[x,y,:] = 255noise_img.flags.writeable = True

不影响label的位置

渐晕

vignetting

对图像添加一个圆范围内的噪声模拟光晕

ratio_min_dist=0.2
range_vignette=np.array((0.2, 0.8))
random_sign=Falseh, w = img.shape[:2]
min_dist = np.array([h, w]) / 2 * np.random.random() * ratio_min_dist# create matrix of distance from the center on the two axis
x, y = np.meshgrid(np.linspace(-w/2, w/2, w), np.linspace(-h/2, h/2, h))
x, y = np.abs(x), np.abs(y)
# create the vignette mask on the two axis
x = (x - min_dist[0]) / (np.max(x) - min_dist[0])
x = np.clip(x, 0, 1)
y = (y - min_dist[1]) / (np.max(y) - min_dist[1])
y = np.clip(y, 0, 1)
# then get a random intensity of the vignette
vignette = (x + y) / 2 * np.random.uniform(*range_vignette)
vignette = np.tile(vignette[..., None], [1, 1, 3])
sign = 2 * (np.random.random() < 0.5) * (random_sign) - 1
vignetting_img = img * (1 + sign * vignette)

不影响label的位置

其他

随机抠除

cutout

随机抠出四个位置,并用黑色/彩色矩形填充

channel_wise = False
max_crop = 4
replacement=0size = np.array(img.shape[:2])
mini, maxi = min_size_ratio * size, max_size_ratio * size
cutout_img = img
for _ in range(max_crop):# random sizeh = np.random.randint(mini[0], maxi[0])w = np.random.randint(mini[1], maxi[1])# random placeshift_h = np.random.randint(0, size[0] - h)shift_w = np.random.randint(0, size[1] - w)if channel_wise:c = np.random.randint(0, img.shape[-1])cutout_img[shift_h:shift_h+h, shift_w:shift_w+w, c] = replacementelse:cutout_img[shift_h:shift_h+h, shift_w:shift_w+w] = replacement

不影响label的位置

目标识别数据集扩充方法相关推荐

  1. yolt 卫星图像进行快速目标识别的新方法

    "只需看两次"--对卫星图像进行快速目标识别的新方法 Bing 极市平台 今天 ↑ 点击蓝字关注极市平台 识别先机 创造未来 来源:论智 原文地址:arxiv.org/pdf/18 ...

  2. 数据增强 数据集扩充_数据扩充的抽象总结

    数据增强 数据集扩充 班级分配不均衡的创新解决方案 (A Creative Solution to Imbalanced Class Distribution) Imbalanced class di ...

  3. 自动驾驶深度多模态目标检测和语义分割:数据集、方法和挑战

    自动驾驶深度多模态目标检测和语义分割:数据集.方法和挑战 原文地址:https://arxiv.org/pdf/1902.07830.pdf Deep Multi-Modal Object Detec ...

  4. 机器学习数据集的方法 及 数据集资源

    亚马逊AWS高级技术顾问Will Badr介绍了8种寻找机器学习数据集的方法 1.Kaggle数据集 Kaggle的数据集中,包含了用于各种任务,不同规模的真实数据集,而且有许多不同的格式.此外,你还 ...

  5. 应用在机器学习中的聚类数据集产生方法

    简 介: 本文根据 机器学习中常用的聚类数据集生成方法 中的内容进行编辑实验和整理而得.并在之后对于聚类数据库生成进行不断的补充. 关键词: 机器学习,聚类算法,数据集合 §01 直接生成   这类方 ...

  6. ML之FE:特征工程中常用的五大数据集划分方法(特殊类型数据分割,如时间序列数据分割法)讲解及其代码

    ML之FE:特征工程中常用的五大数据集划分方法(特殊类型数据分割,如时间序列数据分割法)讲解及其代码 目录 特殊类型数据分割 5.1.时间序列数据分割TimeSeriesSplit 特殊类型数据分割 ...

  7. C#使用linq查询大数据集的方法

    这篇文章主要介绍了C#使用linq查询大数据集的方法,涉及C#调用linq进行数据查询的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 using System; using System.Coll ...

  8. 8种寻找机器学习数据集的方法 | 附数据集资源

    乾明 发自 凹非寺 量子位 出品 | 公众号 QbitAI 在训练机器学习模型时,找到合适的数据集一直是个棘手的问题. 近日,亚马逊AWS高级技术顾问Will Badr介绍了8种寻找机器学习数据集的方 ...

  9. pytorch基于GAN生成对抗网络的数据集扩充

    文章目录 前言 一.GAN基本原理 1.结构图 2.目标函数 二.实现 1.实现流程图 2.实例 2.1采集少量原始数据 2.2GAN模型训练(注意修改图片路径) 2.3用训练好的模型扩充数据集(生成 ...

最新文章

  1. 多线程真的会使用CPU所有的内核吗?
  2. Sharding-jdbc教程:Mysql数据库主从搭建
  3. linux环境下python的部署
  4. LNMP架构之环境搭建
  5. Qwt--散点图/函数图
  6. Minimum Inversion Number 线段树
  7. Fedora 中的 Yum 命令详解
  8. 程序员的数学【概率论】
  9. Echarts 用GeoJson数据绘制地图
  10. vue 手机h5动态银行支付密码键盘前端
  11. C语言引用方式调用函数
  12. 简单的python抢红包脚本-python+红包
  13. 智能时代:大数据与人工智能
  14. userAgent判断客户端,以及各个浏览器的ua
  15. rk3399添加开机启动脚本
  16. ORA-00955: name is already used by an existing object
  17. Latex Zotero导出格式化Bibtex条目
  18. java原生的编译软件_原生态Java 程序员容易忽视的编程细节
  19. Java工程师初学Android(四)(转)
  20. 国产数据库--DM(达梦数据库)

热门文章

  1. python同步远程文件夹_python pyinotify 监控远程文件夹来实现即时全量同步
  2. 最透彻的分析!NTC热敏电阻与浪涌电流,热启动不会失效?
  3. MySQL中什么是关系型数据库???
  4. ps -ef中的e、f是什么含义
  5. 计算机改显存会有啥影响,显卡显存越大越好吗?显存对电脑速度的影响有哪些?...
  6. 网站收录链接分析之网站排名查询
  7. VUE使用vue-tree-color组件实现组织架构图(递归数据,简单明了)
  8. 计算机网络基础(理论知识)
  9. 咸鱼的 GitHub 情报 | 20200111 期
  10. 阿里巴巴创始人马云:阿里是幸福指数最高的企业