对于一般的目标检测 loss 计算,通常分为几部分。比如 yolo 系列分为 objectness(是否包含目标)、classification(目标分类)、boundingbox-regression(目标位置)。其中,每个样本都需要计算 objectness 得分的损失,正样本需要计算 classification 和 bbox-regression 损失,其中每种损失又有不同的计算方式和组合方法,比如 bbox-regression 有 D_IoU、G_IoU、C_IoU 等等,组合方法有 Focal Loss 等等。但是这些不是我们这篇文章关注的重点。
对于目标检测我们要搞明白一个核心问题:如何生成参与 loss 计算的样本?anchor 和 ground-truth 的纠缠不休就是在这个问题上,各种框混杂一起。要搞明白这个问题,我们把带 anchor 的目标检测中出现各种框的核心概念一一剥开。
一般来说,带 anchor 的目标检测包含以下几种框:
写的越多越杂乱,所以不写太多计算,只要记住这些核心概念,下面来说明每种框之间的关联:
总结以上核心:正负样本通常由 gt 和先验框 anchor 匹配生成,参与计算的是 anchor 的和 gt(只有尺寸,没有类别),而计算 loss 则是其对应的 predict 和 gt(包含类别信息) 。这句话就点明了 3 种框的关系,可以看出 anchor 是桥梁,非常重要。
有了以上概念,我们来实际操作解读以下经典的目标检测中一些具体实际操作。
我的老朋友,最爱。faster-rcnn 属于 two-stage,anchor 主要是在第一层 RPN 中用到。我们知道 RPN 用于生成 RoI。我们把 RPN 网络输出的就是 predicts,那么如何计算 Loss 呢?
依据上述步骤,首先就是 anchor 和 gt 的匹配。在 faster-rcnn 中分为:
上述规则将 anchor 标记分类(anchor_target_layer 实现),正样本都有对应的 gt 用于计算 bbox-regression 损失,同时正负样本本身又可以用于计算 objectness loss,直接将每个 anchor 对应的 predict 带入计算即可。没有用到的 anchor(标记为 -1),计算 loss 的时候被忽略。另外,RPN 没有 classification 损失。
one-stage 最爱。废话少说,yolo v2 步骤如下:
区分了正负样本之后就可以用于计算 loss 了,类似 faster-rcnn。
上述原理在代码中实现是倒过来的,同时在开始时还有计算 predict 和 anchor 的位置偏移,这个能够加快 predict 的形状向 anchor 的形状收敛。因为 yolo 中的 anchor 是聚合而来,本身就比较合理。仔细看下面的 loss 计算公式:
1. 第一项是预测框与 gt 的坐标误差(coord);
1. 第二项是是 objectness 置信度误差(obj);
1. 第三项是分类误差。
上述公式弄明白了,也就基本理解了各种框的用途和意义了。v3 和 v2 一样是基于 max iou 的匹配规则,只不过有多个检测分支,其规定一个 gt 不可能出现在多个检测分支上,也就是每个 gt 取三个检测分支上 anchor 匹配最大的那个。
yolo v5 相对 v2/v3 变动很大,主要是匹配规则变了,首先明确一点,v5 和 v3 一样,同样有 3 个检测分支,但是v5 中的匹配是逐层进行的,每一层互不影响,也就是说一个 gt 可以与多个检测层的 anchor 匹配。具体规则如下(以下规则是逐层进行的):
1. 一个 cell 相邻的有上下左右 4 个cell,根据中心点在当前 cell 中的偏移来找出和中心点比较近的两个相邻 cell。
代码中的具体做法是:在任何一预测层,将每个 gt 复制和 anchor 个数一样多的数目(3个),然后将 gt 和 anchor 一一对应计算,去除本层不匹配的 gt,然后对 gt 原始中心点网格坐标扩展两个邻居像素,因此每个 gt 总共有 3 个 cell 上的若干个 anchor 负责预测。有个细节需要注意,前面 shape 过滤时候是不考虑 xy 坐标的,也就是说 gt 的 wh 是和所有 anchor 匹配的,会导致找到的邻居也相当于进行了 shape 过滤规则。详见 build_targets
函数,
yolo v5 的改动造成的变化主要如下:
有了正负样本,v5 的 loss 计算也很简单,classification 和 objectness confidence 分支都是 bce loss,bbox regression 直接采用 giou loss。
通过对这些核心概念和操作的了解,我们可以更加深入地理解目标检测的实现过程。此外,我们还可以发现不同的检测方法可能在anchor和ground-truth匹配和样本选择方面存在不同的策略,这也为我们选择和优化目标检测算法提供了启示。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有