24 YOLOv8中Bin是固定的,概率才是模型学的——16个Bin如何变成具体偏移值

发布时间:2026/8/1 22:20:35
24 YOLOv8中Bin是固定的,概率才是模型学的——16个Bin如何变成具体偏移值 YOLOv8中Bin是固定的概率才是模型学的——16个Bin如何变成具体偏移值一句话总结16 个 bin 对应的值是写死的常数0, 1, 2, …, 15模型只负责输出每个 bin 的投票比例概率。加权求和把固定选项和可变票数组合起来得到一个可以落在任意两个 bin 之间的连续值从而实现亚像素级精度。目录YOLOv8中Bin是固定的概率才是模型学的——16个Bin如何变成具体偏移值目录一、先分清两个东西bin 和概率二、bin 的值是固定的2.1 固定在哪里2.2 为什么是这个值2.3 所有检测头一样——但网格大小不同三、模型只输出概率3.1 模型输出的是什么3.2 Softmax 把分数变成概率3.3 模型学的就是这些概率四、固定选项 可变票数 加权求和4.1 公式4.2 为什么用加权求和而不是只选最大值4.3 类比五、手算一遍从 16 个概率到偏移值5.1 假设的 Softmax 输出5.2 加权求和5.3 解读六、量化攻击的是概率不是 bin6.1 量化改了什么6.2 概率被压平6.3 加权求和结果偏移6.4 一句话总结七、完整数据流从模型输出到像素坐标各算子输入输出含义八、一句话总结自测一、先分清两个东西bin 和概率这是最容易混淆的地方。在 DFL 的语境里同一个词bin经常被混用但它们是两个完全不同的东西东西谁决定的变不变数学表示bin 对应的值ONNX 图结构Conv(dfl) 权重固定[0, 1, 2, ..., 15]bin 的概率模型推理结果Softmax 输出可变[p₀, p₁, p₂, ..., p₁₅]bin 是选项概率是投票。选项永远不变每张图的投票结果不同。二、bin 的值是固定的2.1 固定在哪里Conv(dfl) 是一个 1×1 卷积层它的权重在 ONNX 导出时就写死了Conv(dfl) 权重 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]这 16 个数字不会变——不随输入变化不随检测头变化不随训练/推理变化。2.2 为什么是这个值在 YOLOv8 中回归分支输出的 64 个值会被拆成 4 条边left/top/right/bottom× 16 个 bin。每条边经过 Softmax 加权求和后得到的是该边到网格中心的距离特征图像素单位bin₀ → 权重 0 → 距离 0.0 特征图像素边界与网格中心重合 bin₁ → 权重 1 → 距离 1.0 特征图像素 bin₂ → 权重 2 → 距离 2.0 特征图像素 ... bin₁₅ → 权重 15 → 距离 15.0 特征图像素每个 bin 间隔1 特征图像素。16 个 bin 覆盖0 ~ 15的固定范围——这个范围是写死的不会变。注意0 ~ 15是 bin 的覆盖范围特征图像素单位不是网格大小。网格大小随检测头不同而变化P38、P416、P532 输入像素详见 2.3。加权求和的结果可以落在任意两个 bin 之间如 0.991所以实际距离可以是连续值并不限于这 16 个整数档位。2.3 所有检测头一样——但网格大小不同P3 (stride 8): Conv(dfl) 权重 [0, 1, 2, ..., 15] 距离范围 0~15 特征像素 → 对应输入图像 0~120 像素×8 P4 (stride 16): Conv(dfl) 权重 [0, 1, 2, ..., 15] 距离范围 0~15 特征像素 → 对应输入图像 0~240 像素×16 P5 (stride 32): Conv(dfl) 权重 [0, 1, 2, ..., 15] 距离范围 0~15 特征像素 → 对应输入图像 0~480 像素×32权重一样bin 编号的含义一样都是 0~15 特征像素但stride 不同——同样的 bin 距离乘上不同的 stride就对应不同的输入图像物理距离。简单说同一个 bin 编号P3 上代表小距离、P5 上代表大距离。三、模型只输出概率3.1 模型输出的是什么模型回归分支输出 64 个值4 条边 × 16 个 bin这些是原始分数logits可以是任意实数。注意这是每个网格各 64 个值比如 P3 特征图 80×80总共 80×80×64 409,600 个值模型原始输出某个网格某条边的 16 个值: [2.0, 5.0, 1.0, 0.5, 0.1, 0.0, 0.0, ..., 0.0] ↑ 16 个原始分数正负无穷都可以3.2 Softmax 把分数变成概率原始分数 → Softmax → 概率加起来 1 [2.0, 5.0, 1.0, 0.5, ...] → [0.046, 0.927, 0.017, 0.010, ...]Softmax 之后16 个值满足每个值在 0~1 之间全部加起来 1这就是投票比例3.3 模型学的就是这些概率训练时模型通过 DFL Loss 学习如何让概率分布集中在真实距离附近。比如真实距离是 2.3模型学会让 bin₂ 和 bin₃ 的概率较高。四、固定选项 可变票数 加权求和4.1 公式距离 Σ(权重ᵢ × 概率ᵢ) 0×p₀ 1×p₁ 2×p₂ ... 15×p₁₅ ↑固定 ↑可变 ↑固定 ↑可变 ↑固定 ↑可变4.2 为什么用加权求和而不是只选最大值只选最大值argmaxbin₁ 概率最高 92.7% → 距离 1 → 精度只有 1 特征图像素加权求和0×0.046 1×0.927 2×0.017 3×0.010 ... 0.991 → 结果 0.991落在 bin₁(1) 和 bin₂(2) 之间 → 精度不受 16 个离散档位的限制可以输出任意连续值4.3 类比选举投票1000 人投票 候选人 A(位置0): 46 票 → 占比 0.046 候选人 B(位置1): 927 票 → 占比 0.927 候选人 C(位置2): 17 票 → 占比 0.017 候选人 D(位置3): 10 票 → 占比 0.010 只选第一名 → 答案 B位置 1 加权平均 → 答案 0×0.046 1×0.927 2×0.017 3×0.010 0.991 → 落在 B(1) 和 C(2) 之间更接近 B → 比只选第一名更精细因为综合了多个候选人的微弱影响五、手算一遍从 16 个概率到偏移值5.1 假设的 Softmax 输出bin₀: 0.046 ( 4.6%) bin₁: 0.927 (92.7%) ← 峰值 bin₂: 0.017 ( 1.7%) bin₃: 0.010 ( 1.0%) bin₄~₁₅: 都接近 05.2 加权求和距离 0×0.046 1×0.927 2×0.017 3×0.010 4×0 ... 15×0 0 0.927 0.034 0.030 0 ... 0.9915.3 解读0.991 在 bin₁(1) 和 bin₂(2) 之间 → 离 bin₁ 更近因为 bin₁ 的概率 92.7% 远大于 bin₂ 的 1.7% → 不是任何一个 bin 的精确值而是插值结果六、量化攻击的是概率不是 bin这是理解量化误差的关键。6.1 量化改了什么量化前: bin 对应值: [0, 1, 2, ..., 15] ← 不变 模型分数: [3.0, 2.8, 0.1, 0.05, 0.02, 0.01, ...] 量化后: bin 对应值: [0, 1, 2, ..., 15] ← 还是不变 模型分数: [3.0, 2.811, 0.0945, 0.0472, 0.0236, 0.0, ...] ← 变了6.2 概率被压平量化前的 Softmax 输出: bin₀: 39.6% bin₁: 32.4% bin₂: 2.2% bin₃: 2.1% ... 此处仅展示部分 bin 的变化趋势完整分布加起来 100% 量化后的 Softmax 输出: bin₀: 39.5% bin₁: 32.7% bin₂: 2.2% bin₃: 2.1% ... 此处仅展示部分 bin 的变化趋势完整分布加起来 100% ↓被压低 ↑被抬高6.3 加权求和结果偏移量化前: 距离 0×0.396 1×0.324 2×0.022 ... 精确值 量化后: 距离 0×0.395 1×0.327 2×0.022 ... 偏移了 差异来自 bin₁ 的概率从 0.324 变成了 0.3276.4 一句话总结量化不碰 bin 的对应值权重它碰的是进入 Softmax 之前的原始分数。分数变了 → Softmax 输出的概率就变了 → 同样的固定权重乘以不同的概率 → 加权求和结果偏移。七、完整数据流从模型输出到像素坐标┌─────────────────────────────────────────────────────────────┐ │ 模型回归分支输出每个网格 64 个值 4 条边 × 16 bin │ │ left 边原始分数: [3.0, 2.8, 0.1, 0.05, 0.02, 0.01, 0, ..., 0]│ │ ↓ │ │ Softmax → 16 个分数变成 16 个概率加起来 1 │ │ [0.046, 0.927, 0.017, 0.010, 0.000, 0.000, 0.000, ...] │ │ ↓ │ │ Conv(dfl) → 固定权重 [0,1,2,...,15] × 概率 加权求和 │ │ l 0×0.046 1×0.927 2×0.017 3×0.010 ... 0.991 │ │ l左边界到网格中心的距离特征图像素 │ │ ↓ │ │ 坐标解码假设网格 x 0stride 8: │ │ x1 (grid_x 0.5 - l) × stride (0 0.5 - 0.991) × 8 │ │ x2 (grid_x 0.5 r) × stride │ │ y1 (grid_y 0.5 - t) × stride │ │ y2 (grid_y 0.5 b) × stride │ │ ↑ 注意是乘 stride不是除 stride4 条边同理 │ │ ↓ │ │ 输出x1 就是输入图像上的像素坐标 │ │ 负值表示左边界在图像外属于正常情况 │ │ 如需归一化坐标可再 ÷ 640 │ └─────────────────────────────────────────────────────────────┘各算子输入输出含义算子输入输出固定/可变Softmax16 个原始分数16 个概率都是可变的Conv(dfl)16 个概率 固定权重1 个边距l/t/r/b特征像素权重固定概率可变坐标解码Mul/Add边距 网格中心 stride输入图像像素坐标网格坐标/stride 固定八、一句话总结Conv(dfl) 的权重 [0, 1, 2, …, 15] 是写死的永远不会变。模型只输出 16 个概率。加权求和 固定选项 × 可变票数结果是连续值精度不受 16 个离散 bin 档位的限制。INT8 量化攻击的是概率路径不是 bin 本身。自测Q1bin 对应的值和 bin 的概率哪个是固定的哪个是模型学的点击查看答案bin 对应的值Conv(dfl) 权重 [0, 1, …, 15]是固定的在 ONNX 导出时写死。bin 的概率是模型推理输出的每张图都不一样。Q2为什么加权求和的结果可以不是整数点击查看答案因为不是只选一个 binargmax而是所有 bin 的概率加权平均。多个 bin 的投票会拉出一个中间值比如 0.991 落在 bin₁(1) 和 bin₂(2) 之间。Q3INT8 量化攻击的是 bin 还是概率点击查看答案攻击的是概率。量化改动了 Softmax 的输入分数分数变了 → 概率变了 → 加权求和结果偏移。Conv(dfl) 的权重是固定的不会被量化改变。Q4所有检测头P3/P4/P5的 Conv(dfl) 权重一样吗点击查看答案一样都是 [0, 1, 2, …, 15]。区别在于解码时的 stride 不同8/16/32所以相同的 bin 编号乘上不同的 stride 后对应不同的输入图像物理距离。