热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于目标检测结果的特定类别图像与XML文件快速分析方法

本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。
### 1. 提取特定类别的图像和XML文件

为了从大量数据中提取特定类别的图像和对应的XML标注文件,可以按照以下步骤操作:

```python
import os
from shutil import copy
from lxml import etree

# 定义源文件夹和目标文件夹路径
origin_folder = "/Data02/decoded_det_seg/det_img/val"
dst_folder = "/home/xxx/datasets/val_sub_2"
class_sub = 'traffic_lights'

# 创建目标文件夹
os.makedirs(dst_folder, exist_ok=True)
os.makedirs(os.path.join(dst_folder, class_sub, 'images'), exist_ok=True)
os.makedirs(os.path.join(dst_folder, class_sub, 'xmls'), exist_ok=True)

# 解析XML文件并提取特定类别的图像和XML
for file in os.listdir(os.path.join(origin_folder, 'xmls_15')):
img_file = file.replace('xml', 'jpg')
src_xml_path = os.path.join(origin_folder, 'xmls_15', file)
src_img_path = os.path.join(origin_folder, 'images', img_file)
dst_xml_path = os.path.join(dst_folder, class_sub, 'xmls', file)
dst_img_path = os.path.join(dst_folder, class_sub, 'images', img_file)

# 解析XML文件
with open(src_xml_path) as fid:
xml_str = fid.read().encode('utf-8')
xml = etree.fromstring(xml_str)
data = parse_xml_to_dict(xml)['annotation']

if 'object' in data.keys():
for obj in data['object']:
if obj['name'] == class_sub:
copy(src_img_path, dst_img_path)
copy(src_xml_path, dst_xml_path)
break

# XML解析函数
def parse_xml_to_dict(xml):
"""将XML文件解析成字典形式
Args:
xml: 使用lxml.etree解析的XML树
Returns:
包含XML内容的Python字典
"""
if len(xml) == 0:
return {xml.tag: xml.text}
result = {}
for child in xml:
child_result = parse_xml_to_dict(child)
if child.tag != 'object':
result[child.tag] = child_result[child.tag]
else:
if child.tag not in result:
result[child.tag] = []
result[child.tag].append(child_result[child.tag])
return {xml.tag: result}
```

### 2. 分析特定类别的预测结果

在提取了特定类别的图像和XML文件后,可以进一步分析模型对该类别的预测结果。以下是代码示例:

```python
target_idx = class_names.index('traffic_lights')
all_box = []

for label, dets in enumerate(detections):
if label != target_idx:
continue
for bbox in dets:
score = bbox[-1]
if score > score_thresh:
x0, y0, x1, y1 = [int(i) for i in bbox[:4]]
all_box.append([label, x0, y0, x1, y1, score])
```

### 3. 可视化特定类别的标注框

为了更直观地展示特定类别的标注框,可以在图像上叠加这些框。以下是代码示例:

```python
import cv2 as cv

for file in os.listdir(os.path.join(origin_folder, 'xml_tmp')):
file_path = os.path.join(origin_folder, 'xml_tmp', file)
img_path = os.path.join(origin_folder, 'img_tmp', file.replace('xml', 'jpg'))
img = cv.imread(img_path)

with open(file_path) as fid:
xml_str = fid.read().encode('utf-8')
xml = etree.fromstring(xml_str)
data = parse_xml_to_dict(xml)['annotation']

if 'object' in data.keys():
for obj in data['object']:
if obj['name'] == class_sub:
xmin = int(float(obj['bndbox']['xmin']))
xmax = int(float(obj['bndbox']['xmax']))
ymin = int(float(obj['bndbox']['ymin']))
ymax = int(float(obj['bndbox']['ymax']))
cv.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1)

cv.imwrite(img_path, img)
```

如图所示,预测结果用黄色框表示,而XML标注的真实边界框用红色框表示。

![](https://img.php1.cn/3cd4a/1eebe/cd5/d34245582687a4e6.webp)
推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
author-avatar
命运2502901041_350
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有