Register Two Point Sets 注册两个点集

文章目录

    • Register Two Point Sets 注册两个点集
    • Visualize Gradient Descent 可视化梯度下降
    • Hyperparameter Search 超参数搜索
    • JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4类说明

原文url: https://examples.itk.org/src/registration/metricsv4/registertwopointsets/registertwopointsets

Register Two Point Sets 注册两个点集

与图像配准类似,可以对 n 维“移动”点集进行重新采样,以与“固定”点集对齐。可以使用 ITK 点集度量和 ITK 优化器来注册这两个集合。

在此示例中,我们创建两个具有任意偏移量的 itk.PointSet 表示,并选择参数以将它们与 TranslationTransform 对齐。我们使用 JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4 类来量化点集之间的差异,并使用 GradientDescentOptimizerv4 类通过修改变换参数来迭代减少这种差异。我们的示例还包括使用 matplotlib 和 itkwidgets 可视化参数表面的示例代码以及用于优化梯度下降性能的示例超参数搜索。

import os
import sys
import itertools
from math import pi, sin, cos, sqrtimport matplotlib.pyplot as plt
import numpy as npimport itk
from itkwidgets import view# 构造二个点集
# Generate two circles with a small offset
def make_circles(dimension: int = 2, offset: list = None):PointSetType = itk.PointSet[itk.F, dimension]RADIUS = 100if not offset or len(offset) != dimension:offset = [2.0] * dimensionfixed_points = PointSetType.New()moving_points = PointSetType.New()fixed_points.Initialize()moving_points.Initialize()count = 0step = 0.1for count in range(0, int(2 * pi / step) + 1):theta = count * stepfixed_point = list()fixed_point.append(RADIUS * cos(theta))for dim in range(1, dimension):fixed_point.append(RADIUS * sin(theta))fixed_points.SetPoint(count, fixed_point)moving_point = [fixed_point[dim] + offset[dim] for dim in range(0, dimension)]moving_points.SetPoint(count, moving_point)return fixed_points, moving_pointsPOINT_SET_OFFSET = [15.0, 15.0]
fixed_set, moving_set = make_circles(offset=POINT_SET_OFFSET)# Visualize point sets with matplotlibfig = plt.figure()
ax = plt.axes()n_points = fixed_set.GetNumberOfPoints()
ax.scatter([fixed_set.GetPoint(i)[0] for i in range(0, n_points)],[fixed_set.GetPoint(i)[1] for i in range(0, n_points)],
)
ax.scatter([moving_set.GetPoint(i)[0] for i in range(0, n_points)],[moving_set.GetPoint(i)[1] for i in range(0, n_points)],
)# 运行梯度下降优化
# 我们将使用 JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4 量化点集偏移,并在 10 次梯度下降迭代中最小化度量值。ExhaustiveOptimizerType = itk.ExhaustiveOptimizerv4[itk.D]
dim = 2
# Define translation parameters to update iteratively
TransformType = itk.TranslationTransform[itk.D, dim]
transform = TransformType.New()
transform.SetIdentity()PointSetType = type(fixed_set)
# Define a metric to reflect the difference between point sets
PointSetMetricType = itk.JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4[PointSetType]
metric = PointSetMetricType.New(FixedPointSet=fixed_set,MovingPointSet=moving_set,MovingTransform=transform,PointSetSigma=5.0,KernelSigma=10.0,UseAnisotropicCovariances=False,CovarianceKNeighborhood=5,EvaluationKNeighborhood=10,Alpha=1.1,
)
metric.Initialize()
# Define an estimator to help determine step sizes along each transform parameter2
ShiftScalesType = itk.RegistrationParameterScalesFromPhysicalShift[PointSetMetricType]
shift_scale_estimator = ShiftScalesType.New(Metric=metric, VirtualDomainPointSet=metric.GetVirtualTransformedPointSet(), TransformForward=True
)max_iterations = 10
# Define the gradient descent optimzer
OptimizerType = itk.GradientDescentOptimizerv4Template[itk.D]
optimizer = OptimizerType.New(Metric=metric,NumberOfIterations=max_iterations,ScalesEstimator=shift_scale_estimator,MaximumStepSizeInPhysicalUnits=8.0,MinimumConvergenceValue=-1,DoEstimateLearningRateAtEachIteration=False,DoEstimateLearningRateOnce=True,ReturnBestParametersAndValue=True,
)
iteration_data = dict()# Track gradient descent iterations with observers
def print_iteration():print(f"It: {optimizer.GetCurrentIteration()}"f" metric value: {optimizer.GetCurrentMetricValue():.6f} "# f' transform position: {list(optimizer.GetCurrentPosition())}'f" learning rate: {optimizer.GetLearningRate()}")def log_iteration():iteration_data[optimizer.GetCurrentIteration() + 1] = list(optimizer.GetCurrentPosition())optimizer.AddObserver(itk.AnyEvent(), print_iteration)
optimizer.AddObserver(itk.IterationEvent(), log_iteration)# Set first value to default transform position
iteration_data[0] = list(optimizer.GetCurrentPosition())
# Run optimization and print out results
optimizer.StartOptimization()print(f"Number of iterations: {optimizer.GetCurrentIteration() - 1}")
print(f"Moving-source final value: {optimizer.GetCurrentMetricValue()}")
print(f"Moving-source final position: {list(optimizer.GetCurrentPosition())}")
print(f"Optimizer scales: {list(optimizer.GetScales())}")
print(f"Optimizer learning rate: {optimizer.GetLearningRate()}")
print(f"Stop reason: {optimizer.GetStopConditionDescription()}")# Resample Moving Point Set 重采样移动点集
moving_inverse = metric.GetMovingTransform().GetInverseTransform()
fixed_inverse = metric.GetFixedTransform().GetInverseTransform()
transformed_fixed_set = PointSetType.New()
transformed_moving_set = PointSetType.New()for n in range(0, metric.GetNumberOfComponents()):transformed_moving_point = moving_inverse.TransformPoint(moving_set.GetPoint(n))transformed_moving_set.SetPoint(n, transformed_moving_point)transformed_fixed_point = fixed_inverse.TransformPoint(fixed_set.GetPoint(n))transformed_fixed_set.SetPoint(n, transformed_fixed_point)# Compare fixed point set with resampled moving point set to see alignment
fig = plt.figure()
ax = plt.axes()n_points = fixed_set.GetNumberOfPoints()
ax.scatter([fixed_set.GetPoint(i)[0] for i in range(0, n_points)],[fixed_set.GetPoint(i)[1] for i in range(0, n_points)],
)
ax.scatter([transformed_moving_set.GetPoint(i)[0] for i in range(0, n_points)],[transformed_moving_set.GetPoint(i)[1] for i in range(0, n_points)],
)

使用 matplotlib 可视化点集:
在这里插入图片描述

将固定点集与重采样移动点集进行比较以查看对齐情况:
在这里插入图片描述

Visualize Gradient Descent 可视化梯度下降

我们可以使用 ITK ExhaustiveOptimizerv4 类来查看优化器如何沿着变换参数和度量定义的表面移动。

# Set up the new optimizer# Create a new transform and metric for analysis
transform = TransformType.New()
transform.SetIdentity()metric = PointSetMetricType.New(FixedPointSet=fixed_set,MovingPointSet=moving_set,MovingTransform=transform,PointSetSigma=5,KernelSigma=10.0,UseAnisotropicCovariances=False,CovarianceKNeighborhood=5,EvaluationKNeighborhood=10,Alpha=1.1,
)
metric.Initialize()# Create a new observer to map out the parameter surface
optimizer.RemoveAllObservers()
optimizer = ExhaustiveOptimizerType.New(Metric=metric)# Use observers to collect points on the surface
param_space = dict()def log_exhaustive_iteration():param_space[tuple(optimizer.GetCurrentPosition())] = optimizer.GetCurrentValue()optimizer.AddObserver(itk.IterationEvent(), log_exhaustive_iteration)# Collect a moderate number of steps along each transform parameter
step_count = 25
optimizer.SetNumberOfSteps([step_count, step_count])# Step a reasonable distance along each transform parameter
scales = optimizer.GetScales()
scales.SetSize(2)scale_size = 1.0
scales.SetElement(0, scale_size)
scales.SetElement(1, scale_size)optimizer.SetScales(scales)optimizer.StartOptimization()
print(f"MinimumMetricValue: {optimizer.GetMinimumMetricValue():.4f}\t"f"MaximumMetricValue: {optimizer.GetMaximumMetricValue():.4f}\n"f"MinimumMetricValuePosition: {list(optimizer.GetMinimumMetricValuePosition())}\t"f"MaximumMetricValuePosition: {list(optimizer.GetMaximumMetricValuePosition())}\n"f"StopConditionDescription: {optimizer.GetStopConditionDescription()}\t"
)# Reformat gradient descent data to overlay on the plot
descent_x_vals = [iteration_data[i][0] for i in range(0, len(iteration_data))]
descent_y_vals = [iteration_data[i][1] for i in range(0, len(iteration_data))]# Plot the surface, extrema, and gradient descent data in a matplotlib scatter plot
fig = plt.figure()
ax = plt.axes()ax.scatter([x for (x, y) in param_space.keys()],[y for (x, y) in param_space.keys()],c=list(param_space.values()),cmap="Greens",zorder=1,
)
ax.plot(optimizer.GetMinimumMetricValuePosition()[0], optimizer.GetMinimumMetricValuePosition()[1], "kv"
)
ax.plot(optimizer.GetMaximumMetricValuePosition()[0], optimizer.GetMaximumMetricValuePosition()[1], "w^"
)for i in range(0, len(iteration_data)):ax.plot(descent_x_vals[i : i + 2], descent_y_vals[i : i + 2], "rx-")
ax.plot(descent_x_vals[0], descent_y_vals[0], "ro")
ax.plot(descent_x_vals[len(iteration_data) - 1], descent_y_vals[len(iteration_data) - 1], "bo")

在 matplotlib 散点图中绘制表面、极值和梯度下降数据:
在这里插入图片描述

我们还可以使用 itkwidgets 查看表面并将其导出为图像.

x_vals = list(set(x for (x, y) in param_space.keys()))
y_vals = list(set(y for (x, y) in param_space.keys()))x_vals.sort()
y_vals.sort(reverse=True)
array = np.array([[param_space[(x, y)] for x in x_vals] for y in y_vals])image_view = itk.GetImageViewFromArray(array)view(image_view)

Hyperparameter Search 超参数搜索

为了找到具有不同变换、度量和优化器的适当结果,通常需要比较超参数变化的结果。在此示例中,需要评估 JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4.PointSetSigma 参数和 GradientDescentOptimizerv4.DoEstimateLearningRate 参数的不同值的性能。梯度下降迭代数据沿二维散点图绘制,以比较并选择产生最佳性能的超参数组合。

# Index values for gradient descent logging
FINAL_OPT_INDEX = 0
DESCENT_DATA_INDEX = 1hyper_data = dict()
final_optimizers = dict()# sigma must be sufficiently large to avoid negative entropy results
point_set_sigmas = (1.0, 2.5, 5.0, 10.0, 20.0, 50.0)# Compare performance with repeated or one-time learning rate estimation
estimate_rates = [(False, False), (False, True), (True, False)]# Run gradient descent optimization for each combination of hyperparameters
for trial_values in itertools.product(point_set_sigmas, estimate_rates):hyper_data[trial_values] = dict()(point_set_sigma, est_rate) = trial_valuesfixed_set, moving_set = make_circles(offset=POINT_SET_OFFSET)transform = TransformType.New()transform.SetIdentity()metric = PointSetMetricType.New(FixedPointSet=fixed_set,MovingPointSet=moving_set,PointSetSigma=point_set_sigma,KernelSigma=10.0,UseAnisotropicCovariances=False,CovarianceKNeighborhood=5,EvaluationKNeighborhood=10,MovingTransform=transform,Alpha=1.1,)shift_scale_estimator = ShiftScalesType.New(Metric=metric, VirtualDomainPointSet=metric.GetVirtualTransformedPointSet())metric.Initialize()optimizer = OptimizerType.New(Metric=metric,NumberOfIterations=100,MaximumStepSizeInPhysicalUnits=3.0,MinimumConvergenceValue=-1,DoEstimateLearningRateOnce=est_rate[0],DoEstimateLearningRateAtEachIteration=est_rate[1],LearningRate=1e6,  # Ignored if either est_rate argument is TrueReturnBestParametersAndValue=False,)optimizer.SetScalesEstimator(shift_scale_estimator)def log_hyper_iteration_data():hyper_data[trial_values][optimizer.GetCurrentIteration()] = round(optimizer.GetCurrentMetricValue(), 8)optimizer.AddObserver(itk.IterationEvent(), log_hyper_iteration_data)optimizer.StartOptimization()final_optimizers[trial_values] = optimizer# Print results for each set of hyperparameters
print("PS_sigma\test once/each:\tfinal index\tfinal metric")
for trial_values in itertools.product(point_set_sigmas, estimate_rates):print(f"{trial_values[0]}\t\t{trial_values[1]}:\t\t"f"{final_optimizers[trial_values].GetCurrentIteration()}\t"f"{final_optimizers[trial_values].GetCurrentMetricValue():10.8f}")

我们可以使用 matplotlib 子图和条形图来比较每组超参数的梯度下降性能和最终度量值。在这个例子中,我们看到,一次估计学习率通常会随着时间的推移带来最佳性能,而每次迭代都估计学习率可能会阻止梯度下降有效收敛。提供最佳和最一致度量值的超参数集是 PointSetSigma=5.0 和 DoEstimateLearningRateOnce=True,这是我们在本笔记本中使用的值。

# Visualize metric over gradient descent iterations as matplotlib subplots.f, axn = plt.subplots(len(point_set_sigmas), len(estimate_rates), sharex=True)for (i, j) in [(i, j) for i in range(0, len(point_set_sigmas)) for j in range(0, len(estimate_rates))]:axn[i, j].scatter(x=list(hyper_data[point_set_sigmas[i], estimate_rates[j]].keys())[1:],y=list(hyper_data[point_set_sigmas[i], estimate_rates[j]].values())[1:],)axn[i, j].set_title(f"sigma={point_set_sigmas[i]},est={estimate_rates[j]}")axn[i, j].set_ylim(-0.08, 0)plt.subplots_adjust(top=5, bottom=1, right=5)
plt.show()# Compare final metric magnitudes
fig = plt.figure()
ax = fig.gca()labels = [f'{round(sig,0)}{"T" if est0 else "F"}{"T" if est1 else "F"}'for (sig, (est0, est1)) in itertools.product(point_set_sigmas, estimate_rates)
]vals = [final_optimizers[trial_values].GetCurrentMetricValue()for trial_values in itertools.product(point_set_sigmas, estimate_rates)
]ax.bar(labels, vals)
plt.show()

将梯度下降迭代中的度量可视化为 matplotlib 子图:
在这里插入图片描述

比较最终的度量值:

在这里插入图片描述

JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4类说明

url : https://itk.org/Doxygen/html/classitk_1_1JensenHavrdaCharvatTsallisPointSetToPointSetMetricv4.html

Jensen Havrda Charvat Tsallis 点集度量的实现。

给定指定的变换和方向,此类使用 Havrda-Charvat-Tsallis 熵族(众所周知的香农熵的泛化)和 Jensen 散度计算“固定”和“移动”点集对之间的值和导数。另一种看待信息理论度量族的方式是,这些点用于构建相应的可能密度函数。

此外,我们允许用户调用数据的流形 parzen 窗口。我们实际上可以计算每个点的协方差矩阵,以反映定位点集结构,而不是将各向同性高斯与每个点相关联。

为了加快度量计算速度,我们使用 ITK 的 K-d 树仅查询给定邻域的度量值。考虑到可能只需要一小部分点就可以很好地近似单个点的度量值,这可能是有道理的。所以我们要做的是转换每个点(使用指定的变换)并从转换后的点构建 k-d 树。

由 Nicholas J. Tustison、James C. Gee 在 Insight Journal 论文中贡献:https://www.insight-journal.org/browse/publication/317

注意
Tustison 等人在 2011 年报告的原始工作可选地采用了正则化项来防止移动点集合并到单个点位置。然而,在配准框架内,该术语的实用性有限,因为这种正则化由变换和任何显式正则化项决定。还请注意,已发表的工作适用于多个点集,每个点集都可以被视为“移动”,但这也不适用于此特定实现。

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

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

相关文章

【AI驱动TDSQL-C Serverless数据库技术实战】 AI电商数据分析系统——探索Text2SQL下AI驱动代码进行实际业务

目录 一、Text2SQL简介二、基于TDSQL-C Serverless的Text2SQL实战2.1、程序流程图2.2、实践流程2.2.1、配置TDSQL-C2.2.2、部署LLAMA模型2.2.3、本地依赖安装2.2.4、应用构建 2.3、运行效果 三、Text2SQL下的AI驱动 Text2SQL 是一种将自然语言查询转换为 SQL 查询的技术&#x…

中航资本:沪市主板代码以几开头?各板块开头代码是多少

各板块开始代码: 场内商场: 1、沪市主板:股票代码以600、601、603、605开始。 60开始的股票都是在上海证券交易所上市的股票。 600开始是上海证券交易所上市的一般股票,601开始的股票是主板股票,一般是大盘股蓝筹股…

Hi.Events —— 您的全方位活动管理与票务平台

大家好!今天给大家介绍一个超厉害的开源项目:Hi.Events,这是一个功能丰富的自托管活动管理和票务平台,无论是会议还是俱乐部活动,它都能帮你轻松搞定! 项目介绍 Hi.Events是一款功能丰富、自托管的开源活动…

学习Webpack中图片-JS-Vue-plugin

目录 图片文件资源模块类型 JS文件babel命令行使用babel-loaderbabel-preset Vue文件vue-loadervue/compiler-sfc pluginCleanWebpackPluginHtmlWebpackPluginDefinePlugin 图片文件 需要先在项目中使用图片,比较常见的使用图片的方式是两种: img元素&…

关于git分支冲突问题

什么是冲突 在Git中,冲突是指两个或多个开发者对同一文件统一部份进行了不同的修改,并且在合并这些修改时,Git无法自动确定应该采用哪种修改而产生的情况。 分支冲突 如何出现并解决 在一个版本时,有一个master分支&#xff0c…

如何使用WinRAR锁定压缩文件,防止文件被修改或删除?

在日常工作中,我们经常需要分享压缩文件,但也可能面临文件被修改或删除的风险。想要保护压缩文件的完整性,不妨使用WinRAR提供的“锁定压缩文件”功能。这个功能可以防止文件被意外更改或删除,确保压缩文件保持原样。下面一起来看…

【Android 14源码分析】Activity启动流程-1

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命

在我们发布 Llama 3.1 模型群后的两个月内,包括 405B - 第一个开放的前沿级人工智能模型在内,它们所产生的影响令我们兴奋不已。 虽然这些模型非常强大,但我们也认识到,使用它们进行构建需要大量的计算资源和专业知识。 我们也听到…

Meta首款多模态Llama 3.2开源:支持图像推理,还有可在手机上运行的版本 | LeetTalk Daily...

“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 Meta最近推出的Llama Stack的发布标志着一个重要的里程碑。这一新技术的推出不仅为开发者提供了强大的多模态能力,还为企业和初…

安卓13设置删除网络和互联网选项 android13隐藏设置删除网络和互联网选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1修改方法14.2修改方法25.编译6.彩蛋1.前言 有些客户不想让用户修改默认的网络配置,禁止用户进入里面调整网络相关的配置。 2.问题分析 像这个问题,我们有好几种方法去处理,这种需求一般…

IDEA Dependency Analyzer 分析 maven 项目包的依赖

一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范(Java Bean Validation,简称 JSR 380),它并没有具体的实现,它的常用实现,是hibernate-validator。…

匿名管道 Linux

管道 首先自己要用用户层缓冲区,还得把用户层缓冲区拷贝到管道里,(从键盘里输入数据到用户层缓冲区里面),然后用户层缓冲区通过系统调用(write)写到管道里,然后再通过read系统调用&…

[leetcode] 70. 爬楼梯

文章目录 题目描述解题方法动态规划java代码复杂度分析 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释&#xff1…

城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例

1 引言 1.1研究背景、目的与意义 1.1.1研究背景 城市轨道交通系统是现代城市的重要交通方式之一,随着城市化进程的加速和人口增长,轨道交通系统的客流量不断增加。因此,轨道交通部门和相关企业需要对客流数据进行实时监测和分析&#xff0…

BERT训练之数据集处理(代码实现)

目录 1读取文件数据 2.生成下一句预测任务的数据 3.预测下一个句子 4.生成遮蔽语言模型任务的数据 5.从词元中得到遮掩的数据 6.将文本转化为预训练数据集 7.封装函数类 8.调用 import os import random import torch import dltools 1读取文件数据 def _read_wiki(data_d…

可视化是工业互联网的核心技术之一,都有哪些应用场景?

一、工业互联网是什么,发展的来胧去脉 工业互联网是指利用互联网技术和物联网技术,将工业生产中的各种设备、机器、传感器等进行互联互通,实现信息的实时采集、传输和分析,从而实现生产过程的智能化、自动化和高效化。 工业互联网…

工业交换机一键重启的好处

在当今高度自动化和智能化的工业环境中,工业交换机作为网络系统中至关重要的一环,其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行,一键重启功能应运而生,并呈现出诸多显著的好处。 首先&am…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】

将 Mixture-of-Experts 应用于 Transformers 既然我们已经研究了条件计算的早期工作,那么我们就可以看看 MoE 在变换器架构中的一些应用。 如今,基于 MoE 的 LLM 架构(如 Mixtral [13] 或 Grok)已广受欢迎,但 MoE 在语…

【Python】数据可视化之点线图

目录 散点图 气泡图 时序图 关系图 ​​​​​​​ 散点图 Scatterplot(散点图)是一种用于展示两个变量之间关系的图表类型。在散点图中,每个观测值(或数据点)都被表示为一个点,其中横轴(…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面,等小米驱动下载完成后,解压此驱动文件压缩包。 5、小米USB驱动安装方法:右击“计算机”,从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中,展开“设备管理器”项&…