目录
说明
环境
GTOT测评工具箱使用
结构
准备工作
测评过程
生成ERRresults/xxx.mat
生成PR、SR曲线图
合成跟踪可视化视频
RGBT234测评工具箱使用
说明
结构
准备工作
测评过程
生成ERRresults_TIP/xxx.mat
生成PR、SR曲线图
合成跟踪可视化视频
Attribute-based Progressive Fusion Network for RGBT Tracking论文研读笔记
APFNet训练+测试复现过程记录
GTOT和RGBT234测评工具箱使用
在GTOT 工具箱中,共有六个文件夹,其中, BBresults 文件夹中存放的是测试生成的目标跟踪框的 txt 文件,ERRresults 文件夹中的是计算生成的错误率文件,sequencesAttr 是工具箱中自带的关于 GTOT 数据集特性的一些文件,trackingResultsDisplay是存放带有跟踪框的结果图像的文件夹,GTOT_APFNet_tracking_result 文件夹存放的是使用RGBT234 数据集作为训练集,GTOT 作为测试集得到的测试跟踪结果(文件中每一行都含有八个数值,前四个和后四个分别代表在 RGB 图像和热红外图上的跟踪框四元数),my_video文件夹是自己建立的,用来存放合成视频的文件夹。
在测评工具箱根目录下新建脚本cp_BBres_txts.py,用于将测试APF模型时生成的bbox框文件拷贝并重命名至 BBresults 与 ERRresults/APF 两个文件夹内
import os
input_path = './GTOT_APFNet_tracking_result/'
#output_path = './BBresults/'
output_path = './ERRresults/APF/'
for origin_txt in os.listdir(input_path):
os.system('cp ' + input_path + origin_txt + ' ' + output_path + 'APF_' + origin_txt)
修改output_path两次,执行脚本两次
python cp_BBres_txts.py
input | ERRresults/APF/*.txt |
output | ERRresults/APF/*.mat |
(1)main_GenerateMat.m脚本中:basePath为GTOT数据集的位置,即"xxx/data/GTOT/";trackers为几个追踪算法的名字,这里设置为trackers={'APF'};
(2)calcPlotErr.m脚本中:basePath为GTOT数据集的位置;resultPath为跟踪框txt文件所在位置以及要输出的检测框mat文件所在位置,即resultPath='ERRresults/APF/'; 64行左右处也要改为'APF_',即:
results.res=dlmread([resultPath 'APF_' seq_name '.txt']); %seq_length*8
%algs={'APF'}; % ours
algs={'APF', 'ADNet', 'MANet', 'DAPNet', 'DAFNet', 'MDNet', 'SGT', 'RT-MDNet+RGBT', 'MDNet+RGBT', 'MACNet'}; % overall
pixelThreshold=5;
basePath='xxx/dataset/GTOT/';
input | ERRresults/*.mat |
output | PR、SR曲线图 |
如上图所示,在PR图中,横轴表示定位损失阈值,单位是像素,纵轴是精确率 PR,论文中说到过,对于 GTOT 数据集,阈值设置为 5 个像素,所以横轴等于 5 像素时,得到APFNet 在GTOT数据集上的精确率为 90.5%。各个 RGBT 目标跟踪算法相互对比,可知 APFNet算法在众多算法当中,性能较为优越。
在SR图中,横轴表示 overlap 阈值,即追踪框和 GT 框之间交并比的大小,纵轴表示成功率 SR。当阈值取 0.7 时,即当 overlap 大于 0.7 时表示成功追踪,APFNet 算法的 SR 为 73.7%。各个 RGBT 目标跟踪算法相互对比,可知 APFNet 算法在众多算法当中,性能较为优越。
tracker={'APF'} %使用几种跟踪算法就会同时有几种追踪框
basePath='xxx/dataset/GTOT/';
dirs = dir(basePath);
sequences = {dirs.name};
sequences(strcmp('.', sequences) | strcmp('..', sequences) | strcmp('anno', sequences) | ~[dirs.isdir]) = [];
%sequence='Minibus1';
sequence='Football';
%for ni=8
% sequence=sequences{ni}
trackerResultsPath='BBresults/';
sequencePath='xxx/dataset/GTOT/';
saveBasePath='trackingResultsDisplay/';
%imshow(uint8(im));
imshow(uint8(im),'border','tight');
import cv2
import os
import linecache
DEBUG = 1
def gen_video(sequence_path, res_video_path, gt_path):
if not os.path.exists(res_video_path):
os.system('mkdir ' + res_video_path)
f = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 保存视频格式为avi
for sequence_name in os.listdir(sequence_path):
#save_sequence_path = os.path.join(res_video_path, sequence_name)
save_sequence_path = res_video_path + '/' + sequence_name
if DEBUG:
print(save_sequence_path)
if not os.path.exists(save_sequence_path):
os.makedirs(save_sequence_path)
test_frame_v = cv2.imread(os.path.join(sequence_path, sequence_name + '/v/1.jpg') )
video_writter_v = cv2.VideoWriter(os.path.join(save_sequence_path, sequence_name + '_v.avi'), f, 25, (test_frame_v.shape[1], test_frame_v.shape[0]))
test_frame_i = cv2.imread(os.path.join(sequence_path, sequence_name + '/i/1.jpg') )
video_writter_i = cv2.VideoWriter(os.path.join(save_sequence_path, sequence_name + '_i.avi'), f, 25, (test_frame_i.shape[1], test_frame_i.shape[0]))
for channel in ['v', 'i']:
video_path = os.path.join(sequence_path, sequence_name, channel)
label_path = os.path.join(gt_path, sequence_name)
#for frame_name in os.listdir(video_path): # 这样读取是乱序,视频跳帧
# frame = cv2.imread(os.path.join(video_path, frame_name))
for index in range(len(os.listdir(video_path))):
frame = cv2.imread(os.path.join( video_path, str(index+1) + '.jpg') )
if channel == 'v':
now_label = linecache.getline(os.path.join(label_path, 'groundTruth_v.txt'), index+1).strip() # 去掉换行符
else:
now_label = linecache.getline(os.path.join(label_path, 'groundTruth_i.txt'), index+1).strip() # 去掉换行符
ori_data_seq_vis_path = os.path.join(label_path, 'v')
ori_data_seq_vis_img_name = os.listdir(ori_data_seq_vis_path)[0]
ori_data_seq_vis_img = cv2.imread(os.path.join(ori_data_seq_vis_path, ori_data_seq_vis_img_name))
ratio_w = test_frame_v.shape[1] / ori_data_seq_vis_img.shape[1]
ratio_h = test_frame_v.shape[0] / ori_data_seq_vis_img.shape[0]
#print(now_label)
[x, y, x1, y1] = now_label.split(' ')
[x, y, x1, y1] = [int(x), int(y), int(x1), int(y1)]
cv2.rectangle(frame, ( int(x * ratio_w), int(y * ratio_h) ), ( int(x1 * ratio_w), int(y1 * ratio_h)), (255,255,255), 2)
if DEBUG:
cv2.imshow(sequence_name + '_' + channel, frame)
cv2.waitKey(20)
if channel == 'v':
video_writter_v.write(frame)
else:
video_writter_i.write(frame)
cv2.destroyAllWindows()
if __name__ == '__main__':
sequence_path = './trackingResultsDisplay'
res_video_path = './my_video'
gt_path = 'xxx/dataset/GTOT'
gen_video(sequence_path, res_video_path, gt_path)
在RGBT234测评工具箱中,共有七个文件夹,其中, BBresults_TIP 文件夹中存放的是测试生成的目标跟踪框的 txt 文件,ERRresults_TIP 文件夹中的是计算生成的错误率文件,figsResults_TIP文件夹中的是不同属性下的PR、SR曲线评测图,sequencesAttr 是工具箱中自带的关于 RGBT234 数据集特性的一些文件,trackingResultsDisplay是存放带有跟踪框的结果图像的文件夹,RGBT234_APFNet_tracking_result 文件夹存放的是使用GTOT数据集作为训练集, RGBT234作为测试集得到的测试跟踪结果(文件中每一行都含有八个数值,前四个和后四个分别代表在 RGB 图像和热红外图上的跟踪框四元数),my_video文件夹是自己建立的,用来存放合成视频的文件夹。
在测评工具箱根目录下新建脚本cp_BBres_txts.py,用于将测试APF模型时生成的bbox框文件拷贝并重命名至 BBresults_TIP 与 ERRresults_TIP/APF 两个文件夹内,需要注意的是RGBT234数据集解压后可能自带有一个rgbt234.txt文件,需要将其删除。
import os
input_path = './RGBT234_APFNet_tracking_result/'
output_path = './BBresults_TIP/'
#output_path = './ERRresults_TIP/APF/'
for origin_txt in os.listdir(input_path):
os.system('cp ' + input_path + origin_txt + ' ' + output_path + 'APF_' + origin_txt)
修改output_path两次,执行脚本两次
python cp_BBres_txts.py
input | ERRresults_TIP/APF/*.txt |
output | ERRresults_TIP/APF/*.mat |
(1)main_GenerateMat_TPR.m脚本中:basePath为GTOT数据集的位置,即"xxx/data/RGBT234/";trackers为几个追踪算法的名字,这里设置为trackers={'APF'};
(2)calcPlotErr_TPR.m脚本中:basePath为RGBT234数据集的位置;resultPath为跟踪框txt文件所在位置以及要输出的检测框mat文件所在位置,即resultPath='ERRresults_TIP/APF/'; 需要提前建好APF文件夹;73行左右处也要改为'APF_',即:
results.res=dlmread([resultPath 'APF_' seq_name '.txt']); %seq_length*8
%algs={'APF'}; % ours
algs={'APF', 'CFnet+RGBT', 'MDNet+RGBT', 'DAFNet', 'KCF+RGBT', 'DAPNet', 'DAT', 'ECO', 'SGT', 'SiamDW+RGBT'}; % overall
pixelThreshold=20;
basePath='xxx/dataset/RGBT234/';
input | ERRresults_TIP/*.mat |
output | PR、SR曲线图 |
如上图所示,在PR图中,横轴表示定位损失阈值,单位是像素,纵轴是精确率 PR,论文中说到过,对于RGBT234数据集,阈值设置为20个像素,所以横轴等于20像素时,得到APFNet 在RGBT234数据集上的精确率为 82.7%。各个 RGBT 目标跟踪算法相互对比,可知 APFNet算法在众多算法当中,性能较为优越。
在SR图中,横轴表示 overlap 阈值,即追踪框和 GT 框之间交并比的大小,纵轴表示成功率 SR。当阈值取 0.7 时,即当 overlap 大于 0.7 时表示成功追踪,APFNet 算法的 SR 为 57.9%。各个 RGBT 目标跟踪算法相互对比,可知 APFNet 算法在众多算法当中,性能较为优越。
basePath='xxx/dataset/RGB_T234/';
trackerResultsPath='BBresults_TIP/';
sequencePath='xxx/dataset/RGB_T234/';
saveBasePath='trackingResultsDisplay/';
if(isdir(saveBasePath)==0),
mkdir(saveBasePath);
end
tracker={'APF'};
%tracker={'PaGLe','CSR','DSST','HCF','JSR','KCF','L1-PF','MDNet','SGT','SOWP','Staple'};%,'STRUCK','CN','CT','MIL','SCM'};
%all videos, call self with each video name.
%only keep valid directory names
dirs = dir(basePath);
sequences = {dirs.name};
sequences(strcmp('.', sequences) | strcmp('..', sequences) | strcmp('anno', sequences) | ~[dirs.isdir]) = [];
edgeColor={'r','g','b','y','k','m','c','g','b','y','r'};
lineStyle={'-','-','-','-','--','--','--','--','--','--','--'};
% for ni=100:numel(sequences)
for ni=120:120 % 选择第120个文件夹,即manwithluggage
% sequence='walkingtogether1';
sequence=sequences{ni};
%imshow(uint8(im));
imshow(uint8(im),'border','tight');