С большим удовольствием я следил за fast.ai MOOC, чтобы познакомиться с глубоким обучением. Часть 1, которая фокусируется на том, чтобы быстро приступить к работе с передовыми методами, была довольно дикой, что побудило меня перейти к Части 2. Однако темп меняется с Частью 2, и это больше похоже на сделку типа Area51. Процитируем Portal 2: мы бросаем науку в стену здесь, чтобы увидеть, что прилипнет. Оказывается, есть вещи, которыми Кейв Джонсон мог бы гордиться, но кривая обучения чертовски крута. Вы сталкиваетесь с этим в Лекции 9, когда серьезно относитесь к обнаружению нескольких объектов в реальном времени.

Проблема

Джереми, преподаватель fast.ai, делает честную попытку представить тему медленно, но сжатый код и бесчисленные отклонения в второстепенные темы (например, почему такой краткий код) не помогают. Я обнаружил, что мне приходится перематывать столько раз, что я могу синхронизировать губы с Джереми, пока он объясняет часть функции потерь. У меня также необычно толстый череп, который не помогает разобраться в сложной теме.

Цель этого поста - объяснить моей версии, существовавшей 6 дней назад, что такое SSD, на простом английском языке (при условии наличия некоторых предварительных знаний о глубоком обучении). Имея в виду эту довольно интуитивную основу, лекцию должно быть легче понять. Я не буду вдаваться в технические подробности, они просто отвлекут от интуитивного понимания. Я планирую подробнее рассказать об этом в одной из следующих публикаций.

Приведенное ниже объяснение немного специфично для SSD, но давайте будем правдой, оно настолько высшее, что вы также можете интерпретировать его для архитектуры YOLO.

Детектор Single Shot Multibox

Общая идея SSD такова: мы собираемся начать с уже существующей сверточной сети, которая уже может «видеть» (в статье о SSD используется предварительно обученный VGG16, Джереми использует ResNet34). Под «видеть» я подразумеваю, что он может надежно классифицировать объекты реального мира, такие как автомобили, самолеты, кошки, собаки и т. Д.

Поверх этой «магистральной» сети мы собираемся поставить «головку» SSD, которая будет выдавать координаты ограничивающих прямоугольников и то, какие классы, по мнению сети, содержат эти прямоугольники. Он будет делать это на основе последовательных сверточных слоев, построенных поверх «магистральной» сети.

Вау, держи трубку, «коробки»?

Идея на самом деле довольно проста. Допустим, вы сверточная сеть и уже можете «видеть». Теперь я хочу, чтобы вы перешли на следующий уровень и сообщили мне координаты прямоугольников на картинке, которые содержат «объекты», которые вы узнаете.

Но сейчас это немного натянуто: вы, конечно, обучены классифицировать изображения, но придумываете координаты из воздуха, а это сложная задача, особенно если есть несколько объектов / ящиков.

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

Функция потерь

Итак, как мне узнать, хорошо ли вы выплевываете ограничивающие рамки? Это довольно простой процесс, состоящий из двух этапов. Первый этап чаще называют «этапом согласования».

Этап 1

На этапе сопоставления я просматриваю все поля, которые вы выводите, и вычисляю их перекрытие с имеющимися у меня наземными прямоугольниками. Метрика, которую я буду использовать для этого, называется индекс Жаккара (также известный как долговые расписки). Если индекс Жаккара ниже 0,5, я полностью проигнорирую этот прогноз. Это имеет интуитивный смысл: как я могу оценить ваши прогнозы, если нет оснований для сравнения?

Этап 2

Если же индекс Жаккара больше 0,5, это означает «совпадение», и я перейду ко второму этапу. Здесь я разделю ваш прогноз на две части:

  • Я вычисляю потерю L1 предсказанных вами координат и награждаю вас, если вы найдете способ настроить (читай: обратное распространение) свой алгоритм, чтобы снизить эту потерю (т.е. увеличить перекрытие).
  • Кроме того, я посмотрю на класс, который вы предсказали для этого поля, и награду вас, если вы найдете способ настроить свой алгоритм, чтобы получить правильный класс и будьте уверены в этом (потеря двоичной кросс-энтропии, это стандартный материал, который вы видели для мультиклассовой классификации в Части 1)

Это правда.

Подробнее о якорных ящиках

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

Однако вы заметите, что Джереми недолго придерживается ванильных коробок. Когда он говорит о "Еще якорных ящиках!" около 2:05:00 вы заметите, что он начинает как бы увеличивать их, изменяя их соотношение сторон и размер. Это еще больше поможет алгоритму!

Как так? Помните: алгоритм может лишь немного изменить рамки. Мы помогаем ему не только кормить его стандартными квадратными ящиками с ячейками, но и их деформированными вариантами! Позже это будет связано с фактором k, который вы можете видеть плавающим вокруг кода архитектуры SSD.

Размеры объекта

Но подождите, это еще не все! Представим, что у вас есть изображение, и мы разделили его на сетку 4x4. Как описано выше, мы превратим эту сетку в 16 якорных ящиков, возможно, сделаем некоторые улучшения и скормим их алгоритму. Прохладный.

Но что, если на этой картинке есть объект, например велосипедист внизу, который занимает целое пространство 2х4? Алгоритм просто не может «настроить» только одну из 16 крошечных якорных ящиков, чтобы она соответствовала всему велосипедисту, даже если мы поможем ему с расширением.

К счастью, как мы уже говорили выше, SSD выполняет свертки. Итак, вот что мы будем делать в голове SSD:

  • У нас будет сверточный слой, использующий сетку 4x4, и он будет выводить ограничивающие прямоугольники и классы.
  • Но мы также возьмем этот слой 4x4 и пропустим его через Conv2D с шагом 2. Это приведет нас к сетке 2x2. Здесь мы снова добавим ограничивающие рамки и классы.
  • Тогда мы сделаем это снова! Один шаг Conv2D 2 позже, мы получаем сетку 1x1, которая снова выплевывает ограничивающие прямоугольники и классы.

Если вы обдумаете это, то согласитесь, что при разрешении 4x4 одну из этих 16 коробок просто невозможно растянуть настолько, чтобы вместить велосипедиста 2x4. Помните, что наш алгоритм может вносить лишь незначительные изменения в предлагаемые нами якорные блоки. Однако, возможно, один из 4 блоков в слое 2x2 может поместиться в объект, если алгоритм масштабирует его juuust правильно. И даже если они слишком малы, несомненно, что мы можем просто взять коробку 1x1 (которая по определению покрывает все изображение) и прилично масштабировать ее, чтобы она соответствовала велосипедисту.

Вот как мы можем использовать несколько сверточных слоев головки SSD, чтобы дать нам ограничивающие рамки с разным «разрешением», чтобы мы могли обнаруживать как маленькие объекты, так и большие.

Заключение

Не могу поверить, как долго длился этот пост, пока я пытался придерживаться простого английского. SSD и, как правило, обнаружение одиночного кадра - это безумно круто, но нужно немало подумать, чтобы действительно понять все движущиеся части. Надеюсь, это было полезно. Остались вопросы? Посетите форум по адресу forum.fast.ai, чтобы узнать о некоторых из лучших сообществ по глубокому обучению, которые может предложить Интернет.

А что с "одиночным выстрелом"?

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

Спасибо Радеку за вычитку!