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

Призом стал динамик Sonos (который прекрасно впишется в мой дом вместе с тем, который у меня уже есть).

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

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

YOLOv5

YOLO расшифровывается как You Oonly Look OOnce и представляет собой набор моделей для компьютерного зрения. , который славится очень высокой скоростью логического вывода. В отличие от предыдущих методов компьютерного зрения, йоло может предсказывать только за один шаг, отсюда и название. В других методах задачи предложения областей изображения, где может быть объект, и последующего предсказания его класса разбиваются на две. Кроме того, традиционно алгоритмы предложения области требуют значительных вычислительных ресурсов. В YOLO в этих задачах используется одна и та же карта объектов, а алгоритм предложения региона представляет собой просто вывод регрессии для ограничивающих рамок и вероятности наличия объекта в рамке поверх карты функций.



Я начал точную настройку yolov5x в своем экспортированном наборе данных и изо всех сил пытался получить результат выше 0,6 f1, в то время как некоторые визуальные подсказки намекали на то, что он учится, этого было недостаточно, чтобы получить приличное количество яиц. Поэтому мне нужно было больше аннотировать или дополнять данные и тренироваться дальше.

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

Чтобы выяснить, в каком направлении двигаться после первых неутешительных результатов, я позвонил другу, который работает с отслеживанием нескольких объектов, чтобы получить несколько советов, особенно в части отслеживания. Он говорил мне, что у меня есть два варианта; один отслеживал путем обнаружения (или других эвристических методов), а другой должен был изучить отношения между кадрами, что также потребовало бы от меня пометки идентификаторов каждого яйца в каждом кадре. Если это так, он посоветовал мне просто пометить одно изображение, а затем дополнить данные, сдвинув их на пару пикселей за раз, чтобы также узнать идентификаторы каждого яйца на нескольких изображениях. Мы также обсудили стратегии увеличения данных, чтобы посмотреть, смогу ли я легко улучшить свою производительность без необходимости аннотировать несколько новых изображений. Это могло быть добавление версии одного и того же аннотированного изображения, только что перевернутого, зеркального, обрезанного, с большим/меньшим оттенком, большей/меньшей насыщенностью или со случайным дрожанием. В конце концов, я аннотировал еще одно изображение и не реализовал стратегии увеличения, хотя я все еще стремлюсь увидеть увеличение производительности, которое это может дать.

В конце концов, мне просто нужно было аннотировать еще одно изображение, чтобы получить оценку f1 0,8 (конечно, проверочный набор был таким же, как и тренировочный набор), который также визуально соответствовал стандартам, на которые я надеялся. . Я понимаю, что оценка f1 уступает фактической проверке или тестовому набору, но, поскольку я не выполняю поиск по гиперпараметрам и могу визуально проверить, что все в порядке, стоимость аннотирования большего количества скриншотов только ради лучшего счет f1 был слишком высок.

Я был очень настроен не привязывать каждое яйцо к себе на другой картинке, поэтому я исследовал отслеживание с помощью алгоритмов обнаружения, как предложил друг. Я наткнулся на документ с соответствующим репозиторием GitHub под названием ByteTrack, который был разработан только в прошлом году. ByteTrack работает аналогично другим методам отслеживания с помощью обнаружения, но также может отслеживать прогнозы с низкой достоверностью обнаружения, используя стратегию проверки сходства с ранее обнаруженными объектами, обновленными до новой позиции, чтобы еще лучше отслеживать. Эта стратегия, похоже, сработала, и для обычных наборов данных и показателей отслеживания нескольких объектов, таких как точность отслеживания нескольких объектов, они получают очень хорошие результаты.

Кроме того, это может быть очень подходящим для моего варианта использования, поскольку они используют фильтр Калмана для линейного прогнозирования положения объектов в следующем кадре, а затем сравнивают его с новыми прогнозами с использованием IoU или Re-ID. Глядя на мое видео, это звучало очень хорошо, так как яйца редко двигаются нелинейно, и IoU тоже звучало хорошо, так как коробки не слишком сильно меняют размер. В то же время в моем видео много окклюзии, поэтому мне нужно было повторно захватить много яиц после того, как они не были обнаружены на большом количестве кадров.

байттрек

ByteTrack обещает лучше перехватывать уже идентифицированные треклеты (обнаружения с идентификатором), добавляя несколько шагов для их повторной идентификации. В дополнение к обычному подходу связывания полей обнаружения, чьи оценки выше порогового значения, а затем отбрасывания обнаружений ниже, они используют их сходство с треклетами для восстановления реальных объектов и фильтрации фоновых обнаружений. Как указывалось ранее, модель движения треклетов представляет собой фильтр Калмана, который обновляет прогнозируемое положение треклета на основе направления и скорости. Затем сходство между обнаружением и треклетами можно вычислить с помощью расстояния функции IoU или Re-ID. Затем они используют венгерский алгоритм для сопоставления по сходству. После первой ассоциации оставшиеся несопоставленные треклеты сопоставляются с полями обнаружения с низким уровнем только по IoU, потому что поля обнаружения с низким значением обычно содержат серьезную окклюзию или размытие движения, а признаки внешнего вида ненадежны. После ассоциации несопоставленные треки будут удалены из треклетов. Наконец, инициализация новых треклетов выполняется оставшимися непревзойденными блоками с высоким показателем обнаружения.



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

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



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

Вы можете увидеть исходный пост LinkedIn здесь



Поскольку цель поста — нанять новых коллег в области машинного обучения, пожалуйста, свяжитесь с нами, если вам это интересно ☕️