YOLOv1输出信息以及NMS过滤算法详细解读

2025-10-7|2026-2-23
Pavel Han
Pavel Han
date
Oct 7, 2025
slug
2025-10-07-YOLOv1-output-and-NMS-workflow
status
Published
tags
YOLO
summary
本文对YOLOv1模型的输出信息,以及对模型推理输出进行的NMS算法过滤等方面的信息进行总结和学习,为后续阶段解读更近的YOLO模型打好基础。
type
Post
category
AI
AI summary
对于YOLOv1模型的网络架构,在[[YOLOv1模型网络架构解读]]一文中已经有非常详尽的解释。以下是YOLOv1网络的架构图:
notion image
从以上架构图上可以看到,相比于对图像类别进行识别的各种经典卷积神经网络模型而言,YOLOv1的网络结构并没有特别大的创新点,仍然是在网络的前半段通过反复的卷积+池化操作提取图像中的特征,在网络的后半段通过连续两个全连接层进行类别识别和位置判断。但相比其他网络,YOLOv1架构在设计上的精髓在于其最后的7x7x30的输出解读、对模型参数的训练及其损失函数的评估设计方面。

YOLOv1模型的输出信息

YOLOv1的输出是一个7x7x30的三维张量,可以认为该模型把输入的448x448分辨率切分为7x7的网格,从每个网络中搜索待识别对象的中心点及其Bounding Box、置信度、对象类别等信息,每个网络通过一个30个元素的向量来表征该网格中检测到的这些信息。
如下图所示,每个网格会输出两个Bounding BOX的信息,每个BOX的信息包含检测物体中心点坐标(相对于该网格左上角)以及该检测物体的长宽(相对于整幅图即448x448的长宽比例),这个检测框的置信度信息。
notion image
需要注意,YOLOv1对于图像中物体的检测逻辑是,如果一个物体的中心点落在某个网格内,就由这个网格负责检测和输出该物体对应的Bounding Box等信息。因此,每个网格输出BOX信息中,x和y表示这个待检物体的中心点相对于当前网格左上角的位置,而w和h则表示这个网格预测Bounding Box的相对于整个输入图像分辨率的长和宽。
每个BOX都有一个置信度Confidence的参数,这个参数用于表征当前BOX中真正包含待检物体的概率,如果这个BOX中包含有某个待检物体的中心点的话,这个置信度参数会比较高,达到接近1的程度;而如果这个BOX中不包含任何待检物体的中心点,那么其置信度会接近0,这样就会在后面的过滤算法中被过滤掉。
20 Classes则用于表示各个待检物体类别的最终识别概率。对于VOC数据集而言,可以支持对20种类别的检测识别,如果是COCO数据集的话,各个网格输出的类别数量就需要修改为80个种类的识别概率了。

两个BOX,一组类别识别概率?

从以上所总结的YOLOv1模型各个网格的输出信息可以看到,每个网格的输出包含了两个预测BOX的信息,以及一组识别待检物体的识别概率。那么如果一个网格中刚好包含了两个待检物体的中心,那这组类别识别概率究竟表示的是哪一个物体的识别类别呢?
答案是:这种情况下肯定会漏检,这也是YOLOv1在密集小目标场景下召回率骤降的根本原因所在,也是后续版本(YOLOv2起)引入anchor、把“负责检测单元”从网格细化到“网格+anchor”甚至“pixel”级别的动机。
基于下图来理解这个事情:
notion image
对于每个网格所输出的两个BOX而言,这个网格在输出时只会把两个BOX与实际待检物体吻合度(实际上就是IOU指标)最好的那个框标记为正样本。对于上图而言,实际物体的Bounding Box是上图中的浅灰色框,那么预测框A的吻合度远好于预测框B。那么,这个网格的输出中,预测框A的置信度就会比较高,预测框B的置信度会被压得比较低,而这个网络中所包含的类别信息对应的也就是预测框A所圈选的部分图像的类别识别概率。
因此,YOLOv1整个输入图像被划分为7x7个网格,每个网格输出两个BOX,看起来YOLOv1最多可以实现对7x7x2=98个物体的检测,但实际上,每个网格最多只能输出一个BOX及其对应的识别类别,所以整个图像最多也就只能识别49个独立物体。即:每个网格输出的两个BOX不是为了确保在一个网格中检测出来两个物体,而是为了在一个网格中检测出来物体以后,通过两个BOX提供二选一的选项,让模型能够选择匹配性最好的框来定位其位置。

NMS

NMS:Non Maximal Suppression,非极大值抑制算法,顾名思义就是抑制不是极大值的边框,这里的抑制通常是过滤掉针对同一个检测物体的冗余边框。
如上所述,对于每一个输入YOLOv1模型进行推理和检测的图片而言,模型会通过7x7x30这个三维张量输出7x7x2=98个预测框。这98个预测框还需要经过NMS算法的过滤才真正输出最终的检测结果,否则一个物体可能会包含多个输出检测框。
NMS算法的基本执行逻辑:利用得分高的边框抑制得分低且重叠程度高的边框。
NMS算法的执行,按照其所支持的类别分类独立进行处理,每进行一次NMS运算,得到一个类别的最终检测框。但不同类别的计算逻辑是完全相同的,最终把所有类别的最终检测框汇总在一起就是模型最终的检测结果。
步骤0: 首先针对某个指定的类别,通过BOX的置信度confidence和这个类别的识别概率相乘得到这个BOX针对这个类别的分数score。因为模型输出98个BOX,所以每个类别也就有98个score。
步骤1:对这个类别的98个score与NMS的检测阈值(例如0.2)进行比较,小于这个阈值的BOX删除掉,只保留大于阈值的BOX放入备选列表。
步骤2:对备选列表中所有BOX基于score的大小降序排序,把备选列表中score最大的那个BOX直接放入该类别的检测输出中。
步骤3:计算备选列表中score值最大的BOX,与备选列表中所有其他BOX计算IOU指标,当计算出来的IOU值>IOU阈值(一般为0.5)时,表示两个BOX检测的是同一个目标,此时把score较小的那个BOX从备选列表中删除。
步骤4:从当前备选列表中把score最大值的BOX删除掉。
反复执行以上的步骤2-步骤4,直到备选列表的BOX为空。此时就得到了这个类别的检测输出结果,然后对所有的20个类别全部执行完成以上步骤,把所有类别的检测输出结果汇总,就是模型最终的检测输出。
notion image
如上图是针对小狗这个类别的NMS算法过滤流程。
  • 首先针对小狗这个类别,通过每个BOX的置信度及其所属网格中小狗这个类别的识别概率相乘,得到98个分数score。
  • 对这98个score与阈值0.2进行比较,删掉阈值小于0.2的BOX,把其他的BOX放入备选列表中。
  • 对备选列表中的BOX基于score进行降序排序,score最大的BOX直接放入小狗这个类别的检测输出中,同时执行以上描述的NMS算法,每次都是把score最大的BOX放入该类别的输出列表,并通过IOU去掉与该BOX重合度较大的其他BOX(避免一个检测物体出现多个检测框),直到整个备选列表中的BOX全部清空。

参考资料

  • 《深度学习之Pytorch物体检测实战》6.1 无锚框预测YOLOv1
一文彻底搞懂Transformer模型的Encoder结构与计算流程YOLOv2模型网络架构解读
Loading...