CornerNet: Detecting Objects as Paired Keypoints
论文链接:https://arxiv.org/abs/1808.01244
代码链接:https://github.com/umich-vl/CornerNet
1. 为何提出CornerNet(anchor based 方法的缺点)
第一,因为要anchor要覆盖所有的ground truth box并且IOU比较大,所以就需要非常多密集分布的anchor,这也导致正负样本的严重不平衡。其次,为为每个目标分配的anchor的大小、比例、数量都需要人为的设计,比较复杂。
预测anchor box的中心点坐标要考虑四个方向的因素,左、右、上和下。而cornerNet在定位边角点时只要考虑两个方向的因素,比如要定位左上边角点,我们只需要观察物体的最上边点边界和最左边的边界。
用边界点来表示bbox,会更高效:因为只使用O(wh)量级的边角点,就可以表示
O(w2h2)量级的anchor box。
anchor boxes两大缺点
通常数量极大,训练时,DSSD算法用了40K个,RetinaNet算法用了100K个,大量的anchor boxes是不与目标区域重合,这造成了极大的正负样本不平衡,也减慢了训练速度。
引入了许多超参数和设计选择,包括需要生成多少个box、大小多少、长宽比如何等,再考虑到往往要支持多尺度检测,使得问题更加复杂。
2. CornerNet对anchor based 方法的改进(出发点)
把boxes看作左上和右下两个点,这样目标检测就变成了两个关键点的检测。
3.如何匹配同一物体bounding box的左上角和右下角?
将一个目标物体检测为一对关键点——边界框的左上角和右下角。 我们使用单个卷积网络来预测同一物体类别的所有实例的左上角的热图,所有右下角的热图,以及每个检测到的角点的嵌入向量。 嵌入用于对属于同一目标的一对角点进行分组——训练网络以预测它们的类似嵌入。利用embedding后的角点的距离区分左上角和右下角的角点是否属于一个类别
4. 如何检测目标的角点(左上角、右下角)?
我们预测两组热图,一组用于左上角,另一组用于右下角。输出heatmap为H**W*C, 每组热图具有C个通道,其中C是分类的数量,并且