YOLO&DETR | 对比目标检测两大模型(附源代码与分析)
前言
有没有想过计算机如何分析图像、识别和定位其中的对象?这正是目标检测在计算机视觉领域所实现的目标。 DEtection TRansformer (DETR) 和You Only Look Once (YOLO) 是两种重要的目标检测方法。YOLO 赢得了作为实时对象检测和跟踪问题首选模型的声誉。 与此同时,DETR 是一个由 Transformer 技术驱动的新兴竞争者,它有可能彻底改变计算机视觉,就像它对自然语言处理的影响一样。在这篇博文中,我将探索这两种方法,以了解它们如何发挥其魔力!自 2012 年以来,在卷积神经网络 (CNN) 和深度学习架构的推动下,计算机视觉经历了革命性的变革。 这些架构中值得注意的是AlexNet (2012)、GoogleNet (2014)、VGGNet (2014)和ResNet (2015),它们合并了许多卷积层以提高图像分类精度。虽然图像分类任务涉及为整个图像分配标签,例如将图片分类为狗或汽车,但对象检测不仅可以识别图像中的内容,还可以查明每个对象在该图像中的位置。对象检测
YOLO发展史
最初的YOLO(2015)论文发布时是实时目标检测的突破,并且仍然是实际视觉应用中使用最多的模型之一。 它将检测过程从两阶段或三阶段过程(即 R-CNN、Fast R-CNN)转移到单阶段卷积阶段,并且与所有最先进的技术相比,在准确性和速度上都表现出色物体检测方法。 原始论文的模型架构随着时间的推移而发生变化,通过添加不同的手工特征来提高模型的准确性。以下是 YOLO 前三个版本及其差异的概述。
1YOLO v1 (2015)
YOLO v1 (2015) 是原始版本,为后续迭代奠定了基础。它使用单个深度卷积神经网络 (CNN) 来预测边界框和类别概率。YOLO v1 将输入图像划分为网格,并对网格的每个单元格进行预测。每个单元负责预测固定数量的边界框及其相应的类别概率。 该版本以令人印象深刻的速度实现了实时物体检测,但在检测小物体和准确定位重叠物体方面存在一些限制。
YOLO v2 (2016)
YOLO v2 (2016) 解决了原始 YOLO 模型的一些限制。它引入了锚框,这有助于更好地预测不同大小和长宽比的边界框。YOLO v2 使用了更强大的主干网络 Darknet-19,不仅在原始数据集(PASCAL VOC)上进行了训练,而且还在 COCO 数据集上进行了训练,这显著增加了可检测类的数量。锚框和多尺度训练的结合有助于提高小物体的检测性能。
YOLO v3(2018)
YOLO v3(2018) 进一步提高了物体检测的性能。该版本引入了特征金字塔网络的概念,具有多个检测层,允许模型检测不同尺度和分辨率的对象。YOLO v3 使用了具有 53 个卷积层的更大网络架构,称为 Darknet-53,提高了模型的表示能力。YOLO v3 使用三种不同的尺度进行检测:13x13、26x26 和 52x52 网格。每个尺度预测每个网格单元的不同数量的边界框。
NMS算法
等等,我们要预测多少个边界框?在 416 x 416 的分辨率下,YOLO v1 预测 7 x 7 = 49 个框。YOLO v2 预测 13 x 13 x 5 = 845 个框。对于 YOLO v2,在每个网格单元处,使用 5 个锚点检测 5 个框。另一方面,YOLO v3 预测 3 个不同尺度的框。对于相同的 416 x 416 图像,预测框的数量为 13 x 13 x 3 + 26 x 26 x 3 + 52 x 52 x 3 = 10,647。非极大值抑制 (NMS)是一种后处理技术,用于过滤掉冗余和重叠的边界框预测。在 NMS 算法中,首先,将低于某个置信度得分的框从预测列表中删除。然后,具有最高置信度分数的预测被认为是“当前”预测,并且与“当前”预测具有高于特定阈值(例如,0.5)的 IoU 的具有较低置信度分数的所有其他预测被标记为冗余并且压制。有关在 PyTorch 中实现 NMS 的信息,请参阅此YouTube 视频。(https://www.youtube.com/watch?v=YDkjWEN8jNA)
DETR模型
DETR (DEtection TRansformer)是一种相对较新的目标检测算法,由 Facebook AI Research (FAIR) 的研究人员于 2020 年推出。它基于 Transformer 架构,这是一种强大的序列到序列模型,已用于各种自然语言处理任务。传统的目标检测器(即 R-CNN 和 YOLO)很复杂,并且经历了多种变化,并且依赖于手工设计的组件(即 NMS)。另一方面,DETR 是一种直接集预测模型,它使用 Transformer 编码器-解码器架构来同时预测所有对象。这种方法比传统的目标检测器更简单、更高效,并且在 COCO 数据集上实现了相当的性能。DETR 架构很简单,由三个主要组件组成:用于特征提取的 CNN 主干(即 ResNet)、变压器编码器-解码器,以及用于最终检测预测的前馈网络(FFN)。主干网处理输入图像并生成激活图。Transformer编码器减少了通道维度并应用多头自注意力和前馈网络。Transformer 解码器使用 N 个对象嵌入的并行解码,并使用对象查询独立预测框坐标和类标签。DETR 使用成对关系对所有对象进行推理,受益于整个图像上下文。
代码展示
以下代码(取自 DETR 的官方GitHub 存储库)定义了该 DETR 模型的前向传递,该模型通过各个层(包括卷积主干和变压器网络)处理输入数据。我在代码中包含了网络每一层的输出形状,以了解所有数据转换。
1.初始化
该__init__方法定义模块的结构DETR。
它需要几个超参数作为输入,包括类的数量 ( num_classes)、隐藏维度 ( hidden_dim)、注意力头的数量 ( nheads) 以及编码器和解码器的层数 (num_encoder_layers和num_decoder_layers)。
2.主干和转换层
代码创建 ResNet-50 主干 ( self.backbone) 并删除其全连接 (fc) 层,因为它不会用于检测。添加层conv( self.conv) 将主干的输出从 2048 个通道转换为hidden_dim通道。
3.转换器
PyTorch 转换器是使用nn.Transformer类 ( self.transformer) 创建的。该转换器将处理模型的编码器和解码器部分。编码器和解码器层的数量以及其他参数是根据提供的超参数设置的。
4.预测头
模型定义了两个用于预测的线性层:self.linear_class预测类别逻辑。添加了一个额外的类来预测非空槽,因此num_classes + 1. self.linear_bbox预测边界框的坐标。应用该.sigmoid()函数以确保边界框坐标在 [0, 1] 范围内。
5.位置编码
位置编码对于基于变压器的模型至关重要。该模型定义了查询位置编码 ( self.query_pos) 和空间位置编码 (self.row_embed和self.col_embed)。这些编码有助于模型理解不同元素之间的空间关系。该模型产生 100 个有效预测。我们只保留概率高于输出预测特定限制的输出,并丢弃所有其他预测。
例子
这里展示了一个来自Github存储库的示例项目(工程文件地址将放在文末),其中我在实时视频流上使用了 DETR 和 YOLO 模型。该项目的目标是研究 DETR 在实时视频流上与 YOLO 相比的性能,YOLO 是业界大多数实时应用程序的事实模型。下面显示的脚本server.py使用 Ultralytics 的 YOLO v8 和 torch hub 的预训练 DETR 模型。该server.py脚本负责从网络摄像头、IP 摄像机或本地视频文件等源获取数据。可以在配置数据类中修改此源server.py。性能评估显示,使用该yolov8m.pt模型时,它在 Tesla T4 GPU 上实现了每秒 55 帧 (FPS) 的令人印象深刻的处理速度。另一方面,采用该detr_resnet50模型的处理速度为 15 FPS。
结论
总之,对于需要实时检测并注重速度的应用程序来说,YOLO 是一个绝佳的选择,使其适合视频分析和实时对象跟踪等应用程序。另一方面,DETR 在需要提高准确性和处理对象之间复杂交互的任务中表现出色,这在医学成像、细粒度对象检测以及检测质量超过实时处理速度的场景等领域可能尤其重要。然而,重要的是要认识到,DETR 的新版本(称为RT-DETR或实时 DETR)于今年发布,声称与所有类似规模的 YOLO 检测器相比,在速度和准确性方面都具有卓越的性能。这项创新虽然没有在本博客中介绍,但强调了该领域的动态性质以及根据特定应用需求进一步完善 YOLO 和 DETR 之间选择的潜力。