Python 参数配置使用 XML 文件的教程:轻松管理你的项目配置

Python 参数配置使用 XML 文件的教程:轻松管理你的项目配置


一句话总结:当配置项存储在外部文件(如 XML、JSON)时,修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数,无需更改源代码,从而提升开发效率和代码可维护性。


1. 为什么选择 XML 配置文件

XML 配置文件具有多种优点,如良好的扩展性、可读性和兼容性等。然而,最重要的优势在于其简洁和优雅的结构。

在使用 Python 编写机器学习算法或其他算法时,99%的情况需要调用库并使用他人封装的代码。这过程中常常涉及文件路径、参数配置等问题。当算法开发到一定程度(基本不需要修改大的结构后),此时引入 XML 配置文件来管理输入输出文件及相关参数,不仅方便参数的调整,还简化了模型的打包过程。

以我自己的一个代码项目为例,使用 RANSAC 和 ICP 进行点云配准。在引入 XML 配置文件之前,代码如下:

if __name__ == "__main__":# 设置距离阈值voxel_size = 5distance_threshold = 4print(f"Using voxel size: {voxel_size}")print(f"Using distance threshold: {distance_threshold}")# 加载模型pcd_mri = load_and_convert_to_point_cloud("mri1.stl", num_points=8000)pcd_scan = preprocess_point_cloud(load_and_convert_to_point_cloud("scan2.stl", num_points=10000), voxel_size)pcd_helmet = load_and_convert_to_point_cloud("helmet2.stl", num_points=6000)   ...

虽然将需要修改的路径和参数集中在代码前部是一种良好的习惯,便于自己维护和调参,但对于他人来说,代码后部分仍然存在许多需要调整的参数:

# 使用RANSAC进行 mri -> scan 粗配准
result_ransac_mri_to_scan = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(pcd_mri_down, pcd_scan_down, fpfh_mri, fpfh_scan, True,distance_threshold,o3d.pipelines.registration.TransformationEstimationPointToPoint(False),3,[o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(0.8),o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(distance_threshold)],o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500)
)# 使用RANSAC进行 helmet -> scan 粗配准
result_ransac_helmet_to_scan = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(pcd_helmet_down, pcd_scan_down, fpfh_helmet, fpfh_scan, True,distance_threshold,o3d.pipelines.registration.TransformationEstimationPointToPoint(False),3,[o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(0.8),o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(distance_threshold)],o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500)
)

这些参数通常已经调试好,且不需要频繁修改,但其他开发者可能不清楚这些参数的具体含义和设置。因此,使用 XML 配置文件来规范化参数设置,是一种有效的解决方案。

2. 使用 XML 配置文件存储参数

通过一个 XML 配置文件来存储配准相关的参数,可以显著提升代码的可维护性和灵活性。以下是一个示例配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<config><Preprocessing><VoxelSize>5.0</VoxelSize></Preprocessing><Alignment><DistanceThreshold>4.0</DistanceThreshold></Alignment><ModelFiles><MRI>mri_model.stl</MRI><Scan>scan_model.stl</Scan></ModelFiles><NumPoints><MRI>8000</MRI><Scan>10000</Scan></NumPoints>
</config>

3. 解析 XML 文件并提取配置参数

使用 Python 的 xml.etree.ElementTree 库,可以轻松解析 XML 文件并提取所需的配置参数。以下是示例代码:

import xml.etree.ElementTree as ET# 从 XML 文件中加载参数
def load_parameters_from_xml(xml_file):tree = ET.parse(xml_file)root = tree.getroot()params = {'voxel_size': float(root.find('Preprocessing/VoxelSize').text),'distance_threshold': float(root.find('Alignment/DistanceThreshold').text),'model_files': {'mri': root.find('ModelFiles/MRI').text,'scan': root.find('ModelFiles/Scan').text,},'num_points': {'mri': int(root.find('NumPoints/MRI').text),'scan': int(root.find('NumPoints/Scan').text),}}return params

这样一来,代码不仅更加简洁优雅,还方便了他人的使用和维护。

4. 保存结果到 XML 文件

同样地,输出结果也可以通过 XML 文件进行保存。只要是可以 print 出来的内容,都可以使用 XML 来存储。这一方法的好处在于,若你的算法需要被集成到某个框架中,其他人也可以轻松通过读取 XML 文件来实现输入输出接口。

def save_results_to_xml(file_name, voxel_size, distance_threshold, ransac_results, icp_results):root = ET.Element("Results")# 添加基本参数parameters = ET.SubElement(root, "Parameters")ET.SubElement(parameters, "VoxelSize").text = str(voxel_size)ET.SubElement(parameters, "DistanceThreshold").text = str(distance_threshold)# 添加 RANSAC 和 ICP 结果# 省略具体的添加过程,最后美化 XML 并写入文件with open(file_name, "w", encoding="utf-8") as f:f.write(pretty_xml)

5. 完整示例代码

以下是最终的完整示例代码,展示了如何使用 XML 配置文件来管理参数,并进行点云配准:

if __name__ == "__main__":try:import osimport sysBASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))xml_file_path = os.path.join(BASE_DIR, 'AlignPoint_input.xml')params = load_parameters_from_xml(xml_file_path)voxel_size = params['voxel_size']distance_threshold = params['distance_threshold']# 加载和预处理点云mri_file_path = os.path.join(BASE_DIR, params['model_files']['mri'])scan_file_path = os.path.join(BASE_DIR, params['model_files']['scan'])pcd_mri = load_and_convert_to_point_cloud(mri_file_path, params['num_points']['mri'])pcd_scan = preprocess_point_cloud(load_and_convert_to_point_cloud(scan_file_path, params['num_points']['scan']), voxel_size)# 计算 FPFH 特征和下采样点云pcd_mri_down, fpfh_mri = compute_fpfh_features(pcd_mri, voxel_size)pcd_scan_down, fpfh_scan = compute_fpfh_features(pcd_scan, voxel_size)# 执行 RANSAC 和 ICP 配准# ...# 保存结果到 XML 文件save_results_to_xml("AlignPoint_output.xml", voxel_size, distance_threshold, ransac_results, icp_results)# 可视化对齐结果visualize_alignment(pcd_mri, pcd_scan, result_icp_mri_to_scan.transformation)except Exception as e:print("An error occurred:", e)with open("error_log.txt", "w") as f:f.write(str(e))

OVER!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 MySQL 启动失败与大小写问题,重置数据库

技术文档&#xff1a;解决 MySQL 启动失败与大小写问题&#xff0c;重置数据库 1. 问题背景 在使用 MySQL 时&#xff0c;可能遇到以下问题&#xff1a; MySQL 启动失败&#xff0c;日志显示 “permission denied” 或 “Can’t create directory” 错误。MySQL 在修改配置文…

python webdriver-manager 实现selenium 免下载安装webdriver

python webdriver-manager 实现selenium 免下载安装webdriver selenium在自动化测试中,通常需要使用浏览器驱动来与浏览器进行交互。然而,手动下载、安装、以及管理这些驱动非常麻烦,尤其是当驱动版本频繁更新时。为此,webdriver-manager库提供了一个极简的方案,自动帮我…

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时&#xff0c;那种既兴奋又困惑的心情吗&#xff1f;我是从一个对AI一知半解的普通用户&#xff0c;逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就&#xff0c;而是通过不断的探索和实践&#xff0c;掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目录 柱梁板标准柱角柱构造柱柱齐墙边绘制梁绘制楼板 柱梁板 标准柱 绘制标准柱&#xff1a; ①&#xff1a;点选插入柱子②&#xff1a;沿着一根轴线布置柱子③&#xff1a;指定的矩形区域内的轴线交点插入柱子 替换现有柱子&#xff1a;选择替换之后的柱子形状&#x…

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现&#xff1a; 1、存储结构出错&#xff1b; 2、数据删除&#xff1b; 3、文件系统格式化&#xff1b; 4、其他原因数据丢失。 UNIX系统常见故障解决方案&#xff1a; 1、检测UNIX系统故障涉及的设备是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

桥接模式的理解和实践

桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又称桥梁模式&#xff0c;是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立地进行变化&#xff0c;从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

HTML综合

一.HTML的初始结构 <!DOCTYPE html> <html lang"en"><head><!-- 设置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置网页…

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强)

二维码数据集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco标注&#xff0c;3044张各种二维码原始图片&#xff08;未图像增强&#xff09; 数据集分割 训练组70&#xff05; 2132图片 有效集20&#xff05; 607图片 测试集10&#xff05; 305图…

Python爬虫技术的最新发展

在互联网的海洋中&#xff0c;数据就像是一颗颗珍珠&#xff0c;而爬虫技术就是我们手中的潜水艇。2024年&#xff0c;爬虫技术有了哪些新花样&#xff1f;让我们一起潜入这个话题&#xff0c;看看最新的发展和趋势。 1. 异步爬虫&#xff1a;速度与激情 随着现代Web应用的复…

用豆包MarsCode IDE,从0到1画出精美数据大屏!

豆包MarsCode IDE 是一个云端 AI IDE 平台&#xff0c;通过内置的 AI 编程助手&#xff0c;开箱即用的开发环境&#xff0c;可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工程师&#xff0c;今天想尝试利用豆包MarsCode IDE&#xff0c;选择 Vue Echarts 创建一个…

游戏引擎学习第42天

仓库: https://gitee.com/mrxiao_com/2d_game 简介 目前我们正在研究的内容是如何构建一个基本的游戏引擎。我们将深入了解游戏开发的每一个环节&#xff0c;从最基础的技术实现到高级的游戏编程。 角色移动代码 我们主要讨论的是角色的移动代码。我一直希望能够使用一些基…

Redis是什么?Redis和MongoDB的区别在那里?

Redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。以下是关于Redis的详细介绍&#xff1a; 一、数据结构支持 字符串&#xff08;String&#xff09; 这是Redis最…

计算机网络中的三大交换技术详解与实现

目录 计算机网络中的三大交换技术详解与实现1. 计算机网络中的交换技术概述1.1 交换技术的意义1.2 三大交换技术简介 2. 电路交换技术2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析 3. 分组交换技术3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析 4. 报文交换技术4.1 …

[Python] 操作redis使用pipeline保证原子性

1. pipeline介绍 在Python中使用Redis的Pipeline可以使多个Redis命令在一个请求中批量执行&#xff0c;从而提高效率。redis-py库提供了对Redis Pipeline的支持&#xff0c;下面是一个基本的例子&#xff1a; 首先&#xff0c;确保你已安装了redis库&#xff1a; pip instal…

Bug 解决 无法正常登录或获取不到用户信息

目录 1、跨域问题 2、后端代码问题 3、前端代码问题 我相信登录这个功能是很多人做项目时候遇到第一个槛&#xff01; **看起来好像很简单的登录功能&#xff0c;实际上还是有点坑的&#xff0c;比如明明账号密码都填写正确了&#xff0c;**为什么登录后请求接口又说我没登…

论文翻译 | ChunkRAG: Novel LLM-Chunk Filtering Method for RAG Systems

摘要 使用大型语言模型&#xff08;LLM&#xff09;的检索-增强生成&#xff08;RAG&#xff09;系统经常由于检索不相关或松散相关的信息而生成不准确的响应。现有的在文档级别操作的方法无法有效地过滤掉此类内容。我们提出了LLM驱动的块过滤&#xff0c;ChunkRAG&#xff0…

Maven(生命周期、POM、模块化、聚合、依赖管理)详解

Maven构建项目的生命周期 在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试&#xff0c;部署等工作&#xff0c;这个过程就是项目构建的生命周期。虽然大家都在不停的做构建工作&…

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…