Как использовать Mask R-CNN для обнаружения объектов с прямой трансляцией с камеры в Google Colaboratory

Существует множество подходов к обнаружению объектов. YOLO (You Only Look Once) - алгоритм выбора для многих, потому что он передает изображение через полностью сверточную нейронную сеть (FCNN) только один раз. Это делает вывод быстрым. Около 30 кадров в секунду на графическом процессоре.

Другой популярный подход - использование сети предложений регионов (RPN). Алгоритмы на основе RPN состоят из двух компонентов. Первый компонент дает предложения для областей интересов (RoI)… то есть, где на изображении могут быть объекты. Второй компонент выполняет задачу классификации изображений в этих предложенных областях. Этот подход более медленный. Mask R-CNN - это фреймворк от Facebook AI, который использует RPN для обнаружения объектов. Mask R-CNN может работать со скоростью около 5 кадров в секунду на графическом процессоре. Мы будем использовать Mask R-CNN.

Зачем использовать медленный алгоритм, если есть более быстрые альтернативы? Рад, что ты спросил!

Mask R-CNN также выводит маски объектов в дополнение к обнаружению объектов и прогнозированию ограничивающей рамки.

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

У Matterport есть отличная реализация Mask R-CNN с использованием Keras и Tensorflow. Они предоставили Блокноты для игры с Mask R-CNN, для обучения Mask R-CNN с вашим собственным набором данных и для проверки модели и весов.

Почему Google Colab

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

В моем случае я недавно потерял свой любимый ноутбук. Итак, я нахожусь на своей резервной машине - планшете с Windows и клавиатурой. Colab позволяет вам работать в Jupyter Notebook в вашем браузере, подключенном к мощному графическому процессору или виртуальной машине TPU (Tensor Processing Unit) в Google Cloud. Виртуальная машина поставляется с предустановленными Python, Tensorflow, Keras, PyTorch, Fastai и многими другими важными инструментами машинного обучения. Все бесплатно. Помните, что прогресс вашего сеанса будет потерян из-за нескольких минут бездействия.

Начало работы с Google Colab

Добро пожаловать в руководство Colaboratory поможет вам легко начать работу. А Advanced Colab guide пригодится при вводе данных с камеры, при взаимодействии между разными ячейками записной книжки и при взаимодействии кода Python и JavaScript. Если у вас нет времени на них смотреть, просто запомните следующее.

Ячейка в записной книжке Colab обычно содержит код Python. По умолчанию код выполняется в каталоге /content подключенной виртуальной машины. Ubuntu - это операционная система виртуальных машин Colab, и вы можете выполнять системные команды, начав строку команды с !.

Следующая команда клонирует репозиторий.

!git clone https://github.com/matterport/Mask_RCNN

Если у вас есть несколько системных команд в одной ячейке, тогда у вас должно быть %%shell в качестве первой строки ячейки, за которой следуют системные команды. Таким образом, следующий набор команд клонирует репозиторий, изменит каталог на Mask_RCNN и настроит проект.

%%shell
# clone Mask_RCNN repo and install packages
git clone https://github.com/matterport/Mask_RCNN
cd Mask_RCNN
python setup.py install

Импортировать маску R-CNN

Следующий код взят из Demo Notebook, предоставленного Matterport. Нам нужно только изменить ROOT_DIR на ./Mask_RCNN, проект, который мы только что клонировали.

Оператор python sys.path.append(ROOT_DIR) гарантирует, что последующий код выполняется в контексте каталога Mask_RCNN, в котором доступна реализация Mask R-CNN. Код импортирует необходимые библиотеки, классы и загружает предварительно обученную модель Mask R-CNN. Пройти через это. Комментарии облегчают понимание кода.

Создать модель из тренированных гирь

Следующий код создает объект модели в режиме вывода, чтобы мы могли выполнять прогнозы. Затем он загружает веса из предварительно обученной модели, которую мы скачали ранее, в объект модели.

Запустить обнаружение объектов

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

Результат предсказания

Работа с изображениями камеры

В расширенном руководстве по использованию Colab они предоставили код, который может захватывать изображение с веб-камеры в записной книжке, а затем пересылать его в код Python.

В записной книжке Colab предустановлен пакет Python под названием google.colab, который содержит удобные вспомогательные методы. Существует метод output.eval_js, который помогает нам оценить код JavaScript и возвращает результат в Python. А в JavaScript мы знаем, что существует метод под названием getUserMedia(), который позволяет нам захватывать аудио- и / или видеопоток с веб-камеры и микрофона пользователя.

Взгляните на следующий код JavaScript. Используя getUserMedia() метод WebRTC API JavaScript, он захватывает видеопоток веб-камеры и рисует отдельные кадры на холсте HTML. Как и google.colab пакет Python, у нас есть google.colab библиотека на JavaScript. Эта библиотека поможет нам вызвать метод Python, используя функцию kernel.invokeFunction из нашего кода JavaScript.

Изображение, снятое с веб-камеры, преобразуется в формат Base64. Это изображение Base64 передается методу обратного вызова Python, который мы определим позже.

Мы уже обсуждали, что при наличии %%shell в качестве первой строки ячейки записной книжки Colab она запускается как команды терминала. Точно так же вы можете написать JavaScript во всей ячейке, начав ячейку с %%javascript. Но мы просто поместим код JavaScript, который мы написали выше, внутрь кода Python. Нравится:

Python - коммуникация JavaScript

Код JavaScript, который мы написали выше, вызывает notebook.run_algo метод нашего кода Python. Следующий код определяет метод Python run_algo, который принимает изображение Base64, преобразует его в массив numpy и затем передает его через модель Mask R-CNN, которую мы создали выше. Затем он показывает выходное изображение и статистику обработки.

Важно! Не забудьте заключить Python-код вашего метода обратного вызова в блок try / except и записать его. Потому что он будет вызван JavaScript, и не будет никаких признаков того, какая ошибка произошла при вызове обратного вызова Python.

Зарегистрируем run_algo как notebook.run_algo. Теперь его можно будет вызывать с помощью кода JavaScript. Мы также вызываем take_photo() метод Python, который мы определили выше, для запуска видеопотока и обнаружения объектов.

Попробуй сам

Теперь вы готовы попробовать Маску R-CNN на камеру в Google Colab. Блокнот проведет вас шаг за шагом через весь процесс.

(Необязательно) Для любопытных

Процесс, который мы использовали выше, преобразует поток камеры в изображения в браузере (JavaScript) и отправляет отдельные изображения в наш код Python для обнаружения объектов. Очевидно, это не в реальном времени. Итак, я потратил часы, пытаясь загрузить поток WebRTC с JavaScript (одноранговый узел A) на Python Server (одноранговый узел B), но безуспешно. Возможно, главным препятствием было мое незнание комбинации async / await с Python Threads. Я пытался использовать aiohttp в качестве сервера Python, который будет обрабатывать соединение WebRTC с использованием aiortc. Библиотека Python aiortc упрощает создание Python как партнера WebRTC. Вот ссылка на Блокнот Colab с неполными усилиями по созданию сервера WebRTC.

Первоначально опубликовано на https://emadehsan.com 29 января 2020 г.