Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署

当配置项存储在外部文件(如 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/pingmian/64337.shtml

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

相关文章

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统&#xff08;01&#xff09;- 架构分析 Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角…

【kubernetes】资源管理方式

目录 1. 说明2. 命令式对象管理3. 命令式对象配置4. 声明式对象配置5. 三种方式的对比 1. 说明 1.在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;资源管理是一个核心功能&#xff0c;它允许用户通过操作资源来管理Kubernetes集群。2.Kubernetes将所有的内容都抽象为资…

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1&#xff1a;git merge&#xff08;保留分支结构&#xff09;方法 2&#xff1a;git rebase&#xff08;线性合并提交历史&#xff09;直接在master分支执行git merge br_feature&#xff0c;再 执行 git pull --reba…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构&#xff0c;可方便地与其他FMC板卡实现高速互联&#xff0c;可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例&#xff0c;实操讲解触摸一体机怎样快速增加大模型语音交互功能&#xff0c;使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音&#xff0c;将语音数据传输…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…

英伟达垄断?中国芯片如何破局?

近期&#xff0c;全球AI芯片巨头英伟达被曝遭遇中国反垄断调查&#xff0c;引发行业广泛关注。 【图片来源于网络&#xff0c;侵删】 众所周知&#xff0c;在人工智能的浪潮中&#xff0c;英伟达无疑是全球AI算力市场的领头羊。在芯片领域&#xff0c;尤其是 GPU 市场&#xff…

用户体验测试与专项测试常用工具

用户体验&#xff08;User Experience, UX&#xff09;测试关注的是用户在使用软件产品时的主观感受。这包括用户界面的易用性、交互设计的友好性以及整体的满意度。UX测试不仅能够帮助开发人员发现产品中的潜在问题&#xff0c;还能为企业提供改善产品体验的建议。 功能亮点 …

40 基于单片机的温湿度检测判断系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用dht11温湿度传感器检测温湿度&#xff0c; 通过lcd1602显示屏各个参数&#xff0c;四个按键分别可以增加温湿度的阈值&#xff0c; 如果超过阈值&#xff0c;则…

基于Matlab实现三维地球模型(源码)

利用MATLAB强大的图形处理能力和数学计算功能构建的可视化应用。这个模型允许用户在三维空间中观察地球&#xff0c;并且能够动态地旋转地球模型&#xff0c;同时还可以模拟卫星在其周围的运动轨迹&#xff0c;为学习地球科学、天文学以及航天工程等领域提供了一个直观的教学工…

JavaSe部分总结

我们先来了解一下Java语言,JavaSE是Java编程语言的标准版,主要是来学习Java的基本语法,书写方式,以及一些简单的逻辑循环和判断,包括一些关键字,特殊类(抽象类),特殊的方法(static修饰的方法,final修饰的方法)等等,最重要的是Java语言是比较C语言和C语言是比较简单的,Java是面向…

适用于 Windows 的 Podman

适用于 Windows 的 Podman 虽然“容器是 Linux”&#xff0c;但 Podman 也可以在 Mac 和 Windows 上运行&#xff0c;它提供原生 CLI 并嵌入来宾 Linux 系统来启动您的容器。此 guest 称为 Podman 计算机&#xff0c;并使用命令进行管理。在 Windows 上&#xff0c;每台 Podma…

Linux中 vim 常用命令大全详细讲解

文章目录 前言一、Vim 基本操作 &#x1f579;️1.1 打开或创建1.2 退出编辑1.3 模式切换 二、Vim 光标移动命令 ↕️2.1 基本移动2.2 行内移动2.3. 单词移动2.4. 页面移动2.5. 行跳转 三、Vim 文本编辑命令 &#x1f4cb;3.1 插入和删除3.2 复制、剪切与粘贴3.3 替换与修改 四…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆&#xff0c;用以运送各种汽油、柴油、原油等油品&#xff0c;运输危险系数大&#xff0c;而且由于油罐车需要经常行驶在城区道路&#xff0c;为城市各个加油站点、企业工厂运输补充所需油料&#xff0c;因此也是危化品运输车辆的重点监测和管控对象…

联想至像M3070DW打印机连接手机方法

首先&#xff0c;按打印机上的“功能”键&#xff0c;上翻页翻到第4项“网络”按“OK”键进入&#xff1b; 点进去之后&#xff0c;再按下翻页翻到第3项“安装向导”&#xff0c;按“OK”键进入&#xff1b; 然后&#xff0c;选择我们要连接的WiFi并输入WiFi密码&#xff0c; 输…

双亲委派机制是Java类加载器的一种工作模式

双亲委派机制是Java类加载器的一种工作模式&#xff0c;确保了类加载的一致性和安全性。以下是对双亲委派机制的详细解析&#xff1a; 一、定义与工作原理 双亲委派机制&#xff08;Parent Delegation Model&#xff09;要求除了顶层的启动类加载器外&#xff0c;其余的类加载…

Qt 使用modbus协议

Qt 框架下 使用modbus协议 一&#xff0c;使用Qt原生的 QModbusClient &#xff0c;比如QModbusTcpClient 1&#xff0c;因为modbus的读写 需要在同一个线程中&#xff0c;所以需要在主线程中利用moveToThread的方式&#xff0c;将业务逻辑封装到 子线程中。 2&#xff0c;m…

C语言中怎样将NULL定义为空指针?空指针的具体值其实为0哈,即地址值为0的指针为空指针。

用下面这条命令即可&#xff1a; #define NULL (void *)0下面是对这句代码的解释&#xff1a; #define NULL (void *)01. #define 的作用 #define 是一个预处理指令&#xff0c;用于定义宏。宏替换发生在编译前的预处理阶段&#xff0c;所有出现 NULL 的地方都会被替换为 (v…

Linux中的cp命令:使用、原理与源码分析

在Linux系统中&#xff0c;cp命令是最常用的命令之一&#xff0c;用于复制文件或目录。无论是日常的文件管理&#xff0c;还是系统维护&#xff0c;cp命令都扮演着重要的角色。本文将深入探讨cp命令的使用方法、工作原理&#xff0c;并从源码层面分析其实现细节。 1. cp命令的…