热门标签 | 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)
推荐阅读
  • 利用Python实现自动化群发邮件
    本文详细介绍如何使用Python语言来实现邮件的自动群发功能,适合希望提高工作效率的技术爱好者和开发者。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • 在Python编程学习过程中,许多初学者常遇到各种功能实现难题。虽然这些问题往往并不复杂,但找到高效解决方案却能显著提升编程效率。本文将介绍一个名为‘30-seconds-of-python’的优质资源,帮助大家快速掌握实用的Python技巧。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 并发环境下的集合元素移除技巧与注意事项
    探讨在并发编程中对集合进行元素移除操作时应注意的关键点,包括使用迭代器的安全方法以及避免常见错误。 ... [详细]
  • python开发mysql:单表查询&多表查询
    一单表查询,以下是表内容二多表查询,一下是表内容三总结&表创建过程单 ... [详细]
  • 深入解析MySQL查询优化:特定类型查询的高级策略
    本文详细探讨了MySQL中特定类型查询的优化方法,包括COUNT()查询、关联查询、LIMIT分页及UNION查询的优化技巧,旨在提高数据库查询效率。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中安装MySQL 5.5.37时遇到的启动失败和PID文件问题,并提供了详细的解决方案,包括日志分析、权限检查等步骤。 ... [详细]
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社区 版权所有