目标检测CornerNet: Detecting Objects as Paired Keypoints论文详解_sinat_24674017的博客-程序员秘密

技术标签: cornernet  目标检测  

论文链接

https://arxiv.org/abs/1808.01244

动机

在目标检测中使用anchor box的两个缺点:(1)在检测过程中会生成大量anchor box并计算每个anchor box和ground truth box的IoU。其中大部分的anchor box都是负样本而被丢弃。这个机制减慢了训练速度,增加了计算开销。 (2)anchor机制引入了更多的超参数,比如anchor box的大小、长宽比等,这增加了系统设计的复杂度。

贡献

提出一个新的one-stage但不需要anchor box的目标检测算法,通过预测bbox的左上角点坐标和右下角点坐标,得到目标的bbox定位。同时提出一个新的corner pooling操作,帮助卷积网络更好地定位bbox的角点。

算法

在这里插入图片描述
将hourglass network的最后一个卷积层的输出分别输入到两个分支,分别用于预测左上角点和右上角点的heatmaps,embeddings,offsets。

角点的检测

使用heatmap去检测定位角点。heatmaps有C个通道,对应C个类别(不包含背景类),本质上第k个通道都是一个针对第k类的二值掩码,在该通道上的每个位置的值可以理解为是第k类的bbox的左上(右下)角点的概率。
在训练时,考虑到角点在真值角点的附近时,依然可以形成一个和真值bbox的IoU接近1的bbox,所以当预测的角点在真值角点的某个半径的范围内时,可以适当减少损失。
半径的确定:处于真值(左上、右下)角点的半径范围内的预测(左上、右下)角点构成的bbox和真值bbox的IoU至少为t(论文中为0.3)

# 根据预测到的bbox计算半径
def gaussian_radius(det_size, min_overlap):
    height, width = det_size

    a1  = 1
    b1  = (height + width)
    c1  = width * height * (1 - min_overlap) / (1 + min_overlap)
    sq1 = np.sqrt(b1 ** 2 - 4 * a1 * c1)
    r1  = (b1 - sq1) / (2 * a1)

    a2  = 4
    b2  = 2 * (height + width)
    c2  = (1 - min_overlap) * width * height
    sq2 = np.sqrt(b2 ** 2 - 4 * a2 * c2)
    r2  = (b2 - sq2) / (2 * a2)

    a3  = 4 * min_overlap
    b3  = -2 * min_overlap * (height + width)
    c3  = (min_overlap - 1) * width * height
    sq3 = np.sqrt(b3 ** 2 - 4 * a3 * c3)
    r3  = (b3 + sq3) / (2 * a3)
    return min(r1, r2, r3)

def gaussian2D(shape, sigma=1):
    m, n = [(ss - 1.) / 2. for ss in shape]
    y, x = np.ogrid[-m:m+1,-n:n+1]

    h = np.exp(-(x * x + y * y) / (2 * sigma * sigma))
    h[h < np.finfo(h.dtype).eps * h.max()] = 0
    return h

def draw_gaussian(heatmap, center, radius, k=1):
    diameter = 2 * radius + 1
    gaussian = gaussian2D((diameter, diameter), sigma=diameter / 6)

    x, y = center

    height, width = heatmap.shape[0:2]
    
    left, right = min(x, radius), min(width - x, radius + 1)
    top, bottom = min(y, radius), min(height - y, radius + 1)

    masked_heatmap  = heatmap[y - top:y + bottom, x - left:x + right]
    masked_gaussian = gaussian[radius - top:radius + bottom, radius - left:radius + right]
    np.maximum(masked_heatmap, masked_gaussian * k, out=masked_heatmap)

角点位置预测的损失函数:
在这里插入图片描述
N为图片中真值bbox的个数。pcij为第c个通道的位置(i, j)处为角点的概率。ycij为标签,表示第c个通道的位置(i, j)处为角点的概率值,以ycij=1的(i, j)位置为中心点,形成一个概率的高斯分布,预测的角点越靠近ycij=1的(i, j)点,其损失越小。
许多网络对输入进行下采样获取全局信息并减少显存占用,输出时的规格比输入的原始图片要小。所以在预测bbox时,角点从原始图像映射到更小规格的heatmap上,在按比例缩小的过程中,导致了坐标精度的损失,影响定位效果。为了解决这个问题,增加一个位置偏移预测,通过预测偏移矫正角点的定位。
在这里插入图片描述
n是下采样系数。损失函数:
在这里插入图片描述
使用了smoothL1损失函数,增强对噪声的鲁棒性。

角点分组

在一副图片上检测到多个左上角点和右下角点后,需要将属于同一个bbox的左上角点和右下角点进行配对,忽略多余的角点。神经网络为每一个被检测的角点预测一个embedding vector。属于同一个bbox的左上角点和右下角点的embedding vector的欧式距离应该尽可能小,不属于同一个bbox的左上角点和右下角点的embedding vector的欧式距离要尽量大。在预测时就可以通过计算各个角点的embedding vector的距离进行配对。
损失函数:
在这里插入图片描述
在这里插入图片描述
etk为左上角点的embedding vector,ebk是右下角点的embedding vector。ek为etk和ebk的平均值

角点池化

由于角点的位置没有视觉上的显示,所以为了定位左上角点,需要在特征图的水平方向上从左向右找到bbox的上边界,在特征图的垂直方向从上向下找到bbox的左边界,通过两条边界确定左上角点(右下角点同理)。所以提出了corner pooling的新池化方法用于更好地定位角点。
在这里插入图片描述
垂直方向上corner pooling的公式:
在这里插入图片描述
t(i+1)j表示在第j列上,第i+1行到第H行的值中最大的值,实际上就是一个动态规划。
水平方向上corner pooling公式(同理):
在这里插入图片描述
Corner pooling在网络中的使用:
在这里插入图片描述
虚线框中的两个灰块分别是对水平方向和垂直方向的corner pooling

沙漏网络

沙漏网络首先通过max pooling进行多次下采样,然后多次上采样后恢复到原始分辨率,并通过跳跃连接恢复丢失的细节。多个沙漏网络能够堆叠构成一个更大的网络,适合目标检测。本文网络由两个沙漏网络堆叠而成,并对网络结构做了一些修改,比如把max pooling改为stride=2的卷积层、将特征分辨率减小5倍并增加了特征通道数、添加中间监督训练等等(具体看原文)。

实验

数据集

MS COCO

评价指标

在这里插入图片描述
在这里插入图片描述

结果

在这里插入图片描述
在这里插入图片描述
以上实验结果说明了corner pooling的有效性,根据bbox的大小确定损失减小半径的有效性以及沙漏网络的有效性。
在这里插入图片描述

优缺点

优点:

  1. 不使用anchor box,而是通过预测bbox的左上角点和右下角点的位置来定位目标bbox,并针对这个预测方式提出corner pooling,彻底摆脱了anchor box,减少了超参数量

缺点:

  1. 文中没有和yolov3进行比较,感觉是故意不进行比较的
  2. 在Titan X GPU上yolov3可以达到50ms一帧,而cornerNet需要244ms一帧,而他们的AP50结果差不多,这说明cornerNet和yolov3相比还是有一定差距

反思

CornerNet输入输出流程梳理:

  1. 输入一张RGB图片到hourglassNet中,通过两个串联的hourglassNet提取特征图。
    2.将第二个hourglassNet最后一个卷积层输出的特征图分别输出到两个分支,分别进行左上角点和右下角点的定位。
    3.在每个分支中特征图经过corner pooling等特征提取后输出3个特征图:(1)Heatmaps,有C(C为目标类别数量)个通道,每个通道上的值表示该像素位置为属于该类的bbox的角点的概率。(2)embeddings,两个分支的embeddings进行L1距离计算对左上角点和右下角点进行配对,获得属于同一个bbox的左上角点和右下角点的位置,从而定位bbox。(3)offsets,由于从高分辨率到低分辨率的映射使得角点的位置精度下降,通过使用offsets对损失的精度进行补偿校准,提高定位准确性。
    4.在heatmap上使用3x3map pooling层进行NMS操作,再选择概率最大的前100个左上角点和前100个右下角点。然后使用L1距离计算两个分支的embedding各个点的距离,距离小于0.5或者两个角点属于不同的类的bbox被排除。再使用soft-nms进一步排除多余的bbox

corner pooling

对于corner pooling仍然有点不明白为什么要这样做。为什么这样的pooling能够对角点的定位有效果?如果把corner pooling换成其他的操作,比如卷积层,是否效果会变差?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_24674017/article/details/97831833

智能推荐

python编译器源码_编译python源码_weixin_39866265的博客-程序员秘密

广告关闭回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你!尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 lts。 首先去官网下载源码,地址:源码下载。 下载完成之后,解压源码: 1 tar -zxvf python-2. 7.12.tgz 可以看到目录结构如下:. ├── aclocal.m4 ├── con...

抓取拉勾上游戏公司地址信息,结合百度地图API,生成游戏公司地图。感谢拉勾和百度地图的大力支持。_公司地址api_老徐WEB的博客-程序员秘密

展示结果如下。说一下制作流程。一、获得公司名称及ID信息,请看下面图。打开Firefox web开发者模式,选择网络标签,在右边框里点击消息头,找到请求网址、请求方法;在参数标签里找到传递的参数;在响应标签里看到返回的JSON数据。请求的时候要伪装一下浏览器,比如headers = {            'Connection': 'Keep-Alive',            'Accep...

学区摇号软件设计_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」..._weixin_39593519的博客-程序员秘密

作者:小傅哥博客:https://bugstack.cn - 原创系列专题文章沉淀、分享、成长,让自己和他人都能有所收获!????一、前言知道的越多不知道的就越多编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java。当视野和格局的扩大,会让我们越来越发现原来的看法是多么浅显,这就像站在地球看地球和站在宇宙看地球一样。但...

Bugku_谢老哥的博客-程序员秘密

MISC修改后缀.jpg为.txt,然后unicode编码就好了把宽度 01 调成02即可修改后缀为.txt,打开就能看到了修改后缀为.zip,搜索找到flag改成zip,flag的密码是图片详细信息,相机型号为16进制,转字符后得到解压缩密码每个包的第一个字符伪加密和LSB隐写演员古力娜扎,然后她的生日,最后解码MD5和base58...

计算机视觉模型常用评价指标_平均交并比_CV技术指南的博客-程序员秘密

分类任务常用准确率、精确率、召回率、F1_scores、ROC曲线等指标来评价模型的优劣,当然这些基础指标也可以用来评价分割模型或检测模型,它们基本上是可以通用的。混淆矩阵是对分类问题预测结果的总结,也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。混淆矩阵中含有4个分类问题的基础指标,如下表所示。.........

随便推点

两帧图像相似_前后两帧图像像素的相似比_小兮风的博客-程序员秘密

图像相似图片相似度计算的几种方法欧式距离[欧几里得距离(Euclidean Distance)]欧氏距离是最常见的距离度量(用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大),衡量的是n维空间中两个点之间的实际距离。A=(a1,a2,...an),B=(b1,b2,...bn)A=(a_1,a_2,...a_n),B=(b_1,b_2,...b_n)A=(a1​,a2​,...an​),B=(b1​,b2​,...bn​)d(A,B)=[∑(ai−bi)2]](i=1,

设计模式--创建型模式_蔚1的博客-程序员秘密

常听前辈们提起设计模式,可一看23种设计模式,被这个数字都吓着了,更别说全部搞懂了,既然前辈们都说的那么重要了,静思之下,决定跟设计模式硬磕到底。 根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 创建型模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。就像一个自行车厂商的角色,我想要生产摩拜单车,永...

教你些技巧,用 Python 自动化办公做一些有趣的事情 太方便了_有趣的python教程_普通网友的博客-程序员秘密

不知道大家听没听过这么一句话:所有需要重复做两次的事情,都可以用程序代替我来完成。是的,说的没错,在现在互联网飞速发展的时代,许多繁琐的事情都可以写一些代码来完成,而Python就是其中之一!小编我在这就说几个用Python可以做哪些有趣的事情,好好看,好好学。场景1:微信上处理的事情有很多都是重复的,又经常容易被这些琐事打断。于是我在Python程序里设定了一些关键词和相应的自动回复:该图片像这种根据关键字自动回复的功能,我想大家也应该不陌生,像微信工作号里面就经常可以看见,如:回复’电影

mongo auth_weixin_33752045的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

channelsftp的put,在JSch中使用channelsftp传输文件夹和子文件夹?_刘岩Lyle的博客-程序员秘密

I want to transfer a folder and a subfolder using channelsftp. I can successfully transfer files using channelsftp.put(src,dest) command but this does not work for folders (at least I could not make i...

暗通道去雾法_暗通道去雾算法_熊叫大雄的博客-程序员秘密

一、算法背景  暗通道先验去雾算法是大神何恺明2009年发表在CVPR上的一篇论文,还获得了当年的CVPR最佳论文。  根据论文的介绍,暗通道去雾算法是基于一个关键的观察:在没有雾霾的室外图像中,大多数局部区域包含一些像素,这些像素在至少一个颜色通道中具有非常低的强度(原文:It is based on a key observation - most local patches in haz...

推荐文章

热门文章

相关标签