基于Python的图像数据增强Data Augmentation解析


Posted in Python onAugust 13, 2019

1.1 简介

深层神经网络一般都需要大量的训练数据才能获得比较理想的结果。在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟合。

在计算机视觉中,典型的数据增强方法有翻转(Flip),旋转(Rotat ),缩放(Scale),随机裁剪或补零(Random Crop or Pad),色彩抖动(Color jittering),加噪声(Noise)

笔者在跟进视频及图像中的人体姿态检测和关键点追踪(Human Pose Estimatiion and Tracking in videos)的项目。因此本文的数据增强仅使用——翻转(Flip),旋转(Rotate ),缩放以及缩放(Scale)

2.1 裁剪(Crop)

  • image.shape--([3, width, height])一个视频序列中的一帧图片,裁剪前大小不统一
  • bbox.shape--([4,])人体检测框,用于裁剪
  • x.shape--([1,13]) 人体13个关键点的所有x坐标值
  • y.shape--([1,13])人体13个关键点的所有y坐标值
def crop(image, bbox, x, y, length):
    x, y, bbox = x.astype(np.int), y.astype(np.int), bbox.astype(np.int)

    x_min, y_min, x_max, y_max = bbox
    w, h = x_max - x_min, y_max - y_min

    # Crop image to bbox
    image = image[y_min:y_min + h, x_min:x_min + w, :]

    # Crop joints and bbox
    x -= x_min
    y -= y_min
    bbox = np.array([0, 0, x_max - x_min, y_max - y_min])

    # Scale to desired size
    side_length = max(w, h)
    f_xy = float(length) / float(side_length)
    image, bbox, x, y = Transformer.scale(image, bbox, x, y, f_xy)

    # Pad
    new_w, new_h = image.shape[1], image.shape[0]
    cropped = np.zeros((length, length, image.shape[2]))

    dx = length - new_w
    dy = length - new_h
    x_min, y_min = int(dx / 2.), int(dy / 2.)
    x_max, y_max = x_min + new_w, y_min + new_h

    cropped[y_min:y_max, x_min:x_max, :] = image
    x += x_min
    y += y_min

    x = np.clip(x, x_min, x_max)
    y = np.clip(y, y_min, y_max)

    bbox += np.array([x_min, y_min, x_min, y_min])
    return cropped, bbox, x.astype(np.int), y.astype(np.int)

2.2 缩放(Scale)

  • image.shape--([3, 256, 256])一个视频序列中的一帧图片,裁剪后输入网络为256*256
  • bbox.shape--([4,])人体检测框,用于裁剪
  • x.shape--([1,13]) 人体13个关键点的所有x坐标值
  • y.shape--([1,13])人体13个关键点的所有y坐标值
  • f_xy--缩放倍数
def scale(image, bbox, x, y, f_xy):
    (h, w, _) = image.shape
    h, w = int(h * f_xy), int(w * f_xy)
    image = resize(image, (h, w), preserve_range=True, anti_aliasing=True, mode='constant').astype(np.uint8)

    x = x * f_xy
    y = y * f_xy
    bbox = bbox * f_xy

    x = np.clip(x, 0, w)
    y = np.clip(y, 0, h)

    return image, bbox, x, y

2.3 翻转(fillip)

这里是将图片围绕对称轴进行左右翻转(因为人体是左右对称的,在关键点检测中有助于防止模型过拟合)

def flip(image, bbox, x, y):
    image = np.fliplr(image).copy()
    w = image.shape[1]
    x_min, y_min, x_max, y_max = bbox
    bbox = np.array([w - x_max, y_min, w - x_min, y_max])
    x = w - x
    x, y = Transformer.swap_joints(x, y)
    return image, bbox, x, y

翻转前:

基于Python的图像数据增强Data Augmentation解析

翻转后:

基于Python的图像数据增强Data Augmentation解析

2.4 旋转(rotate)

angle--旋转角度

def rotate(image, bbox, x, y, angle):
    # image - -(256, 256, 3)
    # bbox - -(4,)
    # x - -[126 129 124 117 107 99 128 107 108 105 137 155 122 99]
    # y - -[209 176 136 123 178 225 65 47 46 24 44 64 49 54]
    # angle - --8.165648811999333
    # center of image [128,128]
    o_x, o_y = (np.array(image.shape[:2][::-1]) - 1) / 2.
    width,height = image.shape[0],image.shape[1]
    x1 = x
    y1 = height - y
    o_x = o_x
    o_y = height - o_y
    image = rotate(image, angle, preserve_range=True).astype(np.uint8)
    r_x, r_y = o_x, o_y
    angle_rad = (np.pi * angle) /180.0
    x = r_x + np.cos(angle_rad) * (x1 - o_x) - np.sin(angle_rad) * (y1 - o_y)
    y = r_y + np.sin(angle_rad) * (x1 - o_x) + np.cos(angle_rad) * (y1 - o_y)
    x = x
    y = height - y
    bbox[0] = r_x + np.cos(angle_rad) * (bbox[0] - o_x) + np.sin(angle_rad) * (bbox[1] - o_y)
    bbox[1] = r_y + -np.sin(angle_rad) * (bbox[0] - o_x) + np.cos(angle_rad) * (bbox[1] - o_y)
    bbox[2] = r_x + np.cos(angle_rad) * (bbox[2] - o_x) + np.sin(angle_rad) * (bbox[3] - o_y)
    bbox[3] = r_y + -np.sin(angle_rad) * (bbox[2] - o_x) + np.cos(angle_rad) * (bbox[3] - o_y)
    return image, bbox, x.astype(np.int), y.astype(np.int)

旋转前:

基于Python的图像数据增强Data Augmentation解析

旋转后:

基于Python的图像数据增强Data Augmentation解析

3 结果(output)

数据增强前的原图:

基于Python的图像数据增强Data Augmentation解析

数据增强后:

基于Python的图像数据增强Data Augmentation解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单介绍Python中的len()函数的使用
Apr 07 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
浅谈Python中函数的参数传递
Jun 21 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
简单谈谈Python的pycurl模块
Apr 07 Python
python 正确保留多位小数的实例
Jul 16 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
python super函数使用方法详解
Feb 14 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
python numpy矩阵信息说明,shape,size,dtype
May 22 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 #Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 #Python
python如何将多个PDF进行合并
Aug 13 #Python
python批量读取文件名并写入txt文件中
Sep 05 #Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 #Python
Python学习笔记之列表推导式实例分析
Aug 13 #Python
Django中create和save方法的不同
Aug 13 #Python
You might like
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
基于vue2.0动态组件及render详解
2018/03/17 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python线程join方法原理解析
2020/02/11 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
工作会议欢迎词
2014/01/16 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
万年牢教学反思
2014/02/15 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
化工生产实习心得体会
2016/01/22 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript