当前位置: 首页 > news >正文

DataProcess-VOC数据图像和标签一起进行Resize

VOC数据图像和标签一起进行Resize

参加检测比赛的时候,很多时候工业原始数据尺度都比较大,如果对数据不提前进行处理,会导致数据在加载进内存时花费大量的时间,所以在执行训练程序之前需要将图像提前进行预处理。对于目标检测的数据,不只是将原始数据进行resize,边界框的坐标也要跟随一起进行resize。

如下,是今天测试需要用到的原始图像和他的标签。

2007_002266

<annotation><folder>VOC2012</folder><filename>2007_002266.jpg</filename><source><database>The VOC2007 Database</database><annotation>PASCAL VOC2007</annotation><image>flickr</image></source><size><width>500</width><height>373</height><depth>3</depth></size><segmented>1</segmented><object><name>aeroplane</name><pose>Rear</pose><truncated>1</truncated><difficult>0</difficult><bndbox><xmin>231</xmin><ymin>251</ymin><xmax>458</xmax><ymax>346</ymax></bndbox></object><object><name>aeroplane</name><pose>Left</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>5</xmin><ymin>118</ymin><xmax>499</xmax><ymax>258</ymax></bndbox></object>
</annotation>

等比例缩放之后的结果如下。

result

单张图像resize

单张进行预处理的脚本如下。

# -*- coding: utf-8 -*-
# @File  : PreProcessing.py
# @Author: 肆十二
# @Date  : 2023/12/24
# @Desc  : 同步缩放图片(等比例缩放无失真)和xml文件标注的anchor size
import glob
import xml.dom.minidom
import cv2img = cv2.imread("./demo.jpg")
height, width = img.shape[:2]# 定义缩放信息 以等比例缩放到416为例
scale=416/height
height=416
width=int(width*scale)dom = xml.dom.minidom.parse("./demo.xml")
root = dom.documentElement# 读取标注目标框
objects = root.getElementsByTagName("bndbox")for object in objects:xmin=object.getElementsByTagName("xmin")xmin_data=int(float(xmin[0].firstChild.data))# xmin[0].firstChild.data =str(int(xmin1 * x))ymin =object.getElementsByTagName("ymin")ymin_data = int(float(ymin[0].firstChild.data))xmax=object.getElementsByTagName("xmax")xmax_data = int(float(xmax[0].firstChild.data))ymax=object.getElementsByTagName("ymax")ymax_data = int(float(ymax[0].firstChild.data))# 更新xmlwidth_xml=root.getElementsByTagName("width")width_xml[0].firstChild.data=widthheight_xml = root.getElementsByTagName("height")height_xml[0].firstChild.data = heightxmin[0].firstChild.data = int(xmin_data*scale)ymin[0].firstChild.data = int(ymin_data*scale)xmax[0].firstChild.data = int(xmax_data*scale)ymax[0].firstChild.data = int(ymax_data*scale)# 另存更新后的文件with open('demo2.xml', 'w') as f:dom.writexml(f, addindent='  ', encoding='utf-8')# 测试缩放效果img = cv2.resize(img, (width, height))# xmin, ymin, xmax, ymax分别为xml读取的坐标信息left_top = (int(xmin_data*scale), int(ymin_data*scale))right_down= (int(xmax_data*scale), int(ymax_data*scale))cv2.rectangle(img, left_top, right_down, (255, 0, 0), 1)cv2.imwrite("result.jpg",img)

批量resize

下面是批量对VOC格式数据集进行预处理的脚本,处理之后划分为37的比例就可以进行模型训练了。

import glob
import xml.dom.minidom
import cv2
from PIL import Image
import matplotlib.pyplot as plt
import os# 定义待批量裁剪图像的路径地址
IMAGE_INPUT_PATH = r'D:\code\data\JPEGImages'
XML_INPUT_PATH = r'D:\code\data\Annotations_new'
# 定义裁剪后的图像存放地址
IMAGE_OUTPUT_PATH = r'D:\code\data\JPEGImages_out'
XML_OUTPUT_PATH = r'D:\code\data\Annotations_out'
imglist = os.listdir(IMAGE_INPUT_PATH)
xmllist = os.listdir(XML_INPUT_PATH)for i in range(len(imglist)):# 每个图像全路径,这里有改进的空间image_input_fullname = IMAGE_INPUT_PATH + '/' + imglist[i]# xml_input_fullname = XML_INPUT_PATH + '/' + xmllist[i] xml_input_fullname = XML_INPUT_PATH + '/' + imglist[i].replace("jpg", "xml")image_output_fullname = IMAGE_OUTPUT_PATH + '/' + imglist[i]xml_output_fullname = XML_OUTPUT_PATH + '/' + xmllist[i]img = cv2.imread(image_input_fullname)height, width = img.shape[:2]# 定义缩放信息 以等比例缩放到416为例scale=400/heightheight=400width=int(width*scale)dom = xml.dom.minidom.parse(xml_input_fullname)root = dom.documentElement# 读取标注目标框objects = root.getElementsByTagName("bndbox")for object in objects:xmin=object.getElementsByTagName("xmin")xmin_data=int(float(xmin[0].firstChild.data))# xmin[0].firstChild.data =str(int(xmin1 * x))ymin =object.getElementsByTagName("ymin")ymin_data = int(float(ymin[0].firstChild.data))xmax=object.getElementsByTagName("xmax")xmax_data = int(float(xmax[0].firstChild.data))ymax=object.getElementsByTagName("ymax")ymax_data = int(float(ymax[0].firstChild.data))# 更新xmlwidth_xml=root.getElementsByTagName("width")width_xml[0].firstChild.data=widthheight_xml = root.getElementsByTagName("height")height_xml[0].firstChild.data = heightxmin[0].firstChild.data = int(xmin_data*scale)ymin[0].firstChild.data = int(ymin_data*scale)xmax[0].firstChild.data = int(xmax_data*scale)ymax[0].firstChild.data = int(ymax_data*scale)# 另存更新后的文件with open(xml_output_fullname, 'w') as f:dom.writexml(f, addindent='  ', encoding='utf-8')# 测试缩放效果img = cv2.resize(img, (width, height))'''# xmin, ymin, xmax, ymax分别为xml读取的坐标信息left_top = (int(xmin_data*scale), int(ymin_data*scale))right_down= (int(xmax_data*scale), int(ymax_data*scale))cv2.rectangle(img, left_top, right_down, (255, 0, 0), 1)'''cv2.imwrite(image_output_fullname,img)

总结

当前的目标检测框架中,模型方面基本都已经固定下来,YOLO或者RCNN,靠模型很难取得大规模的增点,所以这个时候从图像的角度进行入手显得非常重要,这里推荐大家使用一个专业的切图工具。

链接如下:GitHub - obss/sahi: Framework agnostic sliced/tiled inference + interactive ui + error analysis plots

碎碎念:数据预处理真的很关键啊,好的数据预处理真的可以节省大量的时间。

http://www.lryc.cn/news/266816.html

相关文章:

  • MultiValueMap
  • 山西电力市场日前价格预测【2023-12-25】
  • 【华为OD机试真题2023CD卷 JAVAJS】5G网络建设
  • OSI 七层参考模型及TCP/IP 四层模型
  • 【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。
  • 力扣(leetcode)第26题删除有序数组中的重复项(Python)
  • 【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍
  • FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势
  • 如何在Vue3中实现无缝热重载:提升你的开发效率
  • 盒子 Box
  • uni-app附件下载预览 并解决打开附件时黑屏
  • 卸载了Visual Studio后,在vscode中执行npm i或npm i --force时报错,该怎么解决?
  • 渗透测试 | 信息收集常用方法合集
  • 使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)
  • JavaScript中数组的方法和函数作用域问题
  • nodejs设置x-xss-protection解决xss问题
  • C/C++不同整数类型的区别
  • 如何理解JDK、JRE、JVM区别与联系
  • 用友GRP-U8 SmartUpload01 文件上传漏洞
  • react 路由v6
  • rpc【通义】rpc原理【gpt】
  • Leetcode 2973. Find Number of Coins to Place in Tree Nodes
  • 如何调动销售人员使用CRM的积极性?
  • 数值分析期末复习
  • k8s的探针
  • Python 爬虫之下载视频(五)
  • Gradle下载地址
  • 顺序表的实现(头插、尾插、头删、尾删、查找、删除、插入)
  • VMware虚拟机安装Ubuntu系统教程
  • 41 sysfs 文件系统