Відстеження та збирання даних є однією з ключових складових успіху бізнесу в інтернеті. У цій статті я розповім про те, як відбувається відстеження, які методи бувають, їх переваги та недоліки, а також поділюся своїм досвідом використання нового способу відстеження – server-side tracking – у Fintech індустрії. Я постаралася розповісти про це простими словами і зрозуміло структурувати інформацію (мені свого часу не вистачало саме таких статей для занурення у тему), і сподіваюся, що ця стаття буде для вас корисною. Виділяють два основні види відстеження потоку транзакцій: client-side tracking та server-side tracking. Спочатку, давайте розберемося, що таке “клієнт” і “сервер”, т.к. відсутність розуміння цих термінів часто призводить до плутанини. Допустимо, ви вирішили відвідати вебсайт. Те, що реально станеться в цьому випадку - ваш браузер завантажить вам копії сторінок і покаже їх вам. Для цього ваш браузер, подібно до клієнта в ресторані, зробить запит на отримання певних сторінок, а центральний комп'ютер надішле – “сервірує” – ці дані для браузера. Таким чином, ваш браузер виступить у ролі клієнта, а центральний комп'ютер, що володіє даними - сторінками веб-сайту - сервером. Крім веб-браузера, клієнтами можуть бути, наприклад, ваш мобільний пристрій або програму. Справа в тому, що крім копій сторінок, ваш браузер або програма часто завантажує ідентифікатори - шматочки коду, які запам'ятовують ваш браузер (наприклад, файли cookies) або пристрій і збирають інформацію про відвідані сторінки, час відвідування, і т.д. Ці дані потім використовуються аналітиками даних або маркетологами для вирішення бізнес-завдань. Таких методів два - client-side tracking та server-side tracking. Client-side tracking або збір даних на стороні клієнта є традиційним, найчастіше використовуваним методом. При такому методі додавання тега відбувається як у прикладі вище – за допомогою ідентифікатора у браузері або у додатку. Тобто. дія відбувається на "клієнтської" стороні - що й зумовило таку назву. Інформація надсилається безпосередньо з браузера користувача або його мобільного пристрою і надходить далі на сервер аналітичного сервісу (наприклад, це може бути часто використовувані Google Analytics для веб-сайтів або Google Analytics for Firebase для додатків). Взаємодія клієнта та аналітичного сервісу відбувається без посередників. Як виноску зауважу, що незважаючи на те, що саме цей спосіб традиційно використовувався для трекінгу як основний, останнім часом він викликає все більше сумнівів у бізнес- та технологічних колах через питання конфіденційності та приватності даних. Справа в тому, що client-side tracking спирається на використання third-party cookies, тобто на використання шматочків коду, створеного "третьою стороною" - безпосередньо не відноситься до вебсайту, який відвідує користувач (наприклад, cookie, створена рекламодавцем, що розміщується на цьому веб-сайті). У самого веб-сайту буде в цьому випадку вкрай лімітована інформація та контроль за функціонуванням таких cookie. В результаті, у користувачів можуть виникати побоювання, хто і як використовує ці дані, зібрані про їхню поведінку онлайн. Цей аспект поступово починає регулюватись; так, згідно з регламентом про захист даних у Європі (GDPR) вебсайти не можуть більше використовувати third-party cookies без згоди користувача. У сфері мобільних додатків самі технологічні компанії роблять кроки щодо зміни ландшафту трекінгу через зростання запиту на конфіденційність даних.Наприклад, ліквідація включеного за замовчуванням IDFA (Identifier for Advertisers) трекінгу компанією Apple, що схвилювала діджитал-сферу, була подібним кроком. Server-side tracking (aka server-to-server, S2S), чи збір даних за сервера. У цьому випадку відстеження відбувається не "на клієнті" - прямо у браузері або мобільному пристрої - а на сервері. За такої схеми, веб-контейнер зберігається, проте він буде значно компактнішим (а значить, швидшим) і націлений на збір даних за подією, що цікавить (а не на виконання безлічі скриптів різних систем - аналітики, third-party і т.д.). У цьому випадку third-party cookies не використовуються зовсім, тобто збір даних здійснюється лише першою стороною. При цьому додається ланка-посередник - хмарний
сервер. Цей сервер хмари належить (точніше, орендується) власнику сайту/додатку. Саме туди і надсилається отриманий запит від клієнта та дані щодо нього. Далі в хмарному сервері відбувається обробка даних та їхнє перенаправлення в кінцеві точки збору. При цьому рівень управління та контролю над хмарним сервером дуже високий. Наприклад, власник хмарного сервера визначає, які саме дані та в якому вигляді будуть доступні серверам третьої сторони. Поява додаткової ланки у зборі даних - хмарного сервера - націлена на те, щоб вирішити ряд складнощів, пов'язаних зі звичним, client-side tracking методом. Зокрема, наявність хмарного сервера вирішує питання швидкості завантаження сторінок, контролю та приватності даних, а також блокувальників реклами, які знижують точність даних, що збираються. Як це часто буває, кожен із альтернативних способів має свої переваги та недоліки. Я постаралася звести їх до зрозумілої таблиці (підкреслені переваги). Відстеження об'єктів у сфері відеоаналітики - найважливіше завдання, яке дозволяє не лише визначати місце розташування та клас об'єктів у кадрі, але й зберігати унікальний ідентифікатор кожного виявленого об'єкта у міру просування відео. Сфери застосування цієї технології безмежні – від відеоспостереження та безпеки до спортивної аналітики у реальному часі. Вихід з Ultralytics trackers is consistent with standard object detection but has added value of object IDs. Це дає змогу добре до track objects в streams videos and perform subsequent analytics. Тут ви знайдете використання ультралітики YOLO для вашого об'єкта, що потребує: Дивись: Object Detection and Tracking with Ultralytics YOLO. Ultralytics YOLO Розширює функції виявлення об'єктів, щоб забезпечити надійне та універсальне відстеження об'єктів: Ultralytics YOLO підтримує такі алгоритми відстеження. Їх можна увімкнути, передавши відповідний конфігураційний файл YAML, наприклад tracker=tracker_type.yaml : За замовчуванням трекер - BoT-SORT. Інформація про поріг трекера Якщо показник довіри до об'єкта буде низьким, тобто меншим, ніж track_high_thresh Тоді жоден трек не буде успішно повернуто та оновлено. Щоб керувати трекером на відео streams, використовуйте потрібен Detect, Segment or Pose model так, як YOLO11n, YOLO11n-seg і YOLO11n-pose. Як видно з вищенаведеного використання, відстеження доступне для всіх моделей Detect, Segment і Pose, запущених на відео або потокових джерелах. Інформація про поріг трекера Якщо показник довіри до об'єкта буде низьким, тобто меншим, ніж track_high_thresh Тоді жоден трек не буде успішно повернуто та оновлено. Конфігурація відстеження має спільні властивості з режимом Predict, такі як conf, iou і show. Про подальші конфігурації читай у Передбачай Сторінка моделі. Ultralytics також дозволяє використовувати модифікований конфігураційний файл трекера. Для цього просто створи копію конфігураційного файлу трекера (наприклад, custom_tracker.yaml) від ultralytics/cfg/trackers і змінюй будь-які конфігурації (крім tracker_type) відповідно до твоїх потреб. Повний список аргументів для трекінгу ти знайдеш на ultralytics/cfg/trackers. Тут є Python script, використовуючи OpenCV ( cv2 ) і YOLO11 для керування об'єктом руху на відео frames. Це script still assumes you have already installed necessary packages ( opencv-python і ultralytics ). На сайті persist=True Аргумент повідомляє трекеру, що поточне зображення або кадр є наступним у послідовності та що у поточному зображенні слід очікувати треки з попереднього зображення. Потоковий фор-луп з трекінгом Зверніть увагу на зміну model(frame) на model.track(frame) , яка дозволяє відстежувати об'єкти замість простого виявлення. Цей модифікований скрипт запускатиме трекер на кожному кадрі відео, візуалізуватиме результати та відображатиме їх у вікні. Вийти з циклу можна, натиснувши q. Visualizing object tracks over consecutive frames can provide valuable insights in movement patterns and behavior of detected objects within video. З Ultralytics YOLO11, plotting ці пробки є безпосередні і ефективні процеси. У наступному прикладі, ми показуємо, як використовувати YOLO11's tracking capabilities to plot moving of detected objects across multiple video frames. Цей script involves opening a file file, reading it frame by frame, і використовуючи YOLO model для identify and track різні об'єкти. Будучи розташовувати центри пунктів помітних ящиків і підключення до них, ми можемо витягнути лінії, що становлять шляхи, що прямують до переміщених об'єктів. Побудова треків з кількох відеокадр Багатопотоковий трекінг дає можливість запускати відстеження об'єктів на кількох відеопотоках одночасно. Це особливо корисно при роботі з кількома відеовходами, наприклад, з кількох камер спостереження, коли одночасна обробка може значно підвищити ефективність та продуктивність. У наданому скрипті Python ми використовуємо Python's threading модуль для одночасного запуску кількох екземплярів трекера. Кожен потік відповідає за запуск трекера на одному відеофайлі і всі потоки працюють одночасно у фоновому режимі. Щоб кожен потік отримував правильні параметри (відеофайл, модель і індекс файлу, що використовується), ми визначаємо функцію run_tracker_in_thread яка приймає ці параметри і містить основний цикл відстеження. Ця функція зчитує відео кадр за кадром, запускає трекер та виводить результати на екран. У цьому прикладі використовуються дві різні моделі: yolo11n.pt та yolo11n-seg.pt Кожен із них відстежує об'єкти в різних відеофайлах. Відеофайли вказуються в video_file1 та video_file2 . The daemon=True параметр у threading.Thread означає, що ці потоки будуть закриті, як тільки завершиться основна програма. Потім ми запускаємо потоки за допомогою start() і використовуй join(), щоб змусити головний потік чекати, поки обидва потоки трекера не завершать роботу. Нарешті, коли всі потоки виконали своє завдання, вікна, що відображають результати, закриваються з допомогою cv2.destroyAllWindows() . Потоковий фор-луп з трекінгом Цей приклад можна легко розширити для роботи з великою кількістю відеофайлів та моделей, створивши більше потоків та застосувавши ту саму методику. Ти добре розумієшся на багатооб'єктному трекінгу і успішно реалізував або адаптував алгоритм трекінгу за допомогою Ultralytics YOLO? Ми запрошуємо тебе зробити свій внесок у наш розділ "Трекери" в ultralytics/cfg/trackers! Твої реальні програми та рішення можуть виявитися безцінними для користувачів, які працюють над завданнями трекінгу. Вносячи свій внесок у цей розділ, ти допомагаєш розширити спектр рішень для відстеження, доступних у рамках Ultralytics YOLO, додаючи ще один рівень функціональності та корисності для спільноти. Щоб ініціювати свій внесок, зверніться до нашого посібника з контріб'ютінгу, де дано вичерпні інструкції з відправки Pull Request (PR) 🛠️. Нам не терпиться побачити, що ти привнесеш у гру! Разом розширимо можливості відстеження екосистеми Ultralytics YOLO 🙏! Багатооб'єктне відстеження відеоаналітики передбачає як ідентифікацію об'єктів, так і збереження унікального ідентифікатора для кожного виявленого об'єкта у всіх відеокадрах. Ultralytics YOLO підтримує це, надаючи відстеження в реальному часі разом із ідентифікаторами об'єктів, що полегшує такі завдання, як спостереження за безпекою та спортивна аналітика. Система використовує такі трекери, як BoT-SORT та ByteTrack, які можна настроювати через YAML-файли. Ти можеш налаштувати трекер користувача, скопіювавши існуючий файл конфігурації трекера (наприклад, custom_tracker.yaml ) з Ultralytics Каталог конфігурації трекера і змінюй параметри в міру необхідності, за винятком tracker_type . Використовуй цей файл у своїй моделі відстеження таким чином: Щоб запустити відстеження об'єктів на кількох відеопотоках одночасно, ти можеш використовувати Python's Threading Модуль. Кожен потік оброблятиме окремий відеопотік. Ось приклад того, як це можна налаштувати: Спостереження за кількома об'єктами за допомогою Ultralytics YOLO має безліч застосувань, включаючи: Ці програми виграють завдяки можливості Ultralytics YOLO обробляти відео з високою частотою кадрів у режимі реального часу. Щоб візуалізувати треки об'єктів на кількох кадрах відео, ти можеш використовувати функції відстеження моделі YOLO разом із OpenCV, щоб намалювати траєкторію руху виявлених об'єктів. Ось приклад скрипту, який демонструє це: Побудова треків з кількох відеокадр Цей скрипт побудує лінії стеження, що показують траєкторії руху об'єктів, що відстежуються, з часом.Про способи відстеження даних – простими словами. Server-side vs client-side tracking: переваги та недоліки
Хто тут клієнт, а хто сервер?
А як беруть участь ідентифікаційні теги?
Так, зрозуміло, а що це за методи збору даних? Як вони працюють?
А навіщо нам ускладнювати процес збирання даних ланкою-посередником?
Виходить, у server-side tracking є значні переваги? А чи є недоліки?
Спостереження за об'єктами за допомогою Ultralytics YOLO
Чому варто вибрати Ultralytics YOLO для відстеження об'єктів?
Застосування у реальному світі
Особливості з першого погляду
Доступні трекери
Відстеження
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"
Конфігурація
Відстеження аргументів
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, використовуючи command line interface yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4"
conf=0.3, iou=0.5 show
Вибір трекера
from
ultralytics
import
YOLO
# Load the model and run the tracker with 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 custom configuration file using the command line interface yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4"
tracker='custom_tracker.yaml'
Python Приклади
Петля із постійними треками
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()
Побудова треків у часі
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
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("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()
Багатопотоковий трекінг
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 в його власній thread для поточного процесу.
Args:
model_name (str): YOLO11 model об'єкт.
filename (str): Оцінка до файлу відео або identifier для веб-камери/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()
Вносите нові трекери
ПИТАННЯ ТА ВІДПОВІДІ
Що таке Multi-Object Tracking та як Ultralytics YOLO підтримує його?
Як налаштувати трекер для Ultralytics YOLO ?
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'
Як запустити відстеження об'єктів на кількох відеопотоках одночасно?
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 в його власній thread для поточного процесу.
Args:
model_name (str): YOLO11 model об'єкт.
filename (str): Оцінка до файлу відео або identifier для веб-камери/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?
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()