基于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中非常实用的一些功能和函数分享
Feb 14 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 Python
python用插值法绘制平滑曲线
Feb 19 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
简单分析python的类变量、实例变量
Aug 23 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
python requests库的使用
Jan 06 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静态新闻列表自动生成代码
2007/06/14 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
详解vue中移动端自适应方案
2019/05/05 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Python中的zip函数使用示例
2015/01/29 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
EJB面试题
2015/07/28 面试题
Python如何实现单例模式
2016/06/03 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
海南地接欢迎词
2014/01/14 职场文书
2014村务公开实施方案
2014/02/25 职场文书
陈欧广告词
2014/03/14 职场文书
小学社团活动总结
2014/06/27 职场文书
课外访万家心得体会
2014/09/03 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
导游词范文
2015/02/13 职场文书
医生辞职信范文
2015/03/02 职场文书
Python 键盘事件详解
2021/11/11 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js