当前位置:网站首页>损失函数与正负样本分配:YOLO系列
损失函数与正负样本分配:YOLO系列
2022-07-02 12:04:00 【cartes1us】
目标检测算法最难理解的,设计最复杂的就是正负样本分配和损失函数这块了,这两者将很大程度决定网络的训练效果,因此开帖对yolo系列做一总结,重点也在这两者,吸收他人优秀博客内容,进行整理。
YOLO v1:
2016 CVPR有两个明星,一个是resnet,另一个就是YOLO。
上图是网络输出,注意里面每个格子预测两个Box,即论文中的B设置为2,但只有一组class probabilities,即每个格子只能预测一个物体,两个Box是为了让每个Box。
论文中损失:
同济子豪兄的注释:
- 正负样本分配:某个grid cell的预测结果与gt中所有目标计算IoU,IoU最高的那个物体视为这个grid cell应该去预测的目标,即yolo的每个grid cell只负责预测一个物体,由于只有7*7个grid cell,所以yolo对密集排布的目标预测效果差。
- 损失平衡系数: λ c o o r d \lambda_{coord} λcoord是正样本BBox损失的权重系数,论文中设置为5。而负样本不计算BBox损失,只计算是否存在目标的obj损失,其系数 λ n o o b j \lambda_{noobj} λnoobj设置为0.5,正样本的该损失权重设置为1,正样本的obj损失中标签 C ^ i \hat{C}_i C^i不是1,是目前预测结果与分配到的正样本的IoU,负样本该项为0。
- x,y,w,h:w,h都相对输入尺寸归一化到0,1之间了,x,y是相对该grid cell位置的偏移量,也在0~1范围内。
- 对w,h开根号的原因:我们对BBox预测的评价指标是IoU,但IoU相同时,大框的w、h所求得的损失肯定是比小框要高的开根号可以认为是为了增加sum-squared error (L2 loss)的尺度不变性。
- 对分类也是用L2损失:根据我调研的几个第三方的代码实现,这个 p i ( c ) p_i (c) pi(c)和前式中的 C i C_i Ci也没做过softmax(我没有看到)或sigmoid,网络最后一层是线性层,而 p ^ i ( c ) \hat{p}_i (c) p^i(c)的正样本和负样本标签分别为1和0,这样如果初始化不好,刚开始训练就有可能梯度爆炸吧,不知道我的理解对不。
YOLO v2:
相比v1,在backbone上有更新,加入了BN层,且检测头多了一个passthrough layer的短接,但最后的检测头还是只有一个,并且使用了anchor box机制,因为预测偏移量比直接预测更好学习,锚框的shape和大小是根据k-means聚类得到了5种锚框。论文标题的9000意思是可以使用文中的方法使yolov2实现9000种目标的检测。
BN层:
每个grid cell(网格)可以最多预测5个物体,5代表五种不同的anchor:
预测时的计算方式:
其中的sigmoid函数使得每个cell的预测结果的中心位置都是落在该cell中。
损失函数:
上图是网友根据yolov2的代码整理的损失函数,式子中 b i j k o b_{ijk}^{o} bijko是obj置信度, b i j k r b_{ijk}^{r} bijkr是预测的BBox位置信息,其中 r ∈ ( x , y , w , h ) , b i j k c r\in (x,y,w,h),b_{ijk}^{c} r∈(x,y,w,h),bijkc是预测的框所属类别。 p r i o r k r prior_{k}^{r} priorkr是anchor的位置,因为每个cell中的五个anchor都是一样的,所以下角标只需要知道anchor属于这五个anchor的哪一个信息。 t r u t h r truth^{r} truthr是标注框的位置信息。 t r u t h c truth^{c} truthc是标注框的类别信息。 I O U t r u t h k IOU_{truth}^{k} IOUtruthk是anchor与标注框的IOU。
loss由三部分组成,其中标黄的部分非0即1。
第一部分标黄部分,为负样本惩罚,表示预测框与标注框的IOU如果小于阈值0.6,那视作这个预测框是与负样本匹配了,取值1,反之为0,后面的部分表示标签0与置信度 b i j k o b_{ijk}^{o} bijko的L2损失。这个IoU的计算是只根据大小和形状来计算的,与位置无关,即先将某个grid cell所属的anchor和gt(ground truth)中心位置重合,再计算IoU。
第二部分标黄部分,表示是在12800次迭代前,将anchor与预测框位置误差加入损失,可以使模型能够在前期学会预测anchor位置,使得输出的 t x , t y , t w , t h t^{x},t^{y},t^{w},t^{h} tx,ty,tw,th更稳定;(这一项自己的理解不是很清晰)
第三部分标黄部分,表示预测框是否负责预测物体,该anchor与标注框的IoU最大对应的预测框负责预测物体(IOU>0.6但非最大的预测框忽略不计),其中第一项表示预测框与标注框的定位误差,第二项表示预测框的置信度与标注框和anchor的IoU的误差,表示预测框的所属分类结果与标注框的类别信息的误差,这个预测类别结果我看到的代码都是做了softmax的。
图中还有五个 λ \lambda λ, 表示每一个损失的平衡系数。
YOLO v3:
边栏推荐
- CDN 在游戏领域的应用
- 记一次面试
- C language exercises - (array)
- How to test tidb with sysbench
- LeetCode 2320. Count the number of ways to place the house
- Tidb cross data center deployment topology
- 14_Redis_乐观锁
- 15_ Redis_ Redis. Conf detailed explanation
- Arithmetic operations and related exercises in C language
- 18_Redis_Redis主从复制&&集群搭建
猜你喜欢
[c voice] explain the advanced pointer and points for attention (2)
Application and practice of Jenkins pipeline
04_ 栈
CodeCraft-22 and Codeforces Round #795 (Div. 2)D,E
vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases(sigmod‘2019)
21_ Redis_ Analysis of redis cache penetration and avalanche
How to avoid 7 common problems in mobile and network availability testing
Introduction to C language -- array
搭建自己的语义分割平台deeplabV3+
面对“缺芯”挑战,飞凌如何为客户产能提供稳定强大的保障?
随机推荐
20_Redis_哨兵模式
TiDB跨数据中心部署拓扑
Key points of compilation principle examination in 2021-2022 academic year [overseas Chinese University]
04_ 栈
16_Redis_Redis持久化
CDN 在游戏领域的应用
Data analysis thinking analysis methods and business knowledge - business indicators
Leetcode - Search 2D matrix
TiDB混合部署拓扑
数据分析常见的英文缩写(一)
21_ Redis_ Analysis of redis cache penetration and avalanche
. Solution to the problem of Chinese garbled code when net core reads files
Learn the method code of using PHP to realize the conversion of Gregorian calendar and lunar calendar
Printf function and scanf function in C language
. Net core logging system
面对“缺芯”挑战,飞凌如何为客户产能提供稳定强大的保障?
13_ Redis_ affair
10_Redis_geospatial_命令
vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases(sigmod‘2019)
记一次面试