
- •Актуальность
- •Азы работы с изображениями
- •1. Азы работы с изображениями
- •1.1. Попиксельная обработка изображений
- •1.2. Задача маттинга и морфология
- •1.3. Свертки
- •2. Базовые алгоритмы над изображениями
- •2.1. Интерполяция
- •2.2. Фильтрация
- •2.3. Гистограммы
- •Границы и признаки
- •3. Границы
- •3.1. Оператор Собеля
- •3.2. Оператор Лапласа
- •4. Пирамиды и признаки
- •4.1. Пирамиды
- •Задача классификации для нейронных сетей
- •5. Задача классификации
- •5.1. Классификация изображений и ImageNet
- •5.2. Базовые слои и оптимизация
- •6. Архитектуры
- •6.2. Модели ResNet
- •7. Практическая методология
- •7.1. Что делать если плохо учится?
- •7.2. Аугметация и Псевдо-разметка
- •Задачи переноса стиля и поиска изображений по содержанию
- •9. Стаил Трансфер
- •10.1. Поиск изображений по содержанию
- •10.2. Функции схожести и потерь часть 1
- •10.3. Функции схожести и потерь часть 2
- •10.4. Ранжирование
1.3. Свертки
До этого момента мы говорили в основном о попиксельных операциях – операциях, которые используют только один пиксель и как-то его изменяют. Теперь время начать использовать в наших функциях сразу несколько пикселей.
Начнем с самого простого – будем идти по нашему изображению окошком и записывать в пиксель нового изображения среднее значение из пикселей в нашем окошке. Для цветных изображений мы делаем то же самое, но для каждого канала независимо. Давайте посмотрим на результат:
Для черно белого изображения – изображение стало более мутным. Для цветных то же самое – цвет не потерялся, но качество изображения ухудшилось. Давайте более внимательно посмотрим на объекты вблизи:
Если присмотреться к объекту, у которого очень четкие границы, то можно заметить артефакты. Конкретно здесь артефакт называется «звенящим артефактом». Он заключается в том, что четкие границы объекта размазываются и становятся повторяющимися и «призрачными». Если мы хотим добиться размытия изображения, то это точно не тот эффект, который нам нужен. Появляются артефакты буквально из-за усреднения, т.к. мы усредняем все пиксели с одинаковыми весами в независимости от того, на каком расстоянии они находятся от центрального. Решением проблемы такого артефакта будет усреднение тем же окном, но взвешенно.
Такое взвешенное усреднение называется сверткой. Свертка - это такая же операция, где мы идем скользящим окном, но теперь мы записываем не просто среднее значение, а взвешенное среднее значение с какими-то весами и делаем так для каждого канала независимо. Но какие веса нам надо выбрать, если мы хотим замылить наше изображение и при этом не породить артефакты.
Классическим выбором является фильтр гаусса. Мы чуть позже разберем, что это такое, а пока просто посмотрим на то, как он работает. На слайде мы видим, что изображение стало более мутным, но при этом артефактов не возникло и можно хорошо разглядеть объект.
Что же такое фильтр гаусса? Идея в том, чтобы взять двумерное гауссовское распределение – это такой купол, где есть мода, значение распределения в которой максимально и этот купол очень быстро уходит вниз и чем дальше мы находимся от моды, тем ближе к нулю веса пикселей.
Если нарисовать гауссовское распределение, то мы получим следующий белый размытый кружок.
Проблема гауссовского распределения в том, что в теории оно бесконечно и если мы захотим усреднять наши пиксели именно с ним, то нам придется для каждого пикселя усреднять всю картинку. Но за счет того, что гауссовское распределение очень быстро убывает и через какой-то момент времени становится очень близким к нулю мы можем брать окно размером 6 сигма, потому что после него значения настолько незначительны, что практически не влияют на итог. На примере гауссовский фильтр размером 3 на 3, т.е. сигма здесь ½.
Собственно, мы берем наше изображение, применяем к нему гауссовский фильтр и получаем результат, который мы видели несколько слайдов назад.
Свертки используются очень и очень часто – это одна из самых ключевых операций в компьютерном зрении, которая применяется практически везде и делает очень много всяких полезных штук. Например, свертки могут показать нам границы, т.е. те места, в которых объекты меняются (один объект сменяет другой). Зачем и как искать границы мы разберем чуть позже, а пока на слайде показан пример работы сверток в выделении границ.
Также свертки могут применяться для стилизации изображений, как, например, контрастность в попиксельных операциях, или же применяться для размытия изображений, как во время движения руки при записи видео на камеру. Зачем это вообще нужно? Такое бывает полезно, когда мы учим какой-то алгоритм (нейронную сеть) и хотим, чтобы она училась работать на таких изображениях. Мы берем нормальное изображение, каким-то образом портим его и получаем уже несколько изображений для обучения нейронных сетей. Такой метод называется аугментацией, но подробнее об этом мы поговорим позже.
Настало время поговорить о свойствах сверток. Самое очевидное из них – то, что они уменьшают размер изображения. Почему так происходит? Потому что мест, куда мы можем приложить наше ядро свертки (окно, по которому мы идем по изображению) просто меньше, чем количество пикселей. Соответственно, наше итоговое изображение немного уменьшается.
Если мы хотим избежать этого эффекта, т.е. хотим, чтобы наша свертка была такого же размера, как исходное изображение, мы можем воспользоваться паддингом. Паддинг – это просто обивка нашего изображения временными пикселями, которые нужны для того, чтобы количество мест, в которые мы можем приложить свертку, увеличилось и уменьшение изображения съело бы пиксели паддинга, но оставило оригинальные. Паддингов бывает много типов. Самый простой – это константный, когда мы просто взяли и обили наше изображение временными пикселями. Конкретно этот вариант часто применяется в нейронных сетях. Самый продвинутый вариант – симметричный. Тут мы отражаем нашу картинку вдоль оси, которую мы хоти обить.
Следующее свойство сверток – невосприимчивость к сдвигу. Это свойство будет важно, когда мы будем говорить о нейронных сетях, но понять его можно уже сейчас. Что это значит? Это значит, что где бы не находился объект на нашем изображении свертка обработает его одинаково. Будь он в левом углу или в правом. Потому что мы идем скользящим средним и применяем его в независимости от того, где мы находимся.
Еще одно свойство – комбинация сверток – свертка. Почему так? Свертка – это линейная операция, а комбинация двух линейных операций тоже линейна, соответственно, комбинация двух сверток тоже свертка. Давайте рассмотрим это на примере. У нас есть два ядра сверток – одно вертикальное, другое горизонтальное. Мы можем записать их как формулы. В формулах нижний индекс это движение по горизонтали, верхний – движение по вертикали. Соответственно, мы можем записать новую формулу, которая будет последовательным применением двух наших формул. В итоге мы снова получим какую-то формулу, в которой опять будет линейная операция и эта линейная операция будет в окне, просто чуть большего размера. Эту линейную операцию мы сможем записать как свертку.
Из линейности вытекает еще одно свойство, которое доступно не всем сверткам, а именно сепарабельность. Сепарабельность – возможность разложить нашу свертку на какие-нибудь две. В нашем примере итоговая свертка сепарабельна, потому что она раскладывается на две независимые свертки, одна из которых горизонтальна, а другая вертикальна. Зачем это нужно? Это нужно для прироста скорости. Давайте посчитаем конкретно на этом примере. Если мы применим итоговую свертку, то мы применим 9 операций (9 весов), а если мы применим вертикальную и горизонтальную, то мы сделаем всего 6 операций. Это может стать важным на масштабе сверток – допустим у нас свертка не 3 на 3, а 9 на 9, тогда мы сделаем 18 операций против 81.
Вот мы и поговорили о свертках. Поняли, где они могут применяться и что могут делать сами по себе. Давайте попробуем сделать с ними что-то интересное и полезное. Для этого посмотрим на портретную съемку. Портретная съемка делается с помощью профессиональных камер, на которую в результате съемки человека получается красиво размытый задний фон (эффект Боке).
Эффект Боке доступен далеко не для всех камер. На самом деле для профессиональной съемки покупаются специальные камеры, заточенные на то, чтобы снимать людей с определенного расстояния и в итоге получать красивое размытие. На слайде пример фотографии одного и того же объекта, но на разные камеры. У одного присутствует эффект Боке, у другого нет, потому что это буквально физическое свойство камеры. Большая часть камер сейчас – камеры мобильных телефонов. В них эффект Боке недоступен и, скорее всего, никогда не будет доступен, потому что это физическое свойство камеры, которое требует, чтобы камера была большой, а в телефоне физически нет места для такой. Остается только имитировать этот эффект.
Как мы будем это делать? Мы найдем человека на изображении так же, как мы делали для зеленого экрана, но в этом случае воспользуемся каким-то готовым решением и предположим, что у нас уже есть готовая маска. Вторым шагом мы размоем наше исходное изображение, таким образом размыв человека и фон. Затем подставим в наше оригинальное изображение размытый фон и таким образом сэмитируем эффект Боке.
Вот фотография. Мы вытаскиваем маску, после чего удаляем фон (это будет та часть картинки, которая не изменится. Затем размываем наше изображение и инвинтируем маску. Теперь наоборот вырежем человека и оставим фон. После просто сопоставляем. В итоге мы с имитировали сложное физическое свойство камеры просто используя алгоритмы.