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

  • 做网站前先问自己这10个问题(做网站第一步)

    做网站前先问自己这10个问题(做网站第一步)

  • win11按w弹出小组件怎么关闭(windows 11小组件)

    win11按w弹出小组件怎么关闭(windows 11小组件)

  • 电脑版剪映画中画在哪里(电脑版剪映画中画混合模式在哪里)

    电脑版剪映画中画在哪里(电脑版剪映画中画混合模式在哪里)

  • 荣耀9x怎么隐藏应用图标(荣耀9x怎么隐藏应用)

    荣耀9x怎么隐藏应用图标(荣耀9x怎么隐藏应用)

  • bose耳机充电充不进去怎么办?(bose耳机充电充多久)

    bose耳机充电充不进去怎么办?(bose耳机充电充多久)

  • 手机自动发短信10086(手机自动发短信查流量怎么取消)

    手机自动发短信10086(手机自动发短信查流量怎么取消)

  • 天猫农场活动截止时间(天猫农场几点更新礼品)

    天猫农场活动截止时间(天猫农场几点更新礼品)

  • 卖家拒绝了退款并拉黑(卖家拒绝了退款并拉黑钱会退回吗)

    卖家拒绝了退款并拉黑(卖家拒绝了退款并拉黑钱会退回吗)

  • 快手可以接广告吗(快手可以接广告推广吗)

    快手可以接广告吗(快手可以接广告推广吗)

  • 华为手机变成了黑色怎么调过来(华为手机变成了2g网络,怎么解决)

    华为手机变成了黑色怎么调过来(华为手机变成了2g网络,怎么解决)

  • 小猿搜题大学生可以用吗(小猿搜题大学生答题兼职怎么申请)

    小猿搜题大学生可以用吗(小猿搜题大学生答题兼职怎么申请)

  • 怎么让蓝牙耳机不闪光(怎么让蓝牙耳机声音变大)

    怎么让蓝牙耳机不闪光(怎么让蓝牙耳机声音变大)

  • 苹果11wifi连上用不了是什么原因(苹果11连着wifi不能用)

    苹果11wifi连上用不了是什么原因(苹果11连着wifi不能用)

  • ip66防护等级是什么(防护等级ip66与ip65)

    ip66防护等级是什么(防护等级ip66与ip65)

  • web的主要功能是什么(web的主要功能是浏览器向服务器请求)

    web的主要功能是什么(web的主要功能是浏览器向服务器请求)

  • 手机显示呼叫失败是什么意思(手机显示呼叫失灵怎么办)

    手机显示呼叫失败是什么意思(手机显示呼叫失灵怎么办)

  • 苹果11一直断网咋回事(苹果11一直断网怎么办)

    苹果11一直断网咋回事(苹果11一直断网怎么办)

  • 小米cc9有无线充电功能吗(小米cc9带无线充电么)

    小米cc9有无线充电功能吗(小米cc9带无线充电么)

  • 华为手机怎么翻译图片中的英文(华为手机怎么翻译英文)

    华为手机怎么翻译图片中的英文(华为手机怎么翻译英文)

  • iphonex如何拍摄夜景(苹果x怎么拍)

    iphonex如何拍摄夜景(苹果x怎么拍)

  • 华为nova4可以开空调吗(华为nova4可以开门禁卡吗)

    华为nova4可以开空调吗(华为nova4可以开门禁卡吗)

  • 闲鱼怎么看夺宝攻略(有谁在闲鱼夺宝成功的)

    闲鱼怎么看夺宝攻略(有谁在闲鱼夺宝成功的)

  • regsrv.exe - regsrv是什么进程 有什么用

    regsrv.exe - regsrv是什么进程 有什么用

  • 和月薪5W的阿里程序员聊过后,才知道自己一直在打杂...(阿里月薪3万到手多少)

    和月薪5W的阿里程序员聊过后,才知道自己一直在打杂...(阿里月薪3万到手多少)

  • 织梦搜索页调用arclist和channelartlist标签的教程(织梦相关文章调用)

    织梦搜索页调用arclist和channelartlist标签的教程(织梦相关文章调用)

  • 小规模纳税人缴纳企业所得税
  • 跨年增值税发票怎么冲红
  • 增值税税率变化时间节点
  • 企业流动资产周转率下降的原因
  • 企业所得税几大税种
  • 银行存款出现负数算不算违规
  • 小微企业注册流程及费用微
  • 资产损失企业所得税扣除
  • 年末转出未交增值税的视频
  • 税前扣除的职工教育经费
  • 非货币交易例子
  • 进货方的现金折扣怎么处理?
  • 所得税汇算清缴分录怎么做
  • 佣金增值税
  • 慈善会可以开什么票据
  • 纳税人核定征收企业所得税
  • 个人所得税减免申请
  • 向境外支付违约金要代扣税吗
  • 小规模纳税人专票开3%的专票,以后就不能享受1%
  • 企业注销固定资产处理
  • 其他应付款包括应付职工薪酬吗
  • 房地产企业售房印花税
  • 非公党费返还
  • h3c路由配置教程
  • 网速检测工具
  • vue3.0组件库
  • windows的记事本的扩展名
  • 偷税漏税如何处罚
  • uniapp+uview
  • 羽毛球脚踝扭伤怎么办
  • 其他业务支出属于什么会计科目
  • phpswoole面试
  • 怎么用云服务
  • [Vue warn]: Error in created hook: “TypeError: Cannot read properties of undefined (reading ‘$on‘)“
  • 兰斯洛特
  • 开出增值税发票一定要确认收入吗?
  • 解决微信授权回复的方法
  • 小程序从入门到精通
  • 怎么才能学a1
  • 反向选择命令
  • 嵌套循环语句
  • 建行企业网上银行主管盾权限分配
  • 原材料被盗如何报案
  • 应收帐款质保金
  • 民营医院发票样式
  • 支付运输费计入
  • 房产税计入管理费用还是税金附加
  • 理财收益缴纳增值税吗
  • 现金短缺或溢余指的是什么
  • 如何安装sql server2022
  • 会计核算的内容包括
  • 已经确认收入的商品发生销售折让
  • 计提税金用什么附件
  • 实收资本印花税最新规定
  • 收到现金怎么记账凭证
  • 小微企业增资
  • 结转完期间损益是不是可以结账了
  • 公司办公室装修装修
  • 民间非盈利组织使用什么会计准则
  • 印花税税率是多少
  • 土地作为无形资产需要计提折旧吗?
  • win10隐藏文件怎么隐藏
  • 使用dhcp的好处有哪些
  • 因以下文件的损坏或者丢失,windows无法启动hal.dll
  • win8应用商店废了
  • win10界面虚化模糊
  • 所有游戏通用的画质修改器
  • js 阻止触发某个事件
  • android fragmentation
  • linux更换用户登录命令
  • 支付宝是怎么写
  • select类中下拉框选择常见的方法
  • asm/semaphore.h: No such file or directory
  • 使用node写接口
  • node.js tcp 服务器
  • javascript简介和语法
  • jqgrid tree
  • jquery获取值的几种方法
  • 南京市国家税务局溧水分局
  • 苏州社保一卡通要充值吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设