ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ

Свёрточные сети: как искусственный интеллект «видит» картинку

Для компьютера фотография — это просто таблица чисел-яркостей. Как из этой таблицы получается «на снимке кот»? Ответ дала идея, подсмотренная у зрительной коры мозга: не разглядывать всю картинку разом, а скользить по ней маленьким окошком.

ИИ не смотрит на фото целиком — он водит по нему крошечной лупой, ищущей сначала края, потом узоры, потом целые предметы.
Свёрточная сеть устроена просто: маленький фильтр скользит по картинке и в каждой точке спрашивает «есть ли тут то, что я ищу?».

Картинка — это числа

Любое изображение для компьютера — сетка пикселей, и у каждого пикселя есть яркость (а у цветного — три числа: красный, зелёный, синий). Фотография 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, фильтр громко среагировал на пятно

Сжать и упростить

После свёртки карты признаков обычно прореживают (этот шаг называют пулингом): из каждого небольшого квадратика берут, скажем, максимальное значение. Картинка становится мельче, мелкие сдвиги перестают иметь значение, а «громкие» признаки сохраняются. Это и экономит вычисления, и делает сеть устойчивой к тому, что объект чуть смещён или повёрнут.

От краёв к котам

Дальше всё повторяется слоями, как мы видели в статье про глубину:

  • Первые свёрточные слои находят края и пятна.
  • Следующие складывают их в текстуры и детали — мех, ушки, усы.
  • Глубокие слои собирают детали в объекты — «это морда кота».

В самом конце обычные слои превращают набор найденных признаков в ответ: вероятности классов «кот», «собака», «машина».

Где это работает

Свёрточные сети — основа компьютерного зрения: они разблокируют телефон по лицу, помогают врачам находить опухоли на снимках, позволяют беспилотникам видеть дорогу. Главный их секрет прост и элегантен — не пытаться понять всю картинку сразу, а тысячами маленьких окошек спросить «что здесь?» и собрать ответ снизу вверх.

#CNN#компьютерное зрение#нейросети#свёрточные сети