接着~《CMOT中对跟踪结果results.mat的理解》~
在CMOT中,只用了一个数据集ETH-Bahnhof(标准),注意,无论是Results的生成,还是Sequence中,都写的ETH_Bahnhof(here),就是个名称的问题,可以改的。
刚开始我把param中的参数改为
img_path = './Sequences/ETH-Bahnhof/';
img_List = dir(strcat(img_path,'*.png'));
相对应的,把Results和Sequence的序列也改成标准的样子,结果报错了。就是这里的问题,不是Det的问题。step by step => ok
果然是基本流程啊,要认真!!!
有关键的3个问题,
1、400 PK 1000
跟踪结果有400个,检测Det有400个,但是图片共有1000张。??
只是设定的问题,本来这个数据集图片有1000张,只是detections没有检测全,只有400个,要是detections检测全的话,就是1000个。因为检测是400,所以frame_end也是400,虽然导入了1000张图片,但有效的就只有400张,跟踪图像上也只出现了400张。这里用到的思想就是tracking-by-detections。
2、all_mot [ ]中的参数在代码中的由来。
现在有一个问题,即cmot_KCF_tracking_results.mat究竟从哪里保存的呢?
在主函数中,关于all_mot的描述是
[all_mot] = MOT_Draw_Tracking_HCF(Trk_sets, out_path, img_path, img_List, DrawOption,method);
其中,参数介绍~
% Tracking Results
[Trk_sets] = MOT_Tracking_Results(Trk,Trk_sets,fr);
在MOT_Draw_Tracking_HCF.m中,我们来看看all_mot究竟是如何组成的。
本函数的作用是画出跟踪的结果(bbox)并写入。
函数介绍如下:在参数设定函数中有 param.new_thr = param.show_scan + 1; % Temporal window size for tracklet initialization,这个和id有关~。
就是将center position,left-top position,size,labels先算好,然后直接将结果组成矩阵放入字典中。在这里q=1:length(Trk_sets),有400个索引,说明跟踪的结果是400个。那么如何获得跟踪的结果呢?
3、detections的导入load
请问在MDP中detections是什么格式?他是自己创建的吧。。。
CMOT中得到的detections在跟踪的过程中如何比对,怎么用?作用是什么?
CMOT中,如果想要用其他数据集中的Det,生成结果并做测试,如何将标准的det.txt中的数据生成.mat文件的只有x,y,w,h?
答案是Yes。不过CMOT中的x,y 是中心position的,所以后来会有center to left的操作。这点要格外注意。否则,在使用标准数据做评估时会drift。
4、图片的load方法
param.show_scan的作用是可以从指定帧查看跟踪效果,不用只从第一帧查看,当然了,还需要做些预关联的操作。当然啦,为了防止Index exceeds matrix dimensions.在estimation_size.m中nof_s和show_scan 要对应起来。
5、detections中的参数问题
x,y,w,h。为了增加测试数据时的通用性,x,y最好是left-top。
6、detections在不同数据集的.mat,此.mat和标准的Det中的det.txt文件的对应转换问题。
关于将.mat=>.txt,本宝宝之前写过,http://www.jianshu.com/p/ba8530013f12
7、数据关联
主要是用到了本地关联和全局关联。各有各的作用,其中,with the global association, longer trajectories are built by linking fragmented trajectories.
本地关联+全局关联+ILDA=极大程度的提升算法性能,很好的增强了发生遮挡时候的鲁棒性。
~~~
因为Online MOT 无非就是确定如何将检测结果形成轨迹的过程。
轨迹初始化-->轨迹和检测结果进行数据关联(data association)-->判断何时停止跟踪。
tracklet initial-->data association between tracklets and detections-->stop tracking.
其中,前两个阶段,即轨迹初始化和数据关联,都要用到一定的外观模型和动作模型(位置模型)。
顺着这个思路,来看一段代码:
%% Initiailization Tracklet
for i=1:init_frame
Obs_grap(i).iso_idx = ones(size(detections(i).x));
Obs_grap(i).child = [ ];
Obs_grap(i).iso_child =[ ];
end
[Obs_grap] = mot_pre_association(detections,Obs_grap,frame_start,init_frame);
可见,在轨迹初始化(Initiailization Tracklet)的时候,需要先设定一个用于轨迹初始化的初始帧init_frame = frame_start + param.show_scan;之后在for循环中,利用这一初始帧的信息形成Obs_grap。再后来,就可以用形成的Obs_grap和检测detections,以及帧的初始和结束范围进行数据预关联,关联的结果信息仍存在Obs_grap中。可见,这个Obs_grap是专门用来存放数据关联的信息的。但是需要注意的是,目前还没有进行轨迹初始化哦,只是先确定了逻辑上的初始关联消息,因为没有载入图片。随后把第一帧和初始帧之间的图片load进来,利用这些图片构成的init_img_set进行Initialization_Tracklets。
好,之后可以进入Tracking的过程中了。
首先,把初始帧之后的全部图片load进来,还是形成init_img_set。这样我们就知道,init_img_set中包含的是全部的图片。
然后,进行data association。包括两部分,Local Association和Global Association。
为理解Obs_grap的关联过程。必须debug,这样方便理解哈~
再然后,Update。包括两部分,Tracklet Confidence Update和Tracklet State Update & Tracklet Model Update。
再再然后,处理New Tracklet Generation的情况。至此,MOT的基本过程就说完了,可以将Tracking Results保存下来,即Trk_sets,这是极其重要的结果啊!不过呢,没有可视的框框。
再再再然后,Draw Tracking Results,High (Red)-> Low (Blue)。有可视的框了。
最后,Save tracking results。当然了,之后还可以做些评估啥的!
啊,Obs_grap在哪里用到的?需要存储关联信息的地方就会用到。
可以说,数据关联是MOT的核心,用到这个的地方有:
~在1-init_frame中,用于逻辑的预关联和拥有实物图片的轨迹初始化会用到。
~两大数据关联过程,即本地关联和全局关联,会用到。
~当新轨迹需要产生的时候,需要用到。
To the end,涉及轨迹tracklets的产生过程中和需要关联的时候,会用到Obs_grap。具体怎么连啊。。。debug看吧。。。
网友评论