| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 基于源码详解yolov3的loss【注释满满】 -> 正文阅读 |
|
[人工智能]基于源码详解yolov3的loss【注释满满】 |
YOLO v3的损失函数构成及表达式YOLO v3的损失函数由定位损失、置信度损失以及分类损失三部分组成。相信下边的公式大家看过很多遍了,我标明了各个损失对应的部分。 题外话在网上查阅了很多资料,很多人都反应说复现的代码和DarkNet开源代码在LOSS的设计上是有出入的。比如原来的BCE损失改成了MSE损失(这个问题在一些大佬们经过梯度反向推导之后发现这两种损失的梯度是一样的,所以两种都可以)。对于损失其它的改变我们也可以理解,毕竟研究的是一门炼丹玄学,每个人碰到的业务场景和环境也不一样,选择不同的方式也可以接受,大家的目的都是跑出最好的结果。 在分析YOLO v3的LOSS之前,有必要先了解以下BCE(Binary CrossEntropy)。因为在YOLO v3里,很多部分的损失都是用BCE计算的。比如类别分类损失,每张图片里不只有一个类别的目标(比如人和鸟可能同时出现),是一个多标签分类问题,而不是简单的二分类问题,所以在YOLO v3里作者把激活函数从Softmax换成了Sigmoid(Softmax会扩大最大输出值对应类别的概率值,从而抑制其他类别,不利于多标签分类),部分损失改由BCE计算。详情请移步参考: BCE损失函数. YOLO v3的模型输出与多尺度预测YOLO v3为了完成多尺度的目标检测,使用了FPN的结构,最终输出三种不同尺度的特征图(13×13、26×26、39×39)分别预测不同大小的目标。每种尺寸的特征图都要输出自己负责目标的预测信息(中心点偏移、宽高偏移、置信度、类别)。因此三种不同的特征图的预测结果都要计算与target的损失,并且相加进行反向梯度传播优化。 研究LOSS的思维按照深度学习的架构,为了计算LOSS,我们需要先获取到目标值(Target)和预测值(Prediction)。 YOLO v3是一个经典的目标检测框架,目标检测的目的是要定位出图像中目标的位置,并且判断该目标的类别。因此它的模型预测输出为预测框的位置信息以及框内物体的类别。除此之外,YOLO v3还预测输出了当前特征点中是否包含物体的置信度。 获取目标真实值target我们先去源码里的Dataloader里去看一看网络使用的target是什么以及格式是什么样的。
只看代码可能还是比较迷糊,结合上图观察,经过DATaloader输出的target位置信息是模型输入图像上左上角和右上角的x, y坐标。通过读论文我们知道,在位置信息上YOLO v3预测的是与负责该目标的anchor中心点的偏移量,所以我们还要根据target中的左上角和右上角坐标计算出target的中心点与宽高,并计算target中心点和宽高与anchor之间的偏移量。这样以anchor为参考系,计算prediction和target之间的差距。 预测值的获取
其中:
读原论文的时候可以发现,模型预测的输出是预测框相对于anchor的偏移量
t
x
t_x
tx?,
t
y
t_y
ty?,
t
w
t_w
tw?,
t
h
t_h
th?,通过上边图里的公式我们可以根据预测的偏移量计算出预测框的中心点位置以及宽高。
接下来,我们就要通过[ t x t_x tx?, t y t_y ty?, t w t_w tw?, t h t_h th?]和[ t x ? , t y ? , t w ? , t h ? {t_x}^*, {t_y}^*, {t_w}^*, {t_h}^* tx??,ty??,tw??,th??,]计算定位损失了。定位损失就是使用的BCE损失计算的 这里要说的一点是,只有当前特征图的点负责预测一个目标物体的时候,我们才会计算它的定位损失、分类损失,只有置信度损失是所有特征点参与计算的。 就如同文章开头公式里写的那样, I i j o b j {I_{ij}}^{obj} Iij?obj如果等于1,代表的是第i个特征点的第j个anchor有一个负责预测的目标;如果等于0,代表第i个特征点的第j个anchor没有要负责预测的目标。 I i j n o o b j {I_{ij}}^{noobj} Iij?noobj代表的是相反的含义。
从代码中我们看到了,obj_mask就是上边公式里的 I i j o b j {I_{ij}}^{obj} Iij?obj,在计算的loss_x, loss_y, loss_w, loss_h, loss_cls的时候只考虑了 I i j o b j {I_{ij}}^{obj} Iij?obj=1的预测框;而在计算置信度损失的时候 I i j o b j {I_{ij}}^{obj} Iij?obj=1和 I i j n o o b j {I_{ij}}^{noobj} Iij?noobj=1的预测框都参与了计算。还有一个参数是box_loss_scale,该参数是为了兼顾小目标检测的性能,目标的尺寸越小,box_loss_scale越大,从而损失越大。 总结YOLO v3是一种单阶段带anchor设计的目标检测框架,并且通过引入FPN完成多尺度目标的检测。损失包含定位损失,置信度损失,分类损失三部分,有MSE和BCE两种LOSS计算得到。模型的检测头预测输出的定位信息为预测框相对于预设anchor的偏移量( t x t_x tx?, t y t_y ty?, t w t_w tw?, t h t_h th?),再通过真实目标信息target和anchor之间的偏移量计算LOSS。此篇博客是自己学习过程中的记录,仅限于于个人理解,有不正确的地方希望大家能够指出,虚心学习一起交流。希望能帮助到朋友们! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:39:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |