Вы когда-нибудь задумывались, можно ли парковать машину перед домом, в котором вы живете? Для меня это бесконечная история. Иногда вам просто нужно знать, когда вы едете домой, и вы не уверены, подойдет ли вам. Не беспокойтесь, пусть машина посмотрит за вас. Конечно, я пытался провести предварительное исследование, но, похоже, никто не сделал модель, классифицирующую, сколько там машин. С моими довольно ограниченными знаниями о машинном обучении я пытался найти сервис, который сделал бы эту работу за меня. Как пользователь GCP, меня интересовал AutoML. Чтобы проверить усилия, я также создал модель в Tensorflow. Весь проект можно найти на github.

Я уже слышу ваши замечания: А что, если бы вы просто установили IP-камеру и посмотрели? Смотреть на маленькую фотографию за рулем — нехорошо. Кроме того, вы можете использовать услугу преобразования текста в речь, чтобы прочитать номер для вас, как только вы сможете классифицировать, сколько парковочных мест пусто. Разве это не круто?

Подготовка

Сначала мне нужно собрать фотографии. Я использовал RPi 1, потому что у меня был один свободный. Также я использовал старую камеру A4tech. Наличие этой старой и простой установки имеет некоторые неочевидные преимущества. Это очень дешево! Дешево - это тема, к которой я стремился. Поэтому первый кулачковый держатель выглядел так:

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

Это сработало. Вам просто нужно использовать 3D-принтер и двухсторонний скотч.

Чтобы сделать снимок с помощью USB-камеры, вы можете использовать fswebcam. Я рекомендую использовать параметр `-F 10`. Это сделает изображение менее шумным и размывает движущиеся объекты. Он работает на нескольких уровнях. Машины один раз припаркованные стоят без движения минимум 10 кадров, люди как-то не могут усидеть на месте. Как только вы боретесь с GDPR, больше не напрягайтесь. Размытие почти всегда помогало мне сделать людей неузнаваемыми.

Все это дело запускалось в crontab с периодом в десять минут. Скрипт, вызываемый cron, выглядел так:

Как вы могли заметить, я каждый раз проверяю наличие точки монтирования. Это потому, что внутренняя SD-карта Raspberry Pi очень маленькая. Я пытаюсь максимально снизить общую нагрузку ввода-вывода, поэтому сохранение изображений на SD-карту невозможно.

Предварительная обработка

Собрав все фотографии, я столкнулся с несколькими проблемами. Во-первых, моя камера не видит в темноте. Это ограничивает время, в течение которого я могу использовать свой классификатор, только дневным светом. Я могу жить с этим. Чтобы удалить все изображения черного цвета, я использовал скрипт bash, который делает каждое изображение размером в один пиксель. Затем он сравнивает значения HSB и, как только яркость становится ниже 20, картинка удаляется:

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

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

Я назвал группы следующим образом:

  • 1 — Осталось одно место
  • 2 — Осталось всего два места
  • 3 — Думаю, теперь вы заметили общую тему
  • 4 — Это случалось не слишком часто и мне пришлось удалить группу из-за нехватки данных
  • i — пусто только место для инвалидов
  • full — Парковка полностью занята, и мне нужно припарковать машину в другом месте.

Автомл

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

  1. В учебнике не так много говорится о том, как должен выглядеть список данных. Я создал скрипт, который берет все изображения, загруженные в корзину GCS, и добавляет, к какому подмножеству данных относятся изображения.
  2. Мне пришлось снизить порог оценки, потому что модель не чувствовала себя достаточно уверенно в отношении моих новых тестовых фотографий.

Еще одно разочарование случилось, когда я просмотрел матрицу путаницы. Интерпретация GCP выглядит следующим образом: «Эта таблица показывает, как часто модель правильно классифицировала каждую метку и какие метки чаще всего путали с этой меткой». Эта функция доступна только в том случае, если вы предоставляете подмножество изображений, помеченных как TEST.

В случае большого количества комбинаций (например, 2 истинных метки — 2 предсказанных метки) мы видим, что модель не классифицировала ни одно изображение из подмножества TEST наших данных. Что совершенно вводит в заблуждение, так это тот факт, что модель классифицировала три пустых парковочных места как одно свободное парковочное место. Это произошло только для одной фотографии, поэтому трудно сказать, действительно ли это проблема. То же самое касается двух и одного парковочных мест. Это может быть проблемой, когда вы едете на место, потому что вы уверены, что есть еще один свободный.

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

Следующая картина была классифицирована следующим образом:

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

Тензорный поток

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

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

Я также должен упомянуть, что обучение заняло 2 ГБ оперативной памяти. Tensorflow решил, что использовать мою старую Nvidia 1050 не стоит, и обучил все на Ryzen 5950X. Почему-то я не могу его винить.

Общая производительность во время обучения обычно заканчивалась проигрышем: 0,0633 и точностью: 0,9750. Здесь мы можем увидеть результаты в матрице путаницы:

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

Вывод

В конце концов, создание модели самостоятельно в Tensorflow работало намного лучше. Я думаю, мы можем обвинить входные данные. Честно говоря, я просто пропустил вариант использования AutoML. Гораздо большее разочарование ждало меня в биллинге. Tensorflow стоил мне много электроэнергии из-за обучения на CPU, AutoML обошелся мне в 75 долларов за 24 часа использования обучающей ноды.

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

Мой личный совет: если вы не уверены на 100%, что AutoML — это то, что вам нужно, потратьте некоторое время на Tensorflow. Возможность самостоятельного тестирования гиперпараметров может привести к лучшим результатам. Я не эксперт по машинному обучению, но после прочтения хорошо написанного руководства по Tensorflow я с уверенностью решил попробовать. В итоге мои результаты оказались намного лучше, чем с AutoML.

Что дальше

Я начал этот пост с того, что мне нужно что-то, что может подсказать, могу ли я припарковаться перед домом, в котором живу, или нет. Одного классификатора недостаточно. AutoML имеет опцию Облачный хостинг. Он также предоставляет SDK, который вы можете использовать в своих клиентских приложениях. Для Tensorflow вам придется самостоятельно подготовить инфраструктуру.

Первоначально опубликовано на https://www.ackee.agency 5 августа 2021 г.