Свёрточные сети: как искусственный интеллект «видит» картинку
Для компьютера фотография — это просто таблица чисел-яркостей. Как из этой таблицы получается «на снимке кот»? Ответ дала идея, подсмотренная у зрительной коры мозга: не разглядывать всю картинку разом, а скользить по ней маленьким окошком.
ИИ не смотрит на фото целиком — он водит по нему крошечной лупой, ищущей сначала края, потом узоры, потом целые предметы.
Свёрточная сеть устроена просто: маленький фильтр скользит по картинке и в каждой точке спрашивает «есть ли тут то, что я ищу?».
Картинка — это числа
Любое изображение для компьютера — сетка пикселей, и у каждого пикселя есть яркость (а у цветного — три числа: красный, зелёный, синий). Фотография 1000 на 1000 пикселей — это миллион чисел. Если подать их в обычную сеть, где каждый нейрон смотрит на все пиксели сразу, параметров станет неприлично много, а главное — сеть не будет понимать, что кот остаётся котом, сдвинься он на пару пикселей вправо.
Подсказка от природы
Биологи выяснили, что в зрительной коре есть нейроны, реагирующие на простые штуки в маленьком участке поля зрения: один — на вертикальную палочку, другой — на наклонную, третий — на край. Из этих простых реакций мозг постепенно собирает сложные образы. Свёрточная сеть копирует эту идею.
Что такое фильтр и свёртка
Сердце такой сети — фильтр (его ещё зовут ядром). Это маленькое окошко, например 3 на 3 пикселя, заполненное весами. Сеть берёт это окошко и скользит им по всей картинке, в каждой позиции перемножая веса с пикселями под ними и складывая. Так получается одно число — насколько сильно в этом месте проявился искомый узор. Эта операция скольжения и называется свёрткой.
Один фильтр может реагировать на вертикальные края, другой — на горизонтальные, третий — на пятно определённого цвета. Сеть применяет десятки фильтров и получает набор «карт»: где на картинке какие края и узоры. Важно, что один и тот же фильтр работает по всему изображению — поэтому кот узнаётся в любом углу кадра, и параметров нужно во много раз меньше.
image = [[10, 10, 10],
[10, 90, 10],
[10, 10, 10]] # яркое пятно в центре
kernel = [[0, -1, 0],
[-1, 4, -1],
[0, -1, 0]] # фильтр, ищущий контраст с соседями
total = 0
for i in range(3):
for j in range(3):
total += image[i][j] * kernel[i][j]
print(total) # 4*90 - 4*10 = 320, фильтр громко среагировал на пятноСжать и упростить
После свёртки карты признаков обычно прореживают (этот шаг называют пулингом): из каждого небольшого квадратика берут, скажем, максимальное значение. Картинка становится мельче, мелкие сдвиги перестают иметь значение, а «громкие» признаки сохраняются. Это и экономит вычисления, и делает сеть устойчивой к тому, что объект чуть смещён или повёрнут.
От краёв к котам
Дальше всё повторяется слоями, как мы видели в статье про глубину:
- Первые свёрточные слои находят края и пятна.
- Следующие складывают их в текстуры и детали — мех, ушки, усы.
- Глубокие слои собирают детали в объекты — «это морда кота».
В самом конце обычные слои превращают набор найденных признаков в ответ: вероятности классов «кот», «собака», «машина».
Где это работает
Свёрточные сети — основа компьютерного зрения: они разблокируют телефон по лицу, помогают врачам находить опухоли на снимках, позволяют беспилотникам видеть дорогу. Главный их секрет прост и элегантен — не пытаться понять всю картинку сразу, а тысячами маленьких окошек спросить «что здесь?» и собрать ответ снизу вверх.