基于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目录与文件名操作例子
Aug 28 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
Django Celery异步任务队列的实现
Jul 24 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
Python线程threading模块用法详解
Feb 26 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
浅析python中的del用法
Sep 02 Python
python 窃取摄像头照片的实现示例
Jan 08 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
npm qs模块使用详解
2020/02/07 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
python 如何设置守护进程
2020/10/29 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
大学毕业生通用自荐信范文
2013/10/31 职场文书
经贸日语毕业生自荐信
2013/11/03 职场文书
领导视察欢迎词
2014/01/15 职场文书
个人总结格式范文
2015/03/09 职场文书
初婚未育证明样本
2015/06/18 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript