Ну наконец то! Наконец-то я заставил робота работать. После нескольких недель испытаний нового оборудования, переустановки программного обеспечения и ярости робот теперь может двигаться. Я заменил все: адаптер Wi-Fi и Bluetooth, контроллеры двигателей, антенны, все… и теперь он может двигаться без сбоя программного обеспечения.

Пока я ждал поступления некоторых новых деталей, я начал работать над машинным обучением. Для начала я решил заняться более простым проектом: я хотел, чтобы JetBot обнаруживал только те знаки остановки, которые я сделал на данный момент. Я показал знаки остановки в моем предыдущем блоге.

Коллекция изображений

Существует множество ресурсов и обученных моделей, специально предназначенных для обнаружения знаков остановки. Однако их обучали на картинках реальных стоп-сигналов, а я этого не хотел, хотел собрать свои данные. Настоящие немного отличаются от моих самодельных, цвета другие, и фоны совсем другие. Кроме того, камера JetBot представляет собой объектив типа «рыбий глаз» и позволяет снимать изображения с качеством 224x224. Если бы я хотел использовать модель, созданную для реальных знаков остановки, мне пришлось бы изменить размер моих изображений, возможно, исказив их.

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

Сбор данных — самая скучная и утомительная часть всего дела. Я был немного нетерпелив, поэтому собрал только 100 изображений для каждого класса. Возможно, это повлияло на производительность модели (я расскажу об этом ближе к концу этого блога).

Машинное обучение

Это простой пример задачи классификации. Входные данные — это массив изображений, а выходные данные — вероятность 1 или 0. Используемый мной код основан на открытом исходном коде NVIDIA, ссылка на который приведена в моем предыдущем сообщении в блоге.

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

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

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

На тот момент аппаратное обеспечение робота все еще не работало, и я пытался это исправить. Однако операционная система работала, и это все, что мне нужно было проверить, работает ли моя модель. Для начала я получил кадр изображения из потока камеры, предварительно обработал изображение и преобразовал его в массив, а затем запустил обученную модель. Если модель выдавала число 0 ‹ y‹ 0,5, это означало, что она обнаружила знак остановки. Если на выходе было 0,5 ‹ y‹ 1, это означало, что он не обнаруживал знак остановки.

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

Результаты

Я думал, что без моторов моя модель работает очень хорошо. Он распечатает «Обнаружен знак «Стоп!»». когда он увидел знак стоп, и я был счастлив с ним. Как только я заставил моторы работать, я увидел реальность вещей.

Я запрограммировал робота так, чтобы он двигался вперед вечно, и когда он обнаруживал знак остановки, он останавливался только на 1 секунду, а затем продолжал. Робот мог обнаружить знак остановки издалека на трассе. Это позволяет роботу останавливаться, затем продолжать, останавливаться, продолжать, останавливаться, затем продолжать несколько раз, прежде чем даже достигнет знака остановки, чего я не хотел. Способ исправить это — определить расстояние между знаком «стоп» и роботом. Я не думаю, что есть способ сделать это только с помощью камеры. Я думал об использовании ультразвукового датчика, который у меня уже есть, но проблема в том, что знак остановки маленький и тонкий. Это вызовет проблемы с датчиком, потому что он полагается на сигнал, который он отправляет, чтобы вернуться. Небольшой и тонкий объект, такой как мой самодельный знак «Стоп», не подойдет для этого, потому что сигнал пройдет и/или не отразится обратно.

Однако у меня есть идея по борьбе с этой проблемой, и я расскажу о ней в 3-й части этого блога.

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

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

Надеюсь, вам понравилась часть 2! А пока берегите себя!

Хосе Галло является студенческим послом в программе Inspirit AI Student Ambassadors
. Inspirit AI – это программа повышения квалификации для школьников, которая знакомит любознательных
старшеклассников со всего мира с ИИ на живых онлайн-занятиях. Узнайте больше на
https://www.inspiritai.com/.