FairMOT中的deque怎么存ReID特征的?
程序员文章站
2022-06-15 12:39:10
1.FairMOT代码逻辑分析# opts.py# 这里是track_buffer参数默认值self.parser.add_argument('--track_buffer', type=int, default=30, help='tracking buffer')# multitracker.py# 在这里有两个类的实现,JDETracker类里初始化了一个STrack类型的列表,这个过程中会初始化保存特征的deque,设置deque大小。from collections import...
1.FairMOT代码逻辑分析
个人理解根据相关代码逻辑连起来,在下面做了注释。
# opts.py
# 这里是track_buffer参数默认值
self.parser.add_argument('--track_buffer', type=int, default=30, help='tracking buffer')
# multitracker.py
# 在这里有两个类的实现,JDETracker类里初始化了一个STrack类型的列表,这个过程中会初始化保存特征的deque,设置deque大小。
from collections import deque
class JDETracker(object):
self.features = deque([], maxlen=buffer_size)
def update(self, im_blob, img0):
if len(dets) > 0:
'''Detections'''
detections = [STrack(STrack.tlbr_to_tlwh(tlbrs[:4]), tlbrs[4], f, 30) for
(tlbrs, f) in zip(dets[:, :5], id_feature)]
else:
detections = []
...
output_stracks = [track for track in self.tracked_stracks if track.is_activated]
# 输出每一个ID的特征长度,即特征的个数,主要是如果某帧里面出现了某个ID,就会将其他特征append到deque中,当超过长度阈值的时候,就会把先进deque中的特征删除,将新特征加到队尾(先进先出)。
print("detections feature : {}".format([len(i.features) for i in output_stracks]))
# 在STrack中还包含更新特征
class STrack(BaseTrack):
self.buffer_size = int(frame_rate / 30.0 * opt.track_buffer)
def update_features(self, feat):
feat /= np.linalg.norm(feat)
self.curr_feat = feats
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)
2.collections deque进出demo
下面是写的一个测试小demo。由于feature维度大了,所以直接打印输出也不太好看清,代码中是怎么对存在队列中的特征怎么处理的。所以写了这样一个demo。目的是当append的元素个数超出初始化队列范围,怎么处理的?
# deque_test.py
from collections import deque
def main():
features = deque([], maxlen=5)
for i in range(10):
features.append(i)
print(features)
main()
运行显示:
3.总结
根据1.2,可以发现,当每个ID特征个数超过buffer_size时,会用新特征代替之前的特征,放到deque中。
说一下里面的几种情况吧:
(1) 当激活的Track,一直处于激活态,那么deque中对应ID的特征会一直更新,未超出buffer_size时,就不断加1,当超出时,就删除最早的特征,添加当前ID特征;
注:这两帧完美诠释了是否超出buffer_size的操作。ID=6,7未超过buffer_size,特征个数加1,ID=5超出了buffer_size,所以特征个数不变,但是特征都在更新。
(2)当激活的Track丢失后,会将其ID特征放到lost_stracks里,如果refind了话,会将lost_stracks中的特征在放到activated_stracks中。
注:由上图可以看到Frame588帧时,ID=19丢失,detection feature也只有4个ID的了,Frame589找回了ID19,detection feature有5个ID的了。
本文地址:https://blog.csdn.net/qq_35975447/article/details/107247977
上一篇: 肉粽子高压锅煮多久