PyTorch для начинающих: семантическая сегментация с помощью torchvision

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Что такое семантическая сегментация?

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

Это похоже на то, что мы делаем все время бессознательно. Всякий раз, когда мы смотрим на что-то, то мы пытаемся “сегментировать”, какая часть изображения принадлежит к какому классу/метке/категории.

По сути, семантическая сегментация-это метод, с помощью которого мы можем достичь того же эффекта програмно.

Вы можете прочитать больше о сегментации в нашем посте о сегментации изображений.

Этот пост будет посвящен семантической сегментации

Итак, допустим, у нас есть следующее изображение.

После семантической сегментации вы получите следующие выходные данные:

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

Если объяснять в таком упрощенно виде, это и есть семантическая сегментация.

Применение семантической сегментации

Наиболее распространенными вариантами использования семантической сегментации являются:

Автономное управление автомобилем

Компьютер, управляющий автомобилем, должен хорошо понимать дорожную сцену перед ним. Важно сегментировать такие объекты, как автомобили, пешеходы, полосы движения и дорожные знаки. Мы подробно рассмотрим это приложение в нашем предстоящем курсе глубокого обучения с PyTorch.

Сегментация лица

Сегментация лица используется для сегментации каждой части лица на семантически сходные области-губы, глаза и т.д. Это может быть полезно во многих реальных приложениях. Одним из очень интересных приложений может быть виртуальный макияж.

Сегментация интерьера

Можете ли вы догадаться, где это используется? В AR (дополненная реальность) и VR (Виртуальная реальность). Приложения AR могут сегментировать всю внутреннюю область, чтобы понять положение стульев, столов, людей, стен и других подобных объектов, и, таким образом, могут эффективно размещать и манипулировать виртуальными объектами.

Зондирование Земли

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

Давайте посмотрим, как выполнить семантическую сегментацию с помощью PyTorch и Torchvision.

Семантическая сегментация с использованием torchvision

Мы рассмотрим две модели семантической сегментации на основе глубокого обучения. Fully Convolutional Network ( FCN ) и DeepLab v3. Эти модели были обучены на подмножестве набора данных COCO Train 2017, которые соответствуют набору данных Pascal VOC. Есть всего 20 категорий, поддерживаемых моделями.

Вы можете использовать Colab.

Вход и выходные данные

Прежде чем мы начнем, давайте разберемся с входными и выходными данными моделей.

Эти модели ожидают 3-канальное изображение (RGB), которое нормализуется с помощью среднего значения Imagenet и стандартного отклонения, т. е.,

mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]

Таким образом, размер входного сигнала равен [Ni x Ci x Hi x Wi], где

  • Ni -> размер пакета
  • Ci -> количество каналов (3)
  • Hi -> высота изображения
  • Wi -> ширина Image

И выходной размер модели [No x Co x Ho x Wo], где

  • No -> - размер пакета (такой же, как Ni),
  • Co -> - это количество классов, которое имеет набор данных!
  • Ho -> высота изображения (которая почти во всех случаях совпадает с Hi)
  • Wo -> ширина изображения (почти во всех случаях такая же, как Wi)

Примечание: выходные данные моделей torchvision-это OrderedDict, а не torch.Tensor (.eval () mode) выход, который является OrderedDict, имеет только один ключ-выход. Этот ключ out содержит выход, и его соответствующее значение имеет форму [No x Co x Ho x Wo].

Теперь мы готовы писать код?

FCN с Resnet-101, как основа

FCN-полностью сверточные сети, являются одними из первых успешных попыток использования нейронных сетей для решения задачи семантической сегментации. Мы подробно рассмотрим FCNs и некоторые другие модели в нашем предстоящем курсе по глубокому обучению с PyTorch. Давайте посмотрим, как использовать модель в Torchvision.

Загрузите модель

Давайте загрузим FCN!

И это все! У нас есть предварительно обученная модель FCN с Resnet101. Флаг pretrained=True загрузит модель, если она еще не присутствует в кэше. Метод eval загрузит его в режиме вывода.

Загрузите изображение

Далее, давайте получим изображение! Мы загружаем изображение птицы непосредственно из URL-адреса и сохраняем его. Мы используем PIL для загрузки изображения.

Предварительная обработка изображения

Чтобы получить изображение в правильном формате для вывода с помощью модели, нам нужно предварительно обработать его и нормализовать!

Итак, для этапов предварительной обработки мы выполняем следующее.

  • Измените размер изображения на (256 x 256)
  • Обрежьте его (224 х 224)
  • Преобразуйте его в Тензор – все значения в изображении будут масштабированы так, что будут лежать между [0, 1]вместо исходного диапазона [0, 255].
  • Нормализовать его с определенными значениями сетевая интеграция mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]
  • И, наконец, мы расцепляем изображение так, что оно становится [1 x C x H x W] из [C x H x W]. Это необходимо, так как нам нужен пакет, передавая его через сеть.

Давайте посмотрим, что делает вышеприведенная ячейка кода.

Torchvision имеет много полезных функций. Одним из них является преобразование, которое используется для предварительной обработки изображений. Compose-это функция, которая принимает список, в котором каждый элемент имеет тип преобразований, и возвращает объект, через который мы можем передавать пакеты изображений, и все необходимые преобразования будут применены к изображениям.

Давайте посмотрим на преобразования, примененные к изображениям:

T. Resize (256): изменяет размер изображения до размера 256 x 256
T. CenterCrop(224): центр обрезает изображение, чтобы получить результирующий размер 224 x 224
Т. ToTensor() : преобразование изображения до типа torch.Tensorи масштабирует значения в диапазоне [0, 1]

T. Normalize (mean, std) : нормализует изображение с заданным средним и стандартным отклонением.

Прямой проход через сеть

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

Как мы уже упоминали ранее, выход модели является OrderedDict, поэтому нам нужно взять ключ out из этого, чтобы получить выходные данные модели.

Итак, out-это конечный результат модели. И как мы видим, его форма [1 x 21 x H x W], как обсуждалось ранее. Так как, модель обучалась на 21 классе, то выход имеет 21 канал!

Теперь то, что нам нужно сделать, это сделать этот 21 канальный выход в 2D-изображение или 1-канальное изображение, где каждый пиксель этого изображения соответствует классу!

Таким образом, 2D - изображение (формы [H x W]) будет иметь каждый пиксель, соответствующий метке класса, и, таким образом, для каждого (x, y) пикселя в этом 2D-изображении будет соответствовать число от 0 до 20, представляющее класс.

Как мы видим, теперь у нас есть 2D-изображение, где каждый пиксель соответствует классу. Последнее, что нужно сделать, это взять это 2D-изображение и преобразовать его в карту сегментации, где каждая метка класса преобразуется в цвет RGB и, таким образом, помогает в легкой визуализации.

Декодируем выходные данные

Мы будем использовать следующую функцию для преобразования этого 2D изображения в изображение RGB, где каждая метка отображается на соответствующий цвет.

Давайте посмотрим, что мы делаем внутри этой функции!

Во-первых, переменная label_colors хранит цвета для каждого из классов в соответствии с индексом. Таким образом, цвет для первого класса, который является фоном, хранится в 0-м индексе списка label_colors. Второй класс, который является самолетом, хранится в индексе 1 и так далее.

Теперь мы должны создать RGB-изображение из 2D-изображения, которое у нас есть. Итак, мы создаем пустые 2D-матрицы для всех 3-х каналов.

Итак, R, g и b-это массивы, которые будут формировать каналы RGB для конечного изображения, и каждый из этих массивов имеет форму [H x W] (которая совпадает с формой 2Dimage).

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

Наконец, мы складываем 3 отдельных канала, чтобы сформировать изображение RGB.

Ладно! Теперь, давайте использовать эту функцию, чтобы увидеть окончательный сегментированный выход!

И вот мы сделали! Мы сегментировали вывод изображения.

Это же птица!

Обратите внимание, что изображение после сегментации меньше, чем исходное изображение, так как на этапе предварительной обработки изображение изменяется и обрезается.

Результат

Далее, давайте переместим все это под одну функцию и поиграем еще с несколькими изображениями!

Разве это не интересно? Теперь давайте перейдем к одной из государство-оф-искусство архитектуры в семантической сегментации – DeepLab.

Семантическая сегментация с использованием DeepLab

DeepLab-это семантическая архитектура сегментации, которая вышла из Google Brain. Давайте посмотрим, как мы можем его использовать.

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

Итак, вот вы идете! Вы можете видеть, что модель DeepLab сегментировала лошадь почти идеально!

несколько объектов

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

Давайте попробуем это!

Как вы можете видеть, обе модели работают довольно хорошо! Но бывают случаи, когда модель с треском проваливается.

Полный код

Оригинал


Источник: m.vk.com

Комментарии: