В реальном мире есть такие проблемы, как ограниченность данных и крошечное оборудование, такое как мобильные телефоны и Raspberry Pis, которое не может запускать сложные модели глубокого обучения. В этом посте показано, как можно выполнять обнаружение объектов с помощью Raspberry Pi. Как машины на дороге, апельсины в холодильнике, подписи в документе и теслы в космосе.

Отказ от ответственности: я создаю nanonets.com, чтобы помочь построить машинное обучение с меньшим объемом данных и без оборудования

Если вам не терпится, прокрутите до конца сообщения репозиторий Github

Почему обнаружение объектов? Почему Raspberry Pi?

Raspberry Pi - это изящное оборудование, которое покорило сердца целого поколения: продано около 15 миллионов устройств, а хакеры строят на нем даже крутые проекты. Учитывая популярность глубокого обучения и камеры Raspberry Pi, мы подумали, что было бы неплохо, если бы мы могли обнаруживать любой объект с помощью глубокого обучения на Pi.

Теперь вы сможете обнаружить фотобомбардировщик на своем селфи, кого-то, входящего в клетку Харамбе, где кто-то держал шрирача или курьера Amazon, входящего в ваш дом.

Что такое обнаружение объектов?

20 миллионов лет эволюции сделали человеческое зрение достаточно развитым. В человеческом мозге 30 % нейронов работают над обработкой зрения (по сравнению с 8 процентами для осязания и всего 3 процентами для слуха). У людей есть два основных преимущества по сравнению с машинами. Один - стереоскопическое зрение, второй - почти бесконечный набор обучающих данных (у ребенка 5 лет было примерно 2,7 млрд изображений, снятых с частотой 30 кадров в секунду).

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

  1. Классификация: назначает ярлык всему изображению.
  2. Локализация, назначает ограничивающую рамку определенной метке.
  3. Обнаружение объекта: рисует несколько ограничивающих рамок на изображении.
  4. Сегментация изображения: создает точные сегменты расположения объектов на изображении.

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

Использование обнаружения объектов:

Обнаружение объектов имеет большое практическое значение и используется в различных отраслях промышленности. Некоторые из примеров упомянуты ниже:

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

Обнаружение объектов можно использовать, чтобы ответить на множество вопросов. Это общие категории:

  1. Присутствует ли объект на моем изображении или нет? например, в моем доме есть злоумышленник?
  2. Где на изображении находится объект? например, когда машина пытается проехать по миру, важно знать, где находится объект.
  3. Сколько объектов на изображении? Обнаружение объектов - один из самых эффективных способов подсчета объектов. например, сколько ящиков в стеллаже на складе
  4. Какие типы объектов представлены на изображении? например, какое животное находится в какой части зоопарка?
  5. Какого размера объект? Особенно со статической камерой, легко определить размер объекта. например, каков размер манго
  6. Как разные объекты взаимодействуют друг с другом? например, Как форма на футбольном поле влияет на результат?
  7. Где находится объект относительно времени (Отслеживание объекта). например, отслеживание движущегося объекта, например поезда, и вычисление его скорости и т. д.

Обнаружение объектов менее чем в 20 строках кода

Существует множество моделей / архитектур, которые используются для обнаружения объектов. Каждый из них имеет компромисс между скоростью, размером и точностью. Мы выбрали один из самых популярных: YOLO (смотришь один раз). и показали, как это работает ниже, в менее чем 20 строках кода (если вы проигнорируете комментарии).

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

Вы можете прочитать полный текст статьи здесь: https://pjreddie.com/media/files/papers/yolo_1.pdf

Как построить модель глубокого обучения для обнаружения объектов?

Рабочий процесс для глубокого обучения состоит из 6 основных шагов, разбитых на 3 части

  1. Сбор обучающих данных
  2. Обучение модели
  3. Прогнозы на новые изображения

Этап 1 - Сбор обучающих данных

Шаг 1. Соберите изображения (не менее 100 для каждого объекта):

Для этой задачи вам, вероятно, понадобится несколько 100 изображений на объект. Постарайтесь собрать данные как можно ближе к тем данным, на основе которых вы, наконец, собираетесь делать прогнозы.

Шаг 2. Аннотирование (нарисуйте рамки на изображениях вручную):

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

Этап 2 - Обучение модели на машине с графическим процессором

Шаг 3. Поиск предварительно обученной модели для трансферного обучения.

Вы можете узнать больше об этом на medium.com/nanonets/nanonets-how-to-use-deep-learning-when-you-have-limited-data-f68c0b512cab. Вам нужна предварительно обученная модель, чтобы вы могли уменьшить объем данных, необходимых для обучения. Без него для обучения модели вам может потребоваться несколько изображений размером 100 тыс.

Здесь вы можете найти кучу предварительно обученных моделей

Шаг 4. Обучение на графическом процессоре (облачный сервис, такой как AWS / GCP и т. д., или ваш собственный компьютер с графическим процессором):

Образ Docker

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

Чтобы начать обучение модели, вы можете запустить:

sudo nvidia-docker run -p 8000:8000 -v `pwd`:data docker.nanonets.com/pi_training -m train -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -p '{"batch_size":8,"learning_rate":0.003}' 

Пожалуйста, перейдите по этой ссылке для получения подробной информации о том, как использовать

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

run.sh [-m mode] [-a architecture] [-h help] [-e experiment_id] [-c checkpoint] [-p hyperparameters]
-h          display this help and exit
-m          mode: should be either `train` or `export`
-p          key value pairs of hyperparameters as json string
-e          experiment id. Used as path inside data folder to run current experiment
-c          applicable when mode is export, used to specify checkpoint to use for export

Вы можете найти более подробную информацию по адресу:



Для обучения модели вам необходимо правильно выбрать гиперпараметры.

Поиск правильных параметров

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

Квантовать модель (сделать ее меньше, чтобы она поместилась на маленьком устройстве, таком как Raspberry Pi или Mobile)

Маленькие устройства, такие как мобильные телефоны и Rasberry PI, имеют очень мало памяти и вычислительной мощности.

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

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

Зачем нужно квантовать?

Модели нейронных сетей могут занимать много места на диске, например, исходная AlexNet имеет размер более 200 МБ в формате с плавающей запятой. Почти весь этот размер приходится на веса нейронных связей, поскольку часто в одной модели их много миллионов.

Узлы и веса нейронной сети изначально хранятся как 32-битные числа с плавающей запятой. Самая простая мотивация для квантования - уменьшить размеры файлов, сохраняя минимальное и максимальное значение для каждого слоя, а затем сжимая каждое значение с плавающей запятой до восьмибитного целого числа. Размер файлов уменьшается на 75%.

Код для квантования:

curl -L "https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz" |
  tar -C tensorflow/examples/label_image/data -xz
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb \
  --out_graph=/tmp/quantized_graph.pb \
  --inputs=input \
  --outputs=InceptionV3/Predictions/Reshape_1 \
  --transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,299,299,3")
    remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true)
    fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes
    strip_unused_nodes sort_by_execution_order

Примечание. В наш образ докеры встроено квантование.

Этап 3. Прогнозирование новых изображений с помощью Raspberry Pi

Шаг 5. Сделайте новое изображение с помощью камеры

Вам нужна живая и работающая камера Raspberry Pi. Затем сделайте снимок нового изображения

Инструкции по установке кассы можно найти по ссылке

Шаг 6. Прогнозирование нового изображения

Загрузить модель

После того, как вы закончите обучение модели, вы можете загрузить ее на свой пи. Чтобы экспортировать модель, выполните:

sudo nvidia-docker run -v `pwd`:data docker.nanonets.com/pi_training -m export -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -c /data/0/model.ckpt-8998

Затем загрузите модель на Raspberry Pi.

Установите TensorFlow на Raspberry Pi

В зависимости от вашего устройства вам может потребоваться немного изменить установку

sudo apt-get install libblas-dev liblapack-dev python-dev libatlas-base-dev gfortran python-setuptools libjpeg-dev
sudo pip install Pillow
sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly-pi-zero/lastSuccessfulBuild/artifact/output-artifacts/tensorflow-1.4.0-cp27-none-any.whl
git clone https://github.com/tensorflow/models.git
sudo apt-get install -y protobuf-compiler
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:/home/pi/models/research:/home/pi/models/research/slim

Запустить модель для прогнозирования нового изображения

python ObjectDetectionPredict.py --model data/0/quantized_graph.pb --labels data/label_map.pbtxt --images /data/image1.jpg /data/image2.jpg

Тесты производительности на Raspberry Pi

Raspberry Pi имеет ограничения как на память, так и на вычислительные ресурсы (версия Tensorflow, совместимая с графическим процессором Raspberry Pi, все еще недоступна). Поэтому важно оценить, сколько времени требуется каждой из моделей, чтобы сделать прогноз на новом изображении.

Рабочий процесс с наносетями:

Мы в NanoNets стремимся упростить работу с Deep Learning. Обнаружение объектов - это основная область нашего внимания, и мы создали рабочий процесс, который решает множество проблем, связанных с внедрением моделей глубокого обучения.

Как наносети упрощают процесс:

1. Аннотации не требуются

Мы убрали необходимость комментировать изображения, у нас есть опытные комментаторы, которые добавят аннотации к вашим изображениям.

2. Автоматический выбор лучшей модели и гиперпараметров.

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

3. Нет необходимости в дорогом оборудовании и графических процессорах.

NanoNets полностью в облаке и работает без использования какого-либо оборудования. Что значительно упрощает использование.

4. Отлично подходит для мобильных устройств, таких как Raspberry Pi.

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

Вот простой фрагмент для прогнозирования изображения с помощью NanoNets API.

Создайте свою собственную NanoNet

Вы можете попробовать построить свою собственную модель из:

1. Использование графического интерфейса (также автоматическое добавление аннотаций к изображениям): https://nanonets.com/objectdetection/

2. Используя наш API: https://github.com/NanoNets/object-detection-sample-python

Шаг 1. Клонируйте репо

git clone https://github.com/NanoNets/object-detection-sample-python.git
cd object-detection-sample-python
sudo pip install requests

Шаг 2. Получите бесплатный ключ API

Получите бесплатный ключ API на сайте http://app.nanonets.com/user/api_key

Шаг 3. Задайте ключ API как переменную среды

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Шаг 4: Создайте новую модель

python ./code/create-model.py

Примечание: это генерирует MODEL_ID, который вам нужен для следующего шага.

Шаг 5. Добавьте идентификатор модели как переменную среды

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Шаг 6. Загрузите тренировочные данные

Соберите изображения объекта, который вы хотите обнаружить. Вы можете аннотировать их либо с помощью нашего веб-интерфейса (https://app.nanonets.com/ObjectAnnotation/?appId=YOUR_MODEL_ID), либо с помощью инструмента с открытым исходным кодом, такого как labelImg. Когда у вас есть готовый набор данных в папках, images (файлы изображений) и annotations (аннотации к файлам изображений), начните выгрузку набора данных.

python ./code/upload-training.py

Шаг 7: модель обучения

После загрузки изображений приступайте к обучению модели.

python ./code/train-model.py

Шаг 8: Получите состояние модели

На обучение модели уходит ~ 2 часа. Вы получите электронное письмо после обучения модели. А пока вы проверяете состояние модели.

watch -n 100 python ./code/model-state.py

Шаг 9: сделайте прогноз

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

python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg

Код (репозитории Github)

Github Repos для обучения модели:

  1. Код Tensorflow для обучения и квантования модели
  2. Код Наносети для обучения модели

Github Repos для Raspberry Pi для прогнозирования (т.е. обнаружения новых объектов):

  1. Код Tensorflow для прогнозирования на Raspberry Pi
  2. Код NanoNets для прогнозирования на Raspberry Pi

Наборы данных с аннотациями:

  1. Виды автомобилей на индийских дорогах, набор данных для извлечения транспортных средств из изображений индийских дорог
  2. Набор данных Коко