Использование CNN с набором данных, который имеет различную глубину между томами - PullRequest
0 голосов
/ 13 января 2020

Я работаю с медицинскими изображениями, где у меня 130 томов пациентов, каждый том состоит из N количества изображений / срезов DICOM.

Проблема в том, что между томами количество слайсов N различается.

Большинство, 50% томов имеют 20 слайсов, остальные варьируются на 3 или 4 слайса, некоторые даже более 10 срезов (настолько, что интерполяция, чтобы сделать количество срезов равным между объемами, невозможна)

Я могу использовать Conv3d для томов, где глубина N (количество срезов) одинакова между объемы, но я должен использовать весь набор данных для задачи классификации. Итак, как мне включить весь набор данных и передать его в мою сетевую модель?

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Если я понимаю ваш вопрос, у вас есть 130 3-мерных изображений, которые вам нужно вставить в 3D Con vNet. Я предполагаю, что ваши партии, если бы N был одинаковым для всех ваших данных, были бы тензорами формы (batch_size, channel, N, H, W), и ваша проблема в том, что ваш N варьируется между различными выборками данных.

Итак, есть две проблемы. Во-первых, существует проблема, связанная с тем, что вашей модели требуется обрабатывать данные с различными значениями N. Во-вторых, существует проблема, связанная с реализацией пакетных данных различной длины.

Обе проблемы возникают в моделях классификации видео. Во-первых, я не думаю, что есть способ обойти необходимость интерполировать КУДА-ТО в вашей модели (если вы не готовы дополнить / вырезать / сэмплировать) - если вы делаете какой-либо вид задачи классификации, вам в значительной степени нужен слой постоянного размера в вашей главе классификации. Однако интерполяция не произошла в самом начале. Например, если для входного тензора размера (batch, 3, 20, 256, 256) ваша сеть объединяется до (batch, 1024, 4, 1, 1), то вы можете выполнить адаптивный пул (например, https://pytorch.org/docs/stable/nn.html#torch .nn.AdaptiveAvgPool3d ) непосредственно перед выводом, чтобы уменьшить выборку всего большего до этого размера перед прогнозированием.

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

Для второй проблемы, пакетной обработки: если вы знакомы с конвейером данных / конвейером данных pytorch, вам нужно написать собственный collate_fn, который берет список выходных данных вашего объекта набора данных и складывает их вместе в пакетный тензор. В этой функции вы можете решить, дополнять или усекать или что-то еще, чтобы в итоге получить тензор правильной формы. Тогда разные пакеты могут иметь разные значения N. Простой пример реализации этого конвейера приведен здесь: https://github.com/yunjey/pytorch-tutorial/blob/master/tutorials/03-advanced/image_captioning/data_loader.py

Что-то еще, что может помочь при пакетировании, - это поместить ваши данные в сегменты в зависимости от их N измерение. Таким образом, вы сможете избежать большого количества ненужных отступов.

0 голосов
/ 13 января 2020

Вам нужно сгладить набор данных. Вы можете рассматривать каждый отдельный фрагмент как вход в CNN. Вы можете установить каждую переменную как логический флаг Да / Нет, если она категорична или если она числовая, вы можете установить вход как эквивалент none (обычно 0).

...