DeepDriving | 经典的目标检测算法:CenterNet

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。

原文链接:经典的目标检测算法:CenterNet

1 前言

CenterNet2019年发表的一篇文章《Objects as Points》中提出的一个经典的目标检测算法,该算法采用Anchor-Free的方式实现目标检测及其他一些扩展任务,非常值得研究。

2 主要思想

CenterNet将目标检测当做一个标准的关键点估计问题,将目标表示为一个在其bounding box中心位置的单独点,其他的一些属性比如目标尺寸、维度、朝向和姿态等则直接从这个中心点位置的图像特征中进行回归。该模型将图像输入到一个全卷积网络中用来生成热力图,热力图的峰值位置即为目标的中心,每个峰值位置的图像特征用来预测目标bounding box的宽度和高度。该模型训练过程采用标准的监督学习方法,推理过程则是简单的网络前向传播而不需要在后处理中做非极大值抑制处理。这篇文章提出的是一个通用的目标检测方法,只需要在中心点的预测中添加一些额外的内容就可以非常简单地扩展到其他任务中去,比如3D目标检测和人体姿态估计。对于3D目标检测任务,是通过回归目标的绝对深度、3D bounding box维度和目标的朝向来实现的;而对于人体姿态估计任务,则是将2D关节位置视为距中心点的偏移量,并且在中心点位置直接回归得到它们。

3 原理

4 损失函数

5 扩展任务

  • 3D目标检测

3D目标检测就是给每个目标去估计一个3维的bounding box,这需要3个额外的属性:深度、3D维度和朝向,这3个属性通过3个独立的分支进行预测。

  • 人体姿态估计

人体姿态估计的目的是找出图像中每个人体实例的个关节位置(COCO数据集k=17)。可以将姿态视为是包含k x 2维属性的中心点,并且通过到中心点的偏移量对每个关键点进行参数化,另外还使用一个热点图预测分支用于对关键点进行提纯。

6 检测结果

以下是用官方的代码和模型跑出来的一些结果。

6.1 2D目标检测

COCO数据集训练的2D目标检测的结果如下:

6.2 3D目标检测

KITTI数据集训练的3D目标检测的结果如下:

6.3 人体姿态估计

COCO数据集训练的人体姿态估计的结果如下:

7 总结

读完Objects as Points这篇文章,我的感觉是文如其名,简单而又优雅。文中提出的目标检测算法CenterNet,模型结构简单,速度快又效果好,而且还方便扩展,确实是非常经典!

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

### Centernet 模型介绍 Centernet 是于 2019 年提出的一种用于目标检测的模型,区别于传统的依赖 anchors 的检测网络,Centernet 属于无锚点(anchor-free)的目标检测框架[^1]。此模型的主要输出形式为 heatmap,即热力图,其中心点代表了所要检测对象的位置。对于每一个预测到的对象中心点,Centernet 同样会给出额外的信息,例如物体大小以及相对于网格单元格中心的偏移量等,这些信息是通过对特征图执行回归操作获得的。 为了提高检测性能并减少计算复杂度,Centernet 使用 DLA (Deep Layer Aggregation) 结构作为骨干网,这在 Hourglass 和 ResNet 之间提供了一种平衡的选择。DLA 不仅能够保持较高的准确性而且相对降低了参数数量和运算需求[^3]。 ### 数据集 Ground Truth 制作方式 当创建训练所需的 ground truth 时,并不会仅仅把真正的中心像素标记为 1 而其余全部设成 0。相反地,采用的是高斯分布来表示每个实例的热度图上的响应值。这意味着即使不是精确的中心位置也会有一定的正值分配给附近的像素点,从而形成一个平滑过渡的效果。这样的处理有助于提升模型学习过程中的鲁棒性和泛化能力。 ### ONNX 推理流程概述 如果打算利用 MindStudio 对已经训练好的 Centernet 模型做 ONNX 形式的推理,则需先完成相应的开发环境搭建工作。尽管具体的硬件配置可能会有所不同,但只要遵循官方文档指导下的软件栈安装指南,大多数情况下都能顺利运行起整个项目[^4]。 ```python import onnxruntime as ort import numpy as np # 加载ONNX模型文件路径 model_path = 'path/to/centernet.onnx' # 创建Session选项, 可选加载优化器和其他设置 sess_options = ort.SessionOptions() # 初始化Inference Session session = ort.InferenceSession(model_path, sess_options) # 准备输入数据(假设图像已经被预处理过) input_data = np.random.rand(1, 3, 512, 512).astype(np.float32) # 获取模型输出名称列表 output_names = [node.name for node in session.get_outputs()] # 执行前向传播推断 outputs = session.run(output_names, {"image": input_data}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值