欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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()

运行显示:

FairMOT中的deque怎么存ReID特征的?

3.总结

根据1.2,可以发现,当每个ID特征个数超过buffer_size时,会用新特征代替之前的特征,放到deque中。

说一下里面的几种情况吧:

(1) 当激活的Track,一直处于激活态,那么deque中对应ID的特征会一直更新,未超出buffer_size时,就不断加1,当超出时,就删除最早的特征,添加当前ID特征;

FairMOT中的deque怎么存ReID特征的?

FairMOT中的deque怎么存ReID特征的?

注:这两帧完美诠释了是否超出buffer_size的操作。ID=6,7未超过buffer_size,特征个数加1,ID=5超出了buffer_size,所以特征个数不变,但是特征都在更新。

(2)当激活的Track丢失后,会将其ID特征放到lost_stracks里,如果refind了话,会将lost_stracks中的特征在放到activated_stracks中。

FairMOT中的deque怎么存ReID特征的?

FairMOT中的deque怎么存ReID特征的?

 注:由上图可以看到Frame588帧时,ID=19丢失,detection feature也只有4个ID的了,Frame589找回了ID19,detection feature有5个ID的了。

 

 

 

本文地址:https://blog.csdn.net/qq_35975447/article/details/107247977