位置: IT常识 - 正文

深度学习之快速实现数据集增强的方法

编辑:rootadmin
深度学习之快速实现数据集增强的方法

推荐整理分享深度学习之快速实现数据集增强的方法,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

我们在深度学习训练之前准备数据集的时候,特别是打标注的数据集,需要耗费大量的人力物力打标签,在打完的基础我们还可以直接对数据集进行二次增强,即数据集增强。

目录一、常用的数据集增强方法二、使用代码的五个修改点三、代码四、增强后与原始数据集对比1、原始数据集2、增强后数据集一、常用的数据集增强方法

常用的数据增强方法有:

1.平移(Shift)变换:对原始图片在图像平面内以某种方式(预先定义或者随机方式确定平移的步长、范围及其方向)进行平移。

2.翻转(Flip)变换:沿竖直或者水平方向对原始图片进行翻转。

3.随机裁剪(Random Crop):随机定义感兴趣区域以裁剪图像,相当于增加随机扰动。

4.噪声扰动(Noise):对图像随机添加高斯噪声或者椒盐噪声等。

5.对比度变换(Contrast):改变图像对比度,相当于在HSV空间中,保持色调分量H不变,而改变亮度分量V和饱和度S,用于模拟现实环境的光照变化。

6.缩放变换(Zoom):以设定的比例缩小或者放大图像。

7.尺度变换(Scale):与缩放变换有点类似,不过尺度变换的对象是图像内容而非图像本身(可以参考SIFT特征提取方法),构建图像金字塔以得到不同大小、模糊程度的图像。

二、使用代码的五个修改点

以上这些方法可以用一段代码快速的实现增强,在代码中只需要改变五个地方就可直接使用,都在main函数里面:

深度学习之快速实现数据集增强的方法

(1)IMG_DIR :原始数据集图片的文件夹路径

(2)XML_DIR: 原始xml文件的文件夹路径

(3)AUG_XML_DIR :数据增强后的图片保存路径

(4)AUG_IMG_DIR:数据增强后的xml文件的保存路径

(5)AUGLOOP :每张图片增强多少次(我自己设的是5)

代码中的具体修改位置见下:

注:使用前需要先确认原始的图片和xml文件夹内的文件是不是一 一对应的,比如图片文件夹有一张abc.jpg,则xml文件夹一定有一个abc.xml文件。我这里提供的教程主要是用来增强VOC格式的数据集。

三、代码

具体代码见下:

import xml.etree.ElementTree as ETimport pickleimport osfrom os import getcwdimport numpy as npfrom PIL import Imageimport shutilimport matplotlib.pyplot as pltimport imgaug as iafrom imgaug import augmenters as iaaia.seed(1)def read_xml_annotation(root, image_id): in_file = open(os.path.join(root, image_id)) tree = ET.parse(in_file) root = tree.getroot() bndboxlist = [] for object in root.findall('object'): # 找到root节点下的所有country节点 bndbox = object.find('bndbox') # 子节点下节点rank的值 xmin = int(bndbox.find('xmin').text) xmax = int(bndbox.find('xmax').text) ymin = int(bndbox.find('ymin').text) ymax = int(bndbox.find('ymax').text) # print(xmin,ymin,xmax,ymax) bndboxlist.append([xmin, ymin, xmax, ymax]) # print(bndboxlist) bndbox = root.find('object').find('bndbox') return bndboxlist# (506.0000, 330.0000, 528.0000, 348.0000) -> (520.4747, 381.5080, 540.5596, 398.6603)def change_xml_annotation(root, image_id, new_target): new_xmin = new_target[0] new_ymin = new_target[1] new_xmax = new_target[2] new_ymax = new_target[3] in_file = open(os.path.join(root, str(image_id) + '.xml')) # 这里root分别由两个意思 tree = ET.parse(in_file) xmlroot = tree.getroot() object = xmlroot.find('object') bndbox = object.find('bndbox') xmin = bndbox.find('xmin') xmin.text = str(new_xmin) ymin = bndbox.find('ymin') ymin.text = str(new_ymin) xmax = bndbox.find('xmax') xmax.text = str(new_xmax) ymax = bndbox.find('ymax') ymax.text = str(new_ymax) tree.write(os.path.join(root, str("%06d" % (str(id) + '.xml'))))def change_xml_list_annotation(root, image_id, new_target, saveroot, id,img_name): in_file = open(os.path.join(root, str(image_id) + '.xml')) # 这里root分别由两个意思 tree = ET.parse(in_file) elem = tree.find('filename') elem.text = (img_name + str("_%06d" % int(id)) + '.jpg') xmlroot = tree.getroot() index = 0 for object in xmlroot.findall('object'): # 找到root节点下的所有country节点 bndbox = object.find('bndbox') # 子节点下节点rank的值 # xmin = int(bndbox.find('xmin').text) # xmax = int(bndbox.find('xmax').text) # ymin = int(bndbox.find('ymin').text) # ymax = int(bndbox.find('ymax').text) new_xmin = new_target[index][0] new_ymin = new_target[index][1] new_xmax = new_target[index][2] new_ymax = new_target[index][3] xmin = bndbox.find('xmin') xmin.text = str(new_xmin) ymin = bndbox.find('ymin') ymin.text = str(new_ymin) xmax = bndbox.find('xmax') xmax.text = str(new_xmax) ymax = bndbox.find('ymax') ymax.text = str(new_ymax) index = index + 1 tree.write(os.path.join(saveroot, img_name + str("_%06d" % int(id)) + '.xml'))def mkdir(path): # 去除首位空格 path = path.strip() # 去除尾部 \ 符号 path = path.rstrip("\\") # 判断路径是否存在 # 存在 True # 不存在 False isExists = os.path.exists(path) # 判断结果 if not isExists: # 如果不存在则创建目录 # 创建目录操作函数 os.makedirs(path) print(path + ' 创建成功') return True else: # 如果目录存在则不创建,并提示目录已存在 print(path + ' 目录已存在') return Falseif __name__ == "__main__": IMG_DIR = "Images/photo_1" ### 原始数据集图像的路径 XML_DIR = "Images/Annotations" ### 原始xml文件的路径# =============================================================================# AUG_XML_DIR = "./Annotations" # 存储增强后的XML文件夹路径# ============================================================================= AUG_XML_DIR = "Images/Data Enhancement/Annotations Enhancement" ### 数据增强后的xml文件的保存路径 try: shutil.rmtree(AUG_XML_DIR) except FileNotFoundError as e: a = 1 mkdir(AUG_XML_DIR)# =============================================================================# AUG_IMG_DIR = "./JPEGImages" # 存储增强后的影像文件夹路径# ============================================================================= AUG_IMG_DIR = "Images/Data Enhancement/photo Enhancement" ### 数据增强后图片的保存路径 try: shutil.rmtree(AUG_IMG_DIR) except FileNotFoundError as e: a = 1 mkdir(AUG_IMG_DIR) AUGLOOP = 5 # 每张影像增强的数量 boxes_img_aug_list = [] new_bndbox = [] new_bndbox_list = [] # 影像增强 seq = iaa.Sequential([ iaa.Flipud(0.5), # vertically flip 20% of all images iaa.Fliplr(0.5), # 镜像 iaa.Multiply((1.2, 1.5)), # change brightness, doesn't affect BBs iaa.GaussianBlur(sigma=(0, 3.0)), # iaa.GaussianBlur(0.5), iaa.Affine( translate_px={"x": 15, "y": 15}, scale=(0.8, 0.95), rotate=(-30, 30) ) # translate by 40/60px on x/y axis, and scale to 50-70%, affects BBs ]) for root, sub_folders, files in os.walk(XML_DIR): for name in files: print(name) bndbox = read_xml_annotation(XML_DIR, name) shutil.copy(os.path.join(XML_DIR, name), AUG_XML_DIR) shutil.copy(os.path.join(IMG_DIR, name[:-4] + '.jpg'), AUG_IMG_DIR) for epoch in range(AUGLOOP): seq_det = seq.to_deterministic() # 保持坐标和图像同步改变,而不是随机 # 读取图片 img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.jpg')) # sp = img.size img = np.asarray(img) # bndbox 坐标增强 for i in range(len(bndbox)): bbs = ia.BoundingBoxesOnImage([ ia.BoundingBox(x1=bndbox[i][0], y1=bndbox[i][1], x2=bndbox[i][2], y2=bndbox[i][3]), ], shape=img.shape) bbs_aug = seq_det.augment_bounding_boxes([bbs])[0] boxes_img_aug_list.append(bbs_aug) # new_bndbox_list:[[x1,y1,x2,y2],...[],[]] n_x1 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x1))) n_y1 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y1))) n_x2 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x2))) n_y2 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y2))) if n_x1 == 1 and n_x1 == n_x2: n_x2 += 1 if n_y1 == 1 and n_y2 == n_y1: n_y2 += 1 if n_x1 >= n_x2 or n_y1 >= n_y2: print('error', name) new_bndbox_list.append([n_x1, n_y1, n_x2, n_y2]) # 存储变化后的图片 image_aug = seq_det.augment_images([img])[0] path = os.path.join(AUG_IMG_DIR, name[:-4] + str( "_%06d" % (epoch + 1)) + '.jpg') image_auged = bbs.draw_on_image(image_aug, thickness=0) Image.fromarray(image_auged).save(path) # 存储变化后的XML change_xml_list_annotation(XML_DIR, name[:-4], new_bndbox_list, AUG_XML_DIR, epoch + 1,name[:-4]) print( name[:-4] + str( "_%06d" % (epoch + 1)) + '.jpg') new_bndbox_list = []四、增强后与原始数据集对比1、原始数据集

原始的数据集和原始对应的xml文件,原始的数据集中有26张图像:

2、增强后数据集

数据增强后的数据集和数据集增强后的xml文件,增强后的图片有156张,对应的xml文件有156个:

以上就是深度学习之VOC格式数据集实现数据集增强的方法,希望此方法能帮助到你,多多支持,谢谢。

本文链接地址:https://www.jiuchutong.com/zhishi/300389.html 转载请保留说明!

上一篇:vue中利用ref实现更灵活的子向父传值

下一篇:Three.js一学就会系列:05 加载3D模型(three.js入门指南)

  • 增值税普通发票几个点
  • 下半年房产税缴纳时间
  • 从价从量复合计征
  • 无形资产175加计扣除会计如何处理
  • 投资收益收到的现金小于投资收益
  • 商业汇票到期没有收到款
  • 个人挂靠利润如何提取
  • 累计赡养老人专项扣除6000
  • 以固定资产换入原材料
  • 建筑预缴税款后如何进行账务处理?
  • 工会经费可以购买购物卡吗
  • 未结清全额是逾期吗
  • 管理会计的目标包括多选题
  • 如何异地缴纳个人医保
  • 开工程服务发票后怎么成本
  • 雇主责任险发票的项目名称怎么写
  • 发票作废时间有多长
  • 汇算清缴涉及长期投资收益如何做会计核算?
  • windows 10 bug
  • 在标题栏显示完整页面
  • 基金收益率
  • 更改win10通知
  • 电脑cpu风扇不动怎么办
  • 债转股是好还是坏
  • wordpress主题dux
  • php教程零基础入门
  • 小微企业免征税额度
  • 购买材料支出属于资本性支出吗
  • negro 什么意思
  • PHP:mcrypt_enc_get_algorithms_name()的用法_Mcrypt函数
  • 购买房屋用于出租算投资房吗
  • 未按规定开具发票怎么处罚
  • 事业单位长期应付款怎么核销
  • 留抵税额进项构成比例
  • 成本价低于现价 应该卖吗
  • 前端网页设计的三大技术
  • columninfo
  • 快速显示隐藏单元格
  • python中返回结果为true
  • 去年的财务报表网上更正申报
  • 固定资产清理包括什么会计科目
  • 在零售环节征收消费税的是哪些
  • 服务费的增值税可以抵扣吗
  • 进项税额转出和红字冲销区别
  • 普通发票的金额包含增值税吗
  • 投资性房地产转换计入其他综合收益
  • 开出银行承兑汇票一张用于支付材料采购款
  • 建筑业预交税金会计分录
  • 免抵税额什么意思
  • 长期待摊费用的摊销期限应该是
  • 美金形式发票
  • 实收资本,资本公积,盈余公积
  • mysql索引优化是什么意思
  • win10预览版21277
  • win8.1补丁包
  • xp系统怎么提升性能
  • centos7.9关机
  • mac隐藏菜单栏
  • win7系统的桌面图标怎么调出来
  • 硬件茶谈win10系统安装
  • win7声音扬声器设置
  • win8应用商店无法使用
  • 批处理获取文件夹内文件名
  • 固定栏跑到了左边怎么弄
  • android的handler
  • unity3d怎么样
  • android图形架构
  • 基于javascript的毕业设计
  • Shell脚本统计文件行数
  • CloudEditText
  • jquery.flot
  • android如何使用
  • android 图片裁剪 任意形状
  • 安卓listview添加数据
  • 柳州 税务
  • 20年灵活就业人员社保新标准
  • 销售哪些产品需要基金从业资格证?
  • 汽车销售顾问有前途吗
  • 纳税人有什么影响
  • 2018建筑材料考试试题及答案河南卷
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设