基于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中enumerate函数遍历元素用法分析
Mar 11 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 Python
对numpy中array和asarray的区别详解
Apr 17 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
Python3模拟登录操作实例分析
Mar 12 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
关于Python中定制类的比较运算实例
Dec 19 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
Tensorflow实现在训练好的模型上进行测试
Jan 20 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
python 统计代码耗时的几种方法分享
Apr 02 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
星际原理概述
2020/03/04 星际争霸
php中Smarty模板初体验
2011/08/08 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
python中enumerate的用法实例解析
2014/08/18 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
古驰英国官网:GUCCI英国
2020/03/07 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
Django 如何实现文件上传下载
2021/04/08 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server