位置: 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入门指南)

  • 网易邮箱怎么换绑(网易邮箱怎么换实名认证)

    网易邮箱怎么换绑(网易邮箱怎么换实名认证)

  • 微信通过手机号搜索到我怎么关闭(微信通过手机号添加怎么查看手机号)

    微信通过手机号搜索到我怎么关闭(微信通过手机号添加怎么查看手机号)

  • 斗鱼电视版叫什么名(斗鱼电视版app叫什么名字)

    斗鱼电视版叫什么名(斗鱼电视版app叫什么名字)

  • ios14双击背部截屏(ios14双击背部截屏带了套还能吗)

    ios14双击背部截屏(ios14双击背部截屏带了套还能吗)

  • 怎样冻结excel表指定的行列(怎样冻结excel表指定的行和列)

    怎样冻结excel表指定的行列(怎样冻结excel表指定的行和列)

  • 华为p30pro文件管理在哪里(华为p30pro文件管理照片怎么传到相册)

    华为p30pro文件管理在哪里(华为p30pro文件管理照片怎么传到相册)

  • 芒果tv为什么弹幕按钮突然就没有了(芒果TV为什么弹幕与画面不一致)

    芒果tv为什么弹幕按钮突然就没有了(芒果TV为什么弹幕与画面不一致)

  • 微信红包可以退回给对方吗(微信红包可以退吗怎么退)

    微信红包可以退回给对方吗(微信红包可以退吗怎么退)

  • k3是什么手机(手机k3是多大尺寸)

    k3是什么手机(手机k3是多大尺寸)

  • 面向过程语言有哪几种(面向过程语言有图形用户界面吗)

    面向过程语言有哪几种(面向过程语言有图形用户界面吗)

  • 苹果手机如何模拟门禁卡(苹果手机如何模拟安卓系统)

    苹果手机如何模拟门禁卡(苹果手机如何模拟安卓系统)

  • 朋友圈点赞图标没了(朋友圈点赞图标不见了怎么回事)

    朋友圈点赞图标没了(朋友圈点赞图标不见了怎么回事)

  • 微信通话点了静音对面能听到吗(微信通话点了静音会怎样)

    微信通话点了静音对面能听到吗(微信通话点了静音会怎样)

  • 腾讯视频会员怎么和别人同时用(腾讯视频会员怎么共享给别人手机)

    腾讯视频会员怎么和别人同时用(腾讯视频会员怎么共享给别人手机)

  • 手机保护膜分几种(手机膜的保护膜)

    手机保护膜分几种(手机膜的保护膜)

  • 怎样在微信上交新农合(怎样在微信上交养老保险 农村)

    怎样在微信上交新农合(怎样在微信上交养老保险 农村)

  • 微信怎么设置自动启动(微信怎么设置自动收红包和转账)

    微信怎么设置自动启动(微信怎么设置自动收红包和转账)

  • 华为播放视频自动横屏(华为播放视频自动黑屏)

    华为播放视频自动横屏(华为播放视频自动黑屏)

  • 手机wadl是什么文件(手机wap是什么)

    手机wadl是什么文件(手机wap是什么)

  • 苹果手机怎么设置云闪付(苹果手机怎么设置应用锁)

    苹果手机怎么设置云闪付(苹果手机怎么设置应用锁)

  • wps图标转回word(wps换图标了)

    wps图标转回word(wps换图标了)

  • 怎么录制qq视频(怎么录制qq视频在手机上)

    怎么录制qq视频(怎么录制qq视频在手机上)

  • giantantispywaremain.exe是什么进程 有什么作用 giantantispywaremain进程查询

    giantantispywaremain.exe是什么进程 有什么作用 giantantispywaremain进程查询

  • go.exe进程是什么文件 有什么作用 go进程查询(go是单进程还是多进程)

    go.exe进程是什么文件 有什么作用 go进程查询(go是单进程还是多进程)

  • 优酷路由宝不拆机回刷 实现金币倍增的详细教程(优酷路由宝还有用吗)

    优酷路由宝不拆机回刷 实现金币倍增的详细教程(优酷路由宝还有用吗)

  • 小规模应税行为扣除额如何填
  • 新公司如何申报城市建设税
  • 报税怎么操作流程图
  • 高速公路通行费电子发票怎么打印
  • 发票替代票
  • 个体工商户可以给自己交五险一金吗
  • 资产负债表中没有实收资本
  • 应付账款贷方怎么调整
  • 期初未缴税额本年累计是什么意思
  • 资产入股会计处理
  • 借应交税费销项税额贷未交增值税
  • 金融行业打包是什么意思
  • 电汇凭证如何使用
  • 研发费用加计扣除新税收政策2023
  • 财务软件怎样结转销售成本
  • 车辆保险怎么计算器
  • 拆迁置换安置房
  • 境外劳务输出有哪些类型
  • 工会经费应该计入人工成本吗
  • 建筑公司收到工程服务发票怎么做会计分录
  • 国际货运代理免税
  • 2017年个税税率表及个税计算公式
  • 增值税专用发票验票
  • 个人代公司付货款要证明吗
  • 6%的增值税发票能抵扣13%的吗
  • 工资预支怎么做账
  • 初级备考计划表
  • 管理费用保险费汇算清缴
  • 企业收到政府扶贫资金补助及运用补助金怎么做账
  • 融资租赁的利息可以税前扣除吗
  • wifi网速太慢了怎么回事
  • nddeagnt.exe - nddeagnt是什么进程 有什么用
  • 外贸企业红字发票怎么冲
  • win11怎么清理电脑垃圾
  • Linux Kernel 4.5在3月15日发布最终版
  • PHP:pg_consume_input()的用法_PostgreSQL函数
  • php变量底层实现
  • 境外服务收入如何申报增值税
  • 天窗漏进来的水去哪了
  • 董事费如何计算个人所得税
  • 出售生产设备的会计分录
  • 跨年度费用发票还可以抵扣所得税吗
  • erp面试题目100及最佳答案
  • 数字图像处理总结
  • 主营营业成本会计分录
  • 购买小礼品赠送怎么做账
  • nosql manager for mongodb
  • 水利基金应税项填的数据怎么查
  • 盈余公积的提取条件
  • 企业每个季度叫什么
  • 管家婆怎样月末结账?
  • 出口货物质量不足怎么办
  • 上月有留底税额时本月缴纳税款时怎么做分录
  • 供应商退回来的钱应走哪个科目
  • 有存货的公司
  • 自制原始凭证的填制
  • Linux Kernel 4.2下载 更新内容一览
  • 电脑bios启动项设置中文
  • win8如何更改账户名
  • WinXP创建一键静音快捷键(在喇叭消失的情况下实用)
  • sybase ase数据库用户名密码
  • win7系统安装虚拟机
  • win10更新后浏览器打不开网页
  • 嵌入式linux开发用什么语言
  • 搜索超级模式
  • Unity3D 事件
  • django 实例
  • 在微信支付宝借贷会影响征信吗
  • if条件程序
  • vue curd生成
  • 刚开始学java的心得体会
  • 安卓手机后退键
  • jQuery插件开发
  • 工会经费税务机关代收规定
  • 上海国家税务局官网发票查验平台
  • 江苏省电子税务局社保缴费查询
  • 租了店面
  • 国税局发票查询电话
  • 加拿大海关关税税率查询
  • 税额差怎么计算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设