作者:Libor Vanek
编译:ronghuaiyang
导读
CenterNet(Objects as Points)和TTFNet的简单介绍,以及基于TensorFlow2.2+的实现。
首先,我将简要介绍一下不同的物体检测方法。在介绍了传统和新方法之后,你可以阅读有关CenterNet和TTFNet的最重要的部分。这两个模型中的许多想法是相似的,因此它们将被一起引入。我们实现了一个受这两个网络启发的包。如果你有兴趣,请访问我们的GitHub:https://github.com/ximilarcom/xcenternet。
传统方法
就像在计算机科学中经常发生的那样,当我们遇到一个没有解决方案的难题时,我们试图把它变成一个我们已知解决方案或更简单的问题。所谓的两阶段检测模型就是一个很好的例子。在这种情况下,更简单的问题是图像分类。(将给定的图像放入一个类别中或为给定的图像分配标签)简单地说,我们可以将图像划分为多个区域然后对它们进行分类,对吗?是的,但是要花很多时间。因此,你需要聪明一点。使用这种方法的算法的一个例子是R-CNN(2014)。之后发展为Fast R-CNN(2015)和Faster R-CNN(2016)。
虽然这些模型的性能相当好,但研究人员显然在问自己,这个过程是否可以变得简单,从而提高效率。在一个阶段中完成,不需要建议区域。一个可能的答案是YOLO — You Only Look Once(2015)。它现在在YOLOv4(2020),或SSD - Single Shot multibox Detector(2015)。最后,RetinaNet(2017)也应该被提到,特别是因为它被用来引入focal loss用于物体检测,这在现在是非常常用的。
新方法
近年来,另一种观点越来越受欢迎。物体可以转换为一组点。检测任务可以看作是一个关键点估计问题。这种方法在CornerNet: Detecting Objects as Paired Keypoints中介绍。顾名思义,物体被表示为一对关键点,左上角和右下角。
类似的想法在Objects as Points一篇介绍CenterNet的文章中也有探讨。在这里,我们使用热图检测边界框的中心点。其他属性,如边界框的大小,直接使用回归来预测。
这种方法的缺点是训练速度较慢。为了解决这个问题,提出了TTFNet(Training-Time-Friendly Network)。它遵循相同的基本思想,因此我们决定在一个包中实现来自两个网络的思想。
神经网络结构
我们深入一下。下面我就从头开始,给大家介绍一下网络布局。然后,将讨论个别重要的部分,主要是热图和不同的损失函数。
我们可以使用一些专门为这类任务设计的网络。例如Hourglass network。或者,正如我们决定的那样,将标准图像分类CNNs中的一个进行修改,以满足我们的需要。我们选择ResNet(18, 50)和EfficientNet(b0, b1, b2)进行测试。
在所有的标准迁移学习任务中,我们丢弃了顶端的dense层。但是,最上面的那一层根本不符合我们需要的输出。因此,有必要进行上采样。除此之外,来自底层的连接还可以提高性能。当我们的网络末端有一个尺寸正确的层时,我们可以将它“分割”成所需的head。
使用ResNet18的CenterNet的简单可视化,使用了上采样和拼接。(黄色:卷积层,红色:最大池化,蓝色:上采样)
为了使网络运行得更快,热图端仅为输入图像的1/4。每个类别都有一张热图。然后,在CenterNet(用于基本目标检测)和TTFNet中还有另外两个head。
对于CenterNet,有
① 一个预测大小的head,包含包围框的宽和高
② 预测偏移的head,包含使用下采样热图时产生的中心的x和y偏移。
两者都只有两个filters — 在热图的任何给定点上都只能有一个物体。如果你对一个物体的其他属性感兴趣,可以添加更多head。
在TTFNet中,只有一个附加的head带有四个filters来计算尺寸 — 到物体两侧的距离。
热图
那么,热图是什么样的呢?它是一个填充了从0.0到1.0的值的矩阵。这张图上的峰值表示某个物体的存在。
下面,你会看到一些生成的训练热图。只有一个点正好是1.0。围绕着这一点,置信度在慢慢变小。
可变形卷积
网络的上采样部分可以通过多种方式实现。我们已经向你展示了使用拼接、上采样和标准卷积层的简单方法。为了提高性能,使用了可变形卷积。
毫无疑问,卷积神经网络给深度学习带来了一场伟大的革命。它们使我们能够提取出很难从全连接的层中得到的特征。再加上另一种布局上的改进,我们的网络将变得非常深。尽管如此,基本思想还是一样的。特别是滤波器的形状总是矩形的。Deformable Convolutions正在尝试对此进行改进。它们学习标准网格的偏移量,并使用这个“变形的”卷积核执行卷积。
遗憾的是,在TensorFlow和TensorFlow Addons (TFA)中还没有实现可变形的卷积层。我们正在使用TFA的一个分支:https://github.com/smallsunsun1/addons/tree/feature/deformable_ops,支持可变形的Conv2d,并希望它能很快被合并。
损失函数
现在,我们有了网络布局和输出,只有一个关键的东西是缺失的。损失函数。
Focal Loss
热图有一个问题 —— 它们非常稀疏。大多数情况下没有检测(零),只有非常偶然的情况下我们看到一个物体(1,周围的值递减)。标准度量方法在这种情况下并不能很好地工作。幸运的是,有一个解决方案 —— focal loss。它被用于CenteNet和TTFNet。
基于IoU的损失
为了优化包围框的大小,CenterNet使用L1损失。它是真实包围框坐标和预测包围框坐标之间差异的简单求和。它似乎是合理的,但另一方面,我们并不经常使用它来评估。我们使用IoU来度量。因此,当我们对改进这个指标感兴趣时,为什么不将它也用于优化呢?我们可以用1减去IoU值,将其变成损失。
不幸的是,如果没有交集,IoU是0。因此在这种情况下损失总是1。因此,又提出了两种基于IoU的损失函数。在TTFNet中使用的GIoU,解决了这个问题。DIoU还关注于在函数中添加距离信息,换句话说,就是我们离边框中心有多远。
最后
你可以在GitHub:https://github.com/Ximilar-com/xcenternet上找到我们的实现。
END
本文转自: AI公园,原作者:Libor Vanek,编译:ronghuaiyang,转载此文目的在于传递更多信息,版权归原作者所有。