Свёртки и устройство CNN

ЧерновикМатериалы дорабатываются и будут дополняться.

Автор: Максим Банцевич

Представим две рукописные семёрки. Одну написали в центре листа, другую — немного правее. Мы узнаём обе цифры по знакомым штрихам. Как научить нейросеть обнаруживать такие детали независимо от того, в какой части изображения они находятся?

Для обработки изображений часто используют свёрточные нейронные сети, или CNN — от английского convolutional neural network. Они выделяют небольшие детали изображения, а затем объединяют сведения о них, чтобы распознать изображённый объект.

Как представить изображение числами

Цифровое изображение состоит из пикселей. Каждому пикселю соответствует цвет. Изображение в оттенках серого можно представить таблицей яркостей: в наших примерах 0 означает чёрный цвет, 1 — белый, а промежуточные значения задают серые оттенки.

Цветное изображение обычно описывают тремя таблицами — для красной, зелёной и синей составляющих. Их называют каналами. Такую запись цвета обозначают RGB: red, green, blue. Каждому пикселю RGB-изображения соответствуют три числа.

Рассмотрим стену домика на рисунке 1. В красном канале её пикселям соответствует значение 1, в зелёном — 0,5, в синем — 0. Вместе эти составляющие дают оранжевый цвет. Чтобы узнать цвет любого другого пикселя, нужно взять значения из той же позиции во всех трёх таблицах.

Цветное изображение домика и три таблицы составляющих его пикселей; для оранжевой стены красная составляющая равна 1, зелёная — 0,5, синяя — 0
Рисунок 1 — Изображение и его цветовые каналы

В полносвязную сеть можно передать все яркости в виде одного длинного списка. Для изображения размером 28×2828\times28 это 28⋅28=78428\cdot28=784 числа. Но в изображении важны не только сами яркости, но и расположение пикселей. Если перемешать клетки, набор чисел останется прежним, а знакомые штрихи могут исчезнуть. В полносвязном слое соседние пиксели не выделены среди остальных: связи между ними сеть должна обнаружить при обучении.

Зачем нужен свёрточный слой

При распознавании цифр полезно замечать небольшие детали: штрихи, границы, изгибы. Свёрточный слой обрабатывает изображение по участкам. Вычисление повторяется в каждом положении небольшого окна, которое последовательно перемещают по изображению.

Правило вычисления задаёт фильтр, или ядро свёртки, — таблица весов. Значение яркости в каждой клетке окна умножают на вес в соответствующей клетке фильтра. Затем произведения складывают. Полученная сумма — отклик фильтра в этом положении.

Один фильтр применяется во всех допустимых положениях окна. Поэтому знакомую деталь можно искать и слева, и справа, как на рисунке 2. Веса остаются прежними, меняется только участок изображения. Такое повторное использование весов обычно позволяет обойтись меньшим их количеством, чем в полносвязном слое.

Два одинаковых уголка расположены в разных частях изображения; рамки выделяют соответствующие участки
Рисунок 2 — Поиск одной детали в разных частях изображения

Вычислим небольшую свёртку

Возьмём учебное изображение размером 4×44\times4: его левая половина чёрная, правая — белая. Пусть окно и фильтр имеют размер 2×22\times2. В левой колонке фильтра расположим веса −1-1, в правой — 11.

Сначала поместим окно в левый верхний угол изображения. Под ним только нули, поэтому сумма произведений равна 0. Передвинем окно на одну клетку вправо: теперь в его левой колонке нули, а в правой — единицы. Фильтр оказался на границе между двумя областями.

Три положения окна 2 на 2 в верхней строке изображения; соответствующие отклики равны 0, 2 и 0
Рисунок 3 — Три положения одного фильтра

В этом положении каждую яркость умножаем на вес в той же позиции: 0⋅(−1)0\cdot(-1), 1⋅11\cdot1, 0⋅(−1)0\cdot(-1) и 1⋅11\cdot1. Сумма произведений равна 2. Вычисление показано на рисунке 4.

Окно изображения, веса фильтра и произведения соответствующих элементов; сумма четырёх произведений равна 2
Рисунок 4 — Вычисление отклика фильтра

Ещё один шаг вправо — и под окном только единицы. Теперь получим −1+1−1+1=0-1+1-1+1=0. Таким образом, в верхней строке карты стоят числа 0,2,00,2,0. Опустим окно на одну строку и повторим вычисления. Все строки исходного изображения одинаковы, поэтому полная карта будет такой:

Карта размером 3 на 3: в каждой строке стоят числа 0, 2 и 0
Рисунок 5 — Карта откликов на вертикальную границу

Таблицу откликов называют картой признаков. В нашем примере положительные значения отмечают вертикальную границу: слева от неё тёмная область, справа — светлая. На однородных участках положительные и отрицательные слагаемые компенсируются, и отклик равен нулю. Если поменять чёрное и белое местами, на границе получится −2-2.

Такое преобразование изображения в нейросетях называют свёрткой.

Почему фильтров несколько

До сих пор мы использовали один фильтр: он сравнивал левую и правую части окна. Обозначим его буквой А. Возьмём второй фильтр, Б: в его верхней строке запишем два веса −1-1, в нижней — два веса 11. Он будет сравнивать верхнюю и нижнюю части окна.

Применим оба фильтра к тому же изображению с вертикальной границей. На рисунке 6 показаны исходные числа, веса каждого фильтра и полученные карты. В обоих случаях окно перемещается с шагом 1, без дополнения по краям.

Верхний ряд: изображение с вертикальной границей, фильтр А с весами минус 1 слева и 1 справа, карта со строками 0, 2, 0. Нижний ряд: то же изображение, фильтр Б с весами минус 1 сверху и 1 снизу, карта из нулей
Рисунок 6 — Два фильтра на одном изображении

Фильтр А даёт уже знакомую карту: в каждом положении на границе отклик равен 2. У фильтра Б все отклики нулевые. Разберём, почему так происходит. В окне на границе верхняя строка содержит числа 0 и 1, нижняя — тоже 0 и 1. Умножим их на веса фильтра Б:

0⋅(−1)+1⋅(−1)+0⋅1+1⋅1=0.0\cdot(-1)+1\cdot(-1)+0\cdot1+1\cdot1=0.

Верхняя и нижняя строки одинаковы, поэтому их вклады компенсируются. Фильтр Б не обнаружил здесь горизонтальной границы. Если же расположить тёмную область сверху, а светлую снизу, на переходе сработает именно он.

Таким образом, одни и те же исходные числа дают разные карты при разных весах фильтра. Для распознавания цифры нужны сведения о разных деталях, поэтому свёрточный слой обычно использует несколько фильтров. Каждый фильтр создаёт одну карту признаков. Например, восемь фильтров дадут восемь карт — восемь выходных каналов.

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

Обычно к сумме произведений добавляют ещё одно обучаемое число — смещение. Для одного фильтра оно одинаково во всех положениях. В наших ручных вычислениях смещение равно нулю.

Если входных каналов несколько, фильтр обрабатывает их вместе. У RGB-изображения три канала, поэтому нужны три таблицы весов — по одной на канал. Произведения из всех таблиц складывают в один отклик. Число выходных карт определяется числом фильтров и не обязано совпадать с числом входных каналов.

Как управлять размером карты

В ручном примере фильтр 2×22\times2 помещался в изображении 4×44\times4 только в трёх положениях по каждой стороне. Поэтому мы получили карту 3×33\times3. На размер результата влияют также дополнение по краям и шаг перемещения окна.

Дополнение нулями, или padding, — рамка из нулевых пикселей вокруг изображения. Она позволяет обработать положения окна, которые иначе выходили бы за его границы. Шаг, или stride, — длина сдвига ядра свёртки в пикселях. При шаге 1 ядро сдвигается на один пиксель, при шаге 2 — на два.

Рассмотрим изображение 5×55\times5 и окно 3×33\times3 (рисунок 7). Без дополнения при шаге 1 окно может начинаться в первой, второй или третьей колонке. По вертикали тоже есть три положения, поэтому карта имеет размер 3×33\times3.

Добавим рамку из нулей толщиной в одну клетку. Теперь по каждой стороне стало семь клеток, а у окна — по пять допустимых положений. Получится карта 5×55\times5: её размер совпадает с размером исходного изображения.

Наконец, уберём рамку и увеличим шаг до 2. Окно сможет начинаться только в первой и третьей колонках; то же верно для строк. Карта уменьшится до 2×22\times2.

Три случая для изображения 5 на 5 и окна 3 на 3: при шаге 1 без рамки карта 3 на 3, с рамкой нулей — 5 на 5, без рамки при шаге 2 — 2 на 2; выделены первое окно и соответствующая клетка карты
Рисунок 7 — Дополнение нулями и шаг фильтра

Дополнение и шаг выбирают при построении сети. Например, фильтр 3×33\times3 с шагом 1 и рамкой толщиной в один пиксель сохраняет высоту и ширину: из 28×2828\times28 получается 28×2828\times28.

Область видимости свёрток

Один отклик фильтра зависит лишь от тех значений, которые попали в его окно. Например, для фильтра 3×33\times3 это участок изображения из трёх строк и трёх столбцов. Участок исходного изображения, от которого зависит отдельное значение карты, называют областью видимости этого значения.

Следующий свёрточный слой получает уже карты признаков. Его окно 3×33\times3 охватывает девять соседних значений предыдущего слоя. За каждым из них стоит свой участок исходного изображения. Эти участки перекрываются, а вместе занимают область большего размера.

Проследим это на рисунке 8. Пусть все три слоя используют фильтры 3×33\times3 с шагом 1. В первом слое область видимости одного значения имеет размер 3×33\times3. Три соседних значения в строке охватывают уже пять столбцов исходного изображения: каждое следующее окно сдвинуто на один пиксель. По вертикали происходит то же самое. Поэтому во втором слое одно значение зависит от участка 5×55\times5.

На схеме XX — исходное изображение, а L1L_1, L2L_2 и L3L_3 — карты после первой, второй и третьей свёрток. Обозначение rfs означает размер области видимости.

Три свёртки 3 на 3 с шагом 1: для выделенных значений карт L1, L2 и L3 области видимости на исходном изображении X имеют размеры 3 на 3, 5 на 5 и 7 на 7
Рисунок 8 — Как расширяется область видимости свёрток

Если добавить третий такой слой, область видимости увеличится до 7×77\times7. Так с каждым слоем сеть может учитывать всё большую часть изображения: сначала небольшой фрагмент штриха, затем более протяжённую деталь или сочетание деталей. Какие сведения передавать дальше, определяется весами фильтров, которые подбираются при обучении.

Что мы выяснили

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

Один и тот же фильтр может обнаруживать знакомую деталь в разных частях изображения. Однако это не делает сеть нечувствительной к любым изменениям: сдвиг, поворот или изменение размера могут повлиять на её предсказание.

Самопроверка

Вопрос 1

Сколько чисел описывают один пиксель RGB-изображения и что они означают?

Подсказка

Вспомните названия каналов.

Решение

B. Три числа — красная, зелёная и синяя составляющие. Вместе они задают цвет одного пикселя.

Вопрос 2

Почему при перемещении фильтра не нужно задавать новые веса?

Подсказка

Меняется участок изображения.

Решение

C. Один фильтр использует одну таблицу весов во всех положениях. Это позволяет искать одну деталь в разных частях изображения.

Вопрос 3

Чему равен отклик нашего фильтра на окне, в котором все значения равны 1?

Подсказка

Сложите два отрицательных и два положительных слагаемых.

Решение

A. −1+1−1+1=0-1+1-1+1=0. На однородном участке отклики этого фильтра равны нулю.

Вопрос 4

В ручном примере границу сдвинули на один пиксель вправо. Какой станет верхняя строка карты?

Подсказка

Проверьте три положения окна.

Решение

D. (0,0,2)(0,0,2) вместо (0,2,0)(0,2,0). Отклик переместился вслед за границей.

Вопрос 5

Слой применяет к одному изображению несколько фильтров. Должны ли их карты совпасть?

Подсказка

У фильтров могут различаться веса.

Решение

B. Нет, разные фильтры могут давать разные карты. Каждый из них реагирует на своё сочетание значений в окне.

Вопрос 6

Что означает шаг 2 при перемещении ядра свёртки?

Подсказка

Вспомните, чем измеряется длина сдвига ядра.

Решение

C. Ядро сдвигается на два пикселя за один шаг. Размер самого ядра при этом не меняется.

Вопрос 7

Изображение 5×55\times5 дополнили рамкой из нулей толщиной в одну клетку. Какой размер карты даст фильтр 3×33\times3 с шагом 1?

Подсказка

Сначала посчитайте клетки вместе с рамкой, затем — допустимые положения окна.

Решение

A. Получится карта 5×55\times5. В дополненном изображении по семь клеток на каждой стороне, поэтому окно помещается в пяти положениях по горизонтали и по вертикали.

Вопрос 8

На строке из пяти клеток окно шириной 3 перемещается с шагом 2, без дополнения. Сколько положений допустимо?

Подсказка

Отметьте начало окна в первой и третьей клетках.

Решение

B. Два положения. Следующее окно вышло бы за границу строки.

Вопрос 9

Два свёрточных слоя подряд используют фильтры 3×33\times3 с шагом 1. Какова область видимости одного значения второго слоя вдали от границ изображения?

Подсказка

Участки исходного изображения для соседних значений первого слоя перекрываются.

Решение

D. Область видимости имеет размер 5×55\times5. Окно второго слоя объединяет три соседних положения по каждой стороне; каждое следующее положение сдвинуто на один пиксель.

Вопрос 10

Гарантирует ли применение свёрток, что сеть одинаково распознает изображение после любого поворота?

Подсказка

Подумайте, что изменится внутри окна.

Решение

C. Нет. При повороте расположение пикселей меняется, и те же фильтры могут дать другие отклики.

Файлы

Дополнительные материалы