(21)数据增强之通过相似不变性变换、亮度、对比度、饱和度及清晰度进行数据集扩充
创始人
2025-05-28 16:41:35

数据增强之通过相似不变性变换、亮度、对比度、饱和度及清晰度进行数据集扩充

  • 深度学习往往面临:1.数据标注过程很麻烦;2.部分场景数据集预测结果不佳

  • 针对以上弊端,通过本文方法进行数据集扩充对训练过程尤为重要

  • 本文主要依靠PIL(pillow)中的图像变换及增强模块进行图像数据集增强处理

  • 并且在进行数据扩充的同时进行标注文件.xml格式文件相应的修改

  • 具体实现就分为如下两个模块吧,下边详解一下:

      1. 图像变换
      1. xml标注文件修改

1.图像变换

  • 直接调用PIL的变换函数与读写函数,具体使用不作多介绍
  • PIL中文教程:https://www.osgeo.cn/pillow/handbook/tutorial.html
  • 实现代码如下:
'''
批量读取文件夹路径下的图像,然后经过左右、上下翻转,亮度、对比度调整、色调调整进行图像数据集扩充,并自动复制其标签文件进行重命名保存
图像增强:亮度、对比度、饱和度变换
'''import matplotlib.pyplot as plt
import xmlTF
from PIL import Image,ImageEnhance
import shutil
import ospath='./imgs/'t=1200
imgname=""
xmlname=""
imglist=os.listdir(path)
for i in range(len(imglist)):str_=imglist[i].split(".")[-1]if(str_=="jpg"):imgname=path+imglist[i]xmlname = path + imglist[i].split(".")[0] + ".xml"elif(str_=="xml"):continueprint(t," - ",imgname)img_ = Image.open(imgname)# 水平翻转img0 = img_.transpose(Image.FLIP_LEFT_RIGHT)img0.save(path+str(t)+".jpg")shutil.copy(xmlname, path+str(t)+".xml")newname = path + str(t) + ".xml"xmlTF.xmlFlip(newname,1)t+=1# 垂直翻转img1=img_.transpose(Image.FLIP_TOP_BOTTOM)img1.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")newname = path + str(t) + ".xml"xmlTF.xmlFlip(newname, 2)t += 1# 对角线翻转img2=img1.transpose(Image.FLIP_LEFT_RIGHT)img2.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")newname = path + str(t) + ".xml"xmlTF.xmlFlip(newname, 3)t += 1## plt.subplot(2,2,1)# plt.imshow(img_)# plt.subplot(2,2,2)# plt.imshow(img0)# plt.subplot(2,2,3)# plt.imshow(img1)# plt.subplot(2,2,4)# plt.imshow(img2)# plt.show()#色彩调整:# 亮度调整brightEnhancer = ImageEnhance.Brightness(img_.copy())img_0 = brightEnhancer.enhance(0.8)img_0.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1img_1 = brightEnhancer.enhance(1.5)img_1.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1# 对比度调整contrastEnhancer = ImageEnhance.Contrast(img_.copy())img_2 = contrastEnhancer.enhance(1.2)img_2.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1img_3 = contrastEnhancer.enhance(1.7)img_3.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1# 饱和度调整colorEnhancer = ImageEnhance.Color(img_.copy())img_4 = colorEnhancer.enhance(1.2)img_4.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1img_5 = colorEnhancer.enhance(1.8)img_5.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1# 清晰度调整SharpnessEnhancer = ImageEnhance.Sharpness(img_.copy())img_6 = SharpnessEnhancer.enhance(0.7)img_6.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1img_7 = SharpnessEnhancer.enhance(1.5)img_7.save(path + str(t) + ".jpg")shutil.copy(xmlname, path + str(t) + ".xml")t += 1# plt.figure()# plt.subplot(2, 5, 1),plt.imshow(img_),plt.title("1")# plt.subplot(2, 5, 2),plt.imshow(img_0),plt.title("2")# plt.subplot(2, 5, 3),plt.imshow(img_2),plt.title("3")# plt.subplot(2, 5, 4),plt.imshow(img_4),plt.title("4")# plt.subplot(2, 5, 5),plt.imshow(img_6),plt.title("5")## plt.subplot(2, 5, 6), plt.imshow(img_),plt.title("6")# plt.subplot(2, 5, 7), plt.imshow(img_1),plt.title("7")# plt.subplot(2, 5, 8), plt.imshow(img_3),plt.title("8")# plt.subplot(2, 5, 9), plt.imshow(img_5),plt.title("9")# plt.subplot(2, 5, 10), plt.imshow(img_7),plt.title("10")## plt.show()

2. 标注文件修改

  • 修改.xml文件主要是读写其内容,并针对性的 做出一些修改
  • 具体实现代码xmlTF.py如下:
'''
实现对.xml标签文件的一系列修改:1.实现传入xml文件的检测框的水平、竖直与对角线翻转
'''import os
import xml.etree.ElementTree as ETdef checkname(xmlpath):with open(xmlpath, 'r') as f:tree = ET.parse(f)root = tree.getroot()# print(root)# print(list(root))in_name=root.find("filename").textin_path=root.find("path").textxmlname=xmlpath.split("\\")[-1].split(".")[0]a=xmlnameb=in_name.split(".")[0]if(xmlname != in_name.split(".")[0]):print(a, " - ", b)root.find("filename").text=xmlname +".jpg"root.find("path").text=in_path.rsplit("\\",1)[0]+"\\"+xmlname +".jpg"tree.write(xmlpath)def xmlFlip(xmlpath, flg):'''当图像发生翻转时,相对应的xml文件内容也做出相应变化:param xmlpath: xml路径名字:param flg: 操作类型:1-水平、 2-竖直、 3-对角线翻转:return:保存修改后的文件'''#print(xmlpath)# read xmlwith open(xmlpath, 'r') as f:tree = ET.parse(f)root = tree.getroot()# print(root)# print(list(root))size = root.find("size")w = int(size.find("width").text)h = int(size.find("height").text)# print("w = ",w.text,"h = ",h.text)# 查看多个重复元素for obj in root.iter("object"):box = obj.find("bndbox")x_min = int(box.find("xmin").text)y_min = int(box.find("ymin").text)x_max = int(box.find("xmax").text)y_max = int(box.find("ymax").text)#水平翻转,x变化if flg==1:box.find("xmin").text = str(w - 1 - x_min)box.find("xmax").text = str(w - 1 - x_max)#竖直翻转,y变化elif flg==2:box.find("ymin").text = str(h - 1 - y_min)box.find("ymax").text = str(h - 1 - y_max)#对角线翻转,x,y都发生变化elif flg==3:box.find("xmin").text = str(w - 1 - x_min)box.find("xmax").text = str(w - 1 - x_max)box.find("ymin").text = str(h - 1 - y_min)box.find("ymax").text = str(h - 1 - y_max)# print("x1,y1,x2,y2 = ",[x_min,y_min,x_max,y_max])#如果存在中文,则需要在.write()中设置 encoding='utf-8'# tree.write(newpath + "//" + i)# print(newpath + "//" + i)# newpath="./xmls/"+xmlpath.split("/")[-1]# tree.write(newpath)tree.write(xmlpath)
  • 如上所示,第一个函数为检查复制的标注文件中的图像名字和路径是否与xml文件一致,当然,如果内容中filenamepath不一致,但是xml名字图像名称一致,标签也是一一对应的,但是俺略微有点强迫症,就实现了一下检查名称并修改,其调用如下:
  • 当然,在数据增强中也可添加此功能。
#批量赋值图像的标注文件.xml并重命名为图像名字import os
import shutil
import xmlTF# imgspath="./file3/jpg"
# xmlpath="file3/jpg/005.xml"
imgspath="./images"
xmlpath="./images/0.xml"for root,dirs,files in os.walk(imgspath,topdown=True):for name in files:str=name.split('.')if(str[-1] == 'jpg'):newname=str[0]+'.xml'newxml=os.path.join(root,newname)print(newxml)if not os.path.exists(newxml):shutil.copy(xmlpath,newxml)xmlTF.checkname((newxml))

相关内容

热门资讯

【文心一言】什么是文心一言,如... 文心一言什么是文心一言怎么获得内测资格接下来就给大家展示一下文学创作商业文案创作数理逻辑推算中文理解...
第31篇:Java流和文件操作... 目录 1、读取控制台输入流 1.1 从控制台读取多字符输入流 1.2 从控制台读取字符串流 2、读写...
Linux/Debian/Ub... 文章目录前言相关资源下载OpenCVCUDA下载CUDNN下载编译错误异常 前言 本文用来记录在l...
虚拟数字人和GPT-4的结合,... 最近,ChatGPT一直在互联网上狂飙,从 去年11月底推出到月活过亿&...
第三章 Liunx的常用命令 文章目录一、Liunx常用命令查看内存 free -m回到根目录 直接 cd 回车回到上一级目录 c...
素人做课会踩的3大坑,你中了几... 素人做课会踩的3大坑,你中了几个?大坑:盲目模仿别人做课的...
element输入框el-in... element输入框el-input之格式控制 (1)限制输入的长度&#...
oracle19c迁移手册 windows10- 查看当前用户所有的表:select table_name fro...
docker-compose搭... # 关闭防火墙 systemctl stop firewalld.service # 永久关闭防火墙...
【2023最新Activiti... 1.流程实例 1.1 什么是流程实例 流程实例(ProcessInstance)代表流程定义的执行实...
基于ggdensity包的等高... 简介 科研过程中,需要绘制某个后验密度/其他的形状。在发表论文中常常使用等高线来满足该...
Leetcode 105. 从... 题目: 给定两个整数数组 preorder 和 inorder ,其中 ...
点亮LED 目录 一、LED 硬件控制方式 二、LED 应用程序 1、定义宏 2、main函数 ①、打开文件  ...
随想008:烂摊子 我看到过很多离谱的现象。比如: 程序 代码重复、命名随意、逻辑混乱、甚至对齐都不一致&...
2023长沙到广州的火车时刻表... 今天给各位分享2023长沙到广州的火车时刻表,从长沙到广州高铁最新...的知识,其中也会对长沙到广州...
车载DVD一体机导航升级教程(... 本篇文章极速百科给大家谈谈车载DVD一体机导航升级教程(凯立德)(超详细),以及汽车凯立德导航用u盘...
圈内sp是什么意思(sp圈里是... 今天给各位分享圈内sp是什么意思的知识,其中也会对sp圈里是什么样的进行解释,如果能碰巧解决你现在面...
鸡蛋撞地球(鸡蛋撞地球怎么制作... 本篇文章极速百科给大家谈谈鸡蛋撞地球,以及鸡蛋撞地球怎么制作对应的知识点,希望对各位有所帮助,不要忘...
Vue2基础语法速通2 目录计算属性计算属性的简写监视属性深层次监视watch 和 computed 区别绑定 class ...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
Web前端:Angular和R...   在编程领域,Angular 和 React 对于前端开发人员来说是目前最流行的两款...
【Git】SourceTree... 本系列文章前言   之前一直用的TeamFoundation,近期要代码迁移到Gite...
五官是指哪些(五官是指哪些器官... 今天给各位分享五官是指哪些的知识,其中也会对五官是指哪些器官进行解释,如果能碰巧解决你现在面临的问题...
北京汽车交易市场有哪些(北京车... 本篇文章极速百科给大家谈谈北京汽车交易市场有哪些,以及北京车市场在哪里对应的知识点,希望对各位有所帮...
微信吃喝玩乐在哪里搜(微信中吃... 本篇文章极速百科给大家谈谈微信吃喝玩乐在哪里搜,以及微信中吃喝玩乐在哪儿对应的知识点,希望对各位有所...
马勒滤清器怎么样(马勒滤清器产... 今天给各位分享马勒滤清器怎么样的知识,其中也会对马勒滤清器产品目录进行解释,如果能碰巧解决你现在面临...
Java服务器-NIO模型-J... Java服务器 NIO概览 NIO模型 每个客户端关联的套接字都注册到服务器的选择器(...
Vault配置中心产品调研实施... Vault配置中心产品调研实施方案 一、需求描述 nacos作为配置中文,数据都是明文...
镜头校正软件的新标杆DxO P... 镜头校正软件的新标杆DxO PhotoLab 6 的光学校正功能基于 DxO 专用实验室 20 年的...
CNI 网络流量 5.2 Ci... 文章目录Pod 间同节点 pod跨节点 pod in vxlan小结 环境: fedo...