Функция потерь в алгоритме MedSAM

Вопрос или проблема

Я работаю над алгоритмом MedSAM (Segment Anything in Medical Images). Это тонко настроенная версия модели Segment Anything от Meta AI для медицинских изображений. В статье его функция потерь задается как невзвешенная сумма бинарной кросс-энтропийной (BCE) потери и Dice потери.

введите описание изображения здесь

Я хочу вычислить эту потерю вручную.

Допустим, у меня есть $8 \times 8$ градационное изображение, и ниже показана матрица этого изображения, а область, которую я хочу сегментировать, заштрихована серым. Это моя истинная разметка.

введите описание изображения здесь

N — это количество пикселей, и в данном случае оно равно 64. Ниже показан результат сегментации для этого конкретного изображения:

введите описание изображения здесь

Таким образом, я могу вычислить BCE потерю и Dice потерю отсюда, используя приведенный ниже код:

import numpy as np

# Истинная разметка (из оригинального 8x8 градационного изображения)
ground_truth = np.array([
    [0.96, 0.16, 0.77, 0.00, 0.49, 0.25, 0.87, 0.31],
    [0.18, 0.67, 0.44, 0.17, 0.12, 0.93, 0.30, 0.39],
    [0.25, 0.62, 0.57, 0.76, 1.00, 0.03, 0.58, 0.80],
    [0.46, 0.21, 0.45, 0.83, 0.34, 0.39, 0.66, 0.42],
    [0.91, 0.16, 0.10, 0.56, 0.78, 0.71, 0.70, 0.91],
    [0.40, 0.88, 0.35, 0.72, 0.87, 0.27, 0.59, 0.27],
    [0.70, 0.97, 0.89, 0.39, 0.48, 0.94, 0.84, 0.07],
    [0.72, 0.51, 0.02, 0.16, 0.96, 0.70, 0.14, 0.23],
])

# Результат сегментации (из результата MedSAM)
segmentation_result = np.array([
    [0.79, 0.78, 0.38, 0.61, 0.63, 0.25, 0.40, 0.60],
    [0.70, 0.57, 0.23, 0.63, 0.88, 0.03, 0.94, 0.01],
    [0.32, 0.99, 0.39, 0.66, 0.58, 0.22, 0.03, 0.65],
    [0.86, 0.96, 0.38, 0.40, 0.90, 0.34, 0.70, 0.91],
    [0.56, 0.18, 0.08, 0.12, 0.14, 0.68, 0.36, 0.41],
    [0.31, 0.48, 0.68, 0.89, 0.92, 0.93, 0.53, 0.50],
    [0.87, 0.62, 0.30, 0.95, 0.71, 0.65, 0.75, 0.65],
    [0.91, 0.55, 0.24, 0.84, 0.91, 0.90, 0.72, 0.20],
])

# Потеря бинарной кросс-энтропии
epsilon = 1e-7  # Чтобы избежать log(0)
bce_loss = -np.mean(
    ground_truth * np.log(segmentation_result + epsilon) +
    (1 - ground_truth) * np.log(1 - segmentation_result + epsilon)
)

# Dice потеря
numerator = 2 * np.sum(ground_truth * segmentation_result)
denominator = np.sum(ground_truth**2) + np.sum(segmentation_result**2)
dice_loss = 1 - (numerator / (denominator + epsilon))

bce_loss, dice_loss

Рассчитанные потери:

  • Потеря бинарной кросс-энтропии (BCE): 0.9590
  • Dice Потеря: 0.2083

Мой первый вопрос: правильны ли мои вычисления?

Во-вторых, я не понимаю, как и почему здесь включена BCE. Поскольку это не классификационная модель, а только модель сегментации, не будет ли достаточным использовать только Dice потерю?

Мой третий вопрос: что, если изображение включало бы другую область сегментации того же класса? или что, если бы оно включало бы другую область сегментации другого класса? Потеря BCE будет действовать только для классификации на два класса ((1) опухоль или (2) здоровая ткань).

Ответ или решение

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

Корректность вычислений

Ваши вычисления для функции потерь выглядят верными, учитывая предложенный алгоритм и предоставленные данные. См. объяснение:

  1. Функция Binary Cross-Entropy (BCE) Loss:
    [
    BCE_loss = -\frac{1}{N}\sum_{i=1}^{N} [y_i \cdot \log(p_i) + (1 – y_i) \cdot \log(1 – p_i)]
    ]
    Где ( y_i ) – значение истинной метки (ground truth), а ( p_i ) – предсказанное значение (segmentation result). Ваш результат 0.9590 кажется корректным на основе предоставленных данных.

  2. Функция потерь Dice Loss:
    [
    Dice_loss = 1 – \frac{2 \cdot \sum{(y_i \cdot p_i)}}{\sum{y_i^2} + \sum{p_i^2}}
    ]
    Здесь ваш результат 0.2083 также соответствует формуле, утвержденной в литературе.

Роль BCE в сегментационном контексте

Хотя Dice Loss специализируется на оценке сегментаций, BCE Loss обеспечивает определенные преимущества:

  • Стабильность и сходимость: BCE может обеспечить более стабильные и быстрые решения в обучении, особенно когда дело касается сочетания с функциональными целями, такими как Dice Loss.
  • Чувствительность к дисбалансу: BCE может улучшить чувствительность алгоритма к сильному дисбалансу классов, что часто встречается в медицинских данных.

Широкое использование функций потерь

В случае многоклассовой сегментации (несколько областей для одного класса или несколько классов), обычно используется обобщенная версия BCE, известная как Cross-Entropy Loss или даже соответствующая версия для регрессии. Таким образом, подход MedSAM может расширяться на случаи с несколькими классами из одного паспортного класса или даже среди нескольких классов, возможно, с введением механизмов веса или приоритизации.

Заключение

Ваше понимание выбора функции потерь и корректности расчета верно. Через объединение BCE и Dice Loss создается сбалансированная система, учитывающая как метки присутствия, так и структурные сходства сегментации, что важно при обработке медицинской информации. Такая комбинация функций потерь улучшает качество сегментации и надежность итогового результата. Для более сложных многоклассовых задач стоит рассмотреть внесение изменений в функционалы потерь для улучшенного представления структуры данных.

Оцените материал
Добавить комментарий

Капча загружается...