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