Предыстория Унета
Unet был опубликован в 2015 году и относится к варианту FCN.Если вы хотите узнать о FCN, вы можете прочитать другую мою статью.Чтение бумаги с полной сверткой сети FCN и реализация кода. Первоначальная цель Unet — решить проблему биомедицинских изображений, благодаря хорошему эффекту она получила широкое применение во всех направлениях семантической сегментации, таких как сегментация спутниковых изображений, обнаружение промышленных дефектов и т. д.
И Unet, и FCN являются структурами Encoder-Decoder, которые просты, но эффективны. Кодер отвечает за извлечение признаков, и вы можете разместить в этом месте различные сети извлечения признаков, с которыми вы знакомы. Из-за сложности сбора образцов в медицине для решения этой проблемы автор применил метод улучшения изображения и получил хорошую точность в случае ограниченного набора данных.
Структура и детали сети Unet
- Encoder
Как показано на рисунке выше, структура сети Unet симметрична и напоминает английскую букву U, поэтому она называется Unet. Вся картина состоит из сине-белых прямоугольников и стрелок разных цветов, среди которыхСиние/белые прямоугольники представляют собой карты объектов; синие стрелки представляют собой свертку 3x3 для извлечения признаков; серые стрелки обозначают пропуск соединения для слияния признаков; красные стрелки обозначают объединение для уменьшения размерности; зеленые стрелки обозначают повышающую дискретизацию, используемую для восстановления размерности; голубые стрелки обозначают 1x1 свертка, используемая для вывода результата.
Может быть, вы спросите, почему именно 5 слоев, а не 4 или 6 слоев, эммм, вам следует спросить самого автора, может быть, для того набора данных, который получил автор в то время, это количество слоев работало лучше, но не все Эта структура подходит для набора данных. Мы должны уделять больше внимания идее дизайна этого кодировщика-декодера, и конкретная реализация должна варьироваться от набора данных к набору данных.
Кодер состоит из операции свертки и операции понижения частоты.Структура свертки, используемая в этой статье, унифицирована как ядро свертки 3x3, заполнение равно 0, а шаг равен 1. Отступов нет, поэтому H и W карты объектов становятся меньше после каждой свертки.Обратите внимание на размерность карты объектов при пропуске соединения (фактически, вы также можете установить отступ равным 1, чтобы избежать проблемы несоответствие размеров), код pytorch:
nn.Sequential(nn.Conv2d(in_channels, out_channels, 3),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True))
После двух приведенных выше сверток следует максимальное объединение с шагом 2, и размер вывода становится равным 1/2 *(H, W):
код питорча:
nn.MaxPool2d(kernel_size=2, stride=2)
Описанные выше шаги повторяются 5 раз, в последний раз max-pooling отсутствует, а полученная карта признаков напрямую отправляется в декодер.
- Decoder
Декодер восстанавливает карту объектов до исходного разрешения.Помимо свертки, ключевыми этапами этого процесса являются повышающая дискретизация и пропуск соединения.
Существует два распространенных способа повышения частоты дискретизации: 1.FCNДеконволюция введена в2.интерполяция. Здесь представлен метод интерполяции, использованный в тексте. Среди реализаций интерполяции всесторонняя производительность билинейной билинейной интерполяции является лучшей и более распространенной.
В процессе расчета билинейной интерполяции нет никаких параметров, которые нужно заучивать, это фактически набор формул, вот пример для понимания всем (пример описывает случай, когда параметр align_corners равен Fasle).
В примере матрица 2x2 интерполируется для получения матрицы 4x4, затем матрица 2x2 называется исходной матрицей, а матрица 4x4 называется целевой матрицей. При билинейной интерполяции значение целевой точки вычисляется из значений ближайших к ней точек 4. Сначала мы расскажем, как найти 4 точки вокруг целевой точки, взяв в качестве примера P2.
Первая формула, отображение координат целевой матрицы в исходную матрицу:
Чтобы найти эти 4 точки, сначала найдите целевую точку в исходной матрице.относительное положение, приведенная выше формула используется для расчета этого. Координаты P2 в целевой матрице равны (0, 1), а координаты, соответствующие исходной матрице, равны (-0,25, 0,25). В координатах есть десятичные и отрицательные числа, поэтому разберемся с ними по порядку. Мы знаем, что билинейная интерполяция вычисляет значение координаты по 4 точкам вокруг координаты, (-0,25, 0,25). 4 точки вокруг этой точки: (-1, 0), (-1, 1), (0, 0) , (0, 1). Чтобы найти точки с отрицательными координатами, мы расширяем исходную матрицу до следующего вида, а красная часть посередине — это исходная матрица.
Укажем, что f(i, j) представляет собой значение пикселя в точке координат (i, j), а для соответствующих вычисленных координат запишем в виде (i+u, j+v). Тогда i=-1, u=0,75, j=0, v=0,25. Нарисуйте эти 4 точки отдельно, вы можете видеть, что целевая точка P2 соответствует исходной матрице.относительное положение.
Вторая формула и последняя.
f(i + u, j + v) = (1 - u) (1 - v) f(i, j) + (1 - u) v f(i, j + 1) + u (1 - v) f(i + 1, j) + u v f(i + 1, j + 1)
Значение пикселя целевой точки представляет собой взвешенную сумму значений пикселей окружающих 4 точек.Очевидно, что вес ближайшей точки относительно велик.Например, вес точки (0, 0) составляет 0,75x0,75, а самая дальняя точка, такая как (-1, 1). Вес относительно небольшой, 0,25*0,25, что больше соответствует здравому смыслу. Введите значение в расчет, чтобы получить значение точки P2, в результате 12,5 соответствует коду, хорошо.
Используйте билинейную интерполяцию в pytorch:
nn.Upsample(scale_factor=2, mode='bilinear')
Для сетей CNN для достижения хороших результатов в основном необходимо пропустить соединение. Этот ключевой шаг в Unet объединяет информацию о местоположении базовой информации с семантической информацией о глубоких функциях.Код pytorch:
torch.cat([low_layer_features, deep_layer_features], dim=1)
Здесь следует отметить, что,Слияние глубокой и поверхностной информации в FCN осуществляется путем добавления соответствующих пикселей, а в Unet — путем сращивания.
Так в чем разница между ними?На самом деле разница между ResNet и DenseNet такая же.Resnet использует добавление соответствующих значений, а DenseNet использует сплайсинг.Лично понимаю, что при добавлении размер карты объектов не меняется, но каждое измерение содержит больше объектов.Для обычных задач классификации, которым не нужно восстанавливать исходное разрешение из карты объектов, это эффективный выбор; в то время как сплайсинг сохраняет больше информации об измерении/положении, что позволяет последующим слоям свободно выбирать между поверхностными и глубокими признаками, что более выгодно для задач семантической сегментации.
резюме
Unet основан на структуре Encoder-Decoder и реализует слияние признаков путем сплайсинга.Структура краткая и стабильная.Если у вас есть проблема семантической сегментации, особенно когда количество выборочных данных невелико, настоятельно рекомендуется дать его попытка.
PS: Добро пожаловать, чтобы обратить внимание на мой личный публичный аккаунт WeChat [Путь обучения машинному обучению], представлена еженедельная бумажная интерпретация в направлении CV!