前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >医学图像配准 | Voxelmorph 微分同胚 | MICCAI2019

医学图像配准 | Voxelmorph 微分同胚 | MICCAI2019

作者头像
机器学习炼丹术
发布2021-03-22 10:50:55
2.2K0
发布2021-03-22 10:50:55
举报

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代码中体现为:

代码语言:javascript
复制
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 简单

模型结构不复杂:

  • 两个图片先做concatenate,然后输入到Unet中,然后Unet输出一个从moving到fixed图片的速度场。我们来看一下voxelmorph官方提供的pytorch的代码,我们只看voxelmorph模型的forward部分,完整代码链接:https://github.com/voxelmorph/voxelmorph/blob/master/voxelmorph/torch/networks.py:

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

代码语言:javascript
复制
    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份;
  • 双向配准的效果还不确定。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习炼丹术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0 综述
  • 1 微分同胚
  • 2 模型结构
    • 2.1 简单
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档