【目标检测】|无锚点 CornerNet

论文:CornerNet: Detecting Objects as Paired Keypoints
论文链接:https://arxiv.org/abs/1808.01244
代码链接:https://github.com/umich-vl/CornerNet

1、将目标检测问题当作关键点检测问题来解决,也就是通过检测目标框的左上角和右下角两个关键点得到预测框,因此CornerNet算法中没有anchor的概念,这种做法在目标检测领域是比较创新的而且能够取得不错效果是很难的。2、整个检测网络的训练是从头开始的,并不基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制。

在这里插入图片描述
CornerNet是一种one-stage检测方法,其框架如图1所示。主干网采用了Hourglass Network。主干网后紧跟两个prediction modules,其中一个检测top-left corners ,另一个检测bottom-right corners,最后对两组corner进行筛选,组合,修正得到object的一对corners,从而定位object的box。

Heatmaps和Embeddings都是prediction modules最后生成出来的特征图,top-left corners 和bottom-right corners各有一组。Heatmaps预测哪些点最有可能是Corners点,Embeddings用于表征属于相同对象的corner的相似度。它们的通道数都为C,C是object的类别数 (不包括background) 。最后的Offsets用于对corner的位置进行修正。每个corner修正前的坐标位置就是该corner在feature maps上的坐标点映射回原图的位置。

corner点为何是横向与纵向响应最强的点。CornerNet是预测左上角和右下角两个角点,但是这两个角点在不同目标上没有相同规律可循,如果采用普通池化操作,那么在训练预测角点支路时会比较困难。考虑到左上角角点的右边有目标顶端的特征信息(第一张图的头顶),左上角角点的下边有目标左侧的特征信息(第一张图的手),因此如果左上角角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就有了corner pooling。
速度244ms仍比较慢,受限于Hourglass网络特征提取

Test
测试时,使用simple post-processing算法从Heatmaps, Embeddings, Offsets生成边界框。首先在heatmaps上使用3*3的max pooling进行非极大值抑制(NMS)。然后从Heatmaps中选择scores前100的top-left corners和前100的bottom-right corners,corner的位置由Offsets上相应的scores调整。 最后,计算top-left corners和bottom-right corners所对应的Embeddings的L1距离。距离大于0.5或包含不同类别的corners pairs将被剔除。配对上的top-left corners和bottom-right corners以Heatmaps的平均得分用作检测分数。

作者没有使用resize的方法保持输入图像的原始分辨率一致,而是维持原分辨率,用0填充缺失和超出的部分。 原始图像和翻转图像都参与测试,并应用soft-nms来抑制冗余检测。 仅记录前100个检测项。 Titan X(PASCAL)GPU上的每个图像的平均检测时间为244ms。使用检测速度top100的测试图片,计算出CornerNet在TitanX(PASCAL)GPU上的平均推断时间为每张图片224ms。

CornerNet-Lite

CornerNet-Squeeze 探索了一种减少每像素处理量的替代方法。在CornerNet中,大部分计算资源都花在了Hourglass-104上。Hourglass-104 由残差块构成,其由两个3×3卷积层和跳连接(skip connection)组成。尽管Hourglass-104实现了很强的性能,但在参数数量和推理时间方面却很耗时。为了降低Hourglass-104的复杂性,本文将来自SqueezeNet和MobileNets 的想法融入到 lightweight hourglass 架构中。

主要操作是:
受SqueezeNet启发,CornerNet-Squeeze将 residual block 替换为SqueezeNet中的 Fire module
受MobileNet启发,CornerNet-Squeeze将第二层的3x3标准卷积替换为 3x3 深度可分离卷积(depth-wise separable convolution)

ref
https://www.jianshu.com/p/5e91c3894a31

https://www.cnblogs.com/gawain-ma/p/10868852.html

### 目标检测中的锚点概念解释 #### 锚点的作用与定义 在目标检测任务中,锚点(Anchor)是指预先设定好的边界框模板。这些模板具有固定的中心位置、宽度和高度,并覆盖图像的不同区域[^1]。引入锚点的主要目的是简化候选区域生成过程,减少计算量并提高检测效率。 #### 锚点的设计原则 对于不同层次的特征图来说,通常会设置多种尺寸和比例的锚点来适应各种大小的目标对象。具体而言: - **多尺度特性**:同一层特征图上的每个像素点都可能关联着几个不同尺度的锚点; - **感受野匹配**:虽然不是严格一对一的关系,但一般情况下较大的感受野倾向于配置更大面积的锚点用于捕捉较大范围内的物体,而较小的感受野则更适合于定位细小物品; - **跨层级协作**:为了确保能有效识别从小到大的各类物体,在网络结构设计时往往会采用像FPN这样的机制,在多个级别的特征映射上布置相应规模的锚点群集[^3]。 #### 非锚点方法对比 值得注意的是并非所有的现代目标检测框架都会依赖传统的基于锚点的方法来进行候选区的选择工作。例如CornerNet就摒弃了锚点机制转而采取直接回归目标边角坐标的策略完成最终预测框的构建[^2]。 ```python # 这里提供一段简单的Python伪代码展示如何初始化一组常见的9种形状各异的标准锚点(假设输入图片分辨率固定) def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2**np.arange(3, 6)): """ Generate anchor (reference) windows by enumerating aspect ratio and scale. Args: base_size(int): Base size of the anchor relative to input image dimensions. ratios(list[float]): List containing three typical width-to-height ratios used in RPNs. scales(array-like[int]): Array or list indicating scaling factors applied on top of `base_size`. Returns: numpy.ndarray: A set of anchors with shape `(len(ratios)*len(scales), 4)` where each row represents an individual bounding box defined as `[x_center,y_center,w,h]`. """ # ...省略具体的实现细节... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值