CornerNet: Detecting Objects as Paired Keypoints

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

程序: