基于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版
Dec 07 Python
Python标准库内置函数complex介绍
Nov 25 Python
python实现将元祖转换成数组的方法
May 04 Python
Python获取当前路径实现代码
May 08 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
Python使用for生成列表实现过程解析
Sep 22 Python
Django中使用Celery的方法步骤
Dec 07 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 Python
Python 中random 库的详细使用
Jun 03 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
Python threading多线程编程实例
2014/09/18 Python
浅谈python数据类型及类型转换
2017/12/18 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python 发送json数据操作实例分析
2019/10/15 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
Python进行特征提取的示例代码
2020/10/15 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
内刊编辑求职自荐书范文
2014/02/19 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
Mysql中mvcc各场景理解应用
2022/08/05 MySQL