为了更直观地理解anchor的匹配过程,我们通过绘图的方式结合了yolov5的anchor-base和yolov8的anchor-free方法。
1、探究yolov5的anchor匹配机制
在yolov5中,anchor的大小是需要提前设定的。尽管有诸多文章和代码可供参考,但真正理解其原理并不容易。为此,我们通过自行绘制图示来辅助理解。
上图清晰地展示了yolov5s检测层的结构,它包含3层,这里以其中一层为例进行说明。图中,黑色网格代表特征图,红色x则代表真值box(gt_box)在特征图上的中心坐标。绿色框则是特征图网格生成的anchor,其数量和大小由yolov5s.yaml配置文件中的anchor设定决定。
在进行匹配时,首先将gt_box的宽和高转换到特征图尺寸上,然后通过计算gt_box与anchor的宽高比来确定符合条件的真值。特别的是,yolov5还引入了跨网格预测,能够更精确地回归box。
具体来说,它会从当前网格的上下左右四个方向中选取最近的两个网格,并结合当前网格,共同确定box的位置。最终得到的box包含坐标偏移量和宽高信息,这些信息会进一步用于计算预测值与真实值之间的loss。
此外,yolov5的loss还包含obj loss和cls loss两部分,分别代表目标存在置信度和类别loss的计算。
接下来,我们探讨yolov8的anchor匹配机制。与yolov5不同,yolov8采用了anchor-free的方式。这意味着它不再预设固定尺寸的anchor,而是通过特定的assigner来动态对齐真实box和预测box。
这一机制的核心在于TaskAlignedAssigner类,其设计理念源于TOOD论文。具体来说,它将特征图上的每个网格视作一个anchor,并从中选取满足条件的网格作为正样本。选取条件主要基于预测box中心是否在真实box内部,以及两者之间的iou是否超过设定阈值。
通过这种方式,yolov8能够更灵活、更准确地进行目标检测。
在探讨完yolov5和yolov8的anchor匹配机制后,我们再来看看它们在网络结构上的区别。其中一个显著的变化是c3被c2f所替代。这种结构上的调整旨在提高网络的性能和效率。
从上图中可以看出,head部分减少了2层,并且去除了红色部分,同时将c3替换为了c2f。这些改动共同作用于提升模型的整体性能,使其在目标检测任务中表现出更出色的效果。
全部评论 (0)