基于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使用BeautifulSoup分析网页信息的方法
Apr 04 Python
详解Python中heapq模块的用法
Jun 28 Python
Python语言实现将图片转化为html页面
Dec 06 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
如何理解及使用Python闭包
Jun 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 array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
javascript 面向对象继承
2009/11/26 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
jQuery实现数字加减效果汇总
2014/12/16 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python字符串排序方法
2014/08/29 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python中random模块详解
2021/03/01 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
秋季运动会活动方案
2014/02/05 职场文书
党员志愿者活动总结
2014/06/26 职场文书
世界遗产导游词
2015/02/13 职场文书
幼师个人总结范文
2015/02/28 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
pandas取dataframe特定行列的实现方法
2021/05/24 Python
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android