TL, DR; В этой статье вы узнаете, как сделать робота, который приближается к банану, с моделью обнаружения объектов, ускоренной Edge TPU.

Как это работает?

Этот робот построен на Raspberry Pi 3 B +, подключает драйвер двигателя L298N, который управляет двумя двигателями, и обнаруживает объект с помощью камеры, ускоренной с помощью Coral USB Accelerator.

Давайте разберемся, как это работает.

Обнаружение объекта

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

Raspberry Pi + Coral USB Accelerator + MobileNet SSD v2

Немного сложно запустить модель обнаружения объектов на Raspberry Pi, потому что для этого требуется много ресурсов ЦП, поэтому он вызывает медленный отклик при обнаружении (обычно более секунды на изображение), даже если вы используете модель, предназначенную для мобильного использования, например MobileNet SSD.
С Coral USB Accelerator вы можете увеличить время обнаружения более чем в 10 раз.

Вы можете найти быстрое и легкое пошаговое руководство по обнаружению объектов с помощью Edge TPU на веб-сайте Coral, но у него нет демонстрации в реальном времени. Если вы хотите отслеживать то, что обнаруживается на камере в режиме реального времени, вы можете сделать это с помощью picamera и ее функции наложения.

Драйвер мотора

Между тем, нам нужно управлять двигателями, чтобы Raspberry Pi работал как робот! К счастью, у Raspberry Pi уже есть контакты GPIO, которые могут отправлять и управлять сигналами на внешние устройства. Но не управляйте двигателями напрямую через GPIO, вместо этого используйте драйвер двигателя постоянного тока L298N H-Bridge. Драйвер двигателя L298N может управлять двигателями постоянного тока с помощью сигналов LVTTL Raspberry Pi GPIO.
Вы можете управлять этим драйвером двигателя с помощью 3 контактов GPIO для каждого двигателя, подавая HIGH или PWM на контакт EN и HIGH / LOW на контакты IN1 / 2. Код будет примерно таким, как показано ниже.

import RPi.GPIO as GPIO
# Setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.out)  # connect to IN1
GPIO.setup(15, GPIO.out)  # connect to IN2
GPIO.setup(18, GPIO.out)  # connect to ENA
# Run a motor CW or CCW (depends on how you connect)
GPIO.output(14, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
GPIO.output(18, GPIO.HIGH)

Если вас интересует механизм этого драйвера, обратитесь к этому руководству.

Простая логика поиска банана

Теперь у нас есть модель обнаружения объектов с камерой Raspberry Pi, и мы можем управлять двигателями. Давайте объединим эти две функции и заставим его работать как умный робот. В этот раз мы хотим, чтобы робот искал банан (что в данном случае означает следование за бананом). Как мы можем этого добиться?
Это может быть очень сложно, но сейчас будет просто. Если банан находится с левой стороны кадра камеры, поверните налево, если с правой стороны, поверните направо.

Подводя итоги - почему на грани? зачем нужен ускоритель?

Вы можете задаться вопросом, почему мы используем модель обнаружения объектов на Edge TPU вместо облака или процессора? Это зависит от того, какое приложение вам нужно. В этом приложении робот обнаруживает объекты и запускает двигатели для каждого кадра, что составляет 10 кадров в секунду. Что, если на кадр уходит больше секунды? Робот должен подождать секунду для обнаружения, привести в движение двигатели, а затем подождать секунду и запустить двигатели ... Видите ли, для этого приложения требуется быстрая итерация. Как было написано ранее, процессор слишком медленный для обнаружения объектов, а как насчет облака? Он может быть быстрее, чем Edge TPU, потому что вы можете использовать мощный графический процессор или даже Cloud TPU. Однако обнаружение объектов в облаке означает, что вы должны отправлять изображения в облако для каждого кадра, это требует пропускной способности и не работает в автономном режиме.

Посмотрите весь исходный код в моем репозитории GitHub.
Там будет статья по интеграции с Cloud ... может быть!