Ultralytics YOLO를 사용한 다중 객체 추적#
비디오 분석 분야에서 객체 추적은 프레임 내 객체의 위치와 클래스를 식별할 뿐만 아니라, 비디오가 진행됨에 따라 감지된 각 객체에 고유 ID를 유지하는 중요한 작업입니다. 감시 및 보안부터 실시간 스포츠 분석에 이르기까지 그 응용 분야는 무궁무진합니다.
Ultralytics YOLO v8.4.63 버전부터 OC-SORT, Deep OC-SORT, FastTracker, TrackTrack 등 새로운 트래킹 알고리즘을 사용할 수 있습니다. 이러한 트래커는 다중 객체 트래킹 성능과 ID 일관성을 향상합니다.
왜 객체 추적에 Ultralytics YOLO를 선택해야 하나요?#
Ultralytics 트래커의 출력은 표준 객체 감지(object detection)와 일치하지만 객체 ID가 추가로 제공된다는 장점이 있습니다. 이를 통해 비디오 스트림에서 객체를 쉽게 추적하고 후속 분석을 수행할 수 있습니다. 객체 트래킹에 Ultralytics YOLO를 사용해야 하는 이유는 다음과 같습니다:
- 효율성: 정확도 저하 없이 실시간으로 비디오 스트림을 처리합니다.
- 유연성: 여러 추적 알고리즘 및 구성을 지원합니다.
- 사용 편의성: 빠른 통합 및 배포를 위한 간단한 Python API와 CLI 옵션을 제공합니다.
- 사용자 정의 가능성: 사용자 정의 학습된 YOLO 모델과 쉽게 사용할 수 있어 도메인별 애플리케이션으로의 통합이 가능합니다.
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
실제 활용 사례#
| 교통 | 소매 | 양식업 |
|---|---|---|
| 차량 추적 | 사람 추적 | 물고기 추적 |
빠른 시작#
기본 BoT-SORT 트래커로 비디오에서 트래킹을 실행합니다. tracker 인수를 변경하여 다른 트래커로 전환할 수 있습니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")비디오 스트림에서 트래커를 실행하려면 YOLO26n, YOLO26n-seg, YOLO26n-pose, YOLO26n-obb와 같이 학습된 Detect, Segment, Pose 또는 OBB 모델을 사용하십시오. 로컬에서 또는 Ultralytics Platform 클라우드 학습을 통해 커스텀 모델을 학습시킬 수 있습니다.
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom-trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrack지원되는 트래커#
Ultralytics YOLO에는 6가지 기본 트래커가 내장되어 있습니다. tracker 인수에 YAML 설정 파일을 전달하여 하나를 활성화하십시오.
| 트래커 | 구성 파일 | 모션 모델 | 외관 / ReID | 카메라 모션 보정 | 가림(Occlusion) 처리 |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | 선형 Kalman | 선택 사항 (with_reid) | 예 (sparseOptFlow / ECC) | 트랙 버퍼 + ReID 리바인딩 |
| ByteTrack | bytetrack.yaml | 선형 Kalman | 없음 | 아니요 | 2단계 저신뢰도 복구 |
| OC-SORT | ocsort.yaml | 관찰 중심 Kalman | 없음 | 아니요 | ORU, OCM, 마지막 관찰로부터의 OCR 재업데이트 |
| Deep OC-SORT | deepocsort.yaml | 관찰 중심 Kalman | 선택 사항 (with_reid) | 선택 사항 (gmc_method) | OC-SORT + 적응형 외관 EMA |
| FastTracker | fasttrack.yaml | 선형 Kalman + 롤백 | 없음 | 아니요 | Kalman 롤백 + 가림 시 bbox 확대 |
| TrackTrack | tracktrack.yaml | 선형 Kalman (NSA) | 선택 사항 (HMIoU 폴백) | 예 (sparseOptFlow / ECC) | 반복적 다중 큐 연관 + TAI |
어떤 트래커를 사용해야 하나요?#
시작점을 선택하려면 이 흐름을 따르십시오:
- 가장 빠르고 간단한 기준점이 필요한가요? → ByteTrack (ReID 없음, 카메라 모션 보정 없음, 최소한의 오버헤드).
- 휴대용, 드론 또는 이동식 카메라 영상인가요? → BoT-SORT (기본값; 카메라 모션 보정 및 선택적 ReID 추가).
- 비선형 모션(스포츠, 댄스, 급격한 방향 전환) 및 ReID가 필요 없는 경우? → OC-SORT (외관 비용 없는 관찰 중심 보정).
- ID 스왑이 주요 문제인 혼잡한 이동식 카메라 장면인가요? → Deep OC-SORT 또는 TrackTrack (둘 다 적응형 외관 융합 추가; TrackTrack은 다중 큐 연관 및 중복 ID 억제도 추가).
- 실시간으로 잦은 부분 겹침이 발생하고 ReID 예산이 없는 경우? → FastTracker (Kalman 롤백이 포함된 가림 인식 ByteTrack 변형).
트래커 전환#
tracker=에 트래커 설정 파일 이름을 전달합니다. 나머지 모든 코드는 동일하게 유지됩니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")설정#
추적 인수#
트래킹 설정은 conf, iou, show와 같은 Predict 모드와 속성을 공유합니다. 추가 설정에 대해서는 Predict 모델 페이지를 참조하십시오.
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)사용자 정의 트래커 구성#
Ultralytics에서는 수정된 트래커 설정 파일을 사용할 수도 있습니다. 이렇게 하려면 ultralytics/cfg/trackers에서 트래커 설정 파일(예: custom_tracker.yaml)의 복사본을 만들고 필요에 따라 (tracker_type를 제외한) 구성을 수정하면 됩니다.
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")공유 트래커 인수#
다음 매개변수는 대부분의 트래커 YAML 파일에서 공통으로 사용됩니다. 모든 구성에 모든 매개변수가 나타나지는 않습니다:
감지된 객체의 신뢰도 점수가 track_high_thresh 아래로 떨어지면 트래커가 해당 객체를 업데이트하지 않으므로 활성 트랙이 생성되지 않습니다.
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | 트래커 유형을 지정합니다. |
track_high_thresh | 0.0-1.0 | 첫 번째 연관에 대한 임계값입니다. 감지가 기존 트랙과 얼마나 자신 있게 일치되는지에 영향을 줍니다. |
track_low_thresh | 0.0-1.0 | 신뢰도가 낮은 감지에 대한 두 번째 연관 임계값입니다. OC-SORT 및 Deep OC-SORT의 경우 use_byte: True일 때만 적용됩니다. |
new_track_thresh | 0.0-1.0 | 감지가 기존 트랙과 일치하지 않을 경우 새 트랙을 초기화하기 위한 임계값입니다. |
track_buffer | >=0 | 손실된 트랙이 제거되기 전까지 유지되는 프레임 수입니다. 값이 높을수록 가림에 대한 허용치가 높습니다. |
match_thresh | 0.0-1.0 | 트랙 매칭을 위한 임계값입니다. 값이 높을수록 매칭이 더 관대해집니다. |
fuse_score | True, False | 매칭 전 신뢰도 점수를 IoU 거리와 융합할지 여부입니다. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | 글로벌 모션 보정 방식입니다. 카메라 움직임을 고려하는 데 도움이 됩니다. |
proximity_thresh | 0.0-1.0 | 유효한 ReID 매칭에 필요한 최소 IoU입니다. 외관 정보를 사용하기 전에 공간적 근접성을 보장합니다. |
appearance_thresh | 0.0-1.0 | ReID에 필요한 최소 외관 유사도입니다. |
with_reid | True, False | 가림 상태에서도 더 나은 추적을 위해 외관 기반 매칭을 활성화합니다. BoT-SORT, Deep OC-SORT 및 TrackTrack에서 지원됩니다. |
model | auto 또는 내보낸 파일 경로 | ReID 모델. auto은 가능할 때 기본 YOLO 백본 기능을 사용하며, 그렇지 않으면 yolo26n-cls.pt로 대체됩니다. 커스텀 인코더를 위해 .torchscript, .onnx, .engine, .openvino, … 파일을 전달합니다. |
트래커별 인수(Arguments)#
각 알고리즘은 공유 매개변수 외에도 추가적인 설정 옵션을 제공합니다. 각 트래커별 섹션에서 설명과 튜닝 조언을 확인하거나, 구성 파일을 직접 참조하십시오:
재식별(Re-Identification, ReID) 활성화#
오버헤드를 최소화하기 위해 ReID는 기본적으로 비활성화되어 있습니다. 트래커 설정 파일에서 with_reid: True을 설정하여 활성화하십시오.
ReID 모델 옵션:
model: auto— 기본 YOLO 감지기 기능을 사용하여 최소한의 오버헤드를 추가합니다. 성능 저하 없이 일부 ReID가 필요할 때 이상적입니다. 감지기가 호환되는 기능을 노출하지 않으면yolo26n-cls.pt로 대체됩니다.- 내보낸 ReID 모델 — 크롭당 추가 순방향 패스 비용으로 더 구별되는 임베딩을 얻으려면
model:을 내보낸 파일(.torchscript,.onnx,.engine,.openvino등)로 지정하십시오. 인코더는AutoBackend를 통해 로드되므로 Ultralytics가 지원하는 모든 내보내기 형식이 코드 변경 없이 작동합니다.
모든 모델 크기에 대해 즉시 사용 가능한 ONNX 인코더가 게시되어 있습니다. model:을 이러한 이름 중 하나로 설정하면 (YOLO 가중치를 가져오는 것과 같은 방식으로) 트래커가 처음 실행될 때 파일이 자동으로 다운로드됩니다. 수동 내보내기나 다운로드 단계가 필요하지 않습니다:
# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder| 모델 | 크기 (픽셀) | 파라미터 (M) | FLOPs (B) |
|---|---|---|---|
| YOLO26n-reid.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
현재는 트래커 외관 브랜치용 ONNX ReID 인코더만 사용할 수 있습니다. ReID train, val, predict 모드 및 전용 ReID 내보내기 레시피는 여전히 개발 중입니다.
별도의 분류 모델로 더 나은 성능을 얻으려면, TensorRT와 같이 더 빠른 백엔드로 내보내십시오:
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo26n-cls.pt")
# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool
# Export to TensorRT
model.export(format="engine", quantize=16, dynamic=True, batch=32)내보낸 후, 트래커 구성에서 TensorRT 모델 경로를 지정하십시오.
트래커 세부 정보#
각 트래커의 설계, 특정 매개변수 및 튜닝 팁을 보려면 아래 섹션을 확장하십시오.
BoT-SORT#
BoT-SORT (Aharon et al., 2022)는 기본 트래커입니다. 이 트래커는 ByteTrack을 확장하여 카메라 모션 보정 및 선택적 ReID를 제공합니다:
- 카메라 움직임 보정 (CMC): IoU 매칭 전에 각 프레임에서 추정된 아핀 워프(기본값은 희소 광학 흐름(sparse optical flow), ORB/ECC도 사용 가능)가 칼만 필터 상태에 적용됩니다.
- 선택적 ReID: 외관 임베딩을 비용 행렬에 융합할 수 있습니다. 기본적으로 비활성화되어 있으며
with_reid: True으로 활성화합니다.
용도: 범용 추적, 특히 카메라가 움직이는 환경에 가장 적합합니다. 외형이 비슷한 군중으로 인해 ID 교체가 발생하는 경우에만 ReID를 추가하십시오.
BoT-SORT 전용 인수:
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | 카메라 모션 보정 백엔드. sparseOptFlow이 기본값입니다. none은 CMC를 비활성화합니다. |
with_reid | True, False | 외형 기반 매칭을 활성화합니다. 기본값은 꺼짐입니다. |
model | auto 또는 ReID 모델 경로 | ReID 모델. auto은 가능할 때 기본 YOLO 기능을 사용하며, 그렇지 않으면 .torchscript / .onnx / .engine 경로를 전달합니다. |
proximity_thresh | 0.0-1.0 | 외형 특징이 고려되기 전의 최소 IoU 값입니다. |
appearance_thresh | 0.0-1.0 | ReID 매칭에 필요한 최소 코사인 유사도입니다. ID 교체를 줄이려면 이 값을 높이십시오. |
튜닝 팁:
- 정적 카메라:
gmc_method: none을 설정하여 프레임당 몇 밀리초(ms)를 절약합니다. - 심한 카메라 모션:
sparseOptFlow을 유지합니다.ecc은 더 정확하지만 느립니다. - 닮은 군중:
with_reid: True을 켜고appearance_thresh을 높입니다 (예:0.85+).
ByteTrack#
ByteTrack (Zhang et al., ECCV 2022)은 경량 베이스라인입니다. 이 트래커는 2단계 연관과 함께 선형 칼만 + IoU를 사용합니다:
- 1단계: 높은 점수의 탐지 결과를 활성 트랙과 매칭합니다.
- 2단계: 매칭되지 않은 트랙을 낮은 점수의 탐지 결과와 재매칭하여 일시적인 부분 가림(occlusion)을 복구합니다.
외형 모델이나 카메라 움직임 보정 기능은 없습니다.
용도: 탐지 비용이 주를 이루고 트래커 오버헤드를 최소화하려는 정적 또는 거의 정적인 카메라 환경에 가장 적합합니다.
ByteTrack 전용 인수: 공유 트래커 인수 외에는 없습니다.
튜닝 팁:
- 노이즈가 많은 감지기: 두 번째 단계에 더 많은 후보가 생기도록
track_low_thresh을 낮춥니다. - 고재현율 감지기: 조각난 ID를 줄이기 위해
track_high_thresh을 높입니다. - 빈번한 ID 깜빡임: 잠시 놓친 트랙이 유지되도록
track_buffer을 높입니다.
OC-SORT#
OC-SORT (Cao et al., CVPR 2023)는 SORT의 관점 중심(observation-centric) 확장 버전입니다. SORT의 경량 디자인(외관 기능 없음)을 유지하면서 세 가지 보정을 추가합니다:
- 관찰 중심 재업데이트 (ORU): 마지막 관찰과 현재 탐지 사이의 가상 궤적을 재생하여 칼만 업데이트를 다시 실행함으로써 표류된 속도를 복구합니다.
- 관찰 중심 모멘텀 (OCM): 속도 일관성 항을 통해 잘못된 방향으로 이동하는 탐지 결과에 페널티를 부여합니다.
- 관찰 중심 복구 (OCR): 예측된 상태 대신 마지막 관찰 정보를 사용하여 최근 손실된 트랙과 매칭되지 않은 탐지 결과를 재확인합니다.
용도: ReID 모델 비용 없이 비선형 움직임을 추적하는 데 가장 적합합니다.
OC-SORT 전용 인수:
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
delta_t | >=1 | OCM에서 속도 방향 계산을 위한 시간 윈도우(프레임 단위)입니다. 값이 클수록 더 부드러워집니다. |
inertia | 0.0-1.0 | 속도 일관성 비용의 가중치입니다. 높은 값은 갑작스러운 방향 변경에 페널티를 줍니다. |
use_byte | True, False | 낮은 신뢰도의 탐지 결과에 대해 ByteTrack 스타일의 2차 연관 단계를 활성화합니다. |
튜닝 팁:
- 비선형 모션:
inertia을 높입니다 (예:0.3-0.4). - 희소 감지:
use_byte: True을 활성화합니다. - 긴 가림(Occlusion): OCR이 다시 바인딩할 손실된 트랙을 더 많이 확보할 수 있도록
track_buffer을 높입니다.
Deep OC-SORT#
Deep OC-SORT는 OC-SORT에 외관 정보와 카메라 모션 보정을 추가합니다:
- 적응형 외형 융합: 탐지 신뢰도와 중첩 정도에 따라 가중치가 조절된 탐지 임베딩이 비용 행렬에 통합됩니다.
- 동적 외형 EMA: 탐지 신뢰도에 따라 평활화 계수가 조절되는 EMA를 사용하여 트랙 임베딩이 업데이트됩니다.
- 카메라 움직임 보정: 칼만 필터 상태는 희소 광학 흐름, ORB 또는 ECC를 통해 프레임 간 워핑됩니다.
용도: 시각적으로는 다르지만 공간적으로 가까운 객체 간의 ID 교체가 빈번한 혼잡하거나 카메라가 움직이는 환경에 가장 적합합니다.
Deep OC-SORT 전용 인수:
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
with_reid | True, False | 외형 기반 매칭을 활성화합니다. 기본값은 꺼짐입니다. |
model | auto, 내보낸 ReID 모델 파일 | ReID 모델. auto은 기본 YOLO 기능을 재사용하며, 그렇지 않으면 내보낸 파일(.torchscript, .onnx, .engine, …)을 전달합니다. |
proximity_thresh | 0.0-1.0 | 외형 특징이 고려되기 전의 최소 IoU 값입니다. |
appearance_thresh | 0.0-1.0 | ReID 매칭에 필요한 최소 코사인 유사도입니다. |
alpha_fixed_emb | 0.0-1.0 | 트랙 임베딩 업데이트를 위한 기본 EMA 계수입니다. 높은 값은 이전 임베딩을 더 오래 유지합니다. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | 전역 움직임 보정 방법입니다. |
delta_t | >=1 | OCM에서 속도 방향 계산을 위한 시간 윈도우(프레임 단위, OC-SORT에서 상속됨)입니다. |
inertia | 0.0-1.0 | 속도 일관성 비용의 가중치(OC-SORT에서 상속됨)입니다. |
use_byte | True, False | 낮은 신뢰도의 탐지 결과에 대해 ByteTrack 스타일의 2차 연관 단계를 활성화(OC-SORT에서 상속됨)합니다. |
튜닝 팁:
- 군중 속 ID 교체: 임베딩이 더 천천히 적응하도록
appearance_thresh을 높이고 (예:0.92-0.95)alpha_fixed_emb를 낮춥니다. - 움직이는 카메라:
gmc_method: sparseOptFlow을 설정합니다 (Deep OC-SORT는 기본적으로none로 설정됨). - 낮은 지연 시간: 모션 + CMC 전용인 경우
with_reid: False(기본값)을 유지하고, ID 교체가 오류를 지배할 때만 ReID를 활성화합니다.
FastTracker#
FastTracker는 외관 모델이 없는 가림 인식(occlusion-aware) ByteTrack 변형입니다:
- 가림 감지: 다른 활성 트랙에 의한 커버리지가
occ_cover_thresh을 초과할 때 트랙이 가려진 것으로 플래그를 지정합니다. - 가림 시 칼만 필터 롤백: 링 버퍼 기록을 사용하여 칼만 필터 상태를 가림 이전 프레임으로 롤백합니다.
- 움직임 감쇠 및 탐색 확장: 가려진 동안 속도가 감쇠되고 예측된 bbox가 확대됩니다.
- Init-IoU 억제: 새로운 트랙이 활성 트랙 위에 생성되는 것을 방지합니다.
용도: 타겟 간 겹침이 잦은(군중, 대기줄, 스포츠 등) 실시간 탐지 전용 파이프라인에 가장 적합합니다.
FastTracker 전용 인수:
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
reset_velocity_offset_occ | >=0 | 가림 시작 시 칼만 필터 속도를 복구하기 위해 돌아갈 과거 프레임 수입니다. |
reset_pos_offset_occ | >=0 | 가림 시작 시 칼만 필터 위치를 복구하기 위해 돌아갈 과거 프레임 수입니다. |
enlarge_bbox_occ | >=1.0 | 가려진 동안 예측된 bbox에 적용되는 높이 스케일링입니다(너비는 XYAH 종횡비를 통해 조정됨). |
dampen_motion_occ | 0.0-1.0 | 가려진 동안의 속도 배수입니다. 값이 낮을수록 가림 구간에서 트랙이 "느려집니다". |
active_occ_to_lost_thresh | >=1 | 활성 트랙이 손실 상태로 전환되기 전의 최대 연속 가림 프레임 수입니다. |
occ_cover_thresh | 0.0-1.0 | 트랙이 폐색되었음을 선언하기 위해 다른 활성 트랙이 차지하는 트랙 영역의 비율입니다. |
occ_reappear_window | >=0 | 최근에 폐색되어 소실된 트랙이 우선적으로 재탐색 가능한 상태로 유지되는 프레임 수입니다. |
init_iou_suppress | 0.0-1.0 | 활성 트랙과의 IoU가 이 값을 초과하면 새 트랙 초기화를 억제합니다. 비활성화하려면 1.0으로 설정합니다. |
튜닝 팁:
- 빈번한 부분 가림:
occ_cover_thresh을 낮춥니다 (예:0.5-0.6). - 중첩 주변의 중복 ID:
init_iou_suppress을 낮춥니다 (예:0.5). - 긴 가림:
occ_reappear_window과track_buffer을 함께 높입니다. - 빠르게 움직이는 대상:
dampen_motion_occ을 높이고 (1.0에 가깝게)enlarge_bbox_occ를 낮춥니다.
TrackTrack#
TrackTrack (Shim et al., CVPR 2025)은 다중 단서 반복 연관(multi-cue iterative association)을 통해 각 트랙의 관점에서 추론합니다:
- 트랙 관점 기반 연관 (TPA): HMIoU, 코사인 ReID 거리, 신뢰도 투영 거리 및 코너 각도 거리를 결합합니다. 할당은 완화 임계값을 사용하여 반복적으로 해결됩니다.
- 트랙 인식 초기화 (TAI): 새 ID가 생성되기 전에 중복 생성을 억제합니다.
용도: 중복 ID가 문제되는 빈번한 폐색이 있는 혼잡한 장면에 가장 적합합니다.
TrackTrack 전용 인수:
| 파라미터 | 유효한 값 또는 범위 | 설명 |
|---|---|---|
iou_weight | 0.0-1.0 | 다중 큐 비용 행렬에서 HMIoU 거리의 가중치입니다. |
reid_weight | 0.0-1.0 | 코사인 ReID 거리의 가중치입니다. ReID가 비활성화되면 HMIoU로 대체됩니다. |
conf_weight | 0.0-1.0 | 신뢰도 투영 거리의 가중치입니다. |
angle_weight | 0.0-1.0 | 코너 각도 거리의 가중치입니다. |
penalty_p | 0.0-1.0 | 저신뢰도 탐지에 대한 비용 페널티입니다. |
penalty_q | 0.0-1.0 | 보조 NMS에 의해 복구된 탐지에 대한 비용 페널티입니다. |
reduce_step | 0.0-1.0 | 반복당 매칭 임계값 완화 정도입니다. |
tai_thr | 0.0-1.0 | 트랙 인식 초기화 NMS를 위한 IoU 임계값입니다. |
min_track_len | >=0 | 새 트랙이 확정되기 전까지 필요한 최소 성공 업데이트 횟수입니다. |
lost_match_thr | 0.0-1.0 | 완화된 손실-재바인딩 패스를 위한 더 느슨한 비용 게이트; 0은 이를 비활성화합니다. |
with_reid | True, False | 코사인 ReID 외형 매칭을 활성화합니다(기본 YOLO 기능 사용). 기본값은 꺼짐입니다. |
model | auto, ReID 파일 | ReID 모델; auto은 기본 YOLO 기능을 사용하고, 그렇지 않으면 내보낸 ReID 파일을 사용합니다. |
gmc_method | sparseOptFlow, orb, sift, ecc, none | 전역 움직임 보정 방법입니다. |
튜닝 팁:
- 혼잡한 보행자: 중복 생성을 더 많이 억제하려면
tai_thr을 낮추고 (예:0.45) 더 긴 가림을 위해track_buffer를 높입니다. - 빠른 카메라 모션:
gmc_method: sparseOptFlow을 활성화된 상태로 유지합니다. - 작고 빠른 객체:
angle_weight을 약간 높이고min_track_len을 낮춥니다. - 필요할 때만 ReID 활성화: 추론 비용이 추가됩니다. 짧은 폐색의 경우 기본 다중 큐 비용으로 충분한 경우가 많습니다.
Python 예제#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
트랙 지속 루프#
OpenCV (cv2)와 YOLO26을 사용하여 비디오 프레임에서 객체 트래킹을 실행하는 Python 스크립트입니다. 이 스크립트는 필요한 패키지(opencv-python 및 ultralytics)가 이미 설치되어 있다고 가정합니다. persist=True 인수는 트래커에 현재 이미지 또는 프레임이 시퀀스의 다음 이미지이며 현재 이미지에서 이전 이미지의 트랙을 예상하도록 지시합니다.
persist=True은 동일한 비디오 스트림의 연속된 프레임을 model.track()에 전달할 때만 사용하세요. 이를 통해 트래커가 이전 프레임의 상태를 재사용하고 시간에 따라 일관된 트랙 ID를 유지할 수 있습니다. 이전 트랙 상태가 이어질 수 있으므로, 관련 없는 이미지나 다른 스트림 전반에 걸쳐 persist=True를 사용하지 마세요.
또한 tracker="botsort.yaml", tracker="bytetrack.yaml", tracker="tracktrack.yaml"와 같은 트래커 설정 파일을 전달하여 트래커 백엔드를 선택할 수 있습니다.
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()간단한 감지 대신 객체 트래킹을 활성화하는 model(frame)에서 model.track(frame)로의 변경 사항에 유의하십시오. 이 수정된 스크립트는 비디오의 각 프레임에서 트래커를 실행하고, 결과를 시각화하며, 창에 표시합니다. 'q'를 누르면 루프를 종료할 수 있습니다.
시간에 따른 트랙 플로팅#
연속적인 프레임에서 객체 트랙을 시각화하면 비디오 내에서 탐지된 객체의 이동 패턴과 행동에 대한 귀중한 통찰력을 얻을 수 있습니다. Ultralytics YOLO26을 사용하면 이러한 트랙을 플로팅하는 과정이 원활하고 효율적입니다.
다음 예제에서는 YOLO26의 추적 기능을 사용하여 여러 비디오 프레임에 걸쳐 탐지된 객체의 이동을 플로팅하는 방법을 보여줍니다. 이 스크립트는 비디오 파일을 열고 프레임별로 읽으며, YOLO 모델을 활용하여 다양한 객체를 식별하고 추적합니다. 탐지된 바운딩 박스의 중심점을 유지하고 연결함으로써 추적된 객체가 이동한 경로를 나타내는 선을 그릴 수 있습니다.
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(list)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 tracking on the frame, persisting tracks between frames
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.is_track:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.plot()
# Plot the tracks
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y center point
if len(track) > 30: # retain 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO26 Tracking", frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()멀티스레드 추적#
멀티스레드 추적은 여러 비디오 스트림에서 동시에 객체 추적을 실행할 수 있는 기능을 제공합니다. 이는 여러 감시 카메라와 같은 여러 비디오 입력을 처리할 때 특히 유용하며, 병렬 처리를 통해 효율성과 성능을 크게 향상시킬 수 있습니다.
제공된 Python 스크립트에서는 Python의 threading 모듈을 사용하여 트래커의 여러 인스턴스를 동시에 실행합니다. 각 스레드는 하나의 비디오 파일에서 트래커를 실행하는 역할을 하며, 모든 스레드는 백그라운드에서 동시에 실행됩니다.
각 스레드가 올바른 파라미터(비디오 파일, 사용할 모델, 파일 인덱스)를 받도록 하기 위해 이러한 파라미터를 허용하고 메인 트래킹 루프를 포함하는 run_tracker_in_thread 함수를 정의합니다. 이 함수는 비디오 프레임을 프레임별로 읽고, 트래커를 실행하고, 결과를 표시합니다.
이 예제에서는 yolo26n.pt과 yolo26n-seg.pt 두 가지 모델이 사용되며, 각 모델은 서로 다른 비디오 파일에서 객체를 추적합니다. 비디오 파일은 SOURCES에 지정됩니다.
threading.Thread의 daemon=True 매개변수는 메인 프로그램이 완료되는 즉시 이러한 스레드가 종료됨을 의미합니다. 그런 다음 start()로 스레드를 시작하고 join()을 사용하여 두 트래커 스레드가 모두 완료될 때까지 메인 스레드가 대기하도록 합니다.
마지막으로, 모든 스레드가 작업을 완료한 후 결과를 표시하는 창이 cv2.destroyAllWindows()을 사용하여 닫힙니다.
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO26 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()이 예제는 더 많은 스레드를 생성하고 동일한 방법론을 적용하여 더 많은 비디오 파일과 모델을 처리하도록 쉽게 확장할 수 있습니다.
새로운 트래커 기여하기#
다중 객체 트래킹에 능숙하며 Ultralytics YOLO를 사용하여 트래킹 알고리즘을 성공적으로 구현하거나 조정하셨습니까? ultralytics/cfg/trackers의 트래커 섹션에 기여해 주시기 바랍니다! 실제 애플리케이션과 솔루션은 트래킹 작업을 수행하는 사용자에게 매우 유용할 수 있습니다.
이 섹션에 기여함으로써 귀하는 Ultralytics YOLO 프레임워크 내에서 사용 가능한 추적 솔루션의 범위를 확장하고 커뮤니티를 위한 또 다른 기능과 유용성을 더하게 됩니다.
기여를 시작하려면 풀 리퀘스트(PR) 제출에 대한 자세한 지침이 있는 기여 가이드(Contributing Guide)를 참조하십시오 🛠️. 여러분의 기여를 기대합니다!
함께 Ultralytics YOLO 생태계의 추적 기능을 향상시켜 봅시다 🙏!
FAQ#
다중 객체 추적이란 무엇이며 Ultralytics YOLO는 이를 어떻게 지원합니까?#
비디오 분석에서의 다중 객체 트래킹은 객체를 식별하는 것과 비디오 프레임 전반에 걸쳐 감지된 각 객체에 대한 고유 ID를 유지하는 것 모두를 포함합니다. Ultralytics YOLO는 객체 ID와 함께 실시간 트래킹을 제공하여 이를 지원하며, 보안 감시 및 스포츠 분석과 같은 작업을 원활하게 합니다. 이 시스템은 BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker, TrackTrack과 같은 트래커를 사용하며 YAML 파일을 통해 구성할 수 있습니다.
트래커를 YOLO 모델 파일 안에 저장할 수 있습니까?#
아니요. 표준 Ultralytics .pt 파일은 YOLO 모델 가중치를 저장하는 반면, 트래커는 추론 시점에 model.track()에 의해 생성됩니다. 트래크 ID는 연속 프레임 간의 트래커 상태에 의존하므로, 단일 독립형 이미지는 상자, 클래스 및 신뢰도와 같은 감지를 반환할 수 있지만 그 자체로는 의미 있는 지속적인 트래킹 ID를 생성할 수 없습니다.
배포를 위해 애플리케이션에서 검출기와 트래커를 함께 패키징하고, 프레임이 동일한 비디오 스트림에서 올 때 persist=True과 함께 model.track()을 프레임 단위로 호출하세요. 비디오 간에 상태가 이어지지 않도록 관련 없는 스트림에는 별도의 모델 또는 트래커 인스턴스를 사용하세요.
Ultralytics YOLO용 커스텀 트래커를 어떻게 구성합니까?#
Ultralytics 트래커 설정 디렉토리에서 기존 트래커 설정 파일(예: custom_tracker.yaml)을 복사하고 tracker_type를 제외한 매개변수를 필요에 따라 수정하여 커스텀 트래커를 구성할 수 있습니다. 다음과 같이 트래킹 모델에서 이 파일을 사용합니다:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")여러 비디오 스트림에서 객체 추적을 동시에 실행하려면 어떻게 해야 합니까?#
여러 비디오 스트림에서 동시에 객체 트래킹을 실행하려면 Python의 threading 모듈을 사용할 수 있습니다. 각 스레드는 별도의 비디오 스트림을 처리합니다. 설정 방법의 예시는 다음과 같습니다:
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO26 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()Ultralytics YOLO를 사용한 다중 객체 추적의 실제 응용 사례는 무엇입니까?#
Ultralytics YOLO를 사용한 다중 객체 추적에는 다음과 같은 수많은 응용 분야가 있습니다:
- 교통: 교통 관리 및 자율 주행을 위한 차량 트래킹.
- 소매: 매장 내 분석 및 보안을 위한 사람 추적.
- 양식: 수중 환경 모니터링을 위한 물고기 추적.
- 스포츠 분석: 성능 분석을 위한 선수 및 장비 추적.
- 보안 시스템: 의심스러운 활동 모니터링 및 보안 경보 생성.
이러한 응용 분야는 Ultralytics YOLO가 고프레임 속도 비디오를 실시간으로 탁월한 정확도로 처리하는 기능으로부터 이점을 얻습니다.
Ultralytics YOLO를 사용하여 여러 비디오 프레임에 걸쳐 객체 트랙을 시각화하려면 어떻게 해야 합니까?#
여러 비디오 프레임에 걸쳐 객체 트랙을 시각화하려면 YOLO 모델의 추적 기능과 OpenCV를 사용하여 탐지된 객체의 경로를 그릴 수 있습니다. 이를 보여주는 예제 스크립트는 다음과 같습니다:
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(list)
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True)
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
annotated_frame = results[0].plot()
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y)))
if len(track) > 30:
track.pop(0)
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
cv2.imshow("YOLO26 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()이 스크립트는 시간에 따른 추적된 객체의 이동 경로를 보여주는 추적 선을 플로팅하여 객체 행동 및 패턴에 대한 귀중한 통찰력을 제공합니다.