Новые версии (переименованы):
Старые версии:
Отметьте нас на GitHub — это нас очень мотивирует!
Likei — это платформа Rust с привязками Python, которая помогает создавать сложные системы отслеживания. С помощью Likei можно разработать высокоэффективную параллельную сортировку, DeepSORT и другие сложные механизмы отслеживания с одним наблюдателем (например, Cam) или несколькими наблюдателями.
Основная цель Likei — предоставить средства для создания сложных механизмов отслеживания нескольких объектов в памяти.
Платформа помогает создавать различные виды систем поиска по отслеживанию и сходству — самая простая из них содержит векторные признаки и позволяет сравнивать новые векторы с теми, которые хранятся в базе данных. Более сложные механизмы работают по трекам — сериям наблюдений за одной и той же функцией, собранным в течение жизненного цикла. Такие системы часто используются при обработке видео или других системах, где наблюдатель получает нечеткие или изменяющиеся результаты наблюдения.
Likei — это платформа для создания пользовательских трекеров, однако она предоставляет определенные алгоритмы в качестве функций конечного пользователя:
Фильтр Калмана Bounding Box , который прогнозирует прямоугольные ограничивающие рамки, выровненные по оси сцены, также поддерживает ориентированные (повернутые) ограничивающие рамки.
Фильтр Калмана 2D Point , который прогнозирует движение 2D точки.
Фильтр Калмана 2D Point Vector , прогнозирующий вектор движения независимых 2D точек (используется в Keypoint Tracker).
Обрезка ограничивающей рамки , позволяющая вычислить область пересечения для выровненных по оси и ориентированных (повернутых) ограничивающих рамок.
Немаксимальное подавление (NMS) — фильтрует прямоугольные ограничивающие рамки, соосные сцене, и поддерживает ориентированные ограничивающие рамки.
Алгоритм отслеживания SORT (поддерживаются выровненные по осям и ориентированные рамки) — поддерживаются расстояния IoU и Махаланобиса.
Алгоритм отслеживания пакетной сортировки (поддерживаются выровненные по осям и ориентированные блоки) — поддерживаются расстояния IoU и Махаланобиса. Пакетный трекер позволяет передавать несколько сцен трекеру в одном пакете и возвращать их обратно. Если платформа поддерживает пакетную обработку (например, Nvidia DeepStream или Intel DL Streamer), более выгодно использовать пакетный трекер.
Отслеживание VisualSORT — алгоритм, подобный DeepSORT (поддерживаются выровненные по осям и ориентированные рамки) — для позиционного отслеживания поддерживаются расстояния IoU и Махаланобиса, для визуального отслеживания векторов признаков используются евклидовы и косинусные расстояния.
Batch VisualSORT — вариант пакетной VisualSORT;
Хотя Likei позволяет создавать различные механизмы отслеживания и сходства, существуют конкурентоспособные инструменты, которые иногда могут подойти лучше. В этом разделе будет объяснено, где это применимо и какие альтернативы существуют.
Likei лучше всего подходит для задач отслеживания, где объекты описываются несколькими наблюдениями для определенного класса объектов, а не одним вектором объектов. Кроме того, их поведение динамично — вы удаляете их из индекса или изменяете так же часто, как добавляете новые. Это очень важный момент — он менее эффективен, чем инструменты, работающие с растущими или статическими пространствами объектов.
Fit : отслеживание человека в комнате: ReID человека, возраст/пол и характеристики лица собираются несколько раз во время отслеживания и используются для объединения треков или предоставления агрегированных результатов в конце трека;
Не подходит : база данных плагиата, когда один документ описывается числом (или только одним) постоянными векторами ReID, документы добавляются, но не удаляются. Задача — найти X топ-документов, наиболее похожих на проверенный.
Если ваша задача выглядит как Не подходит , вы можете использовать Likei, но вы, вероятно, ищете реализации HNSW
или NMS
:
HNSW Rust — Ссылка
HNSW C/Python — ссылка
НМСлиб — ссылка
Объекты Likei поддерживают следующие функции:
Отслеживание жизненного цикла — объект представлен своим жизненным циклом (треком) — он появляется, развивается и исчезает. В течение своего существования объект развивается в соответствии со своими поведенческими свойствами (атрибутами и наблюдениями за функциями).
Наблюдения - Подобные предполагает, что объект наблюдает объект-наблюдатель, который собирает его характеристики (однородные векторы) и пользовательские атрибуты наблюдения (например, GPS или положение окна экрана) несколько раз. Эти функции представлены векторами чисел с плавающей запятой и атрибутами наблюдения. Когда наблюдение произошло, трек обновляется с учетом собранных функций. Будущие наблюдения используются для поиска похожих треков в индексе и их объединения.
Атрибуты трека . Произвольные атрибуты описывают дополнительные свойства трека, помимо наблюдений за объектами. Отслеживание атрибутов играет решающую роль при сравнении объектов в дикой природе, поскольку в случае несовместимости объектов может возникнуть диспозиция атрибутов, например, animal_type
, которая запрещает вам сравнивать dogs
и cats
между собой. Другое популярное использование атрибутов — это пространственная или временная характеристика объекта, например, объекты, которые одновременно расположены в удаленных местах, нельзя сравнивать. Атрибуты в Likei являются динамическими и развиваются при каждом добавлении наблюдения за объектом и при объединении объектов. Они используются как при расчете расстояний, так и при определении совместимости (что уменьшает вычислительное пространство за счет пропуска несовместимых объектов).
Если вы планируете использовать Likei для поиска в большом индексе, рассмотрите возможность использования атрибутов объекта, чтобы разделить пространство поиска. Если атрибуты двух треков несовместимы, расчеты их расстояний пропускаются.
«Симиди» быстр. Обычно это быстрее, чем трекеры, созданные на Python и NumPy.
Для выполнения вычислений визуальных функций фреймворк использует ультрафиолет — библиотеку для быстрых вычислений SIMD.
Параллельные вычисления реализуются с помощью сегментирования индекса и параллельных вычислений на основе выделенного пула рабочих потоков.
Производительность векторных операций во многом зависит от уровня оптимизации, определенного для сборки. На низких уровнях оптимизации или уровнях оптимизации по умолчанию Rust может не использовать векторизацию f32, поэтому при запуске тестов позаботьтесь о правильно настроенных уровнях оптимизации.
Используйте RUSTFLAGS="-C target-cpu=native"
чтобы включить все функции процессора, такие как AVX, AVX2 и т. д. Ультрафиолет полезен.
Альтернативно вы можете добавить инструкции по сборке в .cargo/config
:
[build] rustflags = "-C target-cpu=native"
Взгляните на эталоны цифр.
Некоторые цифры тестов представлены здесь:
Вы можете запустить свои собственные тесты:
rustup default nightly cargo bench
Возможно, вам придется добавить следующие строки в файл ~/.cargo/config
для сборки кода на Apple Silicone:
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
Интерфейс Python предоставляет готовые к использованию функции и классы Likei. На данный момент интерфейс Python предоставляет:
фильтр Калмана для прогнозирования выровненных по оси и ориентированных (повернутых) блоков;
фильтр Калмана для двумерного прогнозирования движения точки;
фильтр Калмана «Вектор 2D-точки», прогнозирующий вектор движения независимых 2D-точек (используется в Keypoint Tracker);
NMS (Немаксимальное подавление);
отсечение Сазерленда-Ходжмана, область пересечения ориентированных (повернутых) блоков;
СОРТИРОВКА с использованием IoU и метрики Махаланобиса;
BatchSORT с метрикой IoU и Махаланобиса;
VisualSORT — трекер, подобный DeepSORT, с евклидовой/косинусной метрикой для визуальных функций и метрикой IoU/Mahalanobis для позиционного отслеживания (VisualSort).
BatchVisualSORT — вариант пакетной сортировки VisualSORT;
Классы и функции API Python можно изучить в документации Python и в небольших примерах.
Также имеется оценочный комплект MOTChallenge, который можно использовать для простой оценки производительности и показателей трекеров.
Имейте в виду, что пакет PyPi создан для поддержки широкого спектра платформ, поэтому он может быть не таким быстрым, как тот, который вы собираете локально для вашей платформы (см. следующие разделы).
Платформы:
Linux: X86_64, ARM64, ARMv7;
Windows: X86_64;
MacOS: X86_64, ARM64.
pip3 install similari-trackers-rs
Вы можете собрать колесо в Docker и, если хотите установить его в хост-систему, скопировать полученный пакет в хост-систему, как показано в следующих примерах.
Если вы используете другие библиотеки Rust, вам может быть полезно собрать их с помощью базового контейнера Rust (и Python 3.8):
docker build -t similari-trackers-rs -f docker/rust_1.67/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Python 3.8 по-прежнему очень часто используется. Вот как с его помощью можно построить Likei:
docker build -t similari-trackers-rs -f docker/python_3.8/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Если вы используете самую последнюю версию среды Python, вы можете собрать базовый контейнер Python:
docker build -t similari-trackers-rs -f docker/python_3.10/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
ПРИМЕЧАНИЕ . Если вы получаете ошибку pip3
например:
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
Это означает, что версия Python в хост-системе не соответствует той, что находится в образе, использованном для сборки колеса.
Установите актуальную версию набора инструментов Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env обновление ржавчины
Установите инструменты build-essential apt install build-essential -y
.
Установите Python3 (>= 3.8) и файлы разработки ( python3-dev
).
Установите Мэтьюрин:
pip3 install --upgrade maturin~=0.15
Не в ВЭНВ . Создайте модуль Python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
В ВЕНВ . Создайте модуль Python:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
Примеры использования находятся на Python.
Образ Docker MOT Challenge для трекеров Likei и обычных трекеров находится здесь. Вы можете легко создать универсальный образ Docker и опробовать наши трекеры.
Сборник статей о том, как Likei можно использовать для решения конкретных задач.
Пример отслеживания объектов IoU;
Пример трекера объекта Re-ID;
Пример отслеживания объектов SORT;
Пример отслеживания объектов SORT Python;
Пример отслеживания объектов Python Rotated SORT;
Почему вам нужны высокопроизводительные системы слежения для отслеживания нескольких объектов.
Взгляните на образцы в репо:
simple.rs — идея простого использования.
track_merging.rs — идея внутрикамерного объединения треков.
Increal_track_build.rs — очень простой функциональный трекер.
simple_sort_iou_tracker.rs — трекер СОРТИРОВКИ (с фильтром Калмана, IoU).
simple_sort_iou_tracker_resident.rs — Ориентированный (повернутый) трекер SORT (с фильтром Калмана, IoU).
simple_sort_maha_tracker.rs — СОРТИРОВОЧНЫЙ трекер (с фильтром Калмана, Махаланобис).
simple_sort_maha_tracker_ориентированный.rs — трекер ориентированной сортировки (с фильтром Калмана, Mahalanobis).
middleware_sort_tracker.rs — трекер СОРТИРОВКИ (с фильтром Калмана, реализация промежуточного программного обеспечения).