Об архитектуре сверточной нейронной сети (CNN) мы узнали здесь. Одним из популярных приложений CNN является обнаружение / локализация объектов, которое широко используется в беспилотных автомобилях.
Для обнаружения объектов нам необходимо классифицировать объекты на изображении, а также найти ограничивающую рамку (то есть, где находится объект).
Это означает, что обучающий набор должен включать ограничивающий прямоугольник + классы в выходных данных y.
Убыток при этом рассчитывается следующим образом. Проще говоря, вы можете использовать квадратичную ошибку, но на практике вы, вероятно, могли бы использовать потерю вероятности журнала для c1, c2, c3 для вывода softmax. Для координат ограничивающей рамки вы можете использовать квадратичную ошибку или, а для ПК вы можете использовать что-то вроде потери логистической регрессии.
Если вы можете нанять этикетировщиков или обозначить себя достаточно большим набором данных с ориентирами на лице / позе человека, то нейронная сеть сможет вывести все эти ориентиры, которые будут использоваться для выполнения другого интересного эффекта, например, с позой человека. человек, может быть, попытаться распознать чьи-то эмоции по картинке и так далее.
Давайте посмотрим, как выполнять обнаружение объектов с помощью так называемого алгоритма обнаружения скользящего окна.
Допустим, вы хотите создать алгоритм обнаружения автомобилей.
Сначала вы можете создать обучающий набор этикеток, поэтому x и y с тщательно обрезанными примерами автомобилей.
Учитывая этот обучающий набор меток, вы можете затем обучить свертку, которая вводит изображение, например одно из этих близко обрезанных изображений. Затем задача свертки - вывести y, ноль или единицу, есть машина или нет. После того, как вы обучите эту свертку, вы сможете использовать ее в Sliding Windows Detection. Идея состоит в том, что вы берете окна, эти квадратные прямоугольники, перемещаете их по всему изображению и с некоторым шагом классифицируете каждую квадратную область как содержащую машину или нет.
Огромный недостаток обнаружения скользящих окон - это затраты на вычисления. Потому что вы обрезаете так много разных квадратных областей на изображении и запускаете каждую из них независимо через свертку. До появления нейронных сетей люди использовали гораздо более простые классификаторы вместо ручных инженерных функций, чтобы выполнять обнаружение объектов. И в ту эпоху, поскольку каждый классификатор был относительно дешевым в вычислении, это была просто линейная функция, обнаружение скользящих окон работало нормально.
Давайте посмотрим, как сверточно реализовать алгоритм скользящих окон.
Чтобы перейти к сверточной реализации скользящих окон, давайте сначала посмотрим, как можно превратить полносвязные слои нейронной сети в сверточные.
Итак, предположим, что ваш алгоритм обнаружения объектов вводит 14 на 14 на 3 изображения. и предположим, что затем он использует фильтры 5 на 5 и, скажем, он использует 16 из них, чтобы сопоставить его от 14 на 14 на 3 до 10 на 10 на 16. А затем выполняет максимальное объединение 2 на 2, чтобы уменьшить его до 5 на 5. на 16. Затем есть полностью подключенный слой для подключения к 400 единицам. Теперь они являются полностью связанными слоями и, наконец, выводят Y с помощью модуля softmax.
Мы заменяем слой FC фильтром 5 x 5 x 16, и если у вас есть 400 из этих фильтров 5 на 5 на 16, то размер вывода будет 1 на 1 на 400.
Таким образом, каждое из этих 400 значений является некоторой произвольной линейной функцией этих 5 на 5 на 16 активаций из предыдущего уровня. Затем, чтобы реализовать следующий сверточный слой, мы собираемся реализовать свертку 1 на 1. Если у вас есть 400 фильтров 1 на 1, то с 400 фильтрами следующий слой снова будет 1 на 1 на 400. Таким образом, вы получите следующий полностью связанный слой. И, наконец, у нас будет еще один фильтр 1 на 1, за которым последует активация softmax. Таким образом, чтобы получить объем 1 на 1 на 4, чтобы заменить эти четыре числа, которыми работала сеть.
После этого преобразования давайте посмотрим, как можно получить сверточную реализацию обнаружения объектов скользящего окна.
Предположим, что ваши скользящие окна связывают входные данные 14 на 14 на 3 изображения и снова. Как и раньше, у вас есть нейронная сеть, которая в конечном итоге выводит объем 1 на 1 на 4, который является выходом вашего softmax.
Итак, что делает сверточная реализация скользящих окон, так это то, что она позволяет разделять большой объем вычислений. Вы можете взять свертку и просто запустить ее с теми же параметрами, теми же фильтрами 5 на 5, также 16 фильтрами 5 на 5 и запустить ее. Теперь у вас может быть выходной объем 12 на 12 на 16. Затем сделайте максимальный пул, как и раньше. Теперь у вас есть фильтр 6 на 6 на 16, который проходит через те же фильтры 400 5 на 5, чтобы получить объем 2 на 2 на 40.
Вот как вы реализуете скользящие окна сверточно, и это делает все это намного более эффективным. Но у этого все еще есть один недостаток: положение ограничивающих прямоугольников не будет слишком точным.
Хороший способ получить более точные ограничивающие рамки этого вывода - использовать алгоритм YOLO. YOLO расшифровывается как You Only Look Once. Допустим, у вас есть входное изображение размером 100 на 100, вы собираетесь разместить на нем сетку вниз. А для иллюстрации воспользуемся сеткой 3 на 3. Хотя в реальной реализации вы используете более тонкий, например, сетку 19 на 19. Основная идея состоит в том, что вы собираетесь взять классификацию и локализацию изображений и применить ее к каждой из девяти сеток. А алгоритм YOLO берет среднюю точку досягаемости двух объектов, а затем назначает объект ячейке сетки, содержащей эту среднюю точку. Таким образом, целевой результат будет 3 на 3 на 8, потому что у вас есть ячейки сетки 3 на 3. И для каждой из ячеек сетки 3 на 3 у вас есть восьмимерный вектор Y.
Итак, теперь, чтобы обучить вашу нейронную сеть, входные данные имеют размер 100 на 100 на 3, это входное изображение. И тогда у вас есть обычная свёртка с свёртками, слоями из максимальных слоев пула и т. Д. Так что в итоге у вас будет выходной объем 3 на 3 на 8.
Оценка алгоритма обнаружения объекта
Красный - это земная правда
Фиолетовый - это ограничивающая рамка.
Оранжевая область - это пересечение этих двух прямоугольников, а зеленая область - объединение двух прямоугольников.
Одна из проблем обнаружения объектов заключается в том, что ваш алгоритм может обнаруживать несколько случаев обнаружения одних и тех же объектов. Подавление без максимума - это способ убедиться, что ваш алгоритм обнаруживает каждый объект только один раз. Помещаем сетку 19x19 поверх нашего изображения. Теперь, хотя технически машина имеет только одну среднюю точку, ей следует назначить только одну ячейку сетки. На практике мы запускаем алгоритм классификации и локализации объектов для каждой из этих разделенных ячеек. Так что вполне возможно, что множественная разделенная ячейка может подумать, что центр автомобиля находится в ней. Итак, что делает не-максимальное подавление, оно убирает эти обнаружения. Итак, конкретно, что он делает, это сначала рассматривает вероятности, связанные с каждым из этих обнаружений. И сначала он выбирает самый большой, который в данном случае равен 0,9. Часть подавления без максимума затем смотрит на все оставшиеся прямоугольники, и все прямоугольники с высоким перекрытием, с высоким IOU, с тем, что вы только что вывели, будут подавлены. Затем вы просматриваете оставшиеся прямоугольники и находите тот с наибольшей вероятностью,
Якорные ящики
Одна из проблем с обнаружением объектов заключается в том, что каждая из ячеек сетки может обнаруживать только один объект. Что, если ячейка сетки хочет обнаружить несколько объектов? Для этого можно использовать идею якорных ящиков. Мы предварительно определяем две разные формы, называемые якорными блоками или формами якорных ящиков, и связываем два прогноза с двумя якорными блоками. И вообще, вы можете использовать больше якорных ящиков, может быть, пять или даже больше. С помощью якорного блока каждый объект назначается ячейке сетки, которая содержит среднюю точку объекта, но также назначается якорному блоку с наивысшим IoU с формой объекта.
Что, если у вас есть два якорных блока, но три объекта в одной ячейке сетки? Или что, если у вас есть два объекта, связанных с одной и той же ячейкой сетки, но оба они имеют одинаковую форму якорного блока? Этот алгоритм плохо справляется с такими случаями. На практике это случается довольно редко, особенно если вы используете сетку 19 на 19, а не 3 на 3. Вероятность того, что два объекта имеют одинаковую среднюю точку в этих 361 ячейке, нечасто случается.
Наконец, как выбрать якорные ящики? Раньше люди просто выбирали их вручную или выбирали, может быть, пять или десять форм якорных ящиков, которые охватывают множество форм, которые, кажется, покрывают типы объектов, которые вы, кажется, обнаруживаете.
В качестве гораздо более продвинутой версии и даже лучшего способа сделать это в одной из более поздних исследовательских работ YOLO является использование алгоритма K-средних, чтобы сгруппировать два типа форм объектов, которые вы обычно получаете.
Собираем все вместе: алгоритм обнаружения объектов YOLO
YOLO - один из самых эффективных алгоритмов обнаружения объектов, который включает в себя многие из лучших идей из всей литературы по компьютерному зрению, относящейся к обнаружению объектов. Здесь мы суммируем обучение, прогнозирование и максимальное подавление, которое дает нам алгоритм обнаружения объектов YOLO.
Другой подход к обнаружению объектов - алгоритм Region CNN. Но этот алгоритм медленнее по сравнению с YOLO и, следовательно, пока не получил широкого распространения. Существуют более быстрые версии с convnet, но они все равно медленнее, чем YOLO.