Skip to content

Commit 9bf2d52

Browse files
committed
fix bugs of deepsort, add strongsort and sparsetrack
1 parent 81b4845 commit 9bf2d52

14 files changed

+880
-67
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ and the tracker supports:
3535
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf))
3636
- OCSORT ([CVPR2023](https://openaccess.thecvf.com/content/CVPR2023/papers/Cao_Observation-Centric_SORT_Rethinking_SORT_for_Robust_Multi-Object_Tracking_CVPR_2023_paper.pdf))
3737
- C_BIoU Track ([arxiv2211](https://arxiv.org/pdf/2211.14317v2.pdf))
38-
- Strong SORT (***coming soon!***)
38+
- Strong SORT ([IEEE TMM 2023](https://arxiv.org/pdf/2202.13514))
39+
- Sparse Track ([arxiv 2306](https://arxiv.org/pdf/2306.05238))
3940

4041
and the reid model supports:
4142

@@ -51,9 +52,10 @@ The highlights are:
5152

5253
## 🗺️ Roadmap
5354

54-
- [ ] Add StrongSort
55+
- [ x ] Add StrongSort and SparseTrack
5556
- [ x ] Add save video function
5657
- [ x ] Add timer function to calculate fps
58+
- [] Add more ReID modules.
5759

5860
## 🔨 Installation
5961

@@ -183,6 +185,10 @@ For example:
183185

184186
- BoT-SORT: `python tracker/track.py --dataset uavdt --detector yolox --tracker botsort --kalman_format bot --detector_model_path weights/yolox_m_uavdt_50epochs.pth.tar`
185187

188+
- Strong SORT: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker strongsort --kalman_format strongsort --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
189+
190+
- Sparse Track: `python tracker/track.py --dataset uavdt --detector yolov8 --tracker sparsetrack --kalman_format bot --detector_model_path weights/yolov8l_UAVDT_60epochs_20230509.pt`
191+
186192
### ✅ Evaluation
187193

188194
Coming Soon. As an alternative, after obtaining the result txt file, you can use the [Easier to use TrackEval repo](https://github.com/JackWoo0831/Easier_To_Use_TrackEval).

README_CN.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ git checkout v2 # change to v2 branch !!
3131
- Bot-SORT ([arxiv2206](https://arxiv.org/pdf/2206.14651.pdf))
3232
- OCSORT ([CVPR2023](https://openaccess.thecvf.com/content/CVPR2023/papers/Cao_Observation-Centric_SORT_Rethinking_SORT_for_Robust_Multi-Object_Tracking_CVPR_2023_paper.pdf))
3333
- C_BIoU Track ([arxiv2211](https://arxiv.org/pdf/2211.14317v2.pdf))
34-
- Strong SORT (***即将推出!***)
34+
- Strong SORT ([IEEE TMM 2023](https://arxiv.org/pdf/2202.13514))
35+
- Sparse Track ([arxiv 2306](https://arxiv.org/pdf/2306.05238))
3536

3637
REID模型支持:
3738

@@ -47,9 +48,10 @@ REID模型支持:
4748

4849
## 🗺️ 路线图
4950

50-
- [ ] Add StrongSort
51+
- [ x ] Add StrongSort and SparseTrack
5152
- [ x ] Add save video function
5253
- [ x ] Add timer function to calculate fps
54+
- [] Add more ReID modules.mer function to calculate fps
5355

5456
## 🔨 安装
5557

tracker/track.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
from trackers.c_biou_tracker import C_BIoUTracker
2727
from trackers.ocsort_tracker import OCSortTracker
2828
from trackers.deepsort_tracker import DeepSortTracker
29+
from trackers.strongsort_tracker import StrongSortTracker
30+
from trackers.sparse_tracker import SparseTracker
2931

3032
# YOLOX modules
3133
try:
@@ -66,7 +68,9 @@
6668
'botsort': BotTracker,
6769
'c_bioutrack': C_BIoUTracker,
6870
'ocsort': OCSortTracker,
69-
'deepsort': DeepSortTracker
71+
'deepsort': DeepSortTracker,
72+
'strongsort': StrongSortTracker,
73+
'sparsetrack': SparseTracker
7074
}
7175

7276
def get_args():

tracker/trackers/botsort_tracker.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def update(self, output_results, img, ori_img):
120120
"""
121121

122122
self.frame_id += 1
123-
activated_starcks = []
123+
activated_tracklets = []
124124
refind_tracklets = []
125125
lost_tracklets = []
126126
removed_tracklets = []
@@ -199,7 +199,7 @@ def update(self, output_results, img, ori_img):
199199
det = detections[idet]
200200
if track.state == TrackState.Tracked:
201201
track.update(detections[idet], self.frame_id)
202-
activated_starcks.append(track)
202+
activated_tracklets.append(track)
203203
else:
204204
track.re_activate(det, self.frame_id, new_id=False)
205205
refind_tracklets.append(track)
@@ -221,7 +221,7 @@ def update(self, output_results, img, ori_img):
221221
det = detections_second[idet]
222222
if track.state == TrackState.Tracked:
223223
track.update(det, self.frame_id)
224-
activated_starcks.append(track)
224+
activated_tracklets.append(track)
225225
else:
226226
track.re_activate(det, self.frame_id, new_id=False)
227227
refind_tracklets.append(track)
@@ -252,7 +252,7 @@ def update(self, output_results, img, ori_img):
252252

253253
for itracked, idet in matches:
254254
unconfirmed[itracked].update(detections[idet], self.frame_id)
255-
activated_starcks.append(unconfirmed[itracked])
255+
activated_tracklets.append(unconfirmed[itracked])
256256
for it in u_unconfirmed:
257257
track = unconfirmed[it]
258258
track.mark_removed()
@@ -264,7 +264,7 @@ def update(self, output_results, img, ori_img):
264264
if track.score < self.det_thresh:
265265
continue
266266
track.activate(self.frame_id)
267-
activated_starcks.append(track)
267+
activated_tracklets.append(track)
268268

269269
""" Step 5: Update state"""
270270
for track in self.lost_tracklets:
@@ -275,7 +275,7 @@ def update(self, output_results, img, ori_img):
275275
# print('Ramained match {} s'.format(t4-t3))
276276

277277
self.tracked_tracklets = [t for t in self.tracked_tracklets if t.state == TrackState.Tracked]
278-
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_starcks)
278+
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_tracklets)
279279
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, refind_tracklets)
280280
self.lost_tracklets = sub_tracklets(self.lost_tracklets, self.tracked_tracklets)
281281
self.lost_tracklets.extend(lost_tracklets)

tracker/trackers/byte_tracker.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def update(self, output_results, img, ori_img):
2929
"""
3030

3131
self.frame_id += 1
32-
activated_starcks = []
32+
activated_tracklets = []
3333
refind_tracklets = []
3434
lost_tracklets = []
3535
removed_tracklets = []
@@ -84,7 +84,7 @@ def update(self, output_results, img, ori_img):
8484
det = detections[idet]
8585
if track.state == TrackState.Tracked:
8686
track.update(detections[idet], self.frame_id)
87-
activated_starcks.append(track)
87+
activated_tracklets.append(track)
8888
else:
8989
track.re_activate(det, self.frame_id, new_id=False)
9090
refind_tracklets.append(track)
@@ -105,7 +105,7 @@ def update(self, output_results, img, ori_img):
105105
det = detections_second[idet]
106106
if track.state == TrackState.Tracked:
107107
track.update(det, self.frame_id)
108-
activated_starcks.append(track)
108+
activated_tracklets.append(track)
109109
else:
110110
track.re_activate(det, self.frame_id, new_id=False)
111111
refind_tracklets.append(track)
@@ -124,7 +124,7 @@ def update(self, output_results, img, ori_img):
124124

125125
for itracked, idet in matches:
126126
unconfirmed[itracked].update(detections[idet], self.frame_id)
127-
activated_starcks.append(unconfirmed[itracked])
127+
activated_tracklets.append(unconfirmed[itracked])
128128
for it in u_unconfirmed:
129129
track = unconfirmed[it]
130130
track.mark_removed()
@@ -136,7 +136,7 @@ def update(self, output_results, img, ori_img):
136136
if track.score < self.det_thresh:
137137
continue
138138
track.activate(self.frame_id)
139-
activated_starcks.append(track)
139+
activated_tracklets.append(track)
140140

141141
""" Step 5: Update state"""
142142
for track in self.lost_tracklets:
@@ -147,7 +147,7 @@ def update(self, output_results, img, ori_img):
147147
# print('Ramained match {} s'.format(t4-t3))
148148

149149
self.tracked_tracklets = [t for t in self.tracked_tracklets if t.state == TrackState.Tracked]
150-
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_starcks)
150+
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_tracklets)
151151
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, refind_tracklets)
152152
self.lost_tracklets = sub_tracklets(self.lost_tracklets, self.tracked_tracklets)
153153
self.lost_tracklets.extend(lost_tracklets)

tracker/trackers/c_biou_tracker.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def update(self, output_results, img, ori_img):
2929
"""
3030

3131
self.frame_id += 1
32-
activated_starcks = []
32+
activated_tracklets = []
3333
refind_tracklets = []
3434
lost_tracklets = []
3535
removed_tracklets = []
@@ -84,7 +84,7 @@ def update(self, output_results, img, ori_img):
8484
det = detections[idet]
8585
if track.state == TrackState.Tracked:
8686
track.update(detections[idet], self.frame_id)
87-
activated_starcks.append(track)
87+
activated_tracklets.append(track)
8888
else:
8989
track.re_activate(det, self.frame_id, new_id=False)
9090
refind_tracklets.append(track)
@@ -108,7 +108,7 @@ def update(self, output_results, img, ori_img):
108108
det = detections_second[idet]
109109
if track.state == TrackState.Tracked:
110110
track.update(det, self.frame_id)
111-
activated_starcks.append(track)
111+
activated_tracklets.append(track)
112112
else:
113113
track.re_activate(det, self.frame_id, new_id=False)
114114
refind_tracklets.append(track)
@@ -127,7 +127,7 @@ def update(self, output_results, img, ori_img):
127127

128128
for itracked, idet in matches:
129129
unconfirmed[itracked].update(detections[idet], self.frame_id)
130-
activated_starcks.append(unconfirmed[itracked])
130+
activated_tracklets.append(unconfirmed[itracked])
131131
for it in u_unconfirmed:
132132
track = unconfirmed[it]
133133
track.mark_removed()
@@ -139,7 +139,7 @@ def update(self, output_results, img, ori_img):
139139
if track.score < self.det_thresh:
140140
continue
141141
track.activate(self.frame_id)
142-
activated_starcks.append(track)
142+
activated_tracklets.append(track)
143143

144144
""" Step 5: Update state"""
145145
for track in self.lost_tracklets:
@@ -150,7 +150,7 @@ def update(self, output_results, img, ori_img):
150150
# print('Ramained match {} s'.format(t4-t3))
151151

152152
self.tracked_tracklets = [t for t in self.tracked_tracklets if t.state == TrackState.Tracked]
153-
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_starcks)
153+
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_tracklets)
154154
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, refind_tracklets)
155155
self.lost_tracklets = sub_tracklets(self.lost_tracklets, self.tracked_tracklets)
156156
self.lost_tracklets.extend(lost_tracklets)

tracker/trackers/deepsort_tracker.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def update(self, output_results, img, ori_img):
121121
"""
122122

123123
self.frame_id += 1
124-
activated_starcks = []
124+
activated_tracklets = []
125125
refind_tracklets = []
126126
lost_tracklets = []
127127
removed_tracklets = []
@@ -176,7 +176,7 @@ def update(self, output_results, img, ori_img):
176176
det = detections[idet]
177177
if track.state == TrackState.Tracked:
178178
track.update(detections[idet], self.frame_id)
179-
activated_starcks.append(track)
179+
activated_tracklets.append(track)
180180
else:
181181
track.re_activate(det, self.frame_id, new_id=False)
182182
refind_tracklets.append(track)
@@ -194,11 +194,17 @@ def update(self, output_results, img, ori_img):
194194
det = detection_for_iou[idet]
195195
if track.state == TrackState.Tracked:
196196
track.update(detection_for_iou[idet], self.frame_id)
197-
activated_starcks.append(track)
197+
activated_tracklets.append(track)
198198
else:
199199
track.re_activate(det, self.frame_id, new_id=False)
200200
refind_tracklets.append(track)
201201

202+
for it in u_track:
203+
track = tracklet_for_iou[it]
204+
if not track.state == TrackState.Lost:
205+
track.mark_lost()
206+
lost_tracklets.append(track)
207+
202208

203209

204210
'''Deal with unconfirmed tracks, usually tracks with only one beginning frame'''
@@ -209,7 +215,7 @@ def update(self, output_results, img, ori_img):
209215

210216
for itracked, idet in matches:
211217
unconfirmed[itracked].update(detections[idet], self.frame_id)
212-
activated_starcks.append(unconfirmed[itracked])
218+
activated_tracklets.append(unconfirmed[itracked])
213219
for it in u_unconfirmed:
214220
track = unconfirmed[it]
215221
track.mark_removed()
@@ -221,7 +227,7 @@ def update(self, output_results, img, ori_img):
221227
if track.score < self.det_thresh:
222228
continue
223229
track.activate(self.frame_id)
224-
activated_starcks.append(track)
230+
activated_tracklets.append(track)
225231

226232
""" Step 5: Update state"""
227233
for track in self.lost_tracklets:
@@ -232,7 +238,7 @@ def update(self, output_results, img, ori_img):
232238
# print('Ramained match {} s'.format(t4-t3))
233239

234240
self.tracked_tracklets = [t for t in self.tracked_tracklets if t.state == TrackState.Tracked]
235-
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_starcks)
241+
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, activated_tracklets)
236242
self.tracked_tracklets = joint_tracklets(self.tracked_tracklets, refind_tracklets)
237243
self.lost_tracklets = sub_tracklets(self.lost_tracklets, self.tracked_tracklets)
238244
self.lost_tracklets.extend(lost_tracklets)
@@ -275,7 +281,7 @@ def gate_cost_matrix(self, cost_matrix, tracks, dets, max_apperance_thresh=0.15,
275281

276282
cost_matrix[cost_matrix > max_apperance_thresh] = gated_cost
277283
for row, track in enumerate(tracks):
278-
gating_distance = track.kalman.gating_distance(measurements, )
284+
gating_distance = track.kalman_filter.gating_distance(measurements, )
279285
cost_matrix[row, gating_distance > gating_threshold] = gated_cost
280286
return cost_matrix
281287

tracker/trackers/kalman_filters/base_kalman.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def gating_distance(self, measurements, only_position=False):
5757
# map state space to measurement space
5858
mean = self.kf.x.copy()
5959
mean = np.dot(self.kf.H, mean)
60-
covariance = self.kf.P.copy()
60+
covariance = np.linalg.multi_dot((self.kf.H, self.kf.P, self.kf.H.T))
6161

6262
if only_position:
6363
mean, covariance = mean[:2], covariance[:2, :2]

0 commit comments

Comments
 (0)