前言
上一篇文章中,作者主要聚焦于前线推理,也就是forward的部分,并解决了对于调整模型结构的一个重要问题:应该在哪里调整?如何添加使用新的网络层?对于希望利用YOLO V5的框架改进得到自己的模型的初学者指明了一条道路。本文将致力于解释另一部分问题:在何处能修改反向传播相关参数以达到更好的效果呢?关于这一部分,问题导向可能不在适用于讲清楚整个模块,于是作者决定采用先梳理整个框架,最后一个部分中再根据前文的内容获得问题的答案。
Part 1:对于反向传播内容的概述(总体概述)
产出结果:
Loss:经过损失函数计算出来的损失值
Loss_items:把三个损失值拼接在一起返回
loss, loss_items = compute_loss(pred, targets.to(device))
函数结构:
Step 1:将标注框加载于图片上以便后续能进行计算损失函数
对应函数:build_targets()
产出结果:tcls: target的class类别数组;tbox: target的预测框的whxy信息;indices: target是针对于这一批的第几张图片而言的;anchors: 用来拟合target的anchor框在当前分辨率下的序号。
tcls, tbox, indices, anchors = self.build_targets(p, targets)
Step 2:利用加载出来的target的信息计算多种损失
对应函数:bbox_iou,BCEcls,BCEobj
产出结果:loss:单张图片对应的平均损失值
Part 2 细读build_target函数部分
Step1:将targets,也就是yaml中的标注内容加载到图片
(1)对于targets文件进行维度的扩充
对应代码:
ai = torch.arange(na, device=self.device).float().view(na, 1).repeat(1, nt) # same as .repeat_interleave(nt)
targets = torch.cat((targets.repeat(na, 1, 1), ai[..., None]), 2) # append anchor indices
直观效果:(178,6)变成了(3,178,7)

分析:
增添的最后一列是用来模拟这个target框的anchor框的序号(0-2)
增添的第一个维度中的3对应的是某一个分辨率大小下的三个对应的Anchor框。这里给预测框增加了一个维度实际上是利用了枚举的一个思想,现将所有情况列举出来,后续经过判断筛选出合适的留存下来,得到问题“对于某个标注框,应该使用哪个预测框来对应地预测它?”的答案。
(2)把targets文件中的比例换算成在不同分辨率下的实际坐标
之前在数据集那一篇文章中提到,在数据集中的标注框的位置是通过比例的形式储存的,因此一定是需要一段代码将比例转化成实际的位置信息。

本文详细解读了YOLOV5中计算损失函数和优化器反向传播的过程,包括如何调整Loss_items,以及如何利用build_targets函数构建目标并计算各种损失。

3071

被折叠的 条评论
为什么被折叠?



