• 文章转载:微信公众号「机器学习炼丹术」
  • 作者:炼丹兄(已授权)
  • 联系方式:微信cyx645016617(欢迎交流)
  • 论文题目:‘Unsupervised Learning for Fast Probabilistic Diffeomorphic Registration’

0 综述

  • 本文提出了一个概率生成模型,并给出了一种基于无监督学习的推理算法卷积神经网络
  • 论文中对一个三维脑配准任务进行了验证,并提供了一个实验结果;
  • 论文的方法在提供微分同胚的同时,且具有最先进的精度和非常快的运行速度。

1 微分同胚

Our approach results in state of the art accuracy and very fast runtimes, while providing diffeomorphic guarantees.

这片论文提供了SOTA的配准方式,并且使用了diffeomorphic(微分同胚)。

  • diffeomorphic 微分同胚

  • deformation field 变形场

  • ordinary differential equation (ODE) 常微分方程

  • 假设两个三维图片满足:\(\phi = R^3 \rightarrow R^3\),表示从一个图片的坐标到另外一个图片的坐标的变形场

  • 这个变形场的定义为:

  • 假设我们拥有了\(t\in [0,1]\)的所有静态速度场,那么我们就可以integrate(整合)所有的速度场,从而从\(\phi^{(0)}\)推断出\(\phi^{(1)}\)的图片。(也就是0时刻的位移厂推出1时刻的位移场);

关于微分同胚,经过李代数和群论的推到后的结论:

总的来说,我感觉就是对于部分图片变化太大,所以可能不存在静态位移场,所以用速度场来计算位移场。而这个微分同胚的推断,通过李代数和群论,得到的结论如下

\(\phi^{(1)} = \phi^{(1/2)} composition \phi^{(1/2)}\)

这部分我也不太能说明具体的含义,在voxelmorph的github代码中体现为:

class VecInt(nn.Module):
"""
Integrates a vector field via scaling and squaring.
""" def __init__(self, inshape, nsteps):
super().__init__() assert nsteps >= 0, 'nsteps should be >= 0, found: %d' % nsteps
self.nsteps = nsteps
self.scale = 1.0 / (2 ** self.nsteps)
self.transformer = SpatialTransformer(inshape) def forward(self, vec):
vec = vec * self.scale
for _ in range(self.nsteps):
vec = vec + self.transformer(vec, vec)
return vec

重点看最后一行,vec = vec + self.transformer(vec,vec),这个刚好对应上面的:

这一块我的理解也就止步于此,进一步的可能需要李代数和群论的知识把。

2 模型结构

2.1 简单

模型结构不复杂:

我直接在代码中标记注释,来学习这个模型结构的过程。

    def forward(self, source, target, registration=False):
'''
Parameters:
source: Source image tensor.
target: Target image tensor.
registration: Return transformed image and flow. Default is False.
''' # 先把fixed和moving两个图片拼接起来,放到Unet模型中,提取中一个特征
x = torch.cat([source, target], dim=1)
x = self.unet_model(x) # 把特征转换成速度场
flow_field = self.flow(x) # 对速度场做下采样
pos_flow = flow_field
if self.resize:
pos_flow = self.resize(pos_flow) preint_flow = pos_flow # 这个是如果使用了双向配准的话
neg_flow = -pos_flow if self.bidir else None # 微分同胚的整合
if self.integrate:
pos_flow = self.integrate(pos_flow)
neg_flow = self.integrate(neg_flow) if self.bidir else None # 把尺寸恢复到原来的尺寸
if self.fullsize:
pos_flow = self.fullsize(pos_flow)
neg_flow = self.fullsize(neg_flow) if self.bidir else None # 计算这个速度场作用在moving上的结果,如果使用了双向配准,则还需要把速度场反向作用在fixed图片上
y_source = self.transformer(source, pos_flow)
y_target = self.transformer(target, neg_flow) if self.bidir else None # return non-integrated flow field if training
if not registration:
return (y_source, y_target, preint_flow) if self.bidir else (y_source, preint_flow)
else:
return y_source, pos_flow

整个网络也不难理解,其实这个voxelmorph代码中已经使用了微分同胚和双向配准的方案,目前使用变分推断的prob-voxelmorph模型github仓库中作者还没有提供torch的代码,所以目前还没有这个部分。

关于voxelmorph先介绍这么多,个人的心得为:

  • 微分同胚一定要有,不然很容易不收敛,建议使用默认的参数7,把一个时间间隔划分成8份;
  • 双向配准的效果还不确定。

最新文章

  1. 简单配置 nginx 反向代理
  2. ttf,eot,woff,svg,字体格式介绍及使用方法
  3. js入门篇之Math对象
  4. 低信噪比的HTML5优化
  5. jquery.validate ajax提交
  6. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)
  7. sql查询,如何增加一列
  8. Mysql varchar大小长度问题介绍
  9. 学习IOS需要知道的事
  10. CodeForces 689C  Mike and Chocolate Thieves
  11. robots.txt禁止搜索引擎收录
  12. magento删除数据
  13. 【自制工具类】struts返回json数据包装格式类
  14. 四个常用的 Rewrite 使用范例
  15. ubuntu Pycharm 2017 3.3 Active
  16. [JSOI2008]Blue Mary开公司[李超线段树]
  17. ECMAScript 6 新特性-set。const
  18. node的安装及基本使用!
  19. Android ListView的item背景色设置以及item点击无响应等相关问题
  20. Java线程相关的热门面试题

热门文章

  1. [视频] 使用 JavaCV 来显示和保存来自摄像头的视频
  2. DNS域名解析10步
  3. input composition event All In One
  4. TypeScript enum 枚举实现原理
  5. ws & websocket & 掉线重连
  6. Flutter: SearchDelegate 委托showSearch定义搜索页面的内容
  7. Masterboxan INC:OPEC+达成产量协议 产油联盟内部分歧逐步加大
  8. 「NGK每日快讯」12.4日NGK公链第31期官方快讯!
  9. 内存包装类 Memory 和 Span 相关类型
  10. Winform 判断打印机是否可用,实现设置默认打印机功能