최신 버전(이름이 변경됨):
이전 버전:
GitHub에 별표를 남겨주세요. 우리에게 많은 동기를 부여해줍니다!
유사리(Similari)는 정교한 추적 시스템을 구축하는 데 도움이 되는 Python 바인딩이 포함된 Rust 프레임워크입니다. 유사리(Similari)를 사용하면 매우 효율적인 병렬 SORT, DeepSORT 및 기타 정교한 단일 관찰자(예: Cam) 또는 다중 관찰자 추적 엔진을 개발할 수 있습니다.
유사리의 주된 목적은 정교한 인메모리 다중 개체 추적 엔진을 구축할 수 있는 수단을 제공하는 것입니다.
프레임워크는 다양한 종류의 추적 및 유사성 검색 엔진을 구축하는 데 도움이 됩니다. 이는 벡터 기능을 보유하고 새 벡터를 데이터베이스에 보관된 벡터와 비교할 수 있는 가장 간단한 엔진입니다. 보다 정교한 엔진은 트랙을 통해 작동합니다. 즉, 수명 주기 동안 수집된 동일한 기능에 대한 일련의 관찰입니다. 이러한 시스템은 관찰자가 모호하거나 변화하는 관찰 결과를 수신하는 비디오 처리 또는 기타 시스템에 자주 사용됩니다.
유사한 것은 사용자 정의 추적기를 구축하기 위한 프레임워크이지만 최종 사용자 기능으로 특정 알고리즘을 제공합니다.
장면에 축 정렬된 직사각형 경계 상자를 예측하는 경계 상자 칼만 필터 는 방향이 지정된(회전된) 경계 상자도 지원합니다.
2D 포인트 움직임을 예측하는 2D 포인트 칼만 필터 .
2D 포인트 벡터 칼만 필터 - 독립적인 2D 포인트 모션의 벡터를 예측합니다(키포인트 추적기에서 사용됨).
경계 상자 클리핑 - 축 정렬 및 방향(회전) 경계 상자에 대한 교차 영역을 계산할 수 있습니다.
NMS(Non-Maximum Suppression) - 장면에 동축인 직사각형 경계 상자를 필터링하고 방향이 지정된 경계 상자를 지원합니다.
SORT 추적 알고리즘(축 정렬 및 방향 상자 지원) - IoU 및 Mahalanobis 거리가 지원됩니다.
Batch SORT 추적 알고리즘(축 정렬 및 방향 상자 지원) - IoU 및 Mahalanobis 거리가 지원됩니다. 배치 추적기를 사용하면 단일 배치로 여러 장면을 추적기에 전달하고 다시 가져올 수 있습니다. 플랫폼이 일괄 처리(예: Nvidia DeepStream 또는 Intel DL Streamer)를 지원하는 경우 일괄 추적기를 사용하는 것이 더 유리합니다.
VisualSORT 추적 - DeepSORT와 유사한 알고리즘(축 정렬 및 방향 상자 지원) - IoU 및 Mahalanobis 거리가 위치 추적에 지원되고, 유클리드, 코사인 거리가 특징 벡터의 시각적 추적에 사용됩니다.
일괄 VisualSORT - 일괄 VisualSORT 특성;
유사리(Similari)를 사용하면 다양한 추적 및 유사성 엔진을 구축할 수 있지만 때로는 더 적합할 수 있는 경쟁 도구도 있습니다. 이 섹션에서는 적용 가능한 위치와 대안이 무엇인지 설명합니다.
유사성은 단일 특징 벡터가 아닌 특정 특징 클래스에 대한 여러 관찰로 객체를 설명하는 추적 작업에 가장 적합합니다. 또한 해당 동작은 동적입니다. 인덱스에서 제거하거나 새 항목을 추가할 때마다 수정합니다. 이는 매우 중요한 점입니다. 성장하는 개체 공간이나 정적 개체 공간을 다루는 도구보다 효율성이 떨어집니다.
맞춤 : 방 전체에 걸쳐 사람을 추적합니다. 사람 ReID, 연령/성별 및 얼굴 특징은 추적 중에 여러 번 수집되어 트랙을 병합하거나 트랙 끝에서 집계된 결과를 제공하는 데 사용됩니다.
적합하지 않음 : 표절 데이터베이스, 단일 문서가 숫자(또는 단 하나)의 상수 ReID 벡터로 설명되면 문서가 추가되지만 제거되지는 않습니다. 작업은 확인된 문서와 가장 유사한 상위 X개 문서를 찾는 것입니다.
작업이 적합하지 않은 경우 유사한 도구를 사용할 수 있지만 아마도 HNSW
또는 NMS
구현을 찾고 있을 것입니다.
HNSW 러스트 - 링크
HNSW C/파이썬 - 링크
NMSLib - 링크
유사한 객체는 다음 기능을 지원합니다:
수명 주기 추적 - 객체는 수명 주기(트랙)로 표현됩니다. 즉, 나타나고, 진화하고, 사라집니다. 수명 동안 개체는 동작 속성(속성 및 특징 관찰)에 따라 진화합니다.
관찰 - 유사한 개체는 개체의 특징(균일 벡터)과 사용자 지정 관찰 속성(GPS 또는 화면 상자 위치 등)을 여러 번 수집하는 관찰자 개체에 의해 관찰된다고 가정합니다. 이러한 특징은 부동 소수점 숫자와 관찰 속성의 벡터로 표시됩니다. 관찰이 이루어지면 트랙은 수집된 특징으로 업데이트됩니다. 향후 관찰은 인덱스에서 유사한 트랙을 찾아 병합하는 데 사용됩니다.
추적 속성 - 임의의 속성은 특징 관찰 외에 추가 트랙 속성을 설명합니다. 추적 속성은 실제 개체를 비교할 때 중요한 부분입니다. dogs
cats
서로 비교하는 것을 금지하는 animal_type
과 같이 개체가 호환되지 않을 때 속성 처리가 있을 수 있기 때문입니다. 속성의 또 다른 대중적인 용도는 객체의 공간적 또는 시간적 특성입니다. 예를 들어 동시에 먼 위치에 있는 객체는 비교할 수 없습니다. 유사한 속성은 동적이며 모든 특징 관찰 추가 시 및 개체가 병합될 때 진화합니다. 거리 계산과 호환성 추측(호환되지 않는 개체를 건너뛰어 계산 공간을 줄임) 모두에 사용됩니다.
유사리(Similari)를 사용하여 대규모 인덱스를 검색하려는 경우 객체 속성을 고려하여 조회 공간을 분할하세요. 두 트랙의 속성이 호환되지 않으면 거리 계산을 건너뜁니다.
유사리는 빠릅니다. 일반적으로 Python 및 NumPy로 구축된 추적기보다 빠릅니다.
시각적 특징 계산을 효율적으로 실행하기 위해 프레임워크는 빠른 SIMD 계산을 위한 라이브러리인 Ultraviolet을 사용합니다.
병렬 계산은 전용 스레드 작업자 풀을 기반으로 하는 인덱스 샤딩 및 병렬 계산으로 구현됩니다.
벡터 작업 성능은 빌드에 정의된 최적화 수준에 따라 크게 달라집니다. 낮은 또는 기본 최적화 수준에서 Rust는 f32 벡터화를 사용하지 않을 수 있으므로 벤치마크를 실행할 때 구성된 적절한 최적화 수준을 주의하세요.
AVX, AVX2 등과 같은 모든 CPU 기능을 활성화하려면 RUSTFLAGS="-C target-cpu=native"
사용하십시오. 이는 자외선에 유익합니다.
또는 .cargo/config
에 빌드 지침을 추가할 수 있습니다.
[build] rustflags = "-C target-cpu=native"
숫자에 대한 벤치마크를 살펴보세요.
일부 벤치마크 수치는 다음과 같습니다. 벤치마크
다음을 통해 자체 벤치마크를 실행할 수 있습니다.
rustup default nightly cargo bench
Apple Silicon에서 코드를 빌드하려면 ~/.cargo/config
에 다음 줄을 추가해야 할 수도 있습니다.
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
Python 인터페이스는 즉시 사용 가능한 유사리의 함수와 클래스를 제공합니다. 현재 Python 인터페이스는 다음을 제공합니다.
축 정렬 및 방향(회전) 상자 예측을 위한 칼만 필터
2D 포인트 모션 예측을 위한 칼만 필터;
독립적인 2D 포인트 모션의 벡터를 예측하는 2D 포인트 벡터 칼만 필터(키포인트 추적기에서 사용됨)
NMS(비최대 억제);
Sutherland-Hodgman 클리핑, 방향이 지정된(회전된) 상자의 교차 영역;
IoU 및 Mahalanobis 측정항목을 사용하여 정렬합니다.
IoU 및 Mahalanobis 측정항목을 사용한 BatchSORT;
VisualSORT - 시각적 특징을 위한 유클리드/코사인 메트릭과 위치 추적을 위한 IoU/Mahalanobis 메트릭을 사용하는 DeepSORT와 유사한 추적기(VisualSort)입니다.
BatchVisualSORT - 일괄 VisualSORT 특징;
Python API 클래스와 함수는 제공된 Python 문서와 작은 예제에서 탐색할 수 있습니다.
트래커 성능과 지표를 간단히 평가하는 데 사용할 수 있는 MOTChallenge 평가 키트도 제공됩니다.
PyPi 패키지는 광범위한 플랫폼을 준수하도록 구축되었으므로 해당 플랫폼에 맞게 로컬로 구축하는 패키지만큼 빠르지 않을 수 있습니다(다음 섹션 참조).
플랫폼:
리눅스: X86_64, ARM64, ARMv7;
윈도우즈: X86_64;
맥OS: 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은 여전히 매우 자주 사용됩니다. 유사리(Similari)를 구축하는 방법은 다음과 같습니다:
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 툴킷을 설치하세요:
컬 --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env 녹슨 업데이트
빌드 필수 도구를 설치하십시오 apt install build-essential -y
.
Python3(>= 3.8) 및 개발 파일( python3-dev
)을 설치합니다.
Maturin을 설치합니다:
pip3 install --upgrade maturin~=0.15
VENV에는 없습니다 . Python 모듈을 빌드합니다.
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
VENV에서 . Python 모듈을 빌드합니다.
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
사용 예제는 Python에 있습니다.
유사한 추적기 및 기존 추적기에 대한 MOT Challenge Docker 이미지는 여기에 있습니다. 올인원 Docker 이미지를 쉽게 구축하고 추적기를 사용해 볼 수 있습니다.
특정 문제를 해결하기 위해 유사리(Similari)를 어떻게 사용할 수 있는지에 대한 기사를 수집했습니다.
IoU 객체 추적기 예;
Re-ID 개체 추적기 예;
SORT 객체 추적기 예;
Python SORT 객체 추적기 예;
Python Rotated SORT 객체 추적기 예;
다중 객체 추적을 위해 고성능 추적 시스템이 필요한 이유
저장소의 샘플을 살펴보세요.
simple.rs - 간단한 사용법에 대한 아이디어입니다.
track_merging.rs - 캠 내 트랙 병합에 대한 아이디어입니다.
Incremental_track_build.rs - 매우 간단한 기능 기반 추적기입니다.
simple_sort_iou_tracker.rs - SORT 추적기(Kalman 필터, IoU 포함).
simple_sort_iou_tracker_ Oriented.rs - 지향(회전) SORT 추적기(Kalman 필터, IoU 포함).
simple_sort_maha_tracker.rs - SORT 추적기(Kalman 필터, Mahalanobis 사용).
simple_sort_maha_tracker_ Oriented.rs - 지향형 SORT 추적기(Kalman 필터, Mahalanobis 사용).
middleware_sort_tracker.rs - SORT 추적기(Kalman 필터, 미들웨어 구현 포함).