这一篇均是在上一篇的基础上实现的,在上一篇写了如何批量测试VOT数据集及保存跟踪结果。并进行了简单的CLE绘制,这一篇总结一下常用的跟踪评价标准及其实现。
在此之前,已经得到了每一个视频序列的groundtruth和跟踪的结果,保存的格式如下:(groundtruth和跟踪结果都是以这个格式保存在txt之中的)
1. 中心位置误差(CLE)
这个上一篇已经讲过了,这里再重复一下它的概念,因为下面还有几个评价标准是以此为基础的。
CLE计算的是跟踪框中心位置的欧式距离,假设某一帧,groundtruth标注的中心位置为,跟踪结果的中心位置为,这个位置需要通过简单的转换得来:
中心位置的误差则为:
2. 区域重叠度。
在真正的跟踪过程中,因为有尺度变化存在,单纯的CLE并不能全面衡量跟踪算法的性能,所以区域重叠度可以作为一个重要的辅助标准。
所谓区域重叠度就是标注的跟踪框和跟踪的跟踪框之间的重叠程度,显而易见需要寻找一种相对的衡量标准,如果用重叠面积这种绝对的衡量标准是不合适的。
这里,用的是交并比(Intersection-over-Union,IOU),这个标准在目标检测中也用的比较多。
如图,交并比即交集的面积比上并集的面积。
这样的话,就是一个相对值,比较能客观的展示两个矩形的重叠成都。
实现起来也不算难,我也是参考了别人的一些思路,有很多种方法,但是我觉得这种方法是比较简单而且易于理解的。
首先来分析两个矩形相交的情况。
大概是这些情况,总结交集的状态可以发现这么一个规律:
- 交集的
上边(上面的一条边,下面的以此类推)
是两个矩形上边
靠下的那个。- 交集的
左边
是两个矩形左边
靠右的那个。- 交集的
右边
是两个矩形右边
靠左的那个。- 交集的
右边
是两个矩形右边
靠左的那个。
这个规律是可以通过左边之间的转换来表现。
那么要是不相交呢?如果不相交的话,那么依照上面的规律得到的就不是矩形,上边
跑到了下边
的下面或者左边
跑到了右边
的右边。
这样的话思路就很清晰了,代码如下:
我也不是故意要写中文注释,虚拟机的中文输入法好像崩掉了!!
#calculate IOU,rect1 and rect2 are rectangles(x,y,width,height)
def calculateIOU(rect1,rect2):
#calculate the area
area1=rect1[2]*rect1[3]
area2=rect2[2]*rect2[3]
#calculate the sum area
area=area1+area2
#calculate the edge line of every rect
top1=rect1[1]
left1=rect1[0]
bottom1=rect1[1]+rect1[3]
right1=rect1[0]+rect1[2]
top2=rect2[1]
left2=rect2[0]
bottom2=rect2[1]+rect2[3]
right2=rect2[0]+rect2[2]
#calculate the intersect rectangle
top=max(top1,top2)
left=max(left1,left2)
bottom=min(bottom1,bottom2)
right=min(right1,right2)
#if no intersect
if top>=bottom or right<=left:
return 0
else:
intersectArea=(bottom-top)*(right-left)
return intersectArea/(area-intersectArea)
计算完了再画图就比较简单了,一帧一帧计算然后放入列表之中,再使用plt.plot()
来画图就可以了,看一套效果还不错的图:(其实在数据集上整体的效果是非常一般的,数据集上的整体ACU(这个参数我现在还不知道什么东西,应该是平均准确率的意思吧!)才0.5左右)
未完待续!!