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的大小确定损失减小半径的有效性以及沙漏网络的有效性。
对于corner pooling仍然有点不明白为什么要这样做。为什么这样的pooling能够对角点的定位有效果?如果把corner pooling换成其他的操作,比如卷积层,是否效果会变差?
广告关闭回望2020,你在技术之路上,有什么收获和成长么?对于未来,你有什么期待么?云+社区年度征文,各种定制好礼等你!尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 lts。 首先去官网下载源码,地址:源码下载。 下载完成之后,解压源码: 1 tar -zxvf python-2. 7.12.tgz 可以看到目录结构如下:. ├── aclocal.m4 ├── con...
展示结果如下。说一下制作流程。一、获得公司名称及ID信息,请看下面图。打开Firefox web开发者模式,选择网络标签,在右边框里点击消息头,找到请求网址、请求方法;在参数标签里找到传递的参数;在响应标签里看到返回的JSON数据。请求的时候要伪装一下浏览器,比如headers = { 'Connection': 'Keep-Alive', 'Accep...
作者:小傅哥博客:https://bugstack.cn - 原创系列专题文章沉淀、分享、成长,让自己和他人都能有所收获!????一、前言知道的越多不知道的就越多编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java。当视野和格局的扩大,会让我们越来越发现原来的看法是多么浅显,这就像站在地球看地球和站在宇宙看地球一样。但...
MISC修改后缀.jpg为.txt,然后unicode编码就好了把宽度 01 调成02即可修改后缀为.txt,打开就能看到了修改后缀为.zip,搜索找到flag改成zip,flag的密码是图片详细信息,相机型号为16进制,转字符后得到解压缩密码每个包的第一个字符伪加密和LSB隐写演员古力娜扎,然后她的生日,最后解码MD5和base58...
20年后的人月神话(The Mythical Man-Month after 20 Years)
分类任务常用准确率、精确率、召回率、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,
常听前辈们提起设计模式,可一看23种设计模式,被这个数字都吓着了,更别说全部搞懂了,既然前辈们都说的那么重要了,静思之下,决定跟设计模式硬磕到底。 根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。 创建型模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。就像一个自行车厂商的角色,我想要生产摩拜单车,永...
不知道大家听没听过这么一句话:所有需要重复做两次的事情,都可以用程序代替我来完成。是的,说的没错,在现在互联网飞速发展的时代,许多繁琐的事情都可以写一些代码来完成,而Python就是其中之一!小编我在这就说几个用Python可以做哪些有趣的事情,好好看,好好学。场景1:微信上处理的事情有很多都是重复的,又经常容易被这些琐事打断。于是我在Python程序里设定了一些关键词和相应的自动回复:该图片像这种根据关键字自动回复的功能,我想大家也应该不陌生,像微信工作号里面就经常可以看见,如:回复’电影
为什么80%的码农都做不了架构师?>>> ...
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...