前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跟踪算法性能测试之二:常用评价标准实现

跟踪算法性能测试之二:常用评价标准实现

作者头像
和蔼的zhxing
发布2019-03-06 16:54:34
1.1K0
发布2019-03-06 16:54:34
举报

这一篇均是在上一篇的基础上实现的,在上一篇写了如何批量测试VOT数据集及保存跟踪结果。并进行了简单的CLE绘制,这一篇总结一下常用的跟踪评价标准及其实现。

在此之前,已经得到了每一个视频序列的groundtruth和跟踪的结果,保存的格式如下:(groundtruth和跟踪结果都是以这个格式保存在txt之中的)

1. 中心位置误差(CLE)

这个上一篇已经讲过了,这里再重复一下它的概念,因为下面还有几个评价标准是以此为基础的。

CLE计算的是跟踪框中心位置的欧式距离,假设某一帧,groundtruth标注的中心位置为

(x_1,y_1)
(x_1,y_1)

,跟踪结果的中心位置为

(x_2,y_2)
(x_2,y_2)

,这个位置需要通过简单的转换得来:

\begin{eqnarray} X=x+width/2 \\ Y=y+height/2 \end{eqnarray}
\begin{eqnarray} X=x+width/2 \\ Y=y+height/2 \end{eqnarray}

中心位置的误差则为:

CLE=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
CLE=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

2. 区域重叠度。

在真正的跟踪过程中,因为有尺度变化存在,单纯的CLE并不能全面衡量跟踪算法的性能,所以区域重叠度可以作为一个重要的辅助标准。

所谓区域重叠度就是标注的跟踪框和跟踪的跟踪框之间的重叠程度,显而易见需要寻找一种相对的衡量标准,如果用重叠面积这种绝对的衡量标准是不合适的。

这里,用的是交并比(Intersection-over-Union,IOU),这个标准在目标检测中也用的比较多。

如图,交并比即交集的面积比上并集的面积。

IOU=\frac{Rect1\cap Rect2}{Rect1\cup Rect2}
IOU=\frac{Rect1\cap Rect2}{Rect1\cup Rect2}

这样的话,就是一个相对值,比较能客观的展示两个矩形的重叠成都。

实现起来也不算难,我也是参考了别人的一些思路,有很多种方法,但是我觉得这种方法是比较简单而且易于理解的。

首先来分析两个矩形相交的情况。

大概是这些情况,总结交集的状态可以发现这么一个规律:

  1. 交集的上边(上面的一条边,下面的以此类推) 是两个矩形上边靠下的那个。
  2. 交集的左边是两个矩形左边靠右的那个。
  3. 交集的右边是两个矩形右边靠左的那个。
  4. 交集的右边是两个矩形右边靠左的那个。

这个规律是可以通过左边之间的转换来表现。

那么要是不相交呢?如果不相交的话,那么依照上面的规律得到的就不是矩形,上边跑到了下边的下面或者左边跑到了右边的右边。

这样的话思路就很清晰了,代码如下: 我也不是故意要写中文注释,虚拟机的中文输入法好像崩掉了!!

代码语言:javascript
复制
#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左右)


未完待续!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 中心位置误差(CLE)
  • 2. 区域重叠度。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档