Русский
Русский
English
Статистика
Реклама

Компьютерное зрение

Из песочницы Breakout-YOLO знакомимся с шустрой object-detection моделью, играя в классический Арканоид

21.06.2020 14:07:34 | Автор: admin


Всем привет! Весенний семестр для некоторых студентов 3-го курса ФУПМ МФТИ ознаменовался сдачей проектов по курсу Методы оптимизации. Каждый должен был выделить интересную для себя тему (или придумать свою) и воплотить её в жизнь в виде кода, научной статьи, численного эксперимента или даже бота в Telegram.


Жёстких ограничений на выбор темы не было, поэтому можно было дать разгуляться фантазии. You Only Live Once! воскликнул я, и решил использовать эту возможность, чтобы привнести немного огня в бессмертную классику.,


Выбор проекта




Всем хороша свобода выбора, кроме одного: надо определиться с этим самым выбором. Имелось много тем теоретических проектов, предложенных лектором и семинаристами, но меня они не заинтересовали. Всё-таки хотелось получить на выходе нечто, что можно потрогать руками, а не корпеть над статьями и математическими выкладками.


И тут я вспомнил, что год назад вместе с одногруппниками писал браузерный Арканоид на JavaScript. Почему бы не добавить в эту бородатую игрушку немного рок-н-ролла, а точнее модного нынче computer vision-а? Эта область ML представлялась мне довольно интересной и проект на эту тему стал бы прекрасной мотивацией для изучения.


Так и появилась игра Breakout с управлением жестами через веб-камеру, или выражаясь лаконичнее Breakout-YOLO, но обо всем по порядку.


Постановка задачи




Основной геймплей Арканоида заключается в отбивании шарика двигающейся платформой, управляемой мышью/тачпадом или клавиатурой:



Мне же хотелось перенести функцию управления на жесты пользователя. Управление платформой я утвердил следующее: её положение определяется положением некоторого жеста на видео с веб-камеры.


То есть естественным образом возникла задача real-time object-detection на вход алгоритму поступает кадр из видео, на выходе хотим иметь изображение с объектами, обведёнными в рамку (bounding box) прямо как на картинке ниже:



И все это нужно делать быстро, выдавая хотя бы 20-30 FPS, ведь никому не интересно играть в слайд-шоу. Не сомневаюсь, что причастные к CV люди по названию статьи догадались какую модель я выбрал, остальных же охотно приглашаю под следующий заголовок.


Tiny-YOLOv3




You Only Look Once


YOLO это популярная архитектура CNN для решения задачи object-detection:



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


За подробным описанием архитектуры отсылаю интересующегося читателя к оригинальной статье и её обзору от Deep Systems.


Better, Faster, Stronger


Одной из последних* версий YOLO является YOLOv3. От первоначальной модели эту отличает несколько новых фич: авторы отказались от fully-connected слоя в конце, таким образом остались только свёрточные слои. Для улучшения распознавания объектов разных размеров было добавлено 2 дополнительных выходных слоя, что напоминает концепцию feature pyramid.


Были задействованы anchor box наборы ограничительных рамок, а точнее их параметров, относительно которых сеть делает предсказания bounding box-ов. Для повышения точности предсказаний их нужно перевычислять отдельно для каждого датасета. Обычно это делают с помощью метода k-средних, кластеризуя множество bounding box-ов из трейна.


Для того, чтобы регуляризовать сеть, к каждому свёрточному слою был прикручен batch normalization. Также был применён multi-scale training случайное изменение разрешения входящего изображения при обучении.


Детальное описание всех изменений можно найти в статьях про YOLOv2 и YOLOv3 и обзоре.


Я же взял Tiny-YOLOv3 уменьшенную версию этой модели без последнего слоя:



В ней используется слой пулинга вместо свёрточного слоя с страйдом 2. Всё это делает её быстрее и компактнее (~ 35 Мб), а значит более предпочтительнее для моей задачи.


* на момент выбора модели. С тех пор успела выйти YOLOv4 и нечто, называющее себя YOLOv5.


Работа с данными




Перейдём к самой рабоче-крестьянской части проекта.


Выбор жестов и датасета


Для управления игрой были выбраны следующие 4 жеста:



Вопрос: на чем обучать модель?


Первое, что пришло в голову взять датасет какого-нибудь жестового языка, например американского: ASL Alphabet, Sign Language MNIST и обучится на нем.
Но меня отпугнуло следующее:


  • В отсмотренных мною датасетах все фотографии были сделаны на однородном фоне
  • Не все выбранные мною жесты были представлены в датасетах
  • Я не нашел именно object detection датасета с bounding box-ами, так что в любом случае пришлось бы доразмечать данные

Модели же предстояло работать на разных ноутбуках с разными веб-камерами в условиях если не агрессивного фона и плохого освещения, то как минимум силуэта человека на заднем плане. По этой причине (а также из-за своей неосведомлённости в deep learning) я не мог обоснованно сказать, как YOLO обученная на этих данных поведет себя в бою. К тому же сроки предзащиты проекта поджимали права на ошибку не было.


Поэтому я посчитал правильным действовать наверняка и решил...



собрать и разметить свой датасет.


Не имей сто рублей, а имей сто друзей


В развивающемся репозитории с различными YOLO моделями мудрецы гласят, что для сколько-нибудь успешного обучения необходимо иметь в трейне не менее 2000 размеченных изображений для каждого класса. Я решил не мелочиться и поставил планку в 3000 изображений для каждого класса, обеспечивая себе пути для отступления и солидную тестовую выборку в случае выполнения поставленной цели.


Как для достижения большего разнообразия в датасете, так и для облегчения собственных страданий пришлось прибегнуть к бесплатному краудсорсингу помощи друзей. Я попросил каждого из этих восьми несчастных записать на веб-камеру 2-ух минутное видео с 4 жестами по 15 секунд на жест каждой рукой. Сам я сделал 4 таких видео в разной одежде и на разных фонах.


Далее в дело вступал удобнейший GUI для разметки от AlexeyAB. С помощью него я нарезал видео на кадры и, набравшись терпения, сел размечать. Директорию с изображениями я предварительно синхронизировал с гугл-доком при помощи Insync, чтобы не терять время на перенос датасета в облако.


К концу 8-го часа разметки у меня имелось около 8000 изображений с аннотациями в .txt файлах, полное нежелание продолжать процесс и, наверное, парочка новых сидячих болезней. Поэтому, удовлетворившись проделанной работой, я пересчитал anchor box-ы, разделил данные на тест и трейн в жадном соотношении 1:9 и перешел к следующему этапу.


Обучение




Снаряжаемся видеокарточками


Времени до первого показа проекта оставалось всё меньше и меньше, поэтому я пошёл куда глаза глядят по пути наименьшего сопротивления и решил обучать модель в Darknet написанном на C и CUDA open-source фреймворке для создания и обучения нейронных сетей.


Вычислительных мощностей мне объективно не хватало из графических процессоров с поддержкой CUDA под рукой имелась только GeForce GT 740M (Compute Capability = 3.0), которой требовалось 10-12 часов для обучения Tiny-YOLOv3. Поэтому я стал счастливым обладателем подписки на Colab Pro с Tesla P100-PCIE-16GB под капотом, сократившей это время до 3 часов. Стоит отметить, что Colab уже давно и так бесплатно предоставляет всем желающим мощную Tesla T4, правда с ограничениями по времени использования. О них я узнал по всплывшей на экране надписи You cannot currently connect to a GPU due to usage limits in Colab, заигравшись с обучением YOLO на всяких кошечках-собачках, интереса ради.


Чтобы нащупать trade-off между точностью распознавания и быстродействием, я взял 4 модели: Tiny-YOLOv3 с размерами входного изображения 192x192, 256x256, 416x416 и XNOR Tiny-YOLOv3, в которой свёртки аппроксимируются двоичными операциями, что должно ускорять работу сети. Указанные Ёлки обучались в течение 8, 10, 12 и 16 тысяч итераций соответственно.


Метриками качества обученных моделей послужили mean Average Precision с IoU=0.5(далее обозначается как mAP@0,5) и FPS.


Результаты обучения



На графиках выше представлены зависимости значений лосс-функции на трейне и mAP@0.5 на тесте от номера итерации обучения.


Как видите, XNOR модели нездоровилось. Несмотря на финальный mAP@0.5 88%, при хорошем освещении она еле-еле распознавала пару жестов с минимальным confidence. FPS 15 также намекал, что что-то пошло не так. Это не могло не расстраивать, так как я возлагал на XNOR большие надежды. На момент написания этой статьи мне всё ещё не ясно, в чём была проблема, возможно я что-то напутал в .cfg файле.



Остальные же модели обучились приемлемо. Полученные значения FPS справедливы для следующей


конфигурации

ASUS Vivobook S15, i7 1.8GHz, GeForce MX250


В погоне за быстродействием для использования в игре я выбрал 192х192 модель.


Дабы не зависящий от размера входного изображения mAP@0.5 не вводил в заблуждение, надо сказать, что эта метрика в данной ситуации несколько обманчива.


Дело в том, что в собранном датасете жесты на фотографиях расположены примерно на одном расстоянии от камеры, поэтому модели переобучились на это расстояние. Это видно по тому, как 192х192 модель работает при сильном приближении/отдалении от веб-камеры она не умеет предсказывать очень большие/маленькие bounding box-ы, так как не видела таковых в датасете. Однако такое переобучение соответствует поставленной задаче распознаванию жестов на установленном расстоянии, удобном пользователю.


Таким образом, важно понимать, что mAP@0.5 здесь тесно связан с конкретной задачей, и на самом деле при уменьшении размера входного изображения модель теряет в точности распознавания очень близких/далеких к камере жестов, что, однако, практически не влияет на точность на тесте.


Let's play!




Немного про архитектуру


Для распознавания жестов в браузере я использовал библиотеку TensorFlow.js. Обученные веса сначала были сконвертированы в Keras, а затем преобразованы в TFJS Graph model.


Так выглядит демо-версия (загрузка может занять некоторое время):



Сама игра написана на Javascript, за основу был взят этот туториал. Её архитектура предельно проста и заключается лишь в перерисовке кадров с помощью setInterval. На некоторых девайсах наблюдался довольно низкий FPS, поэтому я установил модель распознавать жесты каждую 10-ую перерисовку.


Несмотря на это, всё равно могут быть заметны фризы в момент распознавания. Чтобы их избежать я планирую распараллелить распознавание и перерисовку с помощью Web Worker.


А вот теперь поиграем


Весь код с обученными моделями и инструкцией по использованию лежит здесь.


Управление игрой:


  • Нажатие на кнопку Play/пауза в игре жест finger up
  • Перемещение курсора в меню/снятие с паузы жест circle
  • Перемещение платформы жест fist
  • Выстрел шариком с липкой платформы жест pistol

Поиграть можно здесь. Я рекомендую использовать FIrefox, но Chrome/Chromium также поддерживаются.


Так выглядит геймплей:



Вместо заключения




Внимательный читатель спросит: А причем тут собственно методы оптимизации? Да ни при чем! Но такая свобода выбора темы проекта дала стимул плотно начать разбираться в интересном разделе машинного обучения, и это здорово, на мой взгляд.


Sapere aude, хабровчане!


Полезные ссылки





P. S.


Всё это, как видится, лишь история о моём знакомстве с моделью YOLO и о её использовании. Если Вы знаете как надо было сделать, то приглашаю вместе с конструктивной критикой в комментарии, буду рад дельным рекомендациям.

Подробнее..

Подборка статей о машинном обучении кейсы, гайды и исследования за июнь 2020

06.07.2020 18:16:50 | Автор: admin


Здесь вас ждёт список вышедших за июнь материалов на английском языке. Все они написаны без лишнего академизма, содержат примеры кода и ссылки на непустые репозитории. Большинство упомянутых технологий находятся в открытом доступе и не требуют сверхмощного железа для тестирования.

Image GPT

В Open AI решили, что раз модель-трансформер, которая обучалась на тексте, способна генерировать связные законченные предложения, то если модель обучить на последовательностях пикселей, она сможет генерировать дополненные изображения. Open AI демонстрируют, как качественная выборка и точная классификация изображений позволяет созданной модели конкурировать с лучшими сверточными моделями в условиях обучения без присмотра.



Face depixelizer

Месяц назад нам предоставили возможность поиграть с инструментом, который с помощью модели машинного обучения делает из портретов прекрасный пиксель-арт. Это весело, но пока сложно представить широкую сферу применения этой технологии. А вот инструмент, который производит обратное действие, сразу же очень заинтересовал общественность. С помощью лицевого депикселизатора в теории можно будет устанавливать личность человека по видеозаписи с камер наружного наблюдения.


DeepFaceDrawing

Если работы с пиксельными изображениями недостаточно, и нужно составить фотографию с портретом человека по примитивному наброску, то и для этого уже появился инструмент на основе DNN. По замыслу создателей нужны только общие начертания, а не профессиональные эскизы модель далее сама восстановит лицо человека, которое будет совпадать с наброском. Система создана с использованиям фремворка Jittor, как обещают создатели, исходный код на Pytorch скоро тоже будет добавлен в репозиторий проекта.



PIFuHD

С реконструкциями лиц разобрались, что насчет остального тела? Благодаря развитию DNN, стало возможным 3D-моделирование фигуры человека на основе двухмерного фото. Основное ограничение было связано с тем, что точные прогнозы требуют анализировать широкий контекст и исходные данные в высоком разрешении. Многоуровневая архитектура модели и способность к сквозному обучению помогут решить эту проблему. На первом уровне для экономии ресурсов изображение анализируется целиком в низком разрешении. После этого формируется контекст, и на более детальном уровне модель оценивает геометрию, анализируя изображение с высоким разрешением.



RepNet

Многие вещи, которые нас окружают, состоят из циклов разной периодичности. Часто для того, чтобы понять суть явления, нужно проанализировать информацию о его повторяющихся проявлениях. С учетом возможностей видеосъемки зафиксировать повторения уже давно не сложно, проблема заключалась в их подсчете. Способ покадрового сравнения плотности пикселей в кадре часто не подходил из-за тряски камеры, или загораживания объектами, а также резкой разницей в масштабе и форме при приближении и отдалении. Теперь эту проблему решает модель, разработанная Google. Она определяет повторяющиеся действия на видео, в том числе и те, которые не использовались при обучении. В результате модель возвращает данные о периодичности повторяющихся действий, распознанных на видео. Колаб уже доступен.



SPICE model

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

Детектор социального дистанцирования

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



Распознавание типовых документов

На сегодняшний день существуют тысячи вариаций самых распространенных шаблонных документов вроде квитанций, счетов и чеков. Существующие автоматизированные системы, которые рассчитаны на работу с очень ограниченным типом шаблонов. Google предлагает использовать для этого машинное обучение. В статье рассматривается архитектура модели и результаты полученных данных. Вскоре инструмент станет частью сервиса Document AI.

Как создать масштабируемый пайплайн разработки и деплоя алгоритмов машинного обучения для бесконтактного ритейла

Израильский стартап Trigo делится опытом применения машинного обучения и компьютерного зрения для take-and-go ритейла. Компания является поставщиком системы, которая позволяет магазинам работать без кассы. Авторы рассказывают какие задачи перед ними стояли и объясняют, почему выбрали PyTorch в качестве фреймворка для машинного обучения, а Allegro AI Trains для инфраструктуры и как им удалось наладили процесс разработки.

На этом все, спасибо за внимание!
Подробнее..

Как мы контролируем качество моделей для детектирования объектов на изображениях

08.07.2020 18:05:40 | Автор: admin
image

Добрый день. Нас зовут Татьяна Воронова и Эльвира Дяминова, мы занимаемся анализом данных в компании Center 2M. В частности, мы обучаем нейросетевые модели для детектирования объектов на изображениях: людей, спецтехники, животных.

В начале каждого проекта компания договаривается с заказчиками о приемлемом качестве распознавания. Этот уровень качества необходимо не только обеспечить при сдаче проекта, но и удерживать при дальнейшей эксплуатации системы. Получается, надо постоянно контролировать и дообучать систему. Хочется снизить затраты на этот процесс и избавиться от рутинной процедуры, высвободив время на работу по новым проектам.

Автоматическое дообучение не уникальная идея, многие компании имеют подобные внутренние инструменты-конвейеры. В этой статье мы хотели бы рассказать о нашем опыте и показать, что для успешного внедрения таких практик вовсе не обязательно быть огромной корпорацией.

Один из наших проектов подсчет людей в очередях. Из-за того, что заказчик крупная компания с большим количеством отделений, люди в определенные часы скапливаются как по расписанию, то есть регулярно происходит детектирование большого количества объектов (голов людей). Поэтому мы решили начать внедрение автоматического дообучения именно на этой задаче.

Вот как выглядел наш план. Все пункты, кроме работ разметчика, осуществляются в автоматическом режиме:

  1. Раз в месяц выбираются автоматически все изображения с камер за последнюю неделю.
  2. Названия изображений добавляются на общую xls-страницу в sharepoint, а также заносятся статусы файлов-изображений по умолчанию: Не просмотрено.
  3. С помощью последнего (работающего в текущий момент) варианта модели генерируется разметка изображений в папку также добавляются xml-файлы с разметкой (координаты найденных голов), а на страницу автоматически заносится общее количество найденных моделью объектов это число понадобится в дальнейшем для отслеживания качества модели.
  4. Разметчики раз в месяц просматривают размеченные файлы в статусе Не просмотрено. Правят разметку и заносят количество исправлений в xls-страницу (отдельно количество удаленных меток, отдельно количество добавленных). Статусы просмотренных разметчиком файлов меняются на Просмотрено. Таким образом, мы понимаем, как деградировало качество нашей модели.

    Кроме того, мы уясняем характер ошибки: размечается ли в основном лишнее (сумки, стулья) или, наоборот, не находим часть людей (например, из-за медицинских масок). График изменяющихся метрик качества модели выводится в виде панели-отчета.
  5. Раз в месяц по xls-файлу смотрится количество файлов в статусе Просмотрено и количество изменений > 0. Если количество выше порогового значения, запускается переобучение модели на расширенном множестве (с добавлением поправленной разметки). Если ранее файл входил в обучающий датасет, старая разметка по файлу меняется на новую. У файлов, взятых в обучение, статус меняется на Взято в обучение. Статус нужно менять, иначе одни и те же файлы будут повторно попадать в дообучение. Дообучение производится начиная с чекпоинта, оставшегося при предыдущем обучении. В дальнейшем мы планируем вводить дообучение не только по расписанию, но и превышению порога количества изменений, которые пришлось сделать в разметке.
  6. Если количество файлов в статусе Просмотрено равно 0, необходимо оповещение разметчик по какой-то причине не проверяет разметку.
  7. Если, несмотря на дообучение модели, точность продолжает падать, а метрики спускаются ниже порогового значения, необходимо оповещение. Это знак, что нужно детально разбираться в проблеме с привлечением аналитиков.

В итоге данный процесс очень помог нам. Мы отследили увеличение ошибок второго рода, когда много голов неожиданно стали масочными, вовремя обогатили обучающий датасет новым видом голов и дообучили текущую модель. Плюс такой поход позволяет учитывать сезонность. Мы постоянно корректируем датасет с учетом текущей ситуации: люди часто носят головные уборы либо, наоборот, почти все приходят в учреждение без них. Осенью возрастает число людей в капюшонах. Система становится более гибкой, реагирует на обстановку.

Например, на изображении ниже одно из отделений (в зимний день), кадры которого не были представлены в обучающем датасете:

image

Если посчитать метрики для этого кадра (TP = 25, FN = 3, FP = 0), то получится, что полнота (recall) 89%, точность (precision) 100%, а гармоническое среднее между точностью и полнотой около 94,2% (о метриках чуть ниже). Достаточно неплохой результат для нового помещения.

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

image

Леди вблизи:

image

При тестировании модели выбирались кадры, не участвовавшие в обучении (датасет с различным количеством людей на кадре, в разных ракурсах и различного размера), для оценки качества модели мы использовали recall и precision.

Recall полнота показывает, какую долю объектов, реально относящихся к положительному классу, мы предсказали верно.

Precision точность показывает, какую долю объектов, распознанных как объекты положительного класса, мы предсказали верно.

Когда заказчику была необходима одна цифра, комбинация точности и полноты, мы предоставляли гармоническое среднее, или F-меру. Подробнее про метрики.

После одного цикла мы получили следующие результаты:

image

Полнота в 80% до каких-либо изменений связана с тем, что к системе добавилось большое количество новых отделений, появились новые ракурсы. К тому же сменилось время года, до этого в обучающем датасете были представлены осенне-зимние люди.

После первого цикла полнота стала 96,7%. Если сравнивать с первой статьей, то там полнота достигала 90%. Такие изменения связаны с тем, что сейчас количество людей в отделениях снизилось, они стали намного меньше перекрывать друг друга (закончились объемные пуховики), да и разнообразие головных уборов поубавилось.

Например, раньше нормой было примерно такое количество людей, как на изображении ниже.

image

Сейчас дела обстоят таким образом.

image

Подводя итоги, назовем плюсы автоматизации:

  1. Частичная автоматизация процесса разметки.
  2. Своевременное реагирование на новые ситуации (поголовное ношение медицинских масок).
  3. Быстрое реагирование на неправильные ответы модели (сумка стала детектироваться как голова и тому подобные случаи).
  4. Мониторинг точности модели на постоянной основе. При изменении метрик в худшую сторону подключается аналитик.
  5. Минимизация трудозатрат аналитика при дообучении модели. Наши аналитики занимаются разными проектами с полным вовлечением, поэтому хотелось бы как можно реже отрывать их от основного проекта для сбора данных и дообучения по другому проекту.

Минусом является человеческий фактор со стороны разметчика он может недостаточно ответственно отнестись к разметке, поэтому необходима разметка с перекрытием или использование golden setов заданий с заранее известным ответом, служащих только для контроля качества разметки. Во многих более сложных задачах аналитик должен лично проверять разметку в таких задачах автоматический режим не подойдет.

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

Авторы статьи: Татьяна Воронова (tvoronova), Эльвира Дяминова(elviraa)
Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru