博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
目标检测中的IOU计算问题
阅读量:1886 次
发布时间:2019-04-26

本文共 2747 字,大约阅读时间需要 9 分钟。

在目标检测中我们有一个基本的操作,形象表述就是画框框,我们要通过我们画的框把我们要标注的目标给框出来,如下面那个狗。我们既可以说这个狗被框出来了,但是也可以说没有,因为你可以观察到左边和上面是存在一些缝隙的。

那问题就出现了。什么样的框才算把目标给框住了呢?这个时候就有了IOU这个评价指标。什么是IOU?

IOU想要描述的时黄框(检测到的结果)和绿框(标注的结果)重合的程度。用公式表示为

  • I O U = D e t e c t i o n R e s u l t ⋂ G r o u n d T r u t h D e t e c t i o n R e s u l t ⋃ G r o u n d T r u t h IOU = \frac{DetectionResult\bigcap GroundTruth}{DetectionResult\bigcup GroundTruth} IOU=DetectionResultGroundTruthDetectionResultGroundTruth

公式里面的DetectionResult就表示黄框(也就是通过神经网络得到的结果),GroundResult表示绿框(也就是标注的结果)。

好的,这看上去很容易,但是在具体实现的时候就会有一些问题了。接下来我先用YOLO2中的做法讲解其实现原理。

float overlap(float x1, float w1, float x2, float w2){
float l1 = x1 - w1/2; float l2 = x2 - w2/2; float left = l1 > l2 ? l1 : l2; float r1 = x1 + w1/2; float r2 = x2 + w2/2; float right = r1 < r2 ? r1 : r2; return right - left;}float box_intersection(box a, box b){
float w = overlap(a.x, a.w, b.x, b.w); float h = overlap(a.y, a.h, b.y, b.h); if(w < 0 || h < 0) return 0; float area = w*h; return area;}float box_union(box a, box b){
float i = box_intersection(a, b); float u = a.w*a.h + b.w*b.h - i; return u;}float box_iou(box a, box b){
return box_intersection(a, b)/box_union(a, b);}

在这个代码中box a表示结果box,而box b表示的是标注box,这两者都是box类的对象,这个类在这里我们用到了这样几个属性:

  • x:表示box中心点的x坐标
  • y:表示box中心点的y坐标
  • w:表示box的宽度
  • h:表示box的高度

我么先看第一个函数overlap是干什么的。假设按照box_intersection中的第一个做法,传入这样几个参数overlap(a.x, a.w, b.x, b.w),结果就是l1表示黄框的左边,l2表示绿框的左边,r1表示黄框的右边,r2表示绿框的右边。如下图

接着left=l2right=r1,最后right-left=交集的宽。同理传入overlap(a.y, a.h, b.y, b.h)

得到交集的高。两个一乘即为交集的大小。box_iou函数中的做法大家应该可以看得明白了,不再赘述。

当我们训练好网络后,将待测图像输入网络得到的输出结果是一个高维矩阵。在YOLO2中最后得到的矩阵是这样的[-1, H, W, B, (4 + 1 + C)]

  • H:表示纵向分割的块的数目
  • W:表示横向分割的块的数目

也就是一幅图片被我们分割为了H*W块。

  • B:表示anchors的数目
  • C:表示classes的数目

注意这里的4表示前面讲的x,y,w,h,而后面1表示confidence(参看论文中的 P r ( o b j e c t ) ∗ I O U Pr(object)*IOU Pr(object)IOU

以下是对应的python tensorflow版本

coords = tf.reshape(coords, [-1, H*W, B, 4])wh = tf.exp(coords[:,:,:,2:4]) * np.reshape(anchors, [1, 1, B, 2])area_pred = wh[:,:,:,0] * wh[:,:,:,1]#得到预测框的面积centers = coords[:,:,:,0:2]#得到预测框的xyfloor = centers - (wh * .5)ceil  = centers + (wh * .5)# calculate the intersection areasintersect_upleft   = tf.maximum(floor, _upleft)intersect_botright = tf.minimum(ceil , _botright)intersect_wh = intersect_botright - intersect_upleftintersect_wh = tf.maximum(intersect_wh, 0.0)intersect = tf.multiply(intersect_wh[:,:,:,0], intersect_wh[:,:,:,1])#得到交集# calculate the best IOU, set 0.0 confidence for worse boxesiou = tf.truediv(intersect, _areas + area_pred - intersect)#_areas表示真实的面积

这里的floor对应于上面的l1、黄框的下边,ceil对应于上面的r1、黄框的上边。_upleft对应上面的l2和绿框的下边,_botright对应上面的r2和绿框的上边。intersect_upleft就是l2和黄框的下边,intersect_botright就是r1和绿框的上边,后面的代码就顺理成章了。

由于本人水平有限,如有问题,恳请指出!_

转载地址:http://uhkdf.baihongyu.com/

你可能感兴趣的文章
Java 多维数组遍历
查看>>
深入分析Java中的length和length()
查看>>
数据库连接池浅析
查看>>
Java面试参考指南——同步
查看>>
在Java中如何高效的判断数组中是否包含某个元素
查看>>
线程安全与共享资源
查看>>
八成Java开发者解答不了的问题
查看>>
关于Spring的69个面试问答——终极列表
查看>>
Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
查看>>
设计模式(十一)代理模式Proxy(结构型)
查看>>
eclipse 配置黑色主题
查看>>
开发团队里是否需要测试人员?
查看>>
深入理解java虚拟机 精华总结(面试)
查看>>
Java中String类的方法及说明
查看>>
IntelliJ IDEA - 热部署插件JRebel 安装使用教程
查看>>
插件GsonFormat快速实现JavaBean
查看>>
Java面试题全集(上)
查看>>
Java面试题全集(中)
查看>>
Java面试题全集(下)
查看>>
《代码整洁之道》读书笔记
查看>>