Sky segmentation что это
Обзор методов сегментации изображений в библиотеке scikit-image
Thresholding
Это самый простой способ отделить объекты от фона, выбрав пиксели выше или ниже определенного порога. Это обычно полезно, когда мы собираемся сегментировать объекты по их фону. Вы можете прочитать больше о пороге здесь.
Люди, знакомы с фильмом «Терминатор», наверняка согласятся, что это был величайший научно-фантастический фильм той эпохи. В фильме Джеймс Кэмерон представил интересную концепцию визуальных эффектов, которая позволила зрителям скрыться за глазами киборга под названием Терминатор. Этот эффект стал известен как «Терминаторное видение» (англ. Terminator Vision). В некотором смысле, он отделял силуэты людей от фона. Тогда это могло звучать совершенно неуместно, но сегментация изображений сегодня является важной частью многих методов обработки изображений.
Сегментация изображения
Имеются ряд библиотек, написанных для анализа изображений. В этой статье мы подробно обсудим scikit-image, библиотеку обработки изображений на среде Python.
Scikit-image
Scikit-image — это библиотека Python, предназначенная для обработки изображений.
Установка
scikit-image устанавливается следующим образом:
Обзор изображений в Python
Прежде чем приступить к техническим аспектам сегментации изображений, важно немного ознакомиться с экосистемой изображений Scikit и с тем, как она обрабатывает изображения.
Импорт GrayScale Image из библиотеки skimage
Модуль данных skimage содержит несколько встроенных примеров наборов данных, которые обычно хранятся в формате jpeg или png.
Импорт цветного изображения из библиотеки skimage
Импорт изображения из внешнего источника
Загрузка нескольких изображений
Сохранение изображений
Сегментация изображения
Теперь, когда у нас есть представление о scikit-image, предлагаем рассмотреть детали сегментации изображений. Сегментация изображения – это процесс разделения цифрового изображения на несколько сегментов, чтобы упростить и / или изменить представление изображения на что-то более значимое и более простое для анализа.
В этой статье мы рассмотрим алгоритмы для моделей обучаемые как с учителем (supervised) так и без учителя (unsupervised).
Некоторые из алгоритмов сегментации доступны в библиотеке scikit-image
Сегментация с учителем: некоторые предварительные знания, возможно, из человеческого ввода, используются для руководства алгоритмом.
Сегментация без учителем: предварительных знаний не требуется. Эти алгоритмы пытаются автоматически разделить изображения на значимые области. Пользователь по-прежнему может настраивать определенные параметры для получения желаемых результатов.
Давайте попробуем это на изображении учебника, который поставляется с предустановленным набором данных scikit-image.
Обычный импорт
Простая функция для построения изображений
Образ
Это изображение немного темнее, но, возможно, мы все же сможем выбрать значение, которое даст нам разумную сегментацию без каких-либо сложных алгоритмов. Теперь, чтобы помочь нам в выборе этого значения, мы будем использовать гистограмму.
В данном случае гистограмма показывает количество пикселей в изображении с различными значениями интенсивности, найденными в этом изображении. Проще говоря, гистограмма — это график, на котором ось X показывает все значения, которые есть на изображении, а ось Y показывает частоту этих значений.
Наш пример оказался 8-битным изображением, поэтому мы имеем 256 возможных значений по оси X. По гистограмме видно, что существует концентрация довольно светлых пикселей (0: черный, 255: белый). Скорее всего, это наш довольно светлый текстовый фон, но остальное немного размыто. Идеальная гистограмма сегментации была бы бимодальной, чтобы мы могли выбрать число прямо посередине. Теперь давайте попробуем создать несколько сегментированных изображений на основе простого порогового значения.
Контролируемый порог
Поскольку мы сами выбираем значение порогового значения, мы называем это контролируемым пороговым значением.
Слева: текст> 50 | Середина: текст> 70 | Справа: текст> 120
Мы не получили идеальных результатов, так как тень слева создает проблемы. Давайте попробуем с порогом без присмотра сейчас.
Неконтролируемый порог
Неконтролируемый порог Scikit-image имеет ряд автоматических методов определения порога, которые не требуют ввода при выборе оптимального порога. Вот некоторые из методов: otsu, li, local.
Слева otsu || Справа: li
В случае local, нам также нужно указать block_size. Offset помогает настроить изображение для лучших результатов.
Данный метод дает довольно хороший эффект. В значительной степени можно измевиться от шумных регионов.
Сегментация с алгоритмом для модели с учителем
Thresholding — это очень простой процесс сегментации, и он не будет работать должным образом на высококонтрастном изображении, для которого нам понадобятся более совершенные инструменты.
В этом разделе мы будем использовать пример изображения, которое свободно доступно, и попытаемся сегментировать головную часть, используя методы с учителем.
Прежде чем делать какую-либо сегментацию изображения, рекомендуется удалить из нее шум с помощью некоторых фильтров.
Однако в нашем случае изображение не имеет значительных шумов, поэтому мы примем его как есть. Следующим шагом будет преобразование изображения в оттенки серого с помощью rgb2gray.
Мы будем использовать два метода сегментации, которые работают на совершенно разных принципах.
Активная контурная сегментация (англ. Active contour segmentation)
Сегментация активного контура также называется змеей и инициализируется с использованием определенного пользователем контура или линии вокруг интересующей области, а затем этот контур медленно сжимается и притягивается или отталкивается от света и краев.
Для нашего примера изображения давайте нарисуем круг вокруг головы человека, чтобы инициализировать змею.
Вышеприведенные вычисления вычисляют координаты x и y точек на периферии круга. Так как мы дали разрешение 200, оно вычислит 200 таких точек.
Затем алгоритм сегментирует лицо человека от остальной части изображения, подгоняя замкнутую кривую к краям лица.
Мы можем настроить параметры, называемые alpha и beta. Более высокие значения alpha заставляют кривую сокращаться быстрее, в то время как beta делает кривую более гладкой.
Сегментация случайного прохождения (англ. Random walker segmentation)
В этом методе сегментации проводится с помощью интерактивной маркировкой, которые называются метками (англ. labels). Рисуя каждый пиксель метке, для которой рассчитывается наибольшая вероятность, можно получить высококачественную сегментацию изображения. Подробнее этим методом можно ознакомиться в этой работе.
Далее мы будем снова использовать предыдущие значения из нашего примера. Мы могли бы иметь делали разные инициализации, но для простоты давайте придерживаться принципа кругов.
Алгоритм случайного прохождения принимать метки в качестве ввода. Таким образом, у нас будет большой круг, охватывающий все лицо человека, и еще один меньший круг около середины лица.
Теперь давайте использовать Random Walker и посмотрим, что произойдет.
Результат не самый хороший, остались неохваченными края лица. Чтобы исправить эту ситуацию, мы можем настроить параметр прохождения, пока не получим желаемый результат. После нескольких попыток мы установили значение 3000, который работает достаточно хорошо.
Это все для сегментации с учителем, где мы должны были предоставить определенные входные данные, а также настроить некоторые параметры. Тем не менее, не всегда возможно, чтобы человек смотрел на изображение и затем решал, какой вклад дать и с чего начать. К счастью, для таких ситуаций у нас есть неконтролируемые методы сегментации.
Сегментация без учителя
Сегментация без учителя не требует предварительных знаний. Рассмотрим изображение, которое настолько велико, что невозможно рассмотреть все пиксели одновременно. Таким образом, в таких случаях сегментация без учителя может разбить изображение на несколько субрегионов, поэтому вместо миллионов пикселей у вас есть десятки или сотни областей. Давайте посмотрим на два таких алгоритма:
Простая Линейно-итеративная Кластеризация
Метод ( англ. Simple Linear Iterative Clustering или SLIC) использует алгоритм машинного обучения под названием K-Means. Он принимает все значения пикселей изображения и пытается разделить их на заданное количество подобластей. Прочитайте эту работу для подробной инфомации.
SLIC работает с разными цветами, поэтому мы будем использовать исходное изображение.
Все, что мы нужно сделать, это просто установить для каждого найденного нами сегмента среднее значение, что делает его больше похожим на изображение.
Мы сократили это изображение с 512 * 512 = 262 000 пикселей до 155 сегментов.
Felzenszwalb
Этот метод также использует алгоритм машинного обучения, называемый кластеризацией минимально охватывающего дерева (англ. minimum-spanning tree clustering). Felzenszwaib не сообщает нам точное количество кластеров, на которые будет разделено изображение. Он будет генерировать столько кластеров, сколько он считает нужным для этого.
На рисунке слишком много регионов. Давайте подсчитаем количество уникальных сегментов.
Теперь давайте перекрасим их, используя среднее значение по сегменту, как мы это делали в алгоритме SLIC.
Теперь мы получаем меньше количество сегментов. Если бы мы хотели еще меньше сегментов, мы могли бы изменить параметр scale. Этот подход иногда называют избыточной сегментацией (англ. over-segmentation).
Это больше похоже на постеризованное изображение, которое по сути является лишь уменьшением количества цветов. Чтобы объединить их снова (RAG).
Распознавание дороги посредством семантической сегментации
В предыдущей серии я проводил эксперимент с автономным движением своего домашнего танка. Дорога распознавалась с помощью цветового фильтра, а полученная маска шла на вход специально обученной нейросети-классификатору, которая выбирала ехать вправо, влево или прямо.
Слабым местом было распознавание самого дорожного полотна из-за переменчивости цветовых оттенков, из-за чего нейросеть, принимающая решения, выдавала странные результаты. В комментариях к той статье рекомендовали обратить внимание на семантическую сегментацию. Тема оказалась перспективной и применение сегментирующей нейросети принесло свои плюсы, но и минусы, куда же без них.
Но обо всем по порядку и для начала немного матчасти.
Сегментация
Сегментация — процесс выделения некоторых частей на изображении. Простейший и самый очевидный вид сегментации — по цвету. Однако, используя этот метод, невозможно понять, что и где изображено на картинке.
Вот неплохая статья, описывающая примитивные подходы.
Семантическая сегментация
Семантическая сегментация — разбиение изображения на объекты с определением типов этих объектов.
Выглядит это как-то так:
Результаты очень впечатляющие, посмотрим чего стоит воплотить это в реальной жизни.
Самая известная нейросеть, изначально разработанная для медицины.
Первоисточник
Народ быстро сообразил, что подход можно использовать на все случаи жизни.
В интернете много статей, как готовить данные и обучать U-net сети:
Более молодая и менее известная сеть. Разработана как раз для распознавания городских улиц.
Данные
Самые популярные датасеты, для сегментации улиц (на них изначально обучали E-net):
Выбор реализации
Поток новой информации по сегментации был довольно ошеломляющим. Инстинктивно хотелось зацепиться за что-нибудь попроще. Внутреннего дзена разбираться в архитектуре сетей и тратить время на обучение я в себе не почувствовал. Зато в статье от PyImageSearch была уже готовая и обученная нейросеть, причем в формате совместимом с OpenCV-DNN.
Так что выбор был сделан в сторону наименьшего сопротивления.
Использование очень простое:
(Более всего беспокоит то, что сеть обучена на картинках размером 1024×512 — это во-первых больше, чем отдает камера на Raspberry, во-вторых требуемая производительность для обработки такого объема данных несколько смущает. В итоге, главная проблема окажется именно в этом).
Читаем нейросеть из файлов (в одном сама модель, в другом имена классов, в третьем — цвета).
Сегментируем изображение, попутно размечая сегменты поверх оригинального изображения
(В моем случае все классы, кроме дороги, невидимы).
Проверка
Берем готовые картинки с танка и натравливаем на них сегментирующую нейросеть.
Дорогой признана только левая часть тротуара.
Сжимаем картинку и берем из нее центр размером 64×64:
(Такой размер ожидается нейросетью, которая принимает решение о смене направления)
Нейросеть направления (по факту — классификатор) командует взять влево. Не очень правильно, но терпимо.
Похожая ситуация, опять правый нижний угол потерян (там еще и асфальт мокрый).
Однако большая часть дороги все же распознана.
Классификатор предлагает ехать прямо.
Ситуция, когда робот оказался посреди тротуара.
Дорога распознана практически идеально.
Классификатор командает брать вправо (чтобы найти кромку дороги в следующий раз).
Применение
Поколдовав немного над прошивкой танка, заменил цветовой детектор дороги на сегментирующую нейросеть.
При запуске всего этого на Raspberry Pi первое, что вылезло — удручающая производительность.
На сегментацию одного изображения уходит по 6 секунд — за это время танк бодрой рысцой успевает проскочить все повороты.
В реальных испытаниях так и получилось — несмотря на практически идеальное распознавание тротуара и правильные команды с управляющей нейросети — за время время обработки изображения танк успевал уйти в сторону.
В общем, на Raspberry картинки такого размера не переварить.
Похоже, все таки придется заняться обучением специализированной нейросети.
Object Detection. Распознавай и властвуй. Часть 1
Технологии компьютерного зрения позволяют в сегодняшних реалиях сделать жизнь и бизнес проще, дешевле, безопаснее. По оценкам разных экспертов этот рынок будет двигаться в ближайшие годы только в сторону роста, что и позволяет развиваться соответствующим технологиям как в сторону производительности, так и качества. Одним из наиболее востребованных разделов является Object Detection (обнаружение объектов) – определение объекта на изображении или в видео потоке.
Времена, когда обнаружение объектов решалось исключительно путем классического машинного обучения (каскады, SVM. ) уже прошли – сейчас в этой сфере царят подходы, основанные на Deep Learning. В 2014 году был предложен подход, существенно повлиявший на последующие исследования и разработки в этой области – R-CNN модель. Последующие его улучшения (в виде Fast R-CNN и Faster R-CNN) сделали его одним из самых точных, что и стало причиной его использования по сей день.
Помимо R-CNN есть еще много подходов реализующих поиск объектов: семейство Yolo, SSD, RetinaNet, CenterNet… Кто-то из них предлагает альтернативный подход, а кто-то развивает текущий в сторону увеличения показателя производительности. Обсуждение почти каждого из них можно вынести в отдельную статью, по причине обилия фишек и ухищрений 🙂
К изучению предлагаю набор статей с разбором двухступенчатых Object Detection моделей. Умение разбираться в их устройстве приносит понимание базовых идей, применяемых и в других реализациях. В этом посте рассмотрим самую базовую и, соответственно, первую из них – R-CNN.
Терминология
Ограничивающая рамка (bounding box) – координаты, ограничивающие определенную область изображения, – чаще всего в форме прямоугольника. Может быть представлена 4 координатами в двух форматах: центрированный () и обычный ().
Гипотеза (Proposal), P – определенный регион изображения (заданный с помощью ограничивающей рамки), в котором предположительно находится объект.
End-to-end обучение – обучение, при котором на вход сети поступают сырые изображения, а на выходе – готовые ответы.
IoU (Intersection-over-Union) – метрика степени пересечения между двумя ограничивающими рамками.
Одним из первых подходов, применимых для определения нахождения объекта на картинке, является R-CNN (Region Convolution Neural Network). Его архитектура состоит из нескольких последовательно выполняемых шагов и проиллюстрирована на изображении 1:
Поиск гипотез
Имея определенное изображение на входе первым делом, оно разбивается на маленькие гипотезы разных размеров. Авторы этой статьи используют Selective Search – верхнеуровнево, он позволяет составить набор гипотез (класс объекта пока не имеет значения), на основе сегментации определить границы объектов по интенсивности пикселей, перепаду цветов, контраста и текстур. При этом авторы отмечают, что можно использовать любой аналогичный алгоритм. Таким образом выделяется примерно 2000 разных регионов, которые частично друг друга перекрывают. Для более точной последующей обработки каждая гипотеза дополнительно расширяется на 16 пикселей во всех 4 направлениях – как бы добавляя контекст.
Итог:
Кодирование изображения
Каждая гипотеза из предыдущего шага независимо и по отдельности друг от друга поступает на вход сверточной нейронной сети. В качестве нее используется архитектура AlexNet без последнего softmax-слоя. Главной задачей сети является кодирование поступаемого изображения в векторное представление, которое извлекается из последнего полносвязного FC7 слоя. Так на выходе получается 4096-размерное векторное представление.
Можно заметить, что вход AlexNet имеет размерность 3×227×227, а размер гипотезы может быть почти любого соотношения сторон и размера. Эта проблема обходится простым сжатием или растягиванием входа до нужного размера.
Итог:
Классификация
После получения характеризующего гипотезу вектора становится возможна ее дальнейшая обработка. Для определения, какой именно объект находится в предполагаемом регионе, авторы используют классический метод классификации разделяющими плоскостями на базе SVM (Support Vector Machine – машина опорных векторов, можно смоделировать с помощью Hinge loss). Причем должно быть отдельных (здесь, обозначает количество определяемых классов объектов, а единица добавляется для отдельного определения фона) моделей, обученных по принципу OvR (One vs. Rest – один против всех, один из методов мультиклассовой классификации). По сути, решается задача бинарной классификации – есть ли конкретный класс объекта внутри предполагаемого региона или нет. Таким образом, выходом является -размерный вектор, отображающий уверенность в конкретном классе содержащегося в гипотезе объекта (фон исторически обозначается нулевым классом, ).
Итог:
Уточнение координат гипотез
Гипотезы, полученные на шаге 1 не всегда содержат правильные координаты (например, объект может быть неудачно «обрезан»), поэтому имеет смысл их дополнительно исправлять. По заверению авторов, это приносит дополнительные 3-4 % к метрикам. Так, гипотезы, содержащие какой-либо объект (наличие объекта определяется на шаге классификации), дополнительно обрабатываются линейной регрессией. То есть гипотезы с классом «фон» не нуждаются в дополнительной обработке регионов, ведь на самом деле там нет объекта…
Каждый объект, специфично для своего класса, имеет определенные размеры и соотношения сторон, поэтому, что логично, рекомендуется применять собственный регрессор на каждый класс.
В отличие от предыдущего шага, авторы для наилучшей работы используют на входе не вектор из слоя FC7, а карты признаков, извлеченные из последнего MaxPooling слоя (в AlexNet это , размерность 256×6×6). Объяснение тут следующее – вектор сохраняет информацию о наличии объекта с какими-то характеристическими подробностями, а карта признаков наилучшим образом сохраняет информацию о местоположении объектов.
Итог:
Вспомогательные трюки
Прежде чем переходить к подробностям обучения модели, рассмотрим два необходимых трюка, которые понадобятся нам позднее.
Обозначение позитивных и негативных гипотез
2000) содержат этот самый объект (0$» data-tex=»inline»/>), а все остальные являются фоном ().
Примем необходимое обозначение: гипотезы, содержащие объекты, будем называть позитивными (positive), а без объектов (содержащие только фон, или незначительную часть объекта) – негативными (negative).
Для того, чтобы в последующем определить пересечения между двумя регионами изображения будет использоваться метрика Intersection over Union. Она считается довольно просто: площадь пересечения двух областей делится на общую площадь регионов. На изображении ниже можно увидеть иллюстрации примеров подсчета метрики.
С позитивными гипотезами все понятно – если класс определен неверно, нужно штрафовать. Но как быть с негативными? Их намного больше, чем позитивных… Для начала отметим, что не все негативные гипотезы одинаково сложно распознавать. Например, случаи, содержащие только фон (easy negative) гораздо проще классифицировать, чем содержащие другой объект или малую часть нужного (hard negative).
На практике easy negative и hard negative определяются по пересечению ограничивающей рамки (как раз используется Intersection over Union) с правильным положением объекта на изображении. Например, если пересечения нет, или оно крайне мало – это easy negative (), если большое – это hard negative или positive.
Подход Hard Negative Mining предлагает использовать для обучения только hard negative, поскольку, научившись распознавать их, мы автоматический добиваемся наилучшей работы с easy negative гипотезами. Но такая идеология будет применяться только в последующих реализациях (начиная с Fast R-CNN).
Non-maximum suppression
Довольно часто получается так, что модель выделяет несколько гипотез с большой уверенностью указывающие на один и тот же объект. С помощью Non-maximum suppression (NMS) можно обработать такие случаи и оставить только одну, наилучшую, ограничивающую рамку. Но при этом не стоит забывать о случае, когда на изображении может быть два разных объекта одного класса. На изображении 3 проиллюстрирован эффект работы до (слева) и после (справа) работы алгоритма.
Рассмотрим алгоритм работы на одном классе (в реальности он применяется на каждый класс по отдельности):
Обучение
Блок выделения гипотез не подлежит обучению.
Поскольку сеть разделена на несколько отдельных друг от друга блоков, то она не может обучаться по принципу end-to-end. Так, обучение представляет собой последовательный процесс.
Обучение векторного представления
За основу берётся предобученная на ImageNet сеть – такие сети уже умеют хорошо извлекать важные признаки из поступающих изображений, – остается обучить их работать с нужными классами. Для этого необходимо изменить размерность выходного слоя на и обучить уже модифицированный вариант. Первые слои можно заблокировать, поскольку они извлекают первичные (почти одинаковые для всех изображений) признаки, а последующие во время обучения адаптируются под признаки нужных классов. Так сходимость будет достигаться гораздо быстрее. Но если обучение все же идет плохо, можно разблокировать и первичные слои. Поскольку необходимо именно донастроить уже имеющиеся веса. Использовать большой темп обучения (learning rate) не рекомендуется, – можно очень быстро затереть уже имеющиеся веса.
Когда сеть обучилась хорошо классифицировать объекты, последний слой с SoftMax активацией отбрасывается и выходом становится слой FC7, выход которого в свою очередь можно интерпретировать как векторное представление гипотезы.
Позитивными на этом шаге считаются гипотезы, которые пересекаются с правильным положением объекта (по IoU) более чем на 0.5. Негативными же считаются все остальные. Для обновления весов используется мини-батч размерности 128, состоящий из 32 позитивных и 96 негативных гипотез.
Обучение классификаторов
Напомню, для классификации каждой гипотезы используется SVM моделей, которые получают на вход векторное представление гипотезы, и на основе принципа один против остальных (One-vs-Rest) определяют класс объекта. Обучаются они как обычные SVM модели за одним исключением – на этом шаге определение позитивов и негативов немного отличается. Здесь за негативы берутся те гипотезы, пересечение которых с правильным положением менее 0.3.
Обучение регрессоров
\begin
\hat
\hat
\hat
\hat
\end
При этом (здесь ) является линейной функцией, а вектор ищется с помощью задачи оптимизации (ridge регрессия):
Для определения поправок к координатам соберем пары между правильным положением гипотез и их текущем состоянием , и определим значения как:
\end
Обозначения в формулах внутри этой статьи с целью наилучшего понимания могут расходиться с обозначениями оригинальной статьи.
Поскольку по итогу работы сети на выходе имеется
2000 гипотез, они объединяются с помощью Non-maximum suppression. Авторы статьи также указывают, что если вместо SVM использовать SoftMax слой (который был откинут на втором шаге), то точность падает на
4-4.5 % (датасет VOC 2007), но при этом отмечают, что лучшая «подгонка» весов вероятно поможет избавиться от такой проблемы.
В заключение выделим основные недостатки такого подхода:
Список литературы
1. R. Girshick, J. Donahue, T. Darrell, and J. Malik. «Rich feature hierarchies for accurate object detection and semantic segmentation.» In CVPR, 2014. arXiv:1311.2524
2. R. Girshick, J. Donahue, T. Darrell, and J. Malik. «Region-based convolutional networks for accurate object detection and segmentation.» TPAMI, 2015
Автор: Сергей Михайлин, специалист машинного обучения «Инфосистемы Джет»