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

  • 企业所得税的纳税人发生年度亏损的时间
  • 零报税有风险吗
  • 生产税净额计算实例
  • 可供出售金融资产包括哪些内容
  • 社保多交退款多久到账
  • 用友u8如何计提折旧生成凭证
  • 劳务费确认收入
  • 清算期间公司不再存续
  • 公司委托收款该怎么办
  • 应收账款坏账计提比例变更
  • 电商平台收取会员费吗
  • 一般纳税人交增值税会计科目
  • 专项补助资金补助的领域包括
  • 一张合同分三次收款怎么开票?
  • 燃气公司开发票的工程款入什么会计科目核算与分录怎么写?
  • 微信支付的钱到哪里去了
  • 推广费是广告费和业务宣传费吗
  • 个税贷方余额比实际金额多
  • 关联方债权投资与权益投资比例
  • 非居民个人所得税税率表2021
  • 党建经费如何入账
  • 存货成本包括哪些项目
  • 分公司的款汇入总公司得出什么证明
  • 审图费发票需要备注吗
  • 税务贷的用途
  • 免征的税款每月几号申报
  • macos usb启动
  • 读会计没有考到证 能出来干什么
  • windows10如何开启wifi
  • mac怎么airdrop给ipad
  • php页面传值
  • Mac怎么更改默认打开方式
  • php tokenizer
  • macos big sur值得升级吗
  • it最高工资
  • 企业最佳资金结构
  • 融资租赁与经营租赁的联系
  • PHP:mcrypt_module_get_supported_key_sizes()的用法_Mcrypt函数
  • php使用自定义函数编程求半径r的圆的周长和面积
  • 普票销售方信息不完整可以用吗
  • PHP模拟http请求的方法详解
  • phpcms rce
  • 新开办公司如何办理金税盘
  • 机械设备大修标准
  • phpcms怎么样
  • 小规模纳税人减按1%政策
  • 政府补助的企业所得税如何处理
  • 企业所得税的成本怎么填?
  • 财政拨款方式有哪几种
  • 走账的目的
  • 装饰公司购入材料税额会计分录
  • 劳务派遣公司经营情况说明怎么写
  • 公司购买的商业保险如何使用
  • 溢价发行可转换债券 利息调整在贷方吗
  • 装修费未计入长期费用
  • 所税税汇算补交怎么算
  • 进口关税如何交
  • 材料采购是什么会计要素
  • 商业承兑汇票到期不兑付怎么办
  • 建账固定资产的期初科目是什么
  • 无法启动diagnostic policy service服务
  • windows常用功能
  • 设置centos时区修改时间的方法
  • win10系统怎么连接蓝牙
  • win8正版系统重装
  • win10企业版20h2和1909
  • linux网卡bound
  • 局域网下访问vue点击无反应
  • win8丢失msvcp140.dll的解决办法
  • cocos2d-x教程
  • 每日一个linux命令
  • javascript的字符串操作
  • jquery使用教程
  • 简单介绍自己的名字由来
  • 甘肃车船使用税
  • 小规模纳税人可以开增值税专用发票吗
  • 地税总局局长
  • 电子三方协议怎么下载
  • 同比减少怎么计算出来
  • 富士康走了,京东去哪了
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设