VariFocalNet | IoU-aware同V-Focal Loss全面提升密集目标检测(附YOLOV5测试代码)(二)

简介: VariFocalNet | IoU-aware同V-Focal Loss全面提升密集目标检测(附YOLOV5测试代码)(二)

4 损失函数


VFNet的训练是由以下的loss函数来监督的:

image.png

其中和分别为FPN每一级特征图上位置的c类IACS的预测和目标IACS。为GIoU损失,、和分别表示初始、细化和ground truth bounding box。用训练目标为加权,这是前景点的gt借据,否则为0,跟随FCOS。和分别是用来平衡中2个子损失的超参数,本文经验设定分别为1.5和2.0。Npos是前景点的数量,用于使总损失正常化。这里在训练期间使用ATSS来定义前景和背景点。

VFNet的推理很简单,只涉及通过网络模型传输输入图像和NMS的后处理步骤,以消除冗余检测。

基于YOLO V5的改进代码

替换YOLOV5中的Focal Loss即可,小编在小型数据集已经验证该方法的有效性。

class VFLoss(nn.Module):
    def __init__(self, loss_fcn, gamma=1.5, alpha=0.25):
        super(VFLoss, self).__init__()
        # 传递 nn.BCEWithLogitsLoss() 损失函数  must be nn.BCEWithLogitsLoss()
        self.loss_fcn = loss_fcn  #
        self.gamma = gamma
        self.alpha = alpha
        self.reduction = loss_fcn.reduction
        self.loss_fcn.reduction = 'mean'  # required to apply VFL to each element
    def forward(self, pred, true):
        loss = self.loss_fcn(pred, true)
        pred_prob = torch.sigmoid(pred)  # prob from logits
        focal_weight = true * (true > 0.0).float() + self.alpha * (pred_prob - true).abs().pow(self.gamma) * (true <= 0.0).float()
        loss *= focal_weight
        if self.reduction == 'mean':
            return loss.mean()
        elif self.reduction == 'sum':
            return loss.sum()
        else:
            return loss


5 实验结果


5.1 Varifocal损失对比实验

表1 FL、GFL、VFL对比表

表1显示了使用不同损失训练模型的结果。可以看到Varifocal损失使RetinaNet, FoveaBox和ATSS持续改善0.9 AP。对于RepPoints增加了1.4 AP。这表明Varifocal损失可以很容易地给现有的密集物体探测器带来相当大的性能提升。

与GFL相比Varifocal损失在所有情况下表现都比它好,证明了Varifocal损失的优越性。

此外,作者用FL和GFL训练了VFNet以便进一步比较。表1的最后一部分显示了结果,可以观察到Varifocal损失相对于FL和GFL依然具有优势。同时也证明了VFNet的有效性。

5.2 SOTA模型对比

表2 SOTA检测器对比

表2给出了SOTA检测器实验结果对比。与Backbone ATSS相比VFNet在不同Backbone网下实现了大约2.0 AP的提升,例如使用ResNet-101 Backbone时46.0AP和43.6AP,这验证了方法的有效性。

与类似的工作的GFL(其MSTrain标度范围为1333x[480:800])相比,VFNet始终比它好得多。同时用Res2Net-101-DCN训练的模型达到了51.3AP,几乎超过了所有最新的检测器。

文章还给出了VFNet在Nvidia V100 GPU上的推断速度。由于在完全相同的设置下很难得到所有列出的检测器的速度,所以只将VFNet与Baseline ATSS进行比较。可以看出VFNet非常高效,例如以19.3 FPS的速度实现44.8AP,与Baseline相比,只增加了很小的计算开销。

5.3 测试可视化结果

通过上图可以看到,对于小目标和密集目标具有很好的鲁棒性。


6 参考


[1].VarifocalNet: An IoU-aware Dense Object Detector

[2].https://github.com/hyz-xmaster/VarifocalNet


7 推荐阅读


CVPR2021全新Backbone | ReXNet在CV全任务以超低FLOPs达到SOTA水平(文末下载论文和源码)

CVPR2021-即插即用 | Coordinate Attention详解与CA Block实现(文末获取论文原文)

最强检测 | YOLO V4?都是弟弟! CenterNet2以56.4mAP超越当前所有检测模型(附源码与论文)

全新FPN | 通道增强特征金字塔网络(CE-FPN)提升大中小目标检测的鲁棒性(文末附论文)

最强Vision Trabsformer | 87.7%准确率!CvT:将卷积引入视觉Transformer(文末附论文下载)

相关文章
|
20天前
|
测试技术 API 数据库
Django测试入门:打造坚实代码基础的钥匙
Django测试入门:打造坚实代码基础的钥匙
31 3
|
7天前
|
测试技术 持续交付
软件测试的艺术:追求卓越的代码之旅
在软件的世界中,测试不仅仅是一项任务,它是一场精心编排的舞蹈,旨在确保每一个步伐都准确无误。本文将带您踏上一场探索软件测试之美的旅程,从基础理论到实践技巧,我们将一同揭开高效测试的秘密,并分享那些能让代码更健壮、更可靠的智慧精华。
15 2
|
12天前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
4天前
|
自动驾驶 测试技术 持续交付
软件测试的艺术:追求卓越的代码之旅
在软件开发的海洋中,测试是那艘不可或缺的航船,它带领我们驶向质量的彼岸。本文将带你领略软件测试的重要性,探讨如何通过创造性思维和系统方法提升测试效率与效果。我们将从测试基础出发,逐步深入到高级策略,最终实现测试的艺术化,确保软件产品能在复杂多变的环境中稳健航行。
|
5天前
|
Java 测试技术
单元测试问题之想通过单元测试来驱动代码的设计与重构,如何实现
单元测试问题之想通过单元测试来驱动代码的设计与重构,如何实现
|
5天前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
5天前
|
存储 Kubernetes 测试技术
阿里云块存储问题之生产代码与测试代码需要同步原子提交如何解决
阿里云块存储问题之生产代码与测试代码需要同步原子提交如何解决
16 0
|
5天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到信心
在数字世界的舞台上,软件如同演员,而测试则是它们精彩表演的彩排。本文将带您穿梭于软件测试的幕后,揭示那些让软件从笨拙的初稿变成流畅的终演的魔法。我们将探索测试的多面性,从基础的单元测试到复杂的集成测试,再到用户面前的系统测试,每一步都旨在确保软件的优雅舞步不会因缺陷而绊倒。文章还将点亮持续集成的灯塔,指引船只安全航行,并展示自动化测试如何像忠实的伙伴一样,不断给予支持。最后,我们将探讨测试策略的选择艺术,如何在多变的需求与资源之间找到平衡点。让我们一起走进软件测试的世界,体验这场从代码到信心的旅程。
|
26天前
|
监控 搜索推荐 机器人
开发与运维数据问题之LangChain帮助提升GPT-4的实用性的如何解决
开发与运维数据问题之LangChain帮助提升GPT-4的实用性的如何解决
27 1
|
1月前
|
Devops jenkins 测试技术
如何在Visual Basic项目中实施单元测试以确保代码健壮性
【7月更文挑战第2天】本文探讨了如何在Visual Basic项目中实施单元测试以确保代码健壮性。单元测试基础包括验证代码单元的功能,促进重构和提高代码质量。MSTest、NUnit和xUnit是VB.NET的单元测试工具。遵循TDD原则,保持测试独立,关注单一功能,并确保快速执行。示例展示了如何为`Calculator`类的加法方法编写MSTest。持续集成与自动化测试工具如Jenkins和Azure DevOps辅助测试运行和代码质量检查。单元测试是提升软件质量和开发效率的关键实践,反映了良好的开发文化。
33 2

热门文章

最新文章