सामग्री पर जाएं

के लिए संदर्भ ultralytics/trackers/bot_sort.py

नोट

यह फ़ाइल यहाँ उपलब्ध है https://github.com/ultralytics/ultralytics/बूँद/मुख्य/ultralytics/ट्रैकर्स/bot_sort.py का उपयोग करें। यदि आप कोई समस्या देखते हैं तो कृपया पुल अनुरोध का योगदान करके इसे ठीक करने में मदद करें 🛠️। 🙏 धन्यवाद !



ultralytics.trackers.bot_sort.BOTrack

का रूप: STrack

के लिए STrack वर्ग का एक विस्तारित संस्करण YOLOv8, ऑब्जेक्ट ट्रैकिंग सुविधाओं को जोड़ना।

विशेषताएँ:

नाम प्रकार या क़िस्‍म
shared_kalman KalmanFilterXYWH

BOTrack के सभी उदाहरणों के लिए एक साझा Kalman फ़िल्टर।

smooth_feat ndarray

चिकना फीचर वेक्टर।

curr_feat ndarray

वर्तमान सुविधा वेक्टर।

features deque

द्वारा परिभाषित अधिकतम लंबाई के साथ फीचर वैक्टर को स्टोर करने के लिए एक deque feat_history.

alpha float

सुविधाओं के घातीय चलती औसत के लिए चौरसाई कारक।

mean ndarray

कलमैन फिल्टर की औसत स्थिति।

covariance ndarray

कलमैन फिल्टर का सहप्रसरण मैट्रिक्स।

विधियाँ:

नाम या क़िस्‍म
update_features

सुविधाओं वेक्टर को अपडेट करें और घातीय चलती औसत का उपयोग करके इसे सुचारू करें।

predict

Kalman फिल्टर का उपयोग कर मतलब और सहप्रसरण की भविष्यवाणी करता है.

re_activate

अपडेट की गई सुविधाओं और वैकल्पिक रूप से नई आईडी के साथ एक ट्रैक को फिर से सक्रिय करता है।

update

अद्यतन करें YOLOv8 नए ट्रैक और फ्रेम आईडी के साथ उदाहरण।

tlwh

प्रॉपर्टी जिसे tlwh फ़ॉर्मैट में वर्तमान स्थान मिलता है (top left x, top left y, width, height).

multi_predict

साझा Kalman फिल्टर का उपयोग कर कई वस्तु पटरियों के मतलब और सहप्रसरण की भविष्यवाणी करता है.

convert_coords

tlwh bounding बॉक्स निर्देशांक को xywh स्वरूप में कनवर्ट करता है.

tlwh_to_xywh

बाउंडिंग बॉक्स को xywh प्रारूप में बदलें (center x, center y, width, height).

उपयोग

bo_track = बॉटरैक (tlwh, स्कोर, cls, करतब) bo_track.predict() bo_track.update(new_track, frame_id)

में स्रोत कोड ultralytics/trackers/bot_sort.py
 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 (मलेशिया) 14 बांग्लादेश बांग्लादेश (वियतनाम) 14 बांग्लादेश बांग्लादेश (वियतनाम) 14 बांग्लादेश बांग्लादेश (एमएस) 14 बांग्लादेश (आरबीआई) 14 बांग्लादेश बांग्लादेश (आरबीआई) 14 बांग्लादेश बांग्लादेश (आरबीआई) 14 बांग्लादेश बांग्लादेश (आरबीआई) 14 (3) 32  16 17  18   19 20 21 22 23 24  25  26 27 28 29 30 31 32  33 34 35 36 37 38 39 40 41 42 43 44 45  46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100101102103104105106107108109110111112113114115116117118119120121122
class BOTrack(STrack):
    """
    An extended version of the STrack class for YOLOv8, adding object tracking features.

    Attributes:
        shared_kalman (KalmanFilterXYWH): A shared Kalman filter for all instances of BOTrack.
        smooth_feat (np.ndarray): Smoothed feature vector.
        curr_feat (np.ndarray): Current feature vector.
        features (deque): A deque to store feature vectors with a maximum length defined by `feat_history`.
        alpha (float): Smoothing factor for the exponential moving average of features.
        mean (np.ndarray): The mean state of the Kalman filter.
        covariance (np.ndarray): The covariance matrix of the Kalman filter.

    Methods:
        update_features(feat): Update features vector and smooth it using exponential moving average.
        predict(): Predicts the mean and covariance using Kalman filter.
        re_activate(new_track, frame_id, new_id): Reactivates a track with updated features and optionally new ID.
        update(new_track, frame_id): Update the YOLOv8 instance with new track and frame ID.
        tlwh: Property that gets the current position in tlwh format `(top left x, top left y, width, height)`.
        multi_predict(stracks): Predicts the mean and covariance of multiple object tracks using shared Kalman filter.
        convert_coords(tlwh): Converts tlwh bounding box coordinates to xywh format.
        tlwh_to_xywh(tlwh): Convert bounding box to xywh format `(center x, center y, width, height)`.

    Usage:
        bo_track = BOTrack(tlwh, score, cls, feat)
        bo_track.predict()
        bo_track.update(new_track, frame_id)
    """

    shared_kalman = KalmanFilterXYWH()

    def __init__(self, tlwh, score, cls, feat=None, feat_history=50):
        """Initialize YOLOv8 object with temporal parameters, such as feature history, alpha and current features."""
        super().__init__(tlwh, score, cls)

        self.smooth_feat = None
        self.curr_feat = None
        if feat is not None:
            self.update_features(feat)
        self.features = deque([], maxlen=feat_history)
        self.alpha = 0.9

    def update_features(self, feat):
        """Update features vector and smooth it using exponential moving average."""
        feat /= np.linalg.norm(feat)
        self.curr_feat = feat
        if self.smooth_feat is None:
            self.smooth_feat = feat
        else:
            self.smooth_feat = self.alpha * self.smooth_feat + (1 - self.alpha) * feat
        self.features.append(feat)
        self.smooth_feat /= np.linalg.norm(self.smooth_feat)

    def predict(self):
        """Predicts the mean and covariance using Kalman filter."""
        mean_state = self.mean.copy()
        if self.state != TrackState.Tracked:
            mean_state[6] = 0
            mean_state[7] = 0

        self.mean, self.covariance = self.kalman_filter.predict(mean_state, self.covariance)

    def re_activate(self, new_track, frame_id, new_id=False):
        """Reactivates a track with updated features and optionally assigns a new ID."""
        if new_track.curr_feat is not None:
            self.update_features(new_track.curr_feat)
        super().re_activate(new_track, frame_id, new_id)

    def update(self, new_track, frame_id):
        """Update the YOLOv8 instance with new track and frame ID."""
        if new_track.curr_feat is not None:
            self.update_features(new_track.curr_feat)
        super().update(new_track, frame_id)

    @property
    def tlwh(self):
        """Get current position in bounding box format `(top left x, top left y, width, height)`."""
        if self.mean is None:
            return self._tlwh.copy()
        ret = self.mean[:4].copy()
        ret[:2] -= ret[2:] / 2
        return ret

    @staticmethod
    def multi_predict(stracks):
        """Predicts the mean and covariance of multiple object tracks using shared Kalman filter."""
        if len(stracks) <= 0:
            return
        multi_mean = np.asarray([st.mean.copy() for st in stracks])
        multi_covariance = np.asarray([st.covariance for st in stracks])
        for i, st in enumerate(stracks):
            if st.state != TrackState.Tracked:
                multi_mean[i][6] = 0
                multi_mean[i][7] = 0
        multi_mean, multi_covariance = BOTrack.shared_kalman.multi_predict(multi_mean, multi_covariance)
        for i, (mean, cov) in enumerate(zip(multi_mean, multi_covariance)):
            stracks[i].mean = mean
            stracks[i].covariance = cov

    def convert_coords(self, tlwh):
        """Converts Top-Left-Width-Height bounding box coordinates to X-Y-Width-Height format."""
        return self.tlwh_to_xywh(tlwh)

    @staticmethod
    def tlwh_to_xywh(tlwh):
        """Convert bounding box to format `(center x, center y, width, height)`."""
        ret = np.asarray(tlwh).copy()
        ret[:2] += ret[2:] / 2
        return ret

tlwh property

बाउंडिंग बॉक्स प्रारूप में वर्तमान स्थिति प्राप्त करें (top left x, top left y, width, height).

__init__(tlwh, score, cls, feat=None, feat_history=50)

प्रारंभ YOLOv8 अस्थायी मापदंडों के साथ ऑब्जेक्ट, जैसे फीचर इतिहास, अल्फा और वर्तमान सुविधाएँ।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def __init__(self, tlwh, score, cls, feat=None, feat_history=50):
    """Initialize YOLOv8 object with temporal parameters, such as feature history, alpha and current features."""
    super().__init__(tlwh, score, cls)

    self.smooth_feat = None
    self.curr_feat = None
    if feat is not None:
        self.update_features(feat)
    self.features = deque([], maxlen=feat_history)
    self.alpha = 0.9

convert_coords(tlwh)

शीर्ष-बाएँ-चौड़ाई-ऊँचाई बाउंडिंग बॉक्स निर्देशांक को X-Y-चौड़ाई-ऊँचाई स्वरूप में कनवर्ट करता है.

में स्रोत कोड ultralytics/trackers/bot_sort.py
def convert_coords(self, tlwh):
    """Converts Top-Left-Width-Height bounding box coordinates to X-Y-Width-Height format."""
    return self.tlwh_to_xywh(tlwh)

multi_predict(stracks) staticmethod

साझा Kalman फिल्टर का उपयोग कर कई वस्तु पटरियों के मतलब और सहप्रसरण की भविष्यवाणी करता है.

में स्रोत कोड ultralytics/trackers/bot_sort.py
@staticmethod
def multi_predict(stracks):
    """Predicts the mean and covariance of multiple object tracks using shared Kalman filter."""
    if len(stracks) <= 0:
        return
    multi_mean = np.asarray([st.mean.copy() for st in stracks])
    multi_covariance = np.asarray([st.covariance for st in stracks])
    for i, st in enumerate(stracks):
        if st.state != TrackState.Tracked:
            multi_mean[i][6] = 0
            multi_mean[i][7] = 0
    multi_mean, multi_covariance = BOTrack.shared_kalman.multi_predict(multi_mean, multi_covariance)
    for i, (mean, cov) in enumerate(zip(multi_mean, multi_covariance)):
        stracks[i].mean = mean
        stracks[i].covariance = cov

predict()

Kalman फिल्टर का उपयोग कर मतलब और सहप्रसरण की भविष्यवाणी करता है.

में स्रोत कोड ultralytics/trackers/bot_sort.py
def predict(self):
    """Predicts the mean and covariance using Kalman filter."""
    mean_state = self.mean.copy()
    if self.state != TrackState.Tracked:
        mean_state[6] = 0
        mean_state[7] = 0

    self.mean, self.covariance = self.kalman_filter.predict(mean_state, self.covariance)

re_activate(new_track, frame_id, new_id=False)

अपडेट की गई सुविधाओं के साथ एक ट्रैक को पुनः सक्रिय करता है और वैकल्पिक रूप से एक नई आईडी असाइन करता है।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def re_activate(self, new_track, frame_id, new_id=False):
    """Reactivates a track with updated features and optionally assigns a new ID."""
    if new_track.curr_feat is not None:
        self.update_features(new_track.curr_feat)
    super().re_activate(new_track, frame_id, new_id)

tlwh_to_xywh(tlwh) staticmethod

बाउंडिंग बॉक्स को फॉर्मेट में बदलें (center x, center y, width, height).

में स्रोत कोड ultralytics/trackers/bot_sort.py
@staticmethod
def tlwh_to_xywh(tlwh):
    """Convert bounding box to format `(center x, center y, width, height)`."""
    ret = np.asarray(tlwh).copy()
    ret[:2] += ret[2:] / 2
    return ret

update(new_track, frame_id)

अद्यतन करें YOLOv8 नए ट्रैक और फ्रेम आईडी के साथ उदाहरण।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def update(self, new_track, frame_id):
    """Update the YOLOv8 instance with new track and frame ID."""
    if new_track.curr_feat is not None:
        self.update_features(new_track.curr_feat)
    super().update(new_track, frame_id)

update_features(feat)

सुविधाओं वेक्टर को अपडेट करें और घातीय चलती औसत का उपयोग करके इसे सुचारू करें।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def update_features(self, feat):
    """Update features vector and smooth it using exponential moving average."""
    feat /= np.linalg.norm(feat)
    self.curr_feat = feat
    if self.smooth_feat is None:
        self.smooth_feat = feat
    else:
        self.smooth_feat = self.alpha * self.smooth_feat + (1 - self.alpha) * feat
    self.features.append(feat)
    self.smooth_feat /= np.linalg.norm(self.smooth_feat)



ultralytics.trackers.bot_sort.BOTSORT

का रूप: BYTETracker

के लिए BYTETracker वर्ग का एक विस्तारित संस्करण YOLOv8, ReID और GMC एल्गोरिथ्म के साथ ऑब्जेक्ट ट्रैकिंग के लिए डिज़ाइन किया गया।

विशेषताएँ:

नाम प्रकार या क़िस्‍म
proximity_thresh float

पटरियों और पता लगाने के बीच स्थानिक निकटता (IoU) के लिए दहलीज।

appearance_thresh float

पटरियों और पता लगाने के बीच उपस्थिति समानता (ReID एम्बेडिंग) के लिए दहलीज।

encoder object

ReID एम्बेडिंग को हैंडल करने के लिए ऑब्जेक्ट, ReID सक्षम नहीं होने पर कोई नहीं पर सेट करें।

gmc GMC

डेटा एसोसिएशन के लिए जीएमसी एल्गोरिथ्म का एक उदाहरण।

args object

ट्रैकिंग पैरामीटर वाले कमांड-लाइन तर्कों को पार्स किया गया।

विधियाँ:

नाम या क़िस्‍म
get_kalmanfilter

ऑब्जेक्ट ट्रैकिंग के लिए KalmanFilterXYWH का एक उदाहरण देता है।

init_track

डिटेक्शन, स्कोर और कक्षाओं के साथ ट्रैक को इनिशियलाइज़ करें।

get_dists

IoU और (वैकल्पिक रूप से) ReID का उपयोग करके पटरियों और डिटेक्शन के बीच दूरियां प्राप्त करें।

multi_predict

भविष्यवाणी करें और कई वस्तुओं को ट्रैक करें YOLOv8 को गढ़ना।

उपयोग

bot_sort = बॉटसॉर्ट (आर्ग, frame_rate) bot_sort.init_track(डेट्स, स्कोर, CLS, img) bot_sort.multi_predict (ट्रैक)

नोट

कक्षा के साथ काम करने के लिए डिज़ाइन किया गया है YOLOv8 ऑब्जेक्ट डिटेक्शन मॉडल और केवल तभी ReID का समर्थन करता है जब args के माध्यम से सक्षम किया गया हो।

में स्रोत कोड ultralytics/trackers/bot_sort.py
class BOTSORT(BYTETracker):
    """
    An extended version of the BYTETracker class for YOLOv8, designed for object tracking with ReID and GMC algorithm.

    Attributes:
        proximity_thresh (float): Threshold for spatial proximity (IoU) between tracks and detections.
        appearance_thresh (float): Threshold for appearance similarity (ReID embeddings) between tracks and detections.
        encoder (object): Object to handle ReID embeddings, set to None if ReID is not enabled.
        gmc (GMC): An instance of the GMC algorithm for data association.
        args (object): Parsed command-line arguments containing tracking parameters.

    Methods:
        get_kalmanfilter(): Returns an instance of KalmanFilterXYWH for object tracking.
        init_track(dets, scores, cls, img): Initialize track with detections, scores, and classes.
        get_dists(tracks, detections): Get distances between tracks and detections using IoU and (optionally) ReID.
        multi_predict(tracks): Predict and track multiple objects with YOLOv8 model.

    Usage:
        bot_sort = BOTSORT(args, frame_rate)
        bot_sort.init_track(dets, scores, cls, img)
        bot_sort.multi_predict(tracks)

    Note:
        The class is designed to work with the YOLOv8 object detection model and supports ReID only if enabled via args.
    """

    def __init__(self, args, frame_rate=30):
        """Initialize YOLOv8 object with ReID module and GMC algorithm."""
        super().__init__(args, frame_rate)
        # ReID module
        self.proximity_thresh = args.proximity_thresh
        self.appearance_thresh = args.appearance_thresh

        if args.with_reid:
            # Haven't supported BoT-SORT(reid) yet
            self.encoder = None
        self.gmc = GMC(method=args.gmc_method)

    def get_kalmanfilter(self):
        """Returns an instance of KalmanFilterXYWH for object tracking."""
        return KalmanFilterXYWH()

    def init_track(self, dets, scores, cls, img=None):
        """Initialize track with detections, scores, and classes."""
        if len(dets) == 0:
            return []
        if self.args.with_reid and self.encoder is not None:
            features_keep = self.encoder.inference(img, dets)
            return [BOTrack(xyxy, s, c, f) for (xyxy, s, c, f) in zip(dets, scores, cls, features_keep)]  # detections
        else:
            return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)]  # detections

    def get_dists(self, tracks, detections):
        """Get distances between tracks and detections using IoU and (optionally) ReID embeddings."""
        dists = matching.iou_distance(tracks, detections)
        dists_mask = dists > self.proximity_thresh

        # TODO: mot20
        # if not self.args.mot20:
        dists = matching.fuse_score(dists, detections)

        if self.args.with_reid and self.encoder is not None:
            emb_dists = matching.embedding_distance(tracks, detections) / 2.0
            emb_dists[emb_dists > self.appearance_thresh] = 1.0
            emb_dists[dists_mask] = 1.0
            dists = np.minimum(dists, emb_dists)
        return dists

    def multi_predict(self, tracks):
        """Predict and track multiple objects with YOLOv8 model."""
        BOTrack.multi_predict(tracks)

    def reset(self):
        """Reset tracker."""
        super().reset()
        self.gmc.reset_params()

__init__(args, frame_rate=30)

प्रारंभ YOLOv8 ReID मॉड्यूल और GMC एल्गोरिथ्म के साथ ऑब्जेक्ट।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def __init__(self, args, frame_rate=30):
    """Initialize YOLOv8 object with ReID module and GMC algorithm."""
    super().__init__(args, frame_rate)
    # ReID module
    self.proximity_thresh = args.proximity_thresh
    self.appearance_thresh = args.appearance_thresh

    if args.with_reid:
        # Haven't supported BoT-SORT(reid) yet
        self.encoder = None
    self.gmc = GMC(method=args.gmc_method)

get_dists(tracks, detections)

IoU और (वैकल्पिक रूप से) ReID एम्बेडिंग का उपयोग करके पटरियों और डिटेक्शन के बीच दूरी प्राप्त करें।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def get_dists(self, tracks, detections):
    """Get distances between tracks and detections using IoU and (optionally) ReID embeddings."""
    dists = matching.iou_distance(tracks, detections)
    dists_mask = dists > self.proximity_thresh

    # TODO: mot20
    # if not self.args.mot20:
    dists = matching.fuse_score(dists, detections)

    if self.args.with_reid and self.encoder is not None:
        emb_dists = matching.embedding_distance(tracks, detections) / 2.0
        emb_dists[emb_dists > self.appearance_thresh] = 1.0
        emb_dists[dists_mask] = 1.0
        dists = np.minimum(dists, emb_dists)
    return dists

get_kalmanfilter()

ऑब्जेक्ट ट्रैकिंग के लिए KalmanFilterXYWH का एक उदाहरण देता है।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def get_kalmanfilter(self):
    """Returns an instance of KalmanFilterXYWH for object tracking."""
    return KalmanFilterXYWH()

init_track(dets, scores, cls, img=None)

डिटेक्शन, स्कोर और कक्षाओं के साथ ट्रैक को इनिशियलाइज़ करें।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def init_track(self, dets, scores, cls, img=None):
    """Initialize track with detections, scores, and classes."""
    if len(dets) == 0:
        return []
    if self.args.with_reid and self.encoder is not None:
        features_keep = self.encoder.inference(img, dets)
        return [BOTrack(xyxy, s, c, f) for (xyxy, s, c, f) in zip(dets, scores, cls, features_keep)]  # detections
    else:
        return [BOTrack(xyxy, s, c) for (xyxy, s, c) in zip(dets, scores, cls)]  # detections

multi_predict(tracks)

भविष्यवाणी करें और कई वस्तुओं को ट्रैक करें YOLOv8 को गढ़ना।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def multi_predict(self, tracks):
    """Predict and track multiple objects with YOLOv8 model."""
    BOTrack.multi_predict(tracks)

reset()

ट्रैकर रीसेट करें।

में स्रोत कोड ultralytics/trackers/bot_sort.py
def reset(self):
    """Reset tracker."""
    super().reset()
    self.gmc.reset_params()





Created 2023-11-12, Updated 2024-06-02
Authors: glenn-jocher (5), Burhan-Q (1), Laughing-q (1)