![]() |
![]() |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
Вижу, значит существую: обзор Deep Learning в Computer Vision (часть 1) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-05-22 11:46 Компьютерное зрение. Сейчас о нём много говорят, оно много где применяется и внедряется. И как-то давненько на Хабре не выходило обзорных статей по CV, с примерами архитектур и современными задачами. А ведь их очень много, и они правда крутые! Если вам интересно, что сейчас происходит в области Computer Vision не только с точки зрения исследований и статей, но и с точки зрения прикладных задач, то милости прошу под кат. Также статья может стать неплохим введением для тех, кто давно хотел начать разбираться во всём этом, но что-то мешало ;)
![]() Магазин без касс? Где-то я это уже слышал.. Будем двигаться по плану: Наверное, дорогой читатель, Вы подумали про Amazon Go. В каком-то смысле стоит задача повторить их успех, однако наше решение больше про внедрение, нежели про построение такого магазина с нуля за огромные деньги.
Мотивация и что вообще происходит
Для кого статья? В 2019 году все говорят про искусственный интеллект, четвёртую промышленную революцию и приближение человечества к сингулярности. Круто, классно, но хочется конкретики. Ведь мы с вами любопытные технари, которые не верят в сказки про ИИ, мы верим в формальную постановку задач, математику и программирование. В этой статье мы поговорим о конкретных кейсах применения того самого современного ИИ — о применении deep learning (а именно — свёрточных нейросетей) в множестве задач компьютерного зрения. Да, мы будем говорить именно про сетки, иногда упоминая некоторые идеи из «классического» зрения (так будем называть набор методов в зрении, которые использовались до нейросетей, однако это ни в коем случае не значит, что сейчас они не используются). Статья ориентирована в большей степени на людей, которые уже знакомы с машинным обучением и нейросетями. Однако советую прочитать хотя бы первые два раздела — вдруг всё будет понятно :) Хочу изучить компьютерное зрение с нуля Рекомендую курс Антона Конушина «Введение в компьютерное зрение». Лично я проходил его аналог в ШАДе, что заложило прочную основу в понимании обработки изображений и видео. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Я уже не говорю про многочисленные применения в различных внутренних задачах компаний. Facebook, к примеру, применяет зрение ещё и для того, чтобы фильтровать медиаконтент. В проверке качества/повреждений в промышленности тоже используются методы компьютерного зрения. Дополненной реальности здесь нужно, на самом деле, уделить отдельное внимание, поскольку Смотивировались. Зарядились. Поехали: Классификация как стиль жизни
![]() /cats , /dogs и /leather_bags /humans , поместив в каждую папку только фото с соответствующими объектами.Что такое картинка/фотография? ![]() ![]() Если сейчас уже стало сложно.. Можно взять какие-нибудь методы из “классического” зрения или “классического” машинного обучения, то есть не нейросети. В основном эти методы заключаются в выделении на изображениях неких особенностей (особых точек) или локальных регионов, которые будут характеризовать картинку (“мешок визуальных слов”). Обычно всё это сводится к чему-то типа SVM над HOG/SIFT. Но мы здесь собрались, чтобы поговорить о нейросетях, поэтому не хотим использовать придуманные нами признаки, а хотим, чтобы сеть сделала всё за нас. Наш классификатор будет принимать на вход признаки объекта и возвращать предсказание (метку класса). Здесь в качестве признаков выступают значения интенсивности в пикселях (см. модель картинки в под … то лучше сначала прочитать первые 4 статьи из Открытого курса OpenDataScience по ML и ознакомиться с более вводной статьёй по зрению, например, хорошая лекция в Малом ШАДе. спойлером выше). Помним, что картинка — это тензор размера (Height, Width, 3) (если она цветная). Сетке при обучении на вход всё это обычно подаётся не по одной картинке и не целым датасетом, а батчами, т.е. небольшими порциями объектов (например, 64 картинки в батче). Таким образом, сеть принимает на вход тензор размера (BATCH_SIZE, H, W, 3). Можно “развернуть” каждую картинку в вектор-строку из H*W*3 чисел и работать со значениями в пикселях прямо как с признаками в машинном обучении, обычный Multilayer Perceptron (MLP) так и поступил бы, но это, честно говоря, такой себе бейзлайн, поскольку работа с пикселями как с вектор-строкой никак не учитывает, например, трансляционную инвариантность объектов на картинке. Тот же кот может быть как в середине фото, так и в углу, MLP эту закономерность не выучит. Значит нужно что-то по-умнее, например, операция свёртки. И это уже про современное зрение, про свёрточные нейронные сети: Код обучения свёрточной сети может выглядеть как-то так (на фреймворке PyTorch) Поскольку сейчас речь об обучении с учителем, для тренировки нейросети нам нужны несколько компонент:
В коде именно это и реализовано, сама свёрточная нейросеть описана в классе Net(). Если хочется не спеша и с начала узнать про свёртки и свёрточные сети, рекомендую лекцию в Deep Learning School (ФПМИ МФТИ) (на русском) на эту тему, и, конечно же, курс Стэнфорда cs231n (на английском). Deep Learning School -- что это? Deep Learning School при Лаборатории Инноватики ФПМИ МФТИ — это организация, которая активно занимается разработкой открытого русскоязычного курса по нейросетям. В статье я буду несколько раз ссылаться на эти видеоуроки. ![]() Архитектуры свёрточных нейросетей: 1000 способов достичь одной цели
![]() ![]() Небольшое отступление про ILSVRC Обычно различные обзоры архитектур проливают свет на те, что были первыми на ILSVRC с 2010 до 2016 года, и на некоторые отдельные сети. Чтобы не загромождать рассказ, я поместил их под спойлер ниже, постаравшись подчеркнуть основные идеи: К 2012 году был дан собран ImageNet, и для соревнования ILSVRC использовалась его подвыборка из тысяч картинок и 1000 классов. Сейчас в ImageNet ~14 миллионов картинок и 21841 класс (взято с оф. сайта), но для соревнования всё равно обычно выделяют лишь подмножество. ILSVRC тогда стал самым крупным ежегодным соревнованием по классификации изображений. Кстати, недавно придумали, как можно обучить на ImageNet'е за считанные минуты. Именно на ImageNet (в ILSVRC) с 2010 по 2018 получали SOTA-нейросети в задаче классификации изображений. Правда уже с 2016 года более актуальны соревнования по локализации, детектирования и понимания сцены, а не классификацию. Архитектуры с 2012 по 2015 год
![]() Архитектуры с 2015 по 2019 год Большинство из этих моделей для PyTorch можно найти здесь, а ещё есть вот такая классная штука. Вы могли заметить, что всё это дело весит довольно много (хотелось бы 20 MB максимум, а то поменьше), в то время как сейчас повсеместно используют мобильные устройства и приобретает популярность IoT, а значит сетки хочется использовать и там.
Связь веса модели и скорости работы Авторы многих статей пошли по пути изобретения быстрых архитектур, я собрал их методы под спойлером ниже: Поскольку нейросети внутри себя лишь перемножают тензоры, то количество операций умножения (читай: количество весов) напрямую влияет на скорость работы (если не используются трудоёмкие пост- или предобработка). Сама скорость работы сети зависит от реализации (фреймворка), железа, на котором выполняется, и от размера входной картинки. Легковесные архитектуры CNN Цифры во всех таблицах
Но хочется как-то больше доверять CNN, а то напридумывали чёрных коробок, а что «внутри» — не очевидно. Чтобы лучше понимать механизм функционирования свёрточных сетей, исследователи придумали использовать визуализацию. Визуализация свёрточных нейросетей: покажи мне страсть Важным шагом к осознанию того, что происходит внутри свёрточных сетей, стала статья «Visualizing and Understanding Convolutional Networks». В ней авторы предложили несколько способов визуализации того, на что именно (на какие части картинки) реагируют нейроны в разных слоях CNN (рекомендую также посмотреть лекцию Стэнфорда на эту тему). Результаты получились весьма впечатляющие: авторы показали, что первые слои свёрточной сети реагируют на какие-то «низкоуровневые вещи» по типу краёв/углов/линий, а последние слои реагируют уже на целые части изображений (см. картинку ниже), то есть уже несут в себе некоторую семантику. ![]() ![]() ![]() Я и сам своего рода хирург: извлекаем фичи из нейросетей Представим, что есть картинка, и мы хотим найти похожие на неё визуально (так умеет, например, поиск по картинке в Яндекс.Картинки). Раньше (до нейросетей) инженеры для этого извлекали фичи вручную, например, придумывая что-то, что хорошо описывает картинку и позволит её сравнивать с другими. В основном, эти методы (HOG, SIFT) оперируют градиентами картинок, обычно именно эти штуки и называют «классическими» дескрипторами изображений. Особо интересующихся отсылаю к статье и к курсу Антона Конушина (это не реклама, просто курс хороший :) ![]() ![]() 2). Обучение поверх этих фич Fully Connected (FC) слоёв-классификаторов ![]() А как же автоэнкодеры? Таким образом, пайплайн решения задачи поиска по картинке может быть устроен просто: прогоняем картинки через CNN, берём признаки с нужных слоёв и сравниваем эти фичи друг с другом у разных картинок. Например, банально считаем Евклидово расстояние этих векторов.Да, на самом деле фичи можно получить и автоэнкодерами. На моей практике делали по-разному, но, например, в статьях по ре-идентификации (о которой речь будет дальше), чаще всё же берут фичи после extractor'a, а не обучают для этого автоэнкодер. Мне кажется, стоит провести эксперименты в обоих направлениях, если стоит вопрос о том, что работает лучше. ![]() Подробнее про Transfer Learning Однако просто брать нужные фичи и делать дообучение с датасета на датасет может быть недостаточно, например, для задач поиска похожих лиц/людей/чего-то специфичного. Фотографии одного и того же человека визуально иногда могут быть даже более непохожи, чем фотографии разных людей. Нужно заставить сеть выделять именно те признаки, которые присущи одному человеку/объекту, даже если нам это сделать глазами сложно. Добро пожаловать в мир representation learning.Оригинальная статья, а вообще зачем читать много текста, если можно посмотреть видео Держись рядом: representation learning для людей и лиц
Примечание по терминологии Поставим задачи: Если почитать научные статьи, то иногда складывается впечатление, что некоторые авторы понимают словосочетание metric learning по-разному, и нет какого-то единого мнения на счёт того, какие методы называть metric learning, а какие нет. Именно поэтому в данной статье я решил избежать именно этого словосочетания и использовал более логичное representation learning, некоторые читатели могут с этим не согласиться — буду рад обсудить в комментариях.
Первую задачу обычно называют распознаванием лиц, вторую — ре-идентификацией (сокращённо Reid). Я объединил их в один блок, поскольку в их решениях сегодня используются схожие идеи: для того, чтобы выучивать эффективные эмбеддинги картинок, которые могут справляться и с довольно сложными ситуациями, сегодня используют различные типы лоссов, такие как, например, triplet loss, quadruplet loss, contrastive-center loss, cosine loss. ![]() ![]() Но если быть более точным, то вот так Конкретно по распознаванию лиц есть несколько хороших статей: статья-обзор (MUST READ!), FaceNet, ArcFace, CosFace. На стадии обучения: обучаем нейросеть либо на классификацию (Softmax + CrossEntropy), либо с помощью специального лосса (Triplet, Contrastive, etc.). Во втором случае ещё нужно правильно подбирать positive'ы и negative'ы в каждом батче ![]() ![]() ![]() ![]() Есть ещё несколько трюков ![]() Демотиватор Из реализаций хочется обязательно упомянуть OpenReid и TorchReid. Обратите внимание на сам код — на мой взгляд, он написан грамотно с точки зрения архитектуры фреймворка, подробнее здесь. Плюс они оба на PyTorch, и в Readme есть много ссылок на статьи по Person Re-identification, это приятно. Вообще особый спрос на face- и reid-алгоритмы сейчас в Китае (если вы понимаете, о чём я). Мы на очереди? Кто знает… Несмотря на все эти продвинутые методы, в моих экспериментах, почему-то, лучше всего себя показал именно подход с классификацией. Возможно, я что-то не учёл, но пока что немного грустно, что придумали столько всего, а в итоге работает Слово про ускорение нейросетей Мы уже говорили о том, что можно просто придумать легковесную архитектуру. Но как быть, если сеть уже обучена и она крута, а сжать её всё равно нужно? В таком случае может помочь один (или все) из следующих методов: Ну и правило использовать не float64, а, например, float32 никто не отменял. Есть даже свежая статья про low-precision training. Недавно, кстати, Google представил MorphNet, которая (вроде как) помогает автоматически сжимать модель. А что дальше?
![]() P. S.: Какое образование сейчас предлагает Физтех-школа ПМИ МФТИ? ФПМИ МФТИ организует программу бакалавриата (кстати, теперь и на английском, для иностранных студентов), однако сейчас активно развиваются и магистерские программы, причём как очные, так и онлайн. Со всем списком образовательных возможностей ФПМИ МФТИ можно ознакомиться здесь. Если вам интересно, буду рад обсудить конкретные программы в комментариях или личных сообщениях, а то ведь Физтех уже не тот (в хорошем смысле). Источник: habr.com ![]() Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||