Чем бы вы хотели заняться в предновогодние каникулы? Конечно, чтобы узнать что-то новое! Вот я подумал и решил попробовать себя в 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 объекта в трекере становится другим