论文链接:https://arxiv.org/abs/1808.01244
代码链接:https://github.com/umich-vl/CornerNet
为了检测角落,CornerNet产生两个热度图: 左上角的热度图和右下角的热度图。 热点图代表不同类别关键点的位置,并为每个关键点分配一个得分。 此外,还预测了每个角点的embedding和 a group of offsets。 embedding用于识别两个角是否来自同一对象。从热图到输入图像时有偏差,所以用offsets学习这个映射的角点。 为了生成bounding boxes,分别从热图中根据分数选择上下左上角和右下角。 然后计算一对角点的embedding的距离,确定成对角点是否属于同一对象。 如果距离小于阈值,则生成bounding boxes。
one-stage;
不再采用anchor boxes机制;
the top-left corner and bottom-right;
一个CNN预测同一对象类别的两组热图(左上角,右下角,an embedding vector for each detected corner.两个角点的嵌入距离来自同一个对象的距离很小);
网络还预测偏移;
提出了corner pooling层用来帮助CNN定位目标框的角;
corner pooling层:采用了两个特征映射;一个是对特征映射向右最大池化所有特征矢量,另一个是对特征映射下面最大池所有特征向量;最后将两个合并的结果加在一起,如下图。
利用预测的热图、嵌入向量和偏移量,再简单的后处理算法来获得最终的bounding boxes;
以hourglass network为骨干网络,之后是两个预测模块(一个模块用于左上角,一个用于右下角),两个预测模块中有自己的corner pooling层,之后是corner pooling层;
网络中没有用到尺度,只把两个预测模块都用到hourglass network的输出端;整个模型如下图:
训练时:最小化对目标位置半径内的背景的惩罚。不再使用原来类似IOU这样计算覆盖率为目标,原因如下图,绿色的是预测结果,红色是真实标签,这样的预测结果计算出来的覆盖率值很大,但并不是最准确的结果。
如何匹配左上角的右下角的点:如果左上角点的。。和右下角点的。。计算。。小于阈值就视为是一对,如果有多对怎么筛选?
用的损失函数是focal loss的改进:
由于下采样,当将热度图和输入图像的位置重新映射时,可能会失去一些精度。 为了解决这个问题,我们预测位置偏移,稍微调整角落位置,然后再将它们映射到输入。
Corner Pooling层:为了确定一个像素是否是左上角,我们需要水平地看向物体的最上边界,垂直地看向最左边界的底部。如图:
左上角时:左(从右往左看,v=max(v,v右侧))+上(从下往上看,v=max(v,v下侧)),计算过程如上图。
右下角时:右(从左往右看,v=max(v,v左侧))+下(从上往下看,v=max(v,v上侧))
所以整个预测模块如下图:
程序: