基于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设置检查点简单实现代码
Jul 01 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
详解Python发送email的三种方式
Oct 18 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
深入理解Python异常处理的哲学
Feb 01 Python
Django中的静态文件管理过程解析
Aug 01 Python
用python求一重积分和二重积分的例子
Dec 06 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
Python实现Kerberos用户的增删改查操作
Dec 14 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/04/27 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
PHP反向代理类代码
2014/08/15 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
sina的lightbox效果。
2007/01/09 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
javascript的函数作用域
2014/11/12 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
node中间层实现文件上传功能
2018/06/11 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
python操作xml文件示例
2014/04/07 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
基于python实现学生信息管理系统
2019/11/22 Python
python中id函数运行方式
2020/07/03 Python
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
好人好事事迹材料
2014/02/12 职场文书
网络优化专员求职信
2014/05/04 职场文书
家长建议怎么写
2014/05/15 职场文书
求职教师自荐书
2014/06/19 职场文书
离婚协议书样本
2015/01/26 职场文书
财务部岗位职责
2015/02/03 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
MySQL约束超详解
2021/09/04 MySQL