Чем бы вы хотели заняться в предновогодние каникулы? Конечно, чтобы узнать что-то новое! Вот я подумал и решил попробовать себя в Computer Vision. Первое, что бросилось в глаза, это мандарины (просто сейчас сезон и их много в магазинах). А почему бы не написать программу для подсчета этих вкусных мандаринов?

вот что у меня получилось (Оказалось, что у меня всего 5 мандаринов, хо-хо-хо)

Как я это сделал? Читай дальше. Также хочу отметить, что вы можете смотреть весь код здесь

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

Чтобы считать объекты, их сначала нужно обнаружить. Для этого я использовал YOLOv5. YOLO (You Only Look Once) — популярная архитектура CNN для решения проблемы обнаружения объектов. И да, я знаю о дебатах Yolov4 против Yolov5. Для этой цели я выбрал Yolov5, потому что хотел понять, как с ним работать. Возможно, я выберу четвертую версию для следующей. Вот как выглядит детектор:

На вход подается текущий кадр, а на выходе — список объектов с названиями, цветами, координатами и так далее. Входной параметр classes содержит список классов (тип объекта), которые необходимо обнаружить. Здесь я использовал небольшую хитрость.

Для этой демки я не хотел снова обучать модель (на самом деле я использовал модель yolov5m6.pt — цифра 6 в конце означает шестую версию). Поэтому я добавил альтернативные имена для готовых классов. Вот как вызывается детектор

На самом деле в заголовке я заменил названия апельсинов на мандарины.

Хорошо, теперь пришло время подключить трекер.

Отслеживание объектов

В качестве трекера я использовал Motpy. Для чего нужен трекер? Короче говоря, нужно понять, один и тот же объект в разных кадрах или нет. Это минимальный пример отслеживания:

Я не устанавливал библиотеку с помощью pip. Я скопировал его в папку своего проекта и внес небольшие изменения (добавил дополнительное поле payload для объекта). Итак, основываясь на этом примере, я написал следующее:

В этом примере «objs» — это список объектов, полученных из ранее написанного класса ChristmasDetection.

Вот если собрать все воедино, можно получить полноценное наблюдение за объектами. Их можно отслеживать, определять, входят ли они в полигон (какую-то виртуальную область на кадре), а также, например, вычислять расстояние между ними и так далее.

Что я обнаружил при написании этого проекта

  • Чем больше подключена «большая» предварительно обученная модель YOLO, тем больше повышается качество, но снижается производительность.
  • Для предварительно обученных моделей YOLO версии 5 есть возможность увеличить размер входного изображения (что повышает качество обнаружения). Для версии 6 я не мог изменить входное изображение
  • вертикальное видео отказалось обрабатывать для готовых моделей 6-й версии YOLO
  • Трекер объектов снижает производительность и его качество сильно зависит от количества «запоминаемых» кадров.
  • Если объект закрыт другим объектом, то не помогает даже длинная очередь кадров. ID объекта в трекере становится другим

Рекомендации