当前位置: 首页 > news >正文

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.lryc.cn/news/505974.html

相关文章:

  • [SV]如何在UVM环境中使用C Model
  • 十大开源的Cursor AI替代方案
  • 相机光学(四十六)——镜头马达(VCM)控制策略模式
  • 专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
  • 了解ARM的千兆以太网——RK3588
  • JavaFX使用jfoenix的UI控件
  • Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
  • 单片机:实现教学上下课的自动打玲(附带源码)
  • 进程通信方式---共享映射区(无血缘关系用的)
  • 深度学习实战智能交通计数
  • 【MySQL】MySQL表的操作
  • Redis篇-12--数据结构篇4--Hash内存模型(数组,链表,压缩列表zipList,哈希表,短结构)
  • 二、windows环境下vscode使用wsl教程
  • Qwen2-VL微调体验
  • 论文的模拟环境和实验环境
  • MySQL EXPLAIN 详解:一眼看懂查询计划
  • 自动呼入机器人如何与人工客服进行无缝切换?
  • 二分类模型的性能评价指标
  • 鸿蒙操作系统简介
  • 单片机:实现蜂鸣器数码管的显示(附带源码)
  • C语言期末复习笔记(上)
  • HarmonyOS 实时监听与获取 Wi-Fi 信息
  • Unity超优质动态天气插件(含一年四季各种天气变化,可用于单机局域网VR)
  • 1 JVM JDK JRE之间的区别以及使用字节码的好处
  • 【网络安全】网站常见安全漏洞—服务端漏洞介绍
  • MAPTR:在线矢量化高精地图构建的结构化建模与学习(2208)
  • 基于容器的云原生,让业务更自由地翱翔云端
  • 大屏开源项目go-view二次开发2----半环形控件(C#)
  • web:pc端企业微信登录-vue版
  • OpenGL ES 01 渲染一个四边形