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

Я решил воссоздать то, что делал этот модуль, т.е. анализировать видео, снятое в реальном мире, и определять движущиеся объекты на видео.

Подход

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

  1. Первое правило машинного обучения: начать без машинного обучения

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

2. Обучение под наблюдением требует ярлыков

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

3. Веселее не использовать машинное обучение

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

Метод

Сначала мы разбираем видео на кадры и пытаемся идентифицировать движущиеся объекты, отслеживая цвет каждого пикселя в каждом кадре. Цвет представлен комбинацией красной, зеленой и синей шкал (RGB). Эти тройные цвета представлены числом от 0 до 255. Разве не удивительно, что цвета, изображения и видео, которые мы видим, представляют собой просто огромные матрицы чисел (RGB, пиксели)?

Движущийся объект идентифицируется при значительном изменении цвета пикселя в кадре. Например, когда цвет RGB пикселя меняется с фиолетового (180, 70, 250) на зеленый (40, 200, 120) и обратно на фиолетовый (40, 200, 120), мы можем с уверенностью сказать, что объект прошел через этот пиксель с заданными параметрами. что наша камера работает стабильно. Отслеживая цвет пикселя кадр за кадром, мы можем пометить точку как «движущийся объект» всякий раз, когда наблюдаем изменение цвета, превышающее пороговое значение.

Всякий раз, когда обнаруживается движущийся объект, мы меняем цвет этого пикселя на зеленый, чтобы выделить объект. Мы также конвертируем видео в оттенки серого, чтобы легко видеть выделенные объекты. На видео ниже показано, как эта логика обрабатывает видео и находит движущиеся объекты. Довольно круто, да?

Заключение

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

Код для этой модели: https://github.com/danielkoca/Moving-Object-Detection