Регистрация медицинских изображений | Дифференциальный гомеоморфизм воксельморфов | MICCAI2019

искусственный интеллект
  • Перепечатка статьи: публичный аккаунт WeChat «Алхимия машинного обучения»
  • Автор: Alchemy Brother (авторизованный)
  • Контакт: WeChat cyx645016617 (Добро пожаловать на общение)
  • Название диссертации: «Обучение без учителя для быстрой вероятностной диффеоморфной регистрации»

0 Обзор

  • В этой статье предлагается вероятностная генеративная модель и представленаСверточные нейронные сети для алгоритмов логического вывода на основе неконтролируемого обучения;
  • В статье проверяется задача трехмерной регистрации мозга и предоставляется экспериментальный результат;
  • Тезисный метод представлен вДифференциальный гомеоморфизмВ то же время, он имеет современную точность и очень высокую скорость работы.

1 Дифференциальный гомеоморфизм

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

В этой статье представлен метод регистрации SOTA и используется диффеоморфный (дифференциальный гомеоморфизм).

  • диффеоморфный

  • поле деформации

  • обыкновенное дифференциальное уравнение (ОДУ)

  • Предположим, что два трехмерных изображения удовлетворяют:ϕ=R3R3\phi = R^3 \rightarrow R^3,ВыражатьПоле деформации от координат одной картинки к координатам другой картинки;

  • Это поле деформации определяется как:

  • Предположим, у нас естьtе[0,1]t\in [0,1]всех полей статической скорости, то мы можем проинтегрировать все поля скоростей, тем самымϕ(0)\phi^{(0)}делать выводϕ(1)\phi^{(1)}картинка. (То есть фабрика смещения в момент времени 0 вытесняет поле смещения в момент времени 1);

Что касается дифференциального гомеоморфизма, вывод после алгебры Ли и теории групп выводится:

В общем, я чувствую, чтоДля некоторых изображений изменение слишком велико, поэтому статическое поле смещения может отсутствовать, поэтому поле скорости используется для расчета поля смещения. И этот дифференциальный вывод гомеоморфизма, через алгебру Ли и теорию групп, вывод следующий:

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

Я не могу объяснить конкретный смысл этой части, которая отражена в коде воксельморфа на 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 Простой

Структура модели не сложная:

  • Два изображения сначала объединяются, затем вводятся в Unet, а затем Unet выводит поле скорости от движущихся до фиксированных изображений.

Давайте посмотрим на код pytorch, официально предоставленный voxelmorph, мы смотрим только на переднюю часть модели voxelmorph, полная ссылка на код:GitHub.com/VO XE morph/…

Я отметил комментарии прямо в коде, чтобы изучить процесс построения этой модели.

    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

Всю сеть не сложно понять.На самом деле, этот код воксельморфа уже использовал решение дифференциального гомеоморфизма и двунаправленной регистрации.В настоящее время автор не предоставил код факела в репозитории github модели проб-воксельморфа с использованием вариационного вывод, так что нет этой части.

Сначала так много о воксельморфе, мой личный опыт таков:

  • Дифференциальный гомеоморфизм должен присутствовать, иначе легко не сойтись.Рекомендуется использовать параметр по умолчанию 7, чтобы разделить временной интервал на 8 частей;
  • Эффект двунаправленной регистрации неясен.