东营seo网站排名,成都房地产信息网官网,wordpress learnpress,800元网站建设✅ YOLOv3 正负样本划分详解
一、前言
在目标检测任务中#xff0c;正负样本的划分 是训练过程中的关键环节。它决定了哪些预测框参与位置回归、分类损失和置信度损失。
YOLOv3 在 YOLOv2 的基础上引入了 多尺度预测 和 更精细的 Anchor Boxes 匹配策略#xff0c;使得正样…✅ YOLOv3 正负样本划分详解
一、前言
在目标检测任务中正负样本的划分 是训练过程中的关键环节。它决定了哪些预测框参与位置回归、分类损失和置信度损失。
YOLOv3 在 YOLOv2 的基础上引入了 多尺度预测 和 更精细的 Anchor Boxes 匹配策略使得正样本的选择更加合理提高了模型的召回率和定位精度。
本文将基于以下来源进行解析
YOLOv3: An Incremental Improvement (论文原文)AlexeyAB/darknet 开源实现 二、YOLOv3 的输出结构回顾
YOLOv3 输出三个不同层级的特征图分别用于检测不同尺度的目标
特征图大小每个 cell 预测的 bounding box 数量对应 anchor boxes13×133大目标26×263中目标52×523小目标
每个 bounding box 的输出维度为
(tx, ty, tw, th, confidence, class_0, ..., class_C)三、YOLOv3 的正负样本划分机制详解
✅ 核心思想
YOLOv3 中的正样本由以下两个条件共同决定
该 bounding box 的 anchor 与 ground truth 的 IoU 最大该 bounding box 所属的 grid cell 包含物体中心点 注意YOLOv3 不像 Faster R-CNN 使用 RoI Pooling 或 Proposal 机制而是直接对每个 grid cell 的多个 anchor 进行匹配。 正样本划分流程如下来自 Darknet 实现
Step 1: 获取所有 ground truth 框
ground_truth_boxes [...] # list of (x_center, y_center, w, h) 归一化坐标Step 2: 遍历每个 ground truth 框
对于每个真实框
计算其相对于图像的归一化中心坐标确定其落在哪个 grid cell使用 K-Means 聚类得到的 9 个 anchors计算每个 anchor 与该真实框的 IoU找出 IoU 最大的那个 anchor确定这个 anchor 属于哪个层级13×13 / 26×26 / 52×52将该 anchor 所在的 bounding box 设为正样本其余 anchor 若与该真实框的 IoU iou_thresh如 0.5也设为正样本可选 ✅ 正样本选择规则总结
条件是否为正样本anchor 与 GT 的 IoU 最大✅ 强制标记为正样本anchor 与 GT 的 IoU iou_threshold如 0.5✅ 可选标记为正样本无任何 GT 与其重叠❌ 负样本仅部分重叠但不是最大匹配❌ 忽略不参与位置损失 ⚠️ 注意只有负责预测真实框的 bounding box 才会参与位置回归tx, ty, tw, th和类别概率class probs的损失计算。 四、YOLOv3 中各类 loss 的作用对象
Loss 类型作用对象定位损失Localization Loss正样本负责预测的真实框置信度损失Confidence Loss正样本 负样本分类损失Class Probability Loss正样本 五、具体示例说明
假设我们有以下数据
图像尺寸416 × 416Ground Truth Box[0.5, 0.5, 0.2, 0.2]归一化坐标Anchor Boxes对应 52×52 特征图anchors [[10, 13], [16, 30], [33, 23]] # 小目标 anchorsStep-by-step 划分逻辑 确定 GT 中心落在哪个 grid cell cell_x floor(0.5 * 52) 26cell_y floor(0.5 * 52) 26 计算每个 anchor 与 GT 的 IoU ious [iou(anchor, gt_box) for anchor in anchors]
best_anchor_idx np.argmax(ious)标记该 anchor 对应的 bounding box 为正样本 假设 best_anchor_idx 0则第 0 个 bounding box 被标记为正样本该 bounding box 的位置信息 (tx, ty, tw, th) 将被监督学习confidence 设为 1class prob 设置为目标类别 其他 anchor 若与 GT 的 IoU threshold如 0.5也可被标记为正样本可选 六、YOLOv3 中的负样本定义
✅ 负样本的判断标准
该 bounding box 不负责预测任何真实框且与所有真实框的 IoU threshold通常为 0.5只参与置信度损失confidence loss不参与位置和分类损失 七、YOLOv3 中的 ignore 样本非正非负
✅ 定义
与某个真实框的 IoU threshold如 0.5但不是最大 IoU 的那个 bounding box被标记为“ignore”即 不参与位置损失不参与分类损失参与置信度损失吗取决于实现方式Darknet 中默认不参与 八、YOLOv3 中的标签分配伪代码简化版
for each ground_truth in image:# Step 1: 确定 GT 中心所在的 grid cellcell_x int(gt.x_center * feature_map_width)cell_y int(gt.y_center * feature_map_height)# Step 2: 计算每个 anchor 与 GT 的 IoUious_with_anchors [bbox_iou(anchor, gt) for anchor in anchors]# Step 3: 找到 IoU 最大的 anchorbest_anchor_index np.argmax(ious_with_anchors)# Step 4: 标记该 anchor 为正样本y_true[cell_y, cell_x, best_anchor_index, ...] {tx: tx,ty: ty,tw: tw,th: th,confidence: 1,class_prob: one_hot_label}# Step 5: 可选IoU threshold 的其他 anchor 也被标记为正样本for a in range(num_anchors):if ious_with_anchors[a] ignore_thresh and a ! best_anchor_index:y_true[cell_y, cell_x, a, ...] {confidence: 1, # 仅置信度不更新位置和类别...}九、YOLOv3 中的阈值设置来自 darknet 源码
在官方实现中有两个关键参数影响正负样本划分
参数名含义默认值ignore_thresh若 IoU 该阈值则忽略不参与损失0.5truth_thresh若 IoU 该阈值则强制作为正样本1.0默认只使用最大 IoU 的 anchor 注意YOLOv3 默认只使用 IoU 最大的 anchor 作为正样本其他高 IoU 的 anchor 并不参与训练。 十、YOLOv3 中的正负样本分布特点
维度内容✅ 正样本数量每个真实框 → 至少一个正样本❌ 负样本数量无物体的 bounding box ignore 样本IoU ignore_thresh 但非最大匹配 位置损失仅正样本参与 置信度损失正样本 负样本 分类损失仅正样本参与 十一、YOLOv3 中的损失函数简要回顾
YOLOv3 的损失函数分为三个部分
⚙️ 1. 定位损失Localization Loss L l o c λ c o o r d ∑ i 0 S 2 ∑ j 0 B 1 i j o b j [ ( x i − x ^ i ) 2 ( y i − y ^ i ) 2 ( w i − w ^ i ) 2 ( h i − h ^ i ) 2 ] \mathcal{L}_{loc} \lambda_{coord} \sum_{i0}^{S^2} \sum_{j0}^{B} \mathbb{1}_{ij}^{obj} \left[ (x_i - \hat{x}_i)^2 (y_i - \hat{y}_i)^2 (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] Llocλcoordi0∑S2j0∑B1ijobj[(xi−x^i)2(yi−y^i)2(wi −w^i )2(hi −h^i )2] 仅对正样本计算此部分损失。 ⚙️ 2. 置信度损失Confidence Loss L c o n f ∑ i 0 S 2 ∑ j 0 B [ 1 i j o b j ⋅ ( confidence i j − confidence ^ i j ) 2 λ n o o b j ⋅ ( 1 − 1 i j o b j ) ⋅ ( confidence i j ) 2 ] \mathcal{L}_{conf} \sum_{i0}^{S^2} \sum_{j0}^{B} \left[ \mathbb{1}_{ij}^{obj} \cdot (\text{confidence}_i^j - \hat{\text{confidence}}_i^j)^2 \lambda_{noobj} \cdot (1 - \mathbb{1}_{ij}^{obj}) \cdot (\text{confidence}_i^j)^2 \right] Lconfi0∑S2j0∑B[1ijobj⋅(confidenceij−confidence^ij)2λnoobj⋅(1−1ijobj)⋅(confidenceij)2] 所有 bounding box 都参与此项损失但负样本权重较低。 ⚙️ 3. 分类损失Class Probability Loss L c l s ∑ i 0 S 2 ∑ j 0 B 1 i j o b j ⋅ ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 \mathcal{L}_{cls} \sum_{i0}^{S^2} \sum_{j0}^{B} \mathbb{1}_{ij}^{obj} \cdot \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 Lclsi0∑S2j0∑B1ijobj⋅c∈classes∑(pi(c)−p^i(c))2 仅正样本参与分类损失。 十二、YOLOv3 的样本划分总结
样本类型IoU 条件是否参与位置损失是否参与置信度损失是否参与分类损失正样本IoU 最大 或 IoU threshold可选✅ 是✅ 是✅ 是ignore 样本IoU threshold 但非最大❌ 否❌ 否Darknet 默认不参与❌ 否负样本IoU threshold❌ 否✅ 是降低 confidence❌ 否 十三、结语
YOLOv3 的正负样本划分机制相比 YOLOv2 更加精细主要体现在
引入多尺度预测提升小目标召回使用 anchor boxes 提升边界框匹配合理性通过 IoU 匹配选择最合适的 bounding box保留传统做法仅最大 IoU 为正样本避免过拟合支持 ignore 阈值防止低 IoU 框干扰训练 欢迎点赞 收藏 关注我我会持续更新更多关于目标检测、YOLO系列、深度学习等内容