ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO的anchor base的过程理解

YOLO的anchor base的过程理解 YOLO 的核心思想既然目标检测是要框出物体那我干脆先在图上放一堆大小、比例各异的“空框”然后让神经网络去判断哪个空框里有东西如果有这个空框需要放大还是缩小多少才能完美贴合那个东西YOLO 中 Anchor 机制运作的具体四大步骤1. anchor诞生K-Means 聚类在早期的目标检测如 Faster R-CNN中Anchor 的大小和长宽比是工程师凭直觉手写的比如 1:1, 1:2, 2:1。但从 YOLOv2 开始作者加入了一个非常聪明的步骤让数据自己说话。在训练模型之前YOLO 会扫描你整个训练集里所有的真实标签框Ground Truth。它使用 K-Means 聚类算法把这些框按照宽高的比例进行分类。如果你的数据集是测车牌的聚类出来的 Anchor 就会全是“扁平”的长方形如果是测行人的出来的就会全是“瘦高”的矩形。通常YOLO 会在不同的特征图层大尺度、中尺度、小尺度上各分配 3 种大小的 Anchor总共 9 个量身定制的基准框。2. 全图网格铺设提取完图片特征后YOLO 会把输入图像划分成S×SS \times SS×S的网格比如13×1313 \times 1313×13,26×2626 \times 2626×26,52×5252 \times 5252×52。规则 每一个网格单元Grid Cell都会默认生成刚才聚类出来的 3 个 Anchor。分工 如果一个物体的中心点落在了某个网格里那么这个网格以及它身上的这 3 个 Anchor就全权负责预测这个物体。YOLO 的第一步就是像切豆腐一样把原图切成S×SS \times SS×S的网格比如经典的7×77 \times 77×7或13×1313 \times 1313×13。3. 训练核心规则哪个网格包含中心点哪个网格负责从上面的图中可以看到那只狗的“中心点”落在了左下方的某一个特定网格内。此时YOLO 的规矩是全图其他所有的网格都不用管这只狗只有包含了狗中心点的这个网格才对检测这只狗负全责。匹配“正样本” (IoU 竞争)在训练算 Loss 时YOLO 分配责任的方式与 DETR 的“匈牙利匹配”完全不同YOLO 靠的是重合度竞争 (IoU)图片里有一只真实的狗中心点落在了坐标为 (5, 5) 的网格里。该网格带有 3 个大小不同的 Anchor。系统分别计算这 3 个 Anchor 与真实的狗的边框交并比IoU。赢家通吃 IoU 最大的那个 Anchor比如一个胖胖的 Anchor 最贴近狗的形状被选为正样本。网络会拼命训练这个 Anchor 对应的通道让它输出框的分类和微调坐标更准。剩下的两个 Anchor虽然也在这个网格里但被标记为忽略或负样本当作背景惩罚。负责预测狗的那个网格本身带有几个预设好的 Anchor比如一个高瘦的一个矮胖的。在图中黑框 当前负责预测的网格Grid Celliii。蓝框 (B bounding box candidates)就是这个网格里预设好的那几个 Anchor 模具。红框 (Truth bounding box) 真实数据集中狗的实际位置。系统会计算每一个蓝框Anchor和红框真实框的交并比IoU。那个形状最贴近红框、IoU 最高的蓝框就会被选拔出来作为“负责人Responsible Predictor”。其他落选的蓝框直接被标记为背景不参与这只狗的坐标微调。4. 预测基于 Anchor 的“微调” (回归公式)这是 Anchor 机制的数学核心。神经网络直接预测宽高的绝对绝对坐标是极难收敛的因为屏幕像素从 0 到 1920 跨度太大。有了 Anchor 作为基准网络只需要预测偏移量Offset。假设某个 Anchor 的预设宽是pwp_wpw​高是php_hph​。网络只需输出 4 个微调参数tx,ty,tw,tht_x, t_y, t_w, t_htx​,ty​,tw​,th​。最终在图上画出来的预测框边界(bx,by,bw,bh)(b_x, b_y, b_w, b_h)(bx​,by​,bw​,bh​)计算如下bxσ(tx)cxb_x \sigma(t_x) c_xbx​σ(tx​)cx​byσ(ty)cyb_y \sigma(t_y) c_yby​σ(ty​)cy​bwpw⋅etwb_w p_w \cdot e^{t_w}bw​pw​⋅etw​bhph⋅ethb_h p_h \cdot e^{t_h}bh​ph​⋅eth​σ(tx)\sigma(t_x)σ(tx​)和σ(ty)\sigma(t_y)σ(ty​)用 Sigmoid 函数把网络预测的中心点偏移量限制在0∼10 \sim 10∼1之间确保这个预测框的中心点绝对不会跑出当前网格 (cx,cyc_x, c_ycx​,cy​) 的范围。etwe^{t_w}etw​和ethe^{t_h}eth​用指数函数对 Anchor 的预设宽高(pw,ph)(p_w, p_h)(pw​,ph​)进行缩放。预测出tw0t_w 0tw​0时正好等于预设宽度tw0t_w 0tw​0则放大tw0t_w 0tw​0则缩小。被选中的 Anchor 尺寸可能和真实的红框差不多但肯定不完美。接下来神经网络要输出微调参数tx,ty,tw,tht_x, t_y, t_w, t_htx​,ty​,tw​,th​把这个 Anchor 完美地贴合到真实目标上。这张图完美展示了前面提到的数学公式是如何在图上生效的网格坐标(cx,cy)(c_x, c_y)(cx​,cy​) 虚线网格的左上角坐标。这是基准原点。预设 Anchor 的宽高(pw,ph)(p_w, p_h)(pw​,ph​) 图中的虚线框。这是我们通过 K-Means 聚类得出的初始模具大小。网络预测的中心点偏移(σ(tx),σ(ty))(\sigma(t_x), \sigma(t_y))(σ(tx​),σ(ty​))注意中心点那个紫色的圆点。网络输出的tx,tyt_x, t_ytx​,ty​经过 Sigmoid (σ\sigmaσ) 函数后值被死死卡在0∼10 \sim 10∼1之间。这意味着无论网络怎么瞎猜预测框的中心绝对飞不出这个网格图中中心点距离网格左上角偏移了大概0.50.50.5和0.70.70.7。网络预测的宽高缩放(etw,eth)(e^{t_w}, e^{t_h})(etw​,eth​)紫色的实线框bw,bhb_w, b_hbw​,bh​就是最终预测出来的框。它是通过将预设虚线框的宽高(pw,ph)(p_w, p_h)(pw​,ph​)乘以一个指数缩放因子得到的。通过这套巧妙的几何变换YOLO 把一个极难预测的全局绝对像素坐标变成了一个只需在网格内微调、在 Anchor 基础上缩放的简单回归任务。时代变迁Anchor 的落幕 (Anchor-Free 时代)既然你之前在问 Ultralytics 框架YOLOv8, YOLOv10 等这里必须补充一个极其重要的技术迭代虽然 Anchor 极大地降低了神经网络预测坐标的难度但它有一个致命缺陷计算量大且强依赖超参数调优聚类尺寸一旦没搞好模型直接崩盘。因此从 YOLOv8 开始官方已经彻底抛弃了 Anchor 机制全面转向了 Anchor-Free无锚框架构。现在的 YOLO 不再预设模板而是直接学习将中心点映射到物体上、下、左、右四条边的绝对距离Task-Aligned Assigner 策略。这种思想其实在某种程度上也是受到了 DETR 等新一代架构“去掉人工先验规则”的启发。
返回列表