按类别调整目标检测标注框的写入顺序以优化人工审核效率

news/2024/12/19 15:28:15/

引言

目标检测数据标注审核过程中,我们常常会遇到以下情况:某些小目标的检测框嵌套在大目标检测框内,而在模型进行预标注后,这些小目标的框可能被写入到了大目标框的下层。在人工审核阶段,标注审核人员需要手动移动或删除上层的大目标框以调整小目标框的位置,导致效率低下。

为了解决这一问题,我们可以通过自动化调整标注框的写入顺序,使小目标的检测框优先显示在上层,提升人工审核的效率。

本文将通过一个 Python 脚本展示如何实现这一功能,并对代码逻辑进行讲解和优化。

问题描述

在 XML 格式的标注文件中,标注信息是以 object 标签的形式存储的。每个 object 标签包含了目标类别、位置信息等内容。标注框的显示顺序通常与 XML 文件中标签的写入顺序一致。因此,调整标注框的写入顺序即可改变显示顺序。

为了解决小目标框被覆盖的问题,我们需要:

  • 确定需要调整顺序的类别(如小目标类别)。
  • 将这些类别的标注框写入到 XML 文件的后面,从而显示在上层。

代码实现

import os
import xml.etree.ElementTree as ET
from tqdm import tqdm
import xml.dom.minidom as minidomdef reorder_annotation_boxes(xml_folder: str, prioritized_categories: list):"""调整目标检测标注框的顺序,使指定类别的标注框显示在上层。参数:xml_folder (str): 存储标注文件(XML格式)的文件夹路径。prioritized_categories (list): 需要优先显示(后写入)的目标类别列表。"""# 获取文件夹中所有 XML 文件xml_files = [file for file in os.listdir(xml_folder) if file.endswith('.xml')]for xml_file in tqdm(xml_files, desc="Processing XML files"):xml_path = os.path.join(xml_folder, xml_file)# 解析 XML 文件tree = ET.parse(xml_path)root = tree.getroot()# 获取所有目标标注框all_objects = root.findall('object')# 按类别分类标注框prioritized_boxes = [obj for obj in all_objects if obj.find('name').text in prioritized_categories]other_boxes = [obj for obj in all_objects if obj.find('name').text not in prioritized_categories]# 清空原来的标注框for obj in all_objects:root.remove(obj)# 按顺序重新写入标注框for box in other_boxes:  # 非优先类别的框先写入root.append(box)for box in prioritized_boxes:  # 优先类别的框后写入root.append(box)# 使用 minidom 美化并保存 XML 文件xml_str = ET.tostring(root, encoding='utf-8')pretty_xml = minidom.parseString(xml_str).toprettyxml(indent="\t")with open(xml_path, 'w', encoding='utf-8') as output_file:output_file.write(pretty_xml)if __name__ == "__main__":# 输入文件夹路径xml_folder_path = '/data/inxml'# 需要优先显示的类别列表prioritized_categories = ['cls_1', 'cls_2']# 调用函数处理 XML 文件reorder_annotation_boxes(xml_folder_path, prioritized_categories)

总结

本文通过优化目标检测标注框的写入顺序,解决了人工审核中因标注框层级问题造成的低效问题。脚本简单易用,具有良好的扩展性,可以根据不同需求调整优先类别或处理逻辑。


http://www.ppmy.cn/news/1556416.html

相关文章

Mapper代理开发

引入 Mybatis入门方式中,以下代码仍存在硬编码问题 Mapper 代理开发: 目的: 解决原生方式中的硬编码 简化后期执行sql ------下图中,第一段代码是原生硬编码代码块,第二个是引入了Mapper代理开发的代码块。 Mapper代…

TCP Analysis Flags 之 TCP Fast Retransmission

前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…

1688商品爬取:商品信息与价格接口获取指南

引言 在电商领域,获取商品信息和价格对于市场分析、价格监控和供应链管理至关重要。1688作为中国领先的B2B电商平台,提供了海量的商品数据。本文将详细介绍如何利用Java爬虫技术合法合规地获取1688商品信息和价格接口数据。 环境准备 在开始之前&…

FPGA高速下载器SZ901

SZ901基于AMD(Xilinx) Virtual Cable协议. 本设备使用千兆网络接口。基于此接口,本设备可以同时支持多达四路FPGA板卡同时调试,每组相互独立,互不干扰。 特点 1,支持JTAG 速度最高53Mb/s,电压范围1.2-3.3V,最高支持200cm排线 2,支持4路JTAG独立使用 3,支持多路…

半导体制造全流程

半导体制造是一个极其复杂且精密的过程,主要涉及将硅片加工成功能强大的芯片。以下是半导体制造的全流程概述: 1. 硅材料制备 硅提纯: 使用冶金级硅,进一步提纯为高纯度硅(电子级硅),纯度可达 …

MIT S6081 2024 Lab 1 | Operating System | Notes

目录 安装与下载 实验1 开始我们的实验 sleep(简单) pingpong(简单) primes (中等)/(困难) find(中等) xargs(中等) finally Reference I. Tools Debian 或 Ubuntu Arch…

ubuntu 上怎么设置应用开机自动启动

方法 1: 使用 “启动应用程序” 工具 打开“启动应用程序”工具: 在 GNOME 桌面环境中,按 Super(Windows)键 或点击应用菜单,搜索并打开 “启动应用程序” 或 “Startup Applications”。 添加启动程序: 点…

STM32使用SFUD库驱动W25Q64

SFUD简介 SFUD是一个通用SPI Flash驱动库,通过SFUD可以库轻松完成对SPI Flash的读/擦/写的基本操作,而不用自己去看手册,写代码造轮子。但是SFUD的功能不仅仅于此:①通过SFUD库可以实现在一个项目中对多个Flash的同时驱动&#x…