基于YOLOv5测试图像增强效果。由于发票提取数据仅有1k左右,和数据增强整体效果与各种增强方法效果的不确定性,通过实验确认图像增强效果与增强方法的选定。基本方法是将增强后的图片与标签直接混入原始图像与标签中进行实验。

图像增强方法如下:

  • Rotate:小角度旋转
  • AddToHueAndSaturation:同时更改色相和饱和度
  • WithPolarWarping:极射,类似写轮眼的神威,对图片进行扭曲
  • Dropout:随机失活
  • BlendAlpha:Alpha融合,不论是在3D还是2D中都常见,最常见的应用就是:设置图片的透明度,不透明度,可以实现抠图。
  • AdditiveGaussianNoise:加性高斯白噪声
    • 加性指的是叠加在某信号上
    • 高斯指的是概率分布里的正态分布函数
    • 白噪声指的是它的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性
    • 如果这个噪声的幅度服从高斯分布,功率谱密度又是均匀分布的,则称他为高斯白噪声
  • Multiply:改变亮度, 不影响bounding box
  • Affine:平移后缩放,会影响bounding box

实验思路:综合时间成本等因素,测试8种增加方法。将每一种增强方法与原始图像混合,形成8份增强数据与1份原始数据。对8份增强数据单独训练,比较训练结果,主要是mAP@.5:.95指标,统计优于原始图像的标签项。

在具体实验中的下表(共16个标签),当增强数据mAP@.5:.95>原始数据mAP@.5:.95时,认定该标签表现有提升。

数据增强方法 提升标签数量
Rotate 14
AddToHueAndSaturation 5
WithPolarWarping 7
Dropout 12
BlendAlpha 9
AdditiveGaussianNoise 8
Multiply 9
Affine 12

根据上表统计结果,将Rotate, Dropout and Affine归为大幅提升一组,BlendAlpha, AddtiveGaussianNoise and Multiply归为小幅提升一组,将AddToHueAndSaturation, WithPolarWarping 归为提升效果不明一组。将各小组增强数据与原数据进行重组混合,再进行训练实验(10epoches)。发现数据增强一组训练结果进一步提升,仅有一个标签训练效果不如原始数据。

此后又将6种增强效果较好的图片与原图片混合,共7份图片作为训练集,总体效果有所下降,最好总体效果是Rotate, Dropout and Affine+原始图片这一组。

这段代码来自实验室的一位大神同学,放上来一起学习

import imageio
import imgaug as ia
import matplotlib.pyplot as plt
from glob import glob
from imgaug import augmenters as iaa
import gc#原始图像和标签路径
path = ""
images_path = path+"images/train/"
labels_path = path+"labels/train/"
#增强后图像和标签存储路径
aug_path = "./images_augmenting/rotate/images/rotate_"
aug_label_path = "./images_augmenting/rotate/labels/rotate_"
total_imgs = glob(images_path+"*.png")+glob(images_path+"*.jpg")
total_names = [i.split("/")[-1].split("\\")[-1] for i in total_imgs]
print(total_names)
print(len(total_names))
for num, img_name in enumerate(total_names):# namename = img_name.split(".png")[0].split(".jpg")[0].split(".PNG")[0].split(".JPG")[0]# read imageimage = imageio.imread(images_path+img_name)# print(image.shape)height = image.shape[0]width = image.shape[1]BoundingBoxes = []file = open(labels_path+name+".txt")for line in file:x = float(line.split(" ")[1])*widthy = float(line.split(" ")[2])*heightw = float(line.split(" ")[3])*widthh = float(line.split(" ")[4].split("\n")[0])*heightx1 = x - 0.5*wx2 = x + 0.5*wy1 = y - 0.5*hy2 = y + 0.5*hBoundingBoxes.append(ia.BoundingBox(x1=x1, y1=y1, x2=x2, y2=y2))file.close()# 定义bounding boxbbs = ia.BoundingBoxesOnImage(BoundingBoxes, shape=image.shape)seq = iaa.Sequential([iaa.Rotate((-10, 10))#iaa.AddToHueAndSaturation((-50, 50), per_channel=True)#iaa.WithPolarWarping(iaa.CropAndPad(percent=(-0.01, 0)))#iaa.Dropout(p=(0, 0.1))#iaa.BlendAlpha([0.25, 0.75], iaa.MedianBlur(13))#iaa.AdditiveGaussianNoise(scale=(0, 0.2 * 255)),#iaa.Multiply((0.5, 1.0)),  # 改变亮度, 不影响bounding box#iaa.Affine(#    translate_px={"x": 40, "y": 60},#    scale=(0.5, 0.7)#)  # 平移后缩放,会影响bounding box])# 固定变换seq_det = seq.to_deterministic()# 变换图像和bounding boximage_aug = seq_det.augment_images([image])[0]bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]# 打印坐标# use .x1_int, .y_int, ... to get integer coordinatesprint(num)if len(bbs.bounding_boxes) == 0:with open(aug_label_path + name + ".txt", "a+") as f:f.write('')f.close()for i in range(len(bbs.bounding_boxes)):before = bbs.bounding_boxes[i]after = bbs_aug.bounding_boxes[i]'''print("BB %d: (%.4f, %.4f, %.4f, %.4f) -> (%.4f, %.4f, %.4f, %.4f)" % (i,before.x1, before.y1, before.x2, before.y2,after.x1, after.y1, after.x2, after.y2))'''x = 0.5*(after.x1+after.x2)/widthy = 0.5*(after.y1+after.y2)/heightw = (after.x2 - after.x1)/widthh = (after.y2 - after.y1)/heightwith open(aug_label_path + name + ".txt", "a+") as f:f.writelines("0 " + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + "\n")f.close()# 输出# BB 0: (65.0000, 100.0000, 200.0000, 150.0000) -> (130.7524, 171.3311, 210.1272, 200.7291)# BB 1: (150.0000, 80.0000, 200.0000, 130.0000) -> (180.7291, 159.5718, 210.1272, 188.9699)# image with BBs before/after augmentation (shown below)image_before = bbs.draw_on_image(image, thickness=2, color=[0, 255, 0])image_after = bbs_aug.draw_on_image(image_aug, thickness=2, color=[0, 0, 255])'''fig, axes = plt.subplots(2, 1, figsize=(20, 15))axes[0].set_title("image before")axes[0].imshow(image_before)axes[1].set_title("image after augmentation")axes[1].imshow(image_after)plt.show()'''imageio.imwrite(aug_path+img_name,image_aug)

数据增强(图像)初探相关推荐

  1. 深度学习--TensorFlow(7)拟合(过拟合处理)(数据增强、提前停止训练、dropout、正则化、标签平滑)

    目录 拟合 1.拟合情况 2.抵抗过拟合方法 过拟合处理(防止过拟合): 一.数据增强 1.设置图像生成器 2.载入图片 3.图像转三维数据 4.三维转四维 5.生成图片(用图像生成器) 代码 二.提 ...

  2. 机器学习:使用numpy实现数据增强(Data Augmentation)

    文章目录 数据增强 原图 水平翻转 左右上下平移 增加噪声 数据增强 图像数据增强一般是大多数人会采用的方法之一,这是由于深度学习对数据集的大小有一定的要求,若原始的数据集比较小,无法很好地满足网络模 ...

  3. 【目标检测】(10) Mosaic 数据增强方法,附Python完整代码

    各位同学好,今天和大家分享一下目标检测算法中常用的图像数据增强方法 Mosaic.先放张图看效果.将四张图片缩放后裁剪拼接在一起,并调整检测框的坐标位置,处理位于图像边缘的检测框.文末有完整代码 1. ...

  4. Task 06 数据增强;模型微调;目标检测基础 学习笔记

    Task 06 数据增强:模型微调:目标检测基础 学习笔记 数据增强 图像增广 在5.6节(深度卷积神经网络)里我们提到过,大规模数据集是成功应用深度神经网络的前提.图像增广(image augmen ...

  5. 20210810 所有图像数据准备一条龙(labelme_json转mask、数据增强Augmentor、随机种子设比例生成train.val、转格式(.jpg转.png)、尺寸、位深度变换

    0. 图像批量处理一步到位:转格式(.jpg转.png).尺寸(640*480).位深度(RGB)等 import os import glob import os.path from PIL imp ...

  6. 图像+预处理+数据增强+总结

    图像+预处理+数据增强+总结 图像与处理的中间和最终结果的不同版本,本身就是图像数据增强的一部分. 染色归一化 数据增强 Image augmentation for machine learning ...

  7. 数据增强之图像旋转及坐标对应(附代码)

    海康威视研究院ImageNet2016竞赛经验分享 深度学习之图像的数据增强 data augmentation 数据增强方法总结 图片的数据增强(Data Augmentation)方法 openc ...

  8. unet图片数据增强_numpy实现深度学习遥感图像语义分割数据增强(支持多波段)

    前言 数据增强是指对训练样本数据进行某种变换操作,从而生成新数据的过程.数据增强的根本目的是得到充足的样本数据量,避免模型训练过程中产生过拟合现象. 正文 对于遥感影像来说,由于成像过程传感器对同一地 ...

  9. 【视频课】业界最强数据增强库使用与人脸图像超分辨实践!

    前言 数据是深度学习系统的输入,对深度学习的发展起着至关重要的作用,但是又容易被很多人忽视,尤其是缺少实战的学习人员.数据增强又是其中至关重要的内容,为了让大家能够掌握好深度学习中数据的使用,我们开设 ...

最新文章

  1. Python 之 matplotlib (十一) 3D
  2. Smartmail外贸CRMBuild1.0版使用说明书
  3. SOA标准之----SCA架构思想
  4. 设置mac的全局命令
  5. mysql无法创建新用户_如何mysql禁止创建新用户
  6. python __call__一般用在哪些地方_Python __call__内置函数的作用和用法
  7. 经典算法研究系列:十、从头到尾彻底理解傅里叶变换算法、下
  8. 微课|中学生可以这样学Python(4.2节):break与continue语句
  9. js获取地址栏url以及获取url参数
  10. win11开机音乐怎么设置
  11. Javascript特效:一个不停的表盘
  12. 提问的智慧( 中文阅读笔记)#
  13. 使用开源项目DCRM搭建Cydia源服务器
  14. 联想SR590服务器管理界面配置
  15. cidaemon.exe进程
  16. 联想数字化转型之路:从传统IT到“新IT”
  17. 使用SDNN (space displacement neural network)进行多字体手写识别
  18. idea 一直不停的updating indices 卡进度条问题
  19. Tiled创建六边形地图
  20. 自动创建 api 模拟数据

热门文章

  1. 图显系统DRM FRAMEBUFFER完全解析
  2. USB gadget 驱动之 android.c
  3. 各种新奇网站汇总(学习、生活、工作、娱乐等)
  4. 点云生成-PointFlow: 3D Point Cloud Generation with Continuous Normalizing Flows
  5. Python开发原神刮刮乐脚本,随机自制盲盒卡片
  6. 前端:你要懂的单页面应用和多页面应用
  7. 永恒之蓝漏洞原理及利用
  8. 永恒之蓝--漏洞修补
  9. bullet物理系统功能及实现简介
  10. 洛谷——P2949工作调度Work Scheduling