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

  • OPPO Ace2搭载的是什么型号的处理器(oppo ace 2好吗)

    OPPO Ace2搭载的是什么型号的处理器(oppo ace 2好吗)

  • vivox50是双卡双待的吗(vivo双卡双待吗)

    vivox50是双卡双待的吗(vivo双卡双待吗)

  • 苹果xr耳机第二次用插上还是外放(查找一下苹果耳机第二代多少钱)

    苹果xr耳机第二次用插上还是外放(查找一下苹果耳机第二代多少钱)

  • 抖音火了突然就审核不过了(抖音为什么一下子火了)

    抖音火了突然就审核不过了(抖音为什么一下子火了)

  • 朋友圈黑色心代表什么(朋友圈黑色的心什么意思)

    朋友圈黑色心代表什么(朋友圈黑色的心什么意思)

  • p40pro是曲面屏还是环幕屏(华为p40pro曲面屏和p40哪个好)

    p40pro是曲面屏还是环幕屏(华为p40pro曲面屏和p40哪个好)

  • 拼多多畅销榜为什么没有了(拼多多畅销榜掉榜原因)

    拼多多畅销榜为什么没有了(拼多多畅销榜掉榜原因)

  • 微信通话中断有几种可能(微信打不了语音电话是怎么回事)

    微信通话中断有几种可能(微信打不了语音电话是怎么回事)

  • i79700k和i99900k对比(i79700和i99900kf差距)

    i79700k和i99900k对比(i79700和i99900kf差距)

  • 苹果6s充电器是几安(苹果6s充电器是1a还是2a)

    苹果6s充电器是几安(苹果6s充电器是1a还是2a)

  • 华为荣耀4c下载不了微信(华为荣耀4c怎么下载不了微信)

    华为荣耀4c下载不了微信(华为荣耀4c怎么下载不了微信)

  • iPad?Air2与iPad?mini3有什么区别(ipadair2与ipadmini5哪个好)

    iPad?Air2与iPad?mini3有什么区别(ipadair2与ipadmini5哪个好)

  • ipad2插卡是几g的网络(ipad air 2插卡版)

    ipad2插卡是几g的网络(ipad air 2插卡版)

  • 抖音可以随便定位吗(抖音可以随便定位多少公里)

    抖音可以随便定位吗(抖音可以随便定位多少公里)

  • 华为手机的日历在哪里(华为手机的日历怎么调出来)

    华为手机的日历在哪里(华为手机的日历怎么调出来)

  • 投屏可以倍速播放吗(投屏可以倍速播放吗bilibili)

    投屏可以倍速播放吗(投屏可以倍速播放吗bilibili)

  • vivoz5x反向充电什么意思(vivoy5s反向充电)

    vivoz5x反向充电什么意思(vivoy5s反向充电)

  • 手机拨号键怎么调声音(手机拨号键怎么找回)

    手机拨号键怎么调声音(手机拨号键怎么找回)

  • 饿了么专职骑手怎么加入(饿了么专职骑手摔伤导致血管破损赔付得多少天)

    饿了么专职骑手怎么加入(饿了么专职骑手摔伤导致血管破损赔付得多少天)

  • 怎样删除微信好友(怎样删除微信好友并从他列表中删除)

    怎样删除微信好友(怎样删除微信好友并从他列表中删除)

  • 手机wps中pdf怎么查找(手机wps中pdf怎么删除其中一页)

    手机wps中pdf怎么查找(手机wps中pdf怎么删除其中一页)

  • 芒果tv账号在哪里查看(芒果tv账号在哪里买)

    芒果tv账号在哪里查看(芒果tv账号在哪里买)

  • 手机瀑布屏指的什么(手机瀑布屏什么意思)

    手机瀑布屏指的什么(手机瀑布屏什么意思)

  • iphone11pro有双卡吗(iphone11pro有没有双卡)

    iphone11pro有双卡吗(iphone11pro有没有双卡)

  • oppo手机视频怎么剪辑(oppo手机视频怎么传到u 盘上)

    oppo手机视频怎么剪辑(oppo手机视频怎么传到u 盘上)

  • spring boot是什么(spring boot干什么的)

    spring boot是什么(spring boot干什么的)

  • ElementUI快速上手(jar包本地下载)(element ui)

    ElementUI快速上手(jar包本地下载)(element ui)

  • 计算应纳税所得额时 不得扣除支出有哪些
  • 股权转让产生的印花税
  • 免税苗木普通发票
  • 待认证进项税是借方还是贷方
  • 企业清算的种类
  • 外商投资企业是民营企业吗
  • 增值税认证逾期怎么处理
  • 怎么认证财付通
  • 公司账户资金
  • 会务费发票要附上照片吗
  • 机打发票多久可以作废
  • 代开专用发票的数量单价单位怎么写?
  • 预缴纳税申报怎么报
  • 母公司的注册资金比子公司少可以么
  • 固定资产合并抵扣增值税
  • 公司注销财务账需要保存几年
  • 没有结转损益影响利润表吗
  • 老板垫付款做会计分录
  • proflwiz.exe - proflwiz是什么进程 有什么用
  • icon图标教程
  • uniapp打包成h5如何调用原生
  • php使用oci8扩展连接oracle
  • 数据结构考试内容
  • php验证表单方法有哪些
  • 申请个人所得税
  • php输出隔行变色的表格
  • 微信小程序云开发控制台
  • yolov5训练命令
  • 《中华人民共和国民法典》
  • 织梦前台的菜单怎么换
  • python 数据采集卡
  • 贷款需要考虑什么
  • 净收入是营业收入吗
  • 高价值配件用入固定资产吗
  • 小规模纳税人在什么情况下会成为一般纳税人
  • 2022年最新办公用房标准
  • 公司车辆保险费要交印花税吗
  • 职工食堂的费用怎么入账
  • 房地产个税是什么意思
  • 什么叫固定资产台账
  • 个税申报系统非正常可以改为正常吗?
  • 小规模纳税人开的专票对方可以抵扣吗
  • 税控盘抄报税逾期怎么办
  • 银行定期利息怎么算一年
  • 航天金税服务费280元每年都交吗
  • 少计提的税费如何补提
  • 租赁业发票
  • 扶贫小额信贷分贷统还违规吗
  • 预提费用为什么是负债
  • 分红做什么会计分录
  • 小额 无发票
  • 保险增值税发票是什么
  • 印花税是根据什么计算的
  • 让渡是什么
  • 企业经营规模小的原因
  • 企业的投资公司 私募
  • 增强型图形文件
  • windows中双击硬盘驱动器图标操作的作用
  • linux 的ll
  • linux命令sed -i
  • keyemain.exe是什么进程
  • window web
  • linux datetime命令
  • win10 怎么恢复
  • windows 8虚拟机
  • ubuntu apt-cdrom
  • linux ftp创建文件夹命令
  • Linux系统怎么设置中文输入法
  • unityshader怎么用
  • js修改css样式属性不生效
  • nodejs读取json文件,并返回列表
  • 各种摄像机的介绍
  • nodejs oom
  • ubuntu for android
  • PreferenceActivity、PreferenceFragment使用
  • javascript操作数组的方法
  • 深入浅出jquery
  • 个体经营所得申报密码怎样设置
  • 福利企业免税有哪些项目
  • 税务之星ii驱动
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设