zoukankan      html  css  js  c++  java
  • CenterNet:Corner-Center三元关键点,检测性能全面提升 | ICCV 2019

    为了解决CornerNet缺乏目标内部信息的问题,提出了CenterNet使用三元组进行目标检测,包含一个中心关键点和两个角点。从实验结果来看,CenterNet相对于CornerNet只增加了少量推理时延,但带来了将近5个点的AP提升

    来源:晓飞的算法工程笔记 公众号

    论文: CenterNet: Keypoint Triplets for Object Detection

    Introduction


      CornerNet将目前常用的anchor-based目标检测转换为keypoint-based目标检测,使用角点对表示每个目标,CornerNet主要关注目标的边界信息,缺乏对目标内部信息的获取,很容易造成误检,如图1所示。为了解决这个问题,论文提出CenterNet,在角点对的基础上加入中心关键点组成三元组进行检测,既能捕捉目标的边界信息也能兼顾目标的内部信息。另外,为了更好地提取特征,论文还提出了center pooling和cascade corner pooling,分别用于更好地提取中心关键点和角点。

    Baseline and Motivation


      CenterNet以CornerNet为基础,为了检测角点,CornerNet分别预测左上角点和右下角点的热图。另外,为每个角点预测了embedding向量和偏移值,相同目标的角点的embedding向量距离会非常小,偏移值则是对角点进行小范围调整。最后分别选择top-k个左上角点和top-k个右下角点,根据embedding向量距离进行配对,预测框置信度为角点对的置信度均值。

      论文对CornerNet的误检率进行了分析,如表1所示,大部分的误检集中在低IoU区域,有32.7%的预测结果与GT的IoU低于0.05,而小目标的误检率高达60.3%,可能的原因是CornerNet无法感知目标内部的信息,这个问题可以通过ROI池化二次分类来弥补,但是计算消耗很大。于是,论文提出高效的替代方案CenterNet,在CornerNet的角点对上再加入一个目标内部点组成三元组,以最低的成本捕捉目标的内部信息。

    Object Detection as Keypoint Triplets


      CenterNet的整体结构如图2所示,将每个目标表示为中心关键点和角点对。在CornerNet的基础上增加一个中心关键点的热图输出,先按CornerNet的方法获取top-k个预测框,然后使用中心关键点对预测框进行过滤和排序:

    1. 根据分数选择top-k个中心关键点
    2. 结合对应的偏移值将中心关键点映射到输入图片
    3. 定义每个预测框的中心区域,检查中心区域是否包含中心关键点
    4. 如果中心区域包含中心关键点,保留该预测框,将分数替换为三个关键点的分数均值。如果中心区域不包含中心关键点,则去除该预测框。

      中心区域的大小对检测结果有直接的影响,区域过小会导致小目标召回率低,而区域过大则会导致大目标准确率低。为此,论文提出了尺寸可知(scale-aware)的中心区域,能够根据预测框的大小进行调整。定义$tl_x$和$tl_y$为预测框的左上角点坐标,$br_x$和$br_y$为预测框的右下角点坐标,$ctl_x$和$ctl_y$为中心区域的左上角点坐标,$cbr_x$和$cbr_y$分别为右下角点的坐标,四个点应满足以下关系:

      $n$为奇数,决定中心区域的尺寸大小,论文对于尺寸小于150和大于150的预测框分别将$n$设为3和5。

      图3展示了$n=3$和$n=5$的中心区域,根据公式1计算尺寸可知的中心区域,然后检查中心区域是否包含中心关键点。

    Enriching Center and Corner Information


    Center pooling

      通常,目标的几何中心不一定包含重要的分辨信息,比如人最有辨识度的地方在头部,而几何中心却在人体的中间。为了解决这个问题,论文提出中心池化来提取更丰富的可辨认信息。

      如图a所示,主干网络输出特征图后,在判断中心关键点时,取特征图水平方向和垂直方向的最大值之和作为分数,这样能够很好地帮助中心关键点的检测。

    Cascade corner pooling

      由于角点通常在目标之外,缺少目标的相关信息,CornerNet使用corner pooling来解决这个问题,如图b所示,取边界方向的最大值作为分数,但这会导致角点过于关注边界信息。

      为了解决这个问题,需要让角点能够关注目标的内部,cascade corner pooling如图c所示,首先在边界方向找到最大值,然后在边界最大值处向内找到内部最大值,将两个最大值相加作为分数输出,这样角点能够同时关注边界信息和目标信息。

      Center pooling和cascade corner polling可通过组合不同方向的corner pooling进行简单实现,如图5所示。需要注意,图5b为cascade top corner pooling模块,只输出左上角点在top方向值,还要加上cascade left corner pooling输出的left方向值。cascade left corner pooling的结构跟图5b类似,只是交换Top pooling和Left pooling的位置。

    Training and Inference


    Training

      CenterNet的输入分辨率为$511 imes 511$,最后的热图大小为$128 imes 128$,完整的网络损失函数为:

      $L{co}_{det}$和$L{ce}{det}$为focal loss,用来训练网络检测角点和中心关键点,$L{co}_{pull}$和$L{co}{push}$为角点pull损失和push损失,用来最大化和最小化embedding向量的距离,$L{co}_{off}$和$L{ce}_{off}$为L1损失,用来调整角点和中心点的偏移值。

    Inference

      测试时同时使用原图和水平翻转图片,每个图分别保留70个中心关键点、左上角点和右上关键点来预测,最后综合两个图片的结果进行Soft-nms输出。

    Experiments


      与SOTA目标检测方法对比。

      与CornerNet的错误率优化对比。

      对比实验。

    CONCLUSION


      为了解决CornerNet缺乏目标内部信息的问题,CenterNet使用三元组进行目标检测,包含一个中心关键点和两个角点。从实验结果来看,CenterNet相对于CornerNet只增加了少量推理时延,但带来了将近5个点的AP提升。



    如果本文对你有帮助,麻烦点个赞或在看呗~
    更多内容请关注 微信公众号【晓飞的算法工程笔记】

    work-life balance.

  • 相关阅读:
    [Java] 开课吧--JVM
    [Java] 数据分析 -- 大数据
    [Java] 数据分析 -- NoSQL数据库
    [Java]数据分析--聚类
    [Java] 数据分析--分类
    [Java] 数据分析 -- 回归分析
    [Java] 数据分析--统计
    [Java]数据分析--数据可视化
    [Java] 数据分析--数据预处理
    从零开始的react入门教程(十),快速上手react-redux,相对于redux它究竟简化了什么?
  • 原文地址:https://www.cnblogs.com/VincentLee/p/14281443.html
Copyright © 2011-2022 走看看