基于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 相关文章推荐
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python使用response.read()接收json数据的实例
Dec 19 Python
Python之pymysql的使用小结
Jul 01 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
python对csv文件追加写入列的方法
Aug 01 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
python opencv通过按键采集图片源码
May 20 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 分页原理分析,大家可以看看
2009/12/21 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Django实现celery定时任务过程解析
2020/04/21 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
中软Java笔试题
2012/11/11 面试题
优秀的计算机专业求职信范文
2013/12/27 职场文书
新学期开学寄语
2014/01/18 职场文书
安全资金保障制度
2014/01/23 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
感谢信格式范文
2015/01/22 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
导游词之湖北武当山
2019/09/23 职场文书
php解析非标准json、非规范json的方式实例
2022/05/10 PHP