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 cv2


img = 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))

    # 更新xml
    width_xml=root.getElementsByTagName("width")
    width_xml[0].firstChild.data=width
    height_xml = root.getElementsByTagName("height")
    height_xml[0].firstChild.data = height

    xmin[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/height
    height=400
    width=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))
    
        # 更新xml
        width_xml=root.getElementsByTagName("width")
        width_xml[0].firstChild.data=width
        height_xml = root.getElementsByTagName("height")
        height_xml[0].firstChild.data = height
    
        xmin[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.mfbz.cn/a/268197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot + Vue的图书管理系统

功能概述 该图书管理系统提供了一系列功能&#xff0c;包括图书管理、图书类型管理、读者借阅归还图书、用户管理和重置密码等。 在图书管理功能中&#xff0c;管理员可以方便地进行图书信息的管理。他们可以添加新的图书记录&#xff0c;包括书名、作者、出版社、ISBN等信息&a…

DC-9靶机

目录 DC-9靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap注入&#xff1a; 文件包含&#xff1a; 端口敲门规则&#xff1a; hydra爆破&#xff1a; root提权&#xff1a; 方法一/etc/passwd&#xff1a; ​编辑 方法二定时任务crontab&#xff1a; DC-9靶…

Zookeeper入门

ZooKeeper 是一个开源的分布式协调架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 本质 分布式的文件存储系统(Zookeeper文件系统监听机制)&#xff0c;是一个基于观察者模式设计的分布式服务管理框架 zookeeper的数据结构 Zookeeper的层次模型称作Data Tree,…

Kubectl 部署有状态应用(下)

接上文 《Kubectl 部署有状态应用&#xff08;上&#xff09;》创建完StatefulSet后&#xff0c;本文继续介绍StatefulSet 扩展、更新、删除等内容。 StatefulSet 中的 Pod 验证序数索引和稳定的网络身份 StatefulSet 中的 Pod 具有唯一的序数索引和稳定的网络身份。 查看 …

外贸多语言电商系统的运作流程

外贸多语言电商系统的运作流程通常包括以下几个步骤&#xff1a; 1. 网站搭建和设计&#xff1a;首先需要搭建一个多语言电商网站&#xff0c;可以选择现有的电商平台或自行开发。网站设计应考虑不同语言和文化背景的用户需求&#xff0c;包括界面布局、导航结构、语言切换等。…

TLS 1.2详解

TSL由多个协议组成的两层协议集合&#xff0c;工作与应用层和传输层之间。 TLS协议包含两层协议&#xff1a;记录层协议&#xff08;TLS Record Protocol协议&#xff09;和 握手协议&#xff08;TLS Handshake Protocol协议&#xff09;&#xff0c;底层采用可靠传输协议&…

SpringMVC之跨域请求

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringMVC之跨域请求 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、什么是同源策略…

Report Design

ERP_ENT_STD-CSDN博客

接口测试的持续集成的工具(git代码管理工具,jenkins持续集成)

持续集成的概念&#xff1a;大白话就是持续的做一件事情&#xff0c;使其使用起来更加流畅&#xff1b;结合测试来讲就是说用工具管理好代码的同时&#xff0c;使代码运行的更加自动以及智能&#xff1b;提升测试效率。 ⽹址&#xff1a;https://git-scm.com/downloads 长这个…

CnosDB如何确保多步操作的最终一致性?

背景 在时序数据库中&#xff0c;资源的操作是一个复杂且关键的任务。这些操作通常涉及到多个步骤&#xff0c;每个步骤都可能会失败&#xff0c;导致资源处于不一致的状态。例如&#xff0c;一个用户可能想要在CnosDB集群中删除一个租户&#xff0c;这个操作可能需要删除租户…

网络传输介质简介

通信网络除了包含通信设备本身之外&#xff0c;还包含连接这些设备的传输介质&#xff0c;如同轴电缆、双绞线和光纤等。不同的传输介质具有不同的特性&#xff0c;这些特性直接影响到通信的诸多方面&#xff0c;如线路编码方式、传输速度和传输距离等。 简单网络 两个终端&am…

直排轮滑教程6

直道滑行摆臂练习 1&#xff0c;下面来学练摆臂技术动作。直道滑行摆臂练习。 2&#xff0c;主要有两点作用&#xff0c;第一点&#xff0c;增加蹬地力量。第二点&#xff0c;协助身体平衡。 3&#xff0c;要想摆好臂&#xff0c;首先肩关节放松&#xff0c;摆的就自然了。肘…

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同&#xff0c;通过U盘进行文件拷贝时&#xff0c;导致无法拷贝。官方解决方案如下&#xff0c;但是描述的比较模糊。看我的操作步骤即可。 https://support.apple.com/zh-cn/guide/mac-help/mchlp1657/12.0/mac/12.6 前提条件 mac与…

MySQL数据库增删改查

常用的数据类型&#xff1a; int&#xff1a;整数类型&#xff0c;无符号的范围【0&#xff0c;2^32-1】&#xff0c;有符号【-2^31,2^31-1】 float&#xff1a;单精度浮点&#xff0c;4字节64位 double&#xff1a;双精度浮点&#xff0c;8字节64位 char&#xff1a;固定长…

AIGC:大语言模型LLM的幻觉问题

引言 在使用ChatGPT或者其他大模型时&#xff0c;我们经常会遇到模型答非所问、知识错误、甚至自相矛盾的问题。 虽然大语言模型&#xff08;LLMs&#xff09;在各种下游任务中展示出了卓越的能力&#xff0c;在多个领域有广泛应用&#xff0c;但存在着幻觉的问题&#xff1a…

Qt designer界面和所有组件功能的详细介绍(全!!!)

PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501 目录 1. 界面介绍2. Widget Box 常用组件2.1 Layouts&#xff08;布局&#xff09;2.2 Spacers&#xff08;间隔器&#xff09;2.3 Item V…

web架构师编辑器内容-使用html2canvas获取截图,并处理一些问题

html2canvas-api 为了使用html2canvas完成截图的功能&#xff0c;我们首先先使用一个按钮来测试一下html2canvas的截图功能。 首先在页面上创建一个img标签 <img id"test-image" :style"{ width: 300px}"/>创建一个button按钮&#xff0c;添加点击…

Linux:jumpserver V3的安装与升级(在线离线)(2)

官方文档写的非常详细&#xff0c;我这篇文章时间长了&#xff0c;会随着官方版本更新而落后 JumpServer - 开源堡垒机 - 官网https://www.jumpserver.org/安装和升级在官网也有详细的信息&#xff0c;我写本章是为了记录一下实验 我的系统是centos7.9 在线安装 在确定我们可…

JoySSL诚招SSL证书代理

不久前&#xff0c;阿里云宣布了一个让人稍感唏嘘的消息——它们的一年期免费SSL证书服务将停步&#xff0c;转而提供三个月期限的证书。这一变化&#xff0c;无疑会使得网站开发的公司在维持用户信任和网站安全上多出心思。然而&#xff0c;免费的午餐并没有彻底消失&#xff…

七天搞定java接口自动化测试实战,一文搞定...

前言 无论是自动化测试还是自动化部署&#xff0c;撸码肯定少不了&#xff0c;所以下面的基于java语言的接口自动化测试&#xff0c;要想在业务上实现接口自动化&#xff0c;前提是要有一定的java基础。 如果没有java基础&#xff0c;也没关系。这里小编也为大家提供了一套jav…
最新文章