图解目标检测算法之CenterNet

news2026/4/10 5:56:55
欢迎来到图解深度学习的世界博客主页卿云阁欢迎关注点赞收藏⭐️留言首发时间2026年3月20日✉️希望可以和大家一起完成进阶之路作者水平很有限如果发现错误请留言轰炸哦万分感谢目录前言网络结构数据的介绍特征和标签分别是什么网络预测hm 预测wh 预测offset 预测推理Decode损失函数的计算前言传统的 Anchor-based基于先验框YOLO 系列或者 Faster R-CNN它们找小猫的方式非常“暴力”。 算法会预先准备好成千上万个大大小小、长长短短的先验框 。 为了只保留最准的那一个框算法在最后必须进行非极大值抑制把重叠的废框全删掉。所以大家觉得这根本算不上端到端End-to-End。真正的 Anchor-free无先验框算法根本不需要提前准备任何“空相框”。输入一张小猫照片算法直找准中心点报出长宽直接生成最终的检测框。这是我们要介绍的算法CenterNet。它的核心理念就是它的英文原名Objects as Points —— 万物皆可看作一个点。为什么不用 Faster R-CNN 或 YOLO非要选 CenterNet大家可以对比一下两种方案的匹配难度用传统先验框如 Faster R-CNN图像上全是密密麻麻、相互重叠的候选框。一根雷达柱子投射过来会同时穿透几十个框雷达特征到底该给谁匹配逻辑简直是一场灾难。用CenterNetAnchor-free它颠覆了传统直接把目标提取为一个极其干净的 2D 中心点 。雷达数据是 3D 空间里的“点柱子”视觉网络输出的是 2D 图像上的“点”。两者一拍即合极其优雅地完成了“点对点匹配” 网络结构这种 Backbone - Decoder - Head 的三段式架构我个人觉得更像是Encoder-Decoder编码器-解码器结构Backbone (骨干网络)为了特征提取通过多次卷积和下采样通常缩小 32倍网络整合了全局信息获得了极强的语义信息Semantic Information严重丢失了空间分辨率Spatial Resolution。Decoder (解码器)恢复空间分辨率。Head (预测头)输出最终的预测结果。为什么要分成三个并行的分支这在学术界被称为Decoupled Head解耦头。因为它们对特征的需求是完全矛盾的Heatmap找中心点属于分类任务它需要平移不变性Translation Invariance。一只狗在画面左边还是右边它都得认出那是狗的中心。Size Offset算宽高和偏移属于回归任务它们需要极强的平移等变性Translation Variance。物体变大变小、稍微移动一点预测的数值必须立刻产生精准的相应变化。假设我们输入一张 3*512* 512的图片Batch size 设为 1Backbone (骨干网络特征提取)原始大小[1, 3, 512, 512]的特征图 使用 ResNet50网络经过 5 个 Stage 的疯狂下采样每次尺寸减半。得到[1, 2048, 16, 16] 大小的输出此时的特征图长宽缩小了 32 倍512/32 16。这里的空间细节已经非常模糊了但 2048 个通道里装满了极其丰富的高级语义信息它已经能认出那是狗的毛发和轮廓。Decoder (解码器细节复原)因为 16 *16 实在太小了没法做精准的位置预测所以必须把它放大。输入[1, 2048, 16, 16]过程连续 3 次反卷积Deconv 4x4 BN ReLU每次尺寸放大 2 倍通道数递减。第一次反卷积[1, 256, 32, 32]第二次反卷积[1, 128, 64, 64]第三次反卷积[1, 64, 128, 128]输出[1, 64, 128, 128] 这就是您提到的最关键的 1/4 尺寸此时通道数被浓缩到了 64空间分辨率恢复到了 128* 128。Head (预测头分工合作)接收到 [1, 64, 128, 128] 的特征图后进入三个组件HeatMap、WidthHeight以及Offset。三个组件都需要经过64维的Conv BN ReLU然后分别用对应的卷积层输出。因为卷积核都是 1x1 且stride 为 1所以尺寸永远保持在输入的 1/4128x128。HeatMap输出 [1, num_classes, 128, 128]Sigmoid 激活。WidthHeight输出 [1, 2, 128, 128]线性输出。Offset输出 [1, 2, 128, 128]线性输出。HeatMap的最后一个卷积层通道维度为分类数量卷积核大小为1x1最后需要用sigmoid激活函数处理一下。其输出的形式和解码类似于语义分割。在物体的中心它的响应很强接近于1在背景部分为0。我们解码的时候在通道维度上进行Argmax即可得到最终的分类index。WidthHeight对应的是检测框宽高因为宽高信息为2个所以其最后一层卷积通道输出维度为2卷积核大小为1x1。Offset由于HeatMap的到的响应是基于物体中心的而且相当于输入来说是下采样四倍的从HeatMap中的到的物体中心是有一点误差的。所以需要用Offset的结果对物体中心点进行修正如下图所示其最后一层的卷积通道维度为2卷积核大小为1x1。数据的介绍特征和标签分别是什么假设我们现在有一张512x512的图片里面只有一只狗类别 ID 是16。这只狗在原图上的真实标注框Bounding Box是左上角(x_1100, y_1120)右下角(x_2220, y_2300)。坐标缩水除以 Stride我们要把原图上 512 * 512 尺寸的框搬到 128* 128的图上。所有的坐标统统除以 4新 x_1 100 / 4 25新 y_1 120 / 4 30新 x_2 220 / 4 55新 y_2 300 / 4 75这只狗在特征图上的框变成了 [25, 30, 55, 75]。计算物体的宽、高和中心点现在用缩小后的新坐标来算宽 (w): 55 - 25 30高 (h): 75 - 30 45接下来算极其关键的中心点精确中心点 ct 和 网格中心点 ct_int精确的 X 中心: (25 55) / 2 40.0精确的 Y 中心: (30 75) / 2 52.5所以 ct [40.0, 52.5]。因为特征图上的坐标只能是整数它是一个个网格我们强行丢掉小数所以网格中心点ct_int [40, 52]。标签hm (热力图)找到第 16 层因为狗的类别是 16。找到第 52 行第 40 列。把 hm[52, 40, 16] 这个位置的值改成 1.0。代码会根据宽 30 高 45 算出一个高斯半径假设算出来是 3。然后在这个 1.0 的周围画圈旁边一圈的格子填 0.8再往外一圈填 0.5……形成一个发热的“光晕”。wh (宽高图)找到第 52 行第 40 列。把第 0 层宽的值改为 30wh[52, 40, 0] 30把第 1 层高的值改为 45wh[52, 40, 1] 45offset (偏移量图)X 的误差: 40.0 - 40 0.0Y 的误差: 52.5 - 52 0.5找到第 52 行第 40 列。把第 0 层X偏移的值改为 0.0offset[52, 40, 0] 0.0把第 1 层Y偏移的值改为 0.5offset[52, 40, 1] 0.5网络预测hm 预测标准答案里(52, 40) 是完美的 1.0周围是平滑的高斯衰减其他地方全是绝对的 0。但网络的预测经过 Sigmoid 激活后是一堆 0 到 1 之间的小数看起来像一团朦胧的云找狗的通道第 16 层 hm[:, :, 16]在靶心 (52, 40)网络很自信但不绝对。它可能输出 0.92。在靶心旁边 (52, 41)网络有点犹豫输出 0.85。在靶心上面 (51, 40)网络输出 0.88。在纯背景 (10, 10)网络扫了一眼觉得没东西但不会输出绝对的 0可能是 0.001 或 0.01 这样的暗淡噪点。找猫的通道第 17 层 hm[:, :, 17]在 (52, 40) 狗的位置网络看这毛茸茸的有点像猫可能会输出一个小小的干扰值比如 0.15。其他地方基本是很小的数值比如 0.005。wh 预测在有狗的位置 (52, 40)因为训练时这里有 Mask1 的“鞭策”网络在这里学得很认真。它预测的宽可能是 28.5真实是 30。它预测的高可能是 46.2真实是 45。虽然不完美但已经非常接近真相了在纯背景的位置 (10, 10)极其疯狂因为训练时这里的 Mask0网络在这里不管猜什么都不会被扣分。所以它在这里彻底“放飞自我”了它预测的宽可能是 -15.3。它预测的高可能是 204.8。整个矩阵里除了狗所在的那一小块区域有正常的数值其余 16000 多个格子里全都是毫无逻辑、随机狂飙的垃圾数字Garbage Values。offset 预测和 wh 的情况一模一样只在中心点附近有意义。在有狗的位置 (52, 40)真实答案需要往右偏移 0.0往下偏移 0.5即 [0.0, 0.5]。网络努力预测出的结果可能是X 偏移 0.05Y 偏移 0.42。尽力了有一点点小误差。在纯背景的位置 (10, 10)同样因为 Mask0 放任自流这里全是乱码比如预测出 X 偏移 -0.8Y 偏移 1.推理Decode3x3 最大池化hm 矩阵第 16 层狗。靶心 (52, 40) 概率是 0.92旁边 (52, 41) 是 0.85上面 (51,40) 是 0.88。您拿出一个 3x3 的“扫描框”Max Pooling盖在上面盖在 (52, 40) 上框里最大值是 0.92。原值 0.92 框内最大值 0.92。判定真正的山峰保留。盖在 (52, 41) 上框里也包含了那个 0.92所以框内最大值是 0.92。原值 0.85 ! 框内最大值0.92。强行变成 0。Top-K 排序把被清洗过的hm 矩阵80 层128x128 个点全部摊平按照概率大小从高到低排个名次只取前 100 名。因为我们这张图里只有一只狗这只狗以 0.92 的超高分毫无悬念地拿下了全场第1 名至于那些背景里 0.01 的小噪点它们连前 100 的门槛都摸不到直接被淘汰出局。即使有进了前 100 的后续也会被一个及格线比如 阈值 0.3无情刷掉。反推类别和坐标您拿着第 1 名的索引号去反查瞬间得到三个关键信息16 层 类别狗。行号52 Y 坐标52。列号40 X 坐标40。至此您彻底锁定了目标在特征图上的网格位置(52, 40)。 矩阵里其余 16383 个位置您看都不用再看一眼了精准提货读取 wh 和 offset这是最爽的一步。您带着 (52, 40) 这个坐标像 VIP 客户一样直奔另外两个矩阵的对应“专柜”提货去 wh 矩阵的 (52, 40) 专柜提取出网络预测的宽和高w 28.5h 46.2。(旁边 (10, 10) 那个乱飞的背景宽度 -15.3因为没人去取直接烂在了内存里)去 offset 矩阵的 (52, 40) 专柜提取出网络预测的微调小数 x 0.05y 0.42。组装原图边界框原材料全齐了现在我们把它们组装成最终的 [x_min, y_min, x_max, y_max]并放大回 512x512的原图。算准亚像素中心点特征图尺度精确 X 40 (网格) 0.05 (偏移) 40.05精确 Y 52 (网格) 0.42 (偏移) 52.42向四周扩展算出四个角特征图尺度左边界 x_min 40.05 - (28.5 / 2) 40.05 - 14.25 25.8上边界 y_min 52.42 - (46.2 / 2) 52.42 - 23.1 29.32右边界 x_max 40.05 14.25 54.3下边界 y_max 52.42 23.1 75.52终极复原放大回原图因为特征图比原图小 4 倍所以把这四个数字全部 乘以 4最终 X1 25.8 * 4 103.2 真实答案是 100非常接近最终 Y1 29.32 * 4 117.28 真实答案是 120极其精准最终 X2 54.3 * 4 217.2 真实答案是 220贴合得很好最终 Y2 75.52 * 4 302.08 真实答案是 300完美包裹您成功地把一堆带有噪点的矩阵变成了一个无比精准的原图预测框 [103.2, 117.28, 217.2,302.08]而且完全知道它是一只狗。这就是 CenterNet Decode 过程从头到尾的魔法损失函数的计算真实的狗中心点在 (40, 52)宽 30高 45X偏移 0.0Y偏移 0.5。照片里只有这 1 只狗所以目标总数 N 1。为了演示我们假设网络此时给出了以下预测值靶心位置 (40, 52)预测概率 0.9很自信预测宽 28高 46预测X偏移 0.1Y偏移 0.4。靶心旁边 (41, 52)真实高斯衰减值是 0.8网络预测概率是 0.85有点高。纯背景 (10, 10)真实值是 0.0网络预测概率是 0.1预测宽高是 100 和 -50瞎猜的垃圾数据。Heatmap 损失中心(40, 52)这里 Y 1.0网络预测 hat{Y} 0.9。套用上面第一行公式误差 -(1 - 0.9)^2 *ln(0.9) -(0.1)^2 *(-0.105) -0.01 * -0.105 0.00105老师点评惩罚极小网络猜 0.9 已经很棒了几乎不扣分。纯背景点(10, 10)这里 Y 0.0网络预测 hat{Y} 0.1。套用下面第二行公式误差 -(1 - 0)^4* (0.1)^2*ln(1 - 0.1) -1 * 0.01*(-0.105) 0.00105老师点评惩罚也很小。因为背景本来就该是 0网络猜 0.1只偏了一点点。中心点附近高斯光晕”(41, 52)真实高斯值 Y 0.8网络预测 hat{Y} 0.85。套用下面第二行公式误差 -(1 - 0.8)^4 * (0.85)^2 * ln(1 - 0.85) -(0.2)^4 * (0.7225) *ln(0.15) -0.0016 * 0.7225*(-1.897) 0.0022高斯光晕内部Loss 函数给了它一个超级免死金牌权重极小对它“网开一面”容忍了它在中心点附近的轻微发散。尺寸与偏移损失算宽度真实 30预测 28。误差 |28 - 30| 2.0算高度真实 45预测 46。误差 |46 - 45| 1.0算X偏移真实 0.0预测 0.1。误差 |0.1 - 0.0| 0.1算Y偏移真实 0.5预测 0.4。误差 |0.4 - 0.5| 0.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2501901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…