数据增强

一、数据增强说明

对于目标检测任务的数据增强我们可以采用如下方法
1、将图片放大一些然后随机裁剪
2、将裁剪后的图片进行水平翻转
3、进行上述操作后要将图片上的标注框也要进行相应的操作

二、数据增强实现

import cv2
class ImgAugment(object):  # 定义图片增强类def __init__(self, w, h, jitter):self._jitter = jitter               # 是否要数据增强标志self._w = w                         # 图像统一后的大小之宽self._h = h                         # 图像统一后的大小之高def imread(self, img_file, boxes):''':param img_file: 标注图片的地址:param boxes: 该图片上人工标注的位置坐标 和 分类列别:return: 返回处理后的标注图片'''image = cv2.imread(img_file)         # 依据图片的地址读取到图片boxes_ = np.copy(boxes)              # 复制图片上的标注框信息if self._jitter:  # 是否要增强数据image, boxes_ = make_jitter_on_image(image, boxes_)     # 进行数据增强,数据增强的同时标注框的位置也会发生改变image, boxes_ = resize_image(image, boxes_, self._w, self._h)   # 调整图片为统一大小,图片统一大小的同时,标注框的位置也会进行调整return image, boxes_# 数据增强函数
def make_jitter_on_image(image, boxes):''':param image: 输入图片:param boxes: 该图片上人工标注的位置坐标 和 分类列别:return: 增强后的图片'''h, w, _ = image.shape                                    # 获取输入图片的形状,只要高和宽 通道数不要# ========================================= 1、形状略微放大一点=======================================================###  scale the image         # 将图片略微放大一点scale = np.random.uniform() / 10. + 1.                   # 从[0,1)的均匀分布中随机采样,除10加1,生成一个1.0几的数image = cv2.resize(image, (0,0), fx = scale, fy = scale) # 图片依据比例因子scale略微放大一点# 参数 image是输入图片,(0,0)是处理后的图片大小# 为(0,0)就表示处理后的图片大小依据比例因子产生# 即处理后图片大小宽为水平轴比例因子fx*原图片的宽,高为垂直轴上的比例因子fy*原图片的宽# 图片被略微放大后,标注框没有进行修正,因为影响不大# 图片的大小改变了,其上的标注框一会相应改变,接着就是调整标注框,以匹配形状改变后的图片### translate the image        # 将图片略微放大一点靠边裁剪max_offx = (scale-1.) * w                                  # 0.0几的数*原图片的宽 图片增宽的部分max_offy = (scale-1.) * h                                  # 0.0几的数*原图片的高 图片增高的部分offx = int(np.random.uniform() * max_offx)                 # 随机产生一个比max_offx小的数 np.random.uniform()属于[0,1)offy = int(np.random.uniform() * max_offy)                 # 随机产生一个比max_offy小的数image = image[offy : (offy + h), offx : (offx + w)]        # 从形状略微放大一点图片中截取图像### flip the image             # 将图片随机水平翻转flip = np.random.binomial(1, .5)  # 二项分布,即返回值为 0或1 0、1返回概率都为0.5# numpy.random.binomial(n,p,size=None)# n 一次实验的样本数,事件发生的概率 ,size=None 事件重复次数 默认为1# 理解:假如n=1,p=0.5 返回值 每次抛1个硬币 抛size次,正面朝上的概率为0.5,则返回的是一个长度为size的列表记录每次抛硬币的结果,即样本中正面朝上的硬币个数if flip > 0.5:                    # 若果返回值大于0.5image = cv2.flip(image, 1)    # 将图片进行翻转 参数1水平翻转,0垂直翻转,-1水平垂直翻转is_flip = True                # 标志已经翻转了else:is_flip = False               # 标志没有翻转# fix object's position and size# 图片改变了,其上的标注框一会相应改变,接着就是调整标注框,以匹配形状改变后的图片new_boxes = []for box in boxes:                   # 遍历图片中的标注框# 依据图片的略微放大、随机裁剪进行修改标注框x1,y1,x2,y2 = box               # 获取标注坐标 左上右下形式的坐标x1 = int(x1 * scale - offx)     # x1 * scale放大修改x1 * scale - offx随机裁剪进行修改x2 = int(x2 * scale - offx)y1 = int(y1 * scale - offy)y2 = int(y2 * scale - offy)# 如果图片进行翻转了,则进行翻转后相应的标注框的修改(水平翻转)if is_flip:xmin = x1       # 水平修改标注框坐标x1 = w - x2x2 = w - xminnew_boxes.append([x1,y1,x2,y2])  # 保存变换后的标注框坐标return image, np.array(new_boxes)    # 返回变换后的图片和相应的标注框def resize_image(image, boxes, desired_w, desired_h):''':param image:       图片:param boxes:        图片上的标注框:param desired_w:   要变换到的目标宽:param desired_h:    要变换到的目标高:return: 变换到目标大小后的图片'''h, w, _ = image.shape   # 获取图片的高宽# resize the image to standard sizeimage = cv2.resize(image, (desired_h, desired_w))   # 将图片变换到目标大小image = image[:,:,::-1]# 依据缩放来修改标注框的坐标# fix object's position and sizenew_boxes = []for box in boxes:       # 遍历图片中的标注框x1,y1,x2,y2 = box   # 获取标注框的坐标x1 = int(x1 * float(desired_w) / w)     # 计算缩放比例,并计算新的标注框坐标点x1 = max(min(x1, desired_w), 0)x2 = int(x2 * float(desired_w) / w)x2 = max(min(x2, desired_w), 0)y1 = int(y1 * float(desired_h) / h)y1 = max(min(y1, desired_h), 0)y2 = int(y2 * float(desired_h) / h)y2 = max(min(y2, desired_h), 0)new_boxes.append([x1,y1,x2,y2]) # 保存新标注框坐标return image, np.array(new_boxes)   # 返回缩放后的图片,和相应缩放后的标注框

yolov3从头实现(二)-- 数据增强相关推荐

  1. gan 总结 数据增强_[NLP]聊一聊,预处理和数据增强技术

    在基于margin-loss的句子相似度这个项目中,为了验证想法,找不到开放数据集,因此自己从新浪爱问爬取了数据.自己爬的数据和学界开放的数据对比,数据显得非常脏.这里有三个含义:第一:数据不规范,比 ...

  2. YOLOV5超参数设置与数据增强解析

    1.YOLOV5的超参数配置文件介绍 YOLOv5有大约30个超参数用于各种训练设置.它们在*xml中定义./data目录下的Yaml文件.更好的初始猜测将产生更好的最终结果,因此在进化之前正确地初始 ...

  3. 二、深度学习数据增强方法汇总

    深度学习模型训练数据增强方法汇总 一.随机裁剪 二.RGB-->BGR通道互换 三.仿射变换(缩放) 三.随机旋转 四.对比度调整 五.随机抠图 六.bound box 中心点随机抠图 七.随机 ...

  4. python浮雕图片_python图像数据增强——imgaug (二)

    在这章我们展示一个涵盖了大部分数据增强方法的例子.这里有大量的代码,可能会引起部分读者的不适,但是大家可以主要看注释,以及最后的总结性的话语,在实际上使用的时候再详细的看具体的实现,有一些.from ...

  5. 【YOLOv3从头训练 数据篇】

    YOLOv3从头训练 数据篇 前言 数据下载 数据可视化 标签生成 生成训练路径文件 结语 前言 最近在忙着怎么从头实现YOLOv3,从网上找了很多教程,也在GitHub上面找到了挺多的代码的,有些能 ...

  6. 文本数据增强二(EDA、同义词替换-新增-交换-删除-生成同义句)

    一.中文文本数据增强 (中文.同义句生成.enhance.augment.text.data.nlp.样本不均衡.语料不够.数据不足.扩充增加),相较于图片,中文文本数据强的效果似乎没那么靠谱(效果没 ...

  7. PyTorch 学习笔记(二):PyTorch的数据增强与数据标准化

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial 文章目录 transfor ...

  8. 图像语义分割实践(二)数据增强与读取

    Pytorch数据加载顺序 ​ 手把手视频讲解+代码讲解 1.如何实现输入(完全免费解析直达,致力干货分享) 2.如何实现模型(完全免费解析直达,致力干货分享) 3.如何实现输出(完全免费解析直达,致 ...

  9. 在自建的数据集上训练yolov3准备(二):树莓派自动采集图片,tensorflow_label_tool下载图片,yolo_mark标注与清洗数据(附python脚本)

    前言 上一篇文章写了如何在Google的open image v4上分类下载数据集并保存成yolo格式,这里接着写.为了确认标注没有问题,我们可以用yolo_mark来清洗一遍.而有时可能我们需要自己 ...

最新文章

  1. 当前被频频提及的企业数字化转型是什么?
  2. 可以作为python字符串常量的是_Python 复习
  3. cmake编译时支持gdb调试
  4. Linux下开启/关闭防火墙命令
  5. oracle 数据库查询 COALESCE字符函数
  6. Codeforces Round #610 (Div. 2) D. Enchanted Artifact 交互 + 思维
  7. 【复习】快速幂算法详解
  8. HTTP 协议(详解)
  9. 优考试在线考试系统计算机,使用优考试在线考试系统解决企业员工考核评比
  10. 关于CXF大文件的传输问题
  11. 华为大数据战略_任正非:华为应抓住“大数据”机遇 抢占战略制高点
  12. 给input文本框添加灰色提示文字
  13. 基于深度学习的植物病害检测
  14. CSS简介和CSS选择器
  15. [译]简单声明Lua类
  16. sql 获取日期时分秒_SQL获取系统年月日时分秒 | 学步园
  17. 190122每日一句
  18. 微软亚洲研究院公布12项顶级研发成果(组图)
  19. RFM、PSM、波士顿矩阵模型简介
  20. 一文读懂 Java 反射机制那些事

热门文章

  1. 切比雪夫距离(bzoj 3210: 花神的浇花集会)
  2. HDU 2063:过山车(匈牙利算法模板题)
  3. 基数排序(稍微困难)
  4. 汉诺塔问题(递归思想)(堆栈学习)
  5. js中函数参数arguments、callee、caller,值传递、重载
  6. c#自定义可拖动变形控件
  7. Python实现计算图像RGB均值
  8. Digilent提供的PmodOLEDrgb驱动程序
  9. golang 打印变量类型
  10. mysql,oracle表数据相互导入