基于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 相关文章推荐
python3抓取中文网页的方法
Jul 28 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python实现函数极小值
Jul 10 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 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 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
浅谈php命令行用法
2015/02/04 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python 的类、继承和多态详解
2017/07/16 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
Python 打印中文字符的三种方法
2018/08/14 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
如何使用python传入不确定个数参数
2020/02/18 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
好书伴我成长演讲稿
2014/05/14 职场文书
先进个人总结范文
2015/02/15 职场文书
公司地址变更通知
2015/04/25 职场文书
战友聚会致辞
2015/07/28 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
Python天气语音播报小助手
2021/09/25 Python