Ultralytics YOLO를 사용한 다중 객체 추적
비디오 분석 영역에서 객체 추적은 프레임 내 객체의 위치와 클래스를 식별할 뿐만 아니라 비디오가 진행됨에 따라 감지된 각 객체에 대해 고유한 ID를 유지 관리하는 중요한 작업입니다. 응용 분야는 감시 및 보안에서 실시간 스포츠 분석에 이르기까지 무한합니다.
객체 추적을 위해 Ultralytics YOLO를 선택해야 하는 이유?
Ultralytics 트래커의 출력은 표준 객체 감지와 일관되지만 객체 ID라는 추가적인 가치를 제공합니다. 따라서 비디오 스트림에서 객체를 쉽게 추적하고 후속 분석을 수행할 수 있습니다. 다음은 객체 추적 요구 사항에 대해 Ultralytics YOLO를 고려해야 하는 이유입니다.
- 효율성: 정확도를 저하시키지 않고 실시간으로 비디오 스트림을 처리합니다.
- 유연성: 여러 추적 알고리즘 및 구성을 지원합니다.
- 사용 용이성: 빠른 통합 및 배포를 위한 간단한 Python API 및 CLI 옵션.
- 사용자 정의 가능성: 사용자 정의 훈련된 YOLO 모델과 함께 사용하기 쉬우므로 특정 도메인 애플리케이션에 통합할 수 있습니다.
참고: Ultralytics YOLO를 사용한 객체 감지 및 추적.
실제 응용 분야
운송 | 소매 | 양식업 |
---|---|---|
차량 추적 | 사람 추적 | 물고기 추적 |
주요 기능
Ultralytics YOLO는 강력하고 다재다능한 객체 추적 기능을 제공하기 위해 객체 감지 기능을 확장합니다.
- 실시간 추적: 고프레임 속도 비디오에서 객체를 원활하게 추적합니다.
- 다중 트래커 지원: 다양한 기존 추적 알고리즘 중에서 선택합니다.
- 사용자 정의 가능한 트래커 구성: 다양한 매개변수를 조정하여 특정 요구 사항을 충족하도록 추적 알고리즘을 조정합니다.
사용 가능한 추적기
Ultralytics YOLO는 다음 추적 알고리즘을 지원합니다. 다음과 같은 관련 YAML 구성 파일을 전달하여 활성화할 수 있습니다. tracker=tracker_type.yaml
:
- BoT-SORT - 사용법
botsort.yaml
이 트래커를 활성화하려면 사용하세요. - ByteTrack - 사용법
bytetrack.yaml
이 트래커를 활성화하려면 사용하세요.
기본 트래커는 BoT-SORT입니다.
추적
비디오 스트림에서 트래커를 실행하려면 YOLO11n, YOLO11n-seg 및 YOLO11n-pose와 같이 훈련된 Detect, Segment 또는 Pose 모델을 사용하십시오.
예시
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo11n.pt") # Load an official Detect model
model = YOLO("yolo11n-seg.pt") # Load an official Segment model
model = YOLO("yolo11n-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
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolo11n-pose.pt source="https://youtu.be/LNwODJXcvt4" # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # Custom trained model
# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"
위의 사용법에서 볼 수 있듯이, 트래킹은 비디오 또는 스트리밍 소스에서 실행되는 모든 Detect, Segment 및 Pose 모델에서 사용할 수 있습니다.
구성
추적 인수
트래킹 구성은 다음과 같은 Predict 모드와 속성을 공유합니다. conf
, iou
및 show
. 자세한 구성은 예측 모델 페이지를 참조하십시오.
예시
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show
추적기 선택
Ultralytics는 또한 수정된 트래커 구성 파일을 사용할 수 있도록 합니다. 이를 위해 트래커 구성 파일(예: custom_tracker.yaml
)을 ultralytics/cfg/trackers 에서 복사하여 필요에 따라 구성(다음 제외 tracker_type
)을 수정하십시오.
예시
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
각 파라미터에 대한 자세한 설명은 Tracker 인수 섹션을 참조하십시오.
추적기 인자
일부 추적 동작은 각 추적 알고리즘에 특정한 YAML 구성 파일을 편집하여 세밀하게 조정할 수 있습니다. 이러한 파일은 임계값, 버퍼 및 매칭 로직과 같은 파라미터를 정의합니다.
다음 표는 각 파라미터에 대한 설명을 제공합니다.
트래커 임계값 정보
객체 신뢰도 점수가 낮으면 (예: 다음보다 낮음) track_high_thresh
, 트랙이 성공적으로 반환 및 업데이트되지 않습니다.
파라미터 | 유효한 값 또는 범위 | 설명 |
---|---|---|
tracker_type |
botsort , bytetrack |
트래커 유형을 지정합니다. 옵션은 다음과 같습니다. botsort 또는 bytetrack . |
track_high_thresh |
0.0-1.0 |
트래킹 중 첫 번째 연결에 사용되는 임계값입니다. 탐지 항목이 기존 트랙과 얼마나 확실하게 일치하는지에 영향을 줍니다. |
track_low_thresh |
0.0-1.0 |
트래킹 중 두 번째 연결에 사용되는 임계값입니다. 첫 번째 연결이 실패할 경우, 더 관대한 기준으로 사용됩니다. |
new_track_thresh |
0.0-1.0 |
탐지 항목이 기존 트랙과 일치하지 않을 경우 새 트랙을 초기화하는 임계값입니다. 새로운 객체가 나타나는 시점을 제어합니다. |
track_buffer |
>=0 |
손실된 트랙을 제거하기 전에 유지해야 하는 프레임 수를 나타내는 데 사용되는 버퍼입니다. 값이 높을수록 폐색에 대한 내성이 높아집니다. |
match_thresh |
0.0-1.0 |
트랙 일치 임계값입니다. 값이 높을수록 일치가 더 관대해집니다. |
fuse_score |
True , False |
매칭 전에 신뢰도 점수를 IoU 거리와 융합할지 여부를 결정합니다. 연결 시 공간 정보와 신뢰도 정보의 균형을 맞추는 데 도움이 됩니다. |
gmc_method |
orb , sift , ecc , sparseOptFlow , None |
전역 모션 보정에 사용되는 방법입니다. 카메라 움직임을 고려하여 추적을 개선하는 데 도움이 됩니다. |
proximity_thresh |
0.0-1.0 |
ReID(재식별)를 통한 유효한 매칭에 필요한 최소 IoU입니다. 외형 단서를 사용하기 전에 공간적 근접성을 보장합니다. |
appearance_thresh |
0.0-1.0 |
ReID에 필요한 최소 외형 유사성입니다. 두 탐지 항목이 연결되려면 시각적으로 얼마나 유사해야 하는지를 설정합니다. |
with_reid |
True , False |
ReID 사용 여부를 나타냅니다. 외관 기반 매칭을 활성화하여 폐색 전반에 걸쳐 더 나은 추적을 가능하게 합니다. BoTSORT에서만 지원됩니다. |
model |
auto , yolo11[nsmlx]-cls.pt |
사용할 모델을 지정합니다. 기본값은 auto , 감지기가 YOLO인 경우 기본 기능을 사용하고, 그렇지 않으면 다음을 사용합니다. yolo11n-cls.pt . |
Re-Identification (ReID) 활성화
기본적으로 ReID는 성능 오버헤드를 최소화하기 위해 꺼져 있습니다. 활성화하는 방법은 간단합니다. 다음을 설정하기만 하면 됩니다. with_reid: True
다음에 추적기 구성다음을 사용자 정의할 수도 있습니다. model
ReID에 사용되며, 사용 사례에 따라 정확도와 속도 간의 균형을 맞출 수 있습니다.
- 기본 기능(
model: auto
): 이는 ReID를 위해 YOLO 감지기의 기능을 직접 활용하여 오버헤드를 최소화합니다. 성능에 큰 영향을 주지 않으면서 어느 정도 수준의 ReID가 필요한 경우에 이상적입니다. 감지기가 기본 기능을 지원하지 않으면 자동으로 다음을 사용하는 것으로 대체됩니다.yolo11n-cls.pt
. - YOLO 분류 모델: 분류 모델을 명시적으로 설정할 수 있습니다(예:).
yolo11n-cls.pt
) ReID 특징 추출에 사용됩니다. 이는 더 구별력 있는 임베딩을 제공하지만, 추가적인 추론 단계로 인해 지연 시간이 늘어납니다.
특히 ReID에 별도의 분류 모델을 사용하는 경우 성능 향상을 위해 TensorRT와 같은 더 빠른 백엔드로 내보낼 수 있습니다.
ReID 모델을 TensorRT로 내보내기
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo11n-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", half=True, dynamic=True, batch=32)
내보내기가 완료되면 추적기 구성에서 TensorRT 모델 경로를 지정할 수 있으며, 추적 중에 ReID에 사용됩니다.
Python 예제
지속적인 추적 루프
다음은 비디오 프레임에서 객체 추적을 실행하기 위해 OpenCV (cv2
) 및 YOLO11을 사용하는 python 스크립트입니다. 이 스크립트는 필요한 패키지(opencv-python
및 ultralytics
)가 이미 설치되어 있다고 가정합니다. persist=True
인수는 트래커에게 현재 이미지 또는 프레임이 시퀀스의 다음 이미지이며 현재 이미지에서 이전 이미지의 트랙을 예상하도록 지시합니다.
추적 기능이 있는 스트리밍 for-loop
import cv2
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO11 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 YOLO11을 사용하면 이러한 트랙을 매끄럽고 효율적으로 플로팅할 수 있습니다.
다음 예에서는 YOLO11의 추적 기능을 활용하여 여러 비디오 프레임에서 감지된 객체의 움직임을 플로팅하는 방법을 보여줍니다. 이 스크립트는 비디오 파일을 열고, 프레임 단위로 읽고, YOLO 모델을 사용하여 다양한 객체를 식별하고 추적합니다. 감지된 경계 상자의 중심점을 유지하고 연결함으로써 추적된 객체가 따라간 경로를 나타내는 선을 그릴 수 있습니다.
여러 비디오 프레임에서 트랙 플로팅
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(lambda: [])
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO11 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("YOLO11 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
을 정의합니다. 이 함수는 비디오를 프레임 단위로 읽고, 추적기를 실행하고, 결과를 표시합니다.
이 예에서는 두 개의 서로 다른 모델이 사용됩니다. yolo11n.pt
및 yolo11n-seg.pt
은 각각 다른 비디오 파일에서 객체를 추적합니다. 비디오 파일은 SOURCES
.
에 지정되어 있습니다. daemon=True
의 threading.Thread
매개변수는 기본 프로그램이 완료되는 즉시 이러한 스레드가 닫힘을 의미합니다. 그런 다음 start()
으로 스레드를 시작하고 join()
을 사용하여 기본 스레드가 두 추적기 스레드가 모두 완료될 때까지 기다리도록 합니다.
마지막으로 모든 스레드가 작업을 완료한 후 cv2.destroyAllWindows()
.
멀티스레드 추적 구현
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-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 YOLO11 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와 함께 실시간 추적을 제공하여 보안 감시 및 스포츠 분석과 같은 작업을 용이하게 합니다. 이 시스템은 YAML 파일을 통해 구성할 수 있는 BoT-SORT 및 ByteTrack와 같은 추적기를 사용합니다.
Ultralytics YOLO용 사용자 정의 트래커를 어떻게 구성합니까?
기존 추적기 구성 파일(예:) custom_tracker.yaml
) 위치에서 Ultralytics 트래커 구성 디렉토리 에서 필요에 따라 파라미터를 수정합니다. 단, tracker_type
는 제외합니다. 다음 예시와 같이 추적 모델에서 이 파일을 사용하십시오:
예시
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt 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 = ["yolo11n.pt", "yolo11n-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 YOLO11 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("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])
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("YOLO11 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
이 스크립트는 시간이 지남에 따라 추적된 객체의 이동 경로를 보여주는 추적 라인을 표시하여 객체 행동 및 패턴에 대한 귀중한 통찰력을 제공합니다.