рдорд▓реНрдЯреА-рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде Ultralytics YOLO
рд╡реАрдбрд┐рдпреЛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдлреНрд░реЗрдо рдХреЗ рднреАрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реНрдерд╛рди рдФрд░ рд╡рд░реНрдЧ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЬреНрдЮрд╛рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рднреА рд░рдЦрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд╕реАрдорд┐рдд рд╣реИрдВ - рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд▓реЗрдХрд░ рд░реАрдпрд▓-рдЯрд╛рдЗрдо рд╕реНрдкреЛрд░реНрдЯреНрд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рддрдХред
рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ Ultralytics YOLO рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП?
рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ Ultralytics рдЯреНрд░реИрдХрд░реНрд╕ рдорд╛рдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдореВрд▓реНрдп рд╣реИред рдЗрд╕рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП Ultralytics YOLO рдЖрдкрдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП:
- рджрдХреНрд╖рддрд╛: рд╕рдЯреАрдХрддрд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред
- рд▓рдЪреАрд▓рд╛рдкрди: рдХрдИ рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА: рд╕рд░рд▓ Python API рдФрд░ CLI рддреНрд╡рд░рд┐рдд рдПрдХреАрдХрд░рдг рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкред
- рдЕрдиреБрдХреВрд▓рдирд╢реАрд▓рддрд╛: рдХрд╕реНрдЯрдо рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди YOLO рдореЙрдбрд▓, рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕рддрд░реНрдХрддрд╛: рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдФрд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде Ultralytics YOLOv8.
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ
рдкрд░рд┐рд╡рд╣рди | рдлреБрдЯрдХрд░ | рдПрдХреНрд╡рд╛рдХрд▓реНрдЪрд░ |
---|---|---|
рд╡рд╛рд╣рди рдЯреНрд░реИрдХрд┐рдВрдЧ | рд▓реЛрдЧ рдЯреНрд░реИрдХрд┐рдВрдЧ | рдордЫрд▓реА рдЯреНрд░реИрдХрд┐рдВрдЧ |
рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ
Ultralytics YOLO рдордЬрдмреВрдд рдФрд░ рдмрд╣реБрдореБрдЦреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
- рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдЯреНрд░реИрдХрд┐рдВрдЧ: рдЙрдЪреНрдЪ-рдлрд╝реНрд░реЗрдо-рджрд░ рд╡рд╛рд▓реЗ рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рд░реНрдмрд╛рдз рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░реЗрдВред
- рдПрдХрд╛рдзрд┐рдХ рдЯреНрд░реИрдХрд░ рд╕рдорд░реНрдерди: рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдЪреБрдиреЗрдВред
- рдЕрдиреБрдХреВрд▓рди рдЯреНрд░реИрдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди: рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рджрд░реНрдЬреА рдХрд░реЗрдВред
рдЙрдкрд▓рдмреНрдз рдЯреНрд░реИрдХрд░реНрд╕
Ultralytics YOLO рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ YAML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд╛рд╕ рдХрд░рдХреЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ tracker=tracker_type.yaml
:
- рдмреАрдУрдЯреА-рд╕реЙрд░реНрдЯ -рдкреНрд░рдпреЛрдЧ
botsort.yaml
рдЗрд╕ рдЯреНрд░реИрдХрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред - рдмрд╛рдЗрдЯрдЯреНрд░реИрдХ -рдкреНрд░рдпреЛрдЧ
bytetrack.yaml
рдЗрд╕ рдЯреНрд░реИрдХрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреНрд░реИрдХрд░ BoT-SORT рд╣реИред
рдиреЫрд░ рд░рдЦрдирд╛
рдЯреНрд░реИрдХрд░ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдЬрд╛рдирдХрд╛рд░реА
рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рд╕реНрдХреЛрд░ рдХрдо рд╣реЛрдЧрд╛, рдпрд╛рдиреА рдЗрд╕рд╕реЗ рдХрдо track_high_thresh
, рдлрд┐рд░ рдХреЛрдИ рдЯреНрд░реИрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╡рд╛рдкрд╕ рдФрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЯреНрд░реИрдХрд░ рдХреЛ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдбрд┐рдЯреЗрдХреНрдЯ, рд╕реЗрдЧрдореЗрдВрдЯ рдпрд╛ рдкреЛрдЬрд╝ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ YOLOv8n, YOLOv8n-seg рдФрд░ YOLOv8n-рднрдВрдЧрд┐рдорд╛ред
рдЙрджрд╛рд╣рд░рдг
from ultralytics import YOLO
# Load an official or custom model
model = YOLO('yolov8n.pt') # Load an official Detect model
model = YOLO('yolov8n-seg.pt') # Load an official Segment model
model = YOLO('yolov8n-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(source="https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # Tracking with ByteTrack tracker
# Perform tracking with various models using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolov8n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolov8n-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"
рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрдкрдпреЛрдЧ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реАрдбрд┐рдпреЛ рдпрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдбрд┐рдЯреЗрдХреНрдЯ, рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рдкреЛрдЬрд╝ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╕рдВрд░реВрдкрдг
рдЯреНрд░реИрдХрд░ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдЬрд╛рдирдХрд╛рд░реА
рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рд╕реНрдХреЛрд░ рдХрдо рд╣реЛрдЧрд╛, рдпрд╛рдиреА рдЗрд╕рд╕реЗ рдХрдо track_high_thresh
, рдлрд┐рд░ рдХреЛрдИ рдЯреНрд░реИрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╡рд╛рдкрд╕ рдФрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЯреНрд░реИрдХрд┐рдВрдЧ рддрд░реНрдХ
рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рдХреЗ рд╕рд╛рде рдЧреБрдг рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ conf
, iou
рдФрд░ show
. рдЖрдЧреЗ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНтАНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдореЙрдбрд▓ рдкреЗрдЬред
рдЙрджрд╛рд╣рд░рдг
рдЯреНрд░реИрдХрд░ рдЪрдпрди
Ultralytics рдЖрдкрдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдЯреНрд░реИрдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдЯреНрд░реИрдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, custom_tracker.yaml
) рд╕реЗ ultralytics/рд╕реАрдПрдлрдЬреА/рдЯреНрд░реИрдХрд░реНрд╕ рдФрд░ рдХрд┐рд╕реА рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (рд╕рд┐рд╡рд╛рдп tracker_type
) рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред
рдЙрджрд╛рд╣рд░рдг
рдЯреНрд░реИрдХрд┐рдВрдЧ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, ultralytics/cfg/trackers рдкреГрд╖реНрдаред
Python рдЙрджрд╛рд╣рд░рдг
рд▓рдЧрд╛рддрд╛рд░ рдЯреНрд░реИрдХ рд▓реВрдк
рдпрд╣рд╛рдБ рдПрдХ рд╣реИ Python рдУрдкрдирд╕реАрд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ (cv2
) рдФрд░ YOLOv8 рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднреА рднреА рдорд╛рдирддреА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓рд┐рдП рд╣реИрдВ (opencv-python
рдФрд░ ultralytics
). рд╡рд╣реА persist=True
рддрд░реНрдХ рдЯреНрд░реИрдХрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдпрд╛ рдлреНрд░реЗрдо рдПрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдореЗрдВ рдкрд┐рдЫрд▓реА рдЫрд╡рд┐ рд╕реЗ рдкрдЯрд░рд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ
import cv2
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO('yolov8n.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 YOLOv8 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("YOLOv8 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 YOLOv8, рдЗрди рдкрдЯрд░рд┐рдпреЛрдВ рдХреА рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдирд╛ рдПрдХ рд╕рд╣рдЬ рдФрд░ рдХреБрд╢рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ YOLOv8рдХрдИ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд▓реЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдПрдВред рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдирд╛, рдЗрд╕реЗ рдлреНрд░реЗрдо рджрд░ рдлреНрд░реЗрдо рдкрдврд╝рдирд╛ рдФрд░ YOLO рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ред рдкрддрд╛ рд▓рдЧрд╛рдП рдЧрдП рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЗ рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ, рд╣рдо рдЙрди рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЯреНрд░реИрдХ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдП рдЧрдП рдкрдереЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВред
рдХрдИ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдкрд░ рдкреНрд▓реЙрдЯрд┐рдВрдЧ рдЯреНрд░реИрдХ
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLOv8 model
model = YOLO('yolov8n.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 YOLOv8 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Get the boxes and track IDs
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
# Visualize the results on the frame
annotated_frame = results[0].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 90 tracks for 90 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLOv8 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()
рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдЯреНрд░реИрдХрд┐рдВрдЧ
рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрдХ рд╕рд╛рде рдХрдИ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдХрдИ рд╡реАрдбрд┐рдпреЛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрдИ рдирд┐рдЧрд░рд╛рдиреА рдХреИрдорд░реЛрдВ рд╕реЗ, рдЬрд╣рд╛рдВ рд╕рдорд╡рд░реНрддреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рджрдХреНрд╖рддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдореЗрдВ Python рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╣рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ PythonрдХреЗ рдПрд╕ threading
рдЯреНрд░реИрдХрд░ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ред рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЯреНрд░реИрдХрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рд╕рднреА рдереНрд░реЗрдб рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ рд╕рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ (рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдЗрдВрдбреЗрдХреНрд╕) рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ run_tracker_in_thread
рдЬреЛ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рдЯреНрд░реИрдХрд┐рдВрдЧ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рджрд░ рдлреНрд░реЗрдо рдкрдврд╝рддрд╛ рд╣реИ, рдЯреНрд░реИрдХрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: yolov8n.pt
рдФрд░ yolov8n-seg.pt
, рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдПрдХ рдЕрд▓рдЧ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ video_file1
рдФрд░ video_file2
.
рд╡рд╣реА daemon=True
рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ threading.Thread
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА рдЗрди рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ start()
рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ join()
рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдЯреНрд░реИрдХрд░ рдзрд╛рдЧреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
рдЕрдВрдд рдореЗрдВ, рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдиреЗ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ cv2.destroyAllWindows()
.
рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ
import threading
import cv2
from ultralytics import YOLO
def run_tracker_in_thread(filename, model, file_index):
"""
Runs a video file or webcam stream concurrently with the YOLOv8 model using threading.
This function captures video frames from a given file or camera source and utilizes the YOLOv8 model for object
tracking. The function runs in its own thread for concurrent processing.
Args:
filename (str): The path to the video file or the identifier for the webcam/external camera source.
model (obj): The YOLOv8 model object.
file_index (int): An index to uniquely identify the file being processed, used for display purposes.
Note:
Press 'q' to quit the video display window.
"""
video = cv2.VideoCapture(filename) # Read the video file
while True:
ret, frame = video.read() # Read the video frames
# Exit the loop if no more frames in either video
if not ret:
break
# Track objects in frames if available
results = model.track(frame, persist=True)
res_plotted = results[0].plot()
cv2.imshow(f"Tracking_Stream_{file_index}", res_plotted)
key = cv2.waitKey(1)
if key == ord('q'):
break
# Release video sources
video.release()
# Load the models
model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8n-seg.pt')
# Define the video files for the trackers
video_file1 = "path/to/video1.mp4" # Path to video file, 0 for webcam
video_file2 = 0 # Path to video file, 0 for webcam, 1 for external camera
# Create the tracker threads
tracker_thread1 = threading.Thread(target=run_tracker_in_thread, args=(video_file1, model1, 1), daemon=True)
tracker_thread2 = threading.Thread(target=run_tracker_in_thread, args=(video_file2, model2, 2), daemon=True)
# Start the tracker threads
tracker_thread1.start()
tracker_thread2.start()
# Wait for the tracker threads to finish
tracker_thread1.join()
tracker_thread2.join()
# Clean up and close windows
cv2.destroyAllWindows()
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рдмрдирд╛рдХрд░ рдФрд░ рдЙрд╕реА рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдореЙрдбрд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирдП рдЯреНрд░реИрдХрд░реНрд╕ рдХрд╛ рдпреЛрдЧрджрд╛рди рдХрд░реЗрдВ
рдХреНрдпрд╛ рдЖрдк рдорд▓реНрдЯреА-рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореЗрдВ рдХреБрд╢рд▓ рд╣реИрдВ рдФрд░ рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд╛рдЧреВ рдпрд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ Ultralytics YOLO? рд╣рдо рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдЯреНрд░реИрдХрд░реНрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ultralytics/cfg/рдЯреНрд░реИрдХрд░реНрд╕! рдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рдорд╛рдзрд╛рди рдЕрдореВрд▓реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдХреЗ, рдЖрдк рдХреЗ рднреАрддрд░ рдЙрдкрд▓рдмреНрдз рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рджрд╛рдпрд░реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ Ultralytics YOLO рдврд╛рдВрдЪрд╛, рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдПрдХ рдФрд░ рдкрд░рдд рдЬреЛрдбрд╝рдирд╛ред
рдЕрдкрдирд╛ рдпреЛрдЧрджрд╛рди рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз (рдкреАрдЖрд░) ЁЯЫая╕П рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рдкрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рджреЗрдЦреЗрдВред рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдк рдореЗрдЬ рдкрд░ рдХреНрдпрд╛ рд▓рд╛рддреЗ рд╣реИрдВ!
рд╕рд╛рде рдореЗрдВ, рдЖрдЗрдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рдПрдВ Ultralytics YOLO ЁЯЩП рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ !
2023-11-12 рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ 2024-04-26
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (11)