资讯动态

从Anchor-Based到Anchor-Free:六大目标检测算法工程复现与选型指南

发布时间:2026/10/14 1:17:18 来源:尧图企业网站定制
1. 从Anchor-Based到Anchor-Free一场检测范式的迁移做目标检测这些年我印象最深的一个转折点就是Anchor机制从标配变成可选项的那段时间。早些年做检测不管你是Faster R-CNN还是SSD、YOLO几乎都绕不开Anchor Box——预先在特征图上铺一堆不同尺度、不同长宽比的矩形框然后让网络去回归这些框的偏移量。这套逻辑统治了检测领域好几年但它带来的麻烦也是实打实的超参数多、正负样本分配敏感、计算冗余大、调参像玄学。Anchor-Free这一派的核心主张其实很朴素为什么一定要预先定义一堆框能不能让网络直接去学目标的关键点或者中心区域这个思路一旦打开就衍生出了一系列经典工作。CornerNet用一对角点定位目标ExtremeNet用四个极值点加一个中心点CenterNet干脆只用一个中心点FSAF和FCOS则走的是逐像素预测的路子FoveaBox用中心区域加尺度预测。它们各自解决的角度不同但共同点是——把检测问题从框回归重新定义成了点预测或区域预测。这篇文章我打算把这六个算法串起来讲透。不是那种论文摘要式的罗列而是从工程视角出发讲清楚每个算法为什么这么设计、核心细节怎么实现、实际跑起来会遇到什么问题、以及我在复现和调参过程中踩过的坑。适合已经了解基础检测流程、想深入理解Anchor-Free这一派设计哲学的朋友也适合正在选型、纠结到底用哪个方案落地的同学。读完你应该能自己判断面对一个具体任务到底该选哪个Anchor-Free方案以及为什么。2. 为什么非要干掉Anchor动机与设计哲学拆解2.1 Anchor机制到底哪里让人难受先说清楚Anchor-Based的痛点不然没法理解Anchor-Free为什么值得折腾。传统Anchor方案里你需要在每个特征图位置预设K个Anchor每个Anchor有固定的尺度和长宽比。以RetinaNet为例每个位置9个Anchor特征图假设是100x100那就是9万个Anchor。这9万个框里绝大多数是负样本只有极少数和真值框IoU够高才被标为正样本。问题就出在这个够高上。IoU阈值设0.5那正样本可能只有几十个设0.4正样本多一点但噪声也大。更麻烦的是Anchor的尺度、长宽比这些超参数是针对数据集调出来的换一个数据集比如从COCO换到某个工业缺陷数据集目标形状完全不一样你之前调好的Anchor参数可能全废了。我见过太多项目模型结构没动光调Anchor的尺度和比例就花了两周。还有一个隐性成本Anchor引入了大量超参数——尺度数量、长宽比、IoU阈值、正负样本比例、匹配策略。这些参数之间还相互耦合调一个动全身。Anchor-Free的思路就是把这些人为设定的先验全部拿掉让网络自己从数据里学。2.2 Anchor-Free的两条技术路线Anchor-Free不是一种方法而是一类方法。我把它归为两条主线第一条是关键点路线代表是CornerNet、ExtremeNet、CenterNet。核心思想是一个目标可以用几个关键点唯一确定。左上角加右下角确定一个框四个极值点加中心点确定一个目标或者干脆只用中心点加宽高。网络的任务从回归框偏移变成了预测关键点热力图。第二条是逐像素路线代表是FCOS、FSAF、FoveaBox。核心思想是特征图上的每个位置直接预测它到目标边界的距离或者预测它是否落在某个目标的中心区域。没有Anchor每个像素自己就是一个小检测器。这两条路线的共同优势很明显超参数大幅减少、正负样本定义更直接、不需要复杂的IoU匹配、对小目标和密集场景往往更友好。但代价也有——关键点路线对关键点检测的精度要求极高一个角点偏了框就歪了逐像素路线则要处理一个位置落在多个目标里怎么办的歧义问题。2.3 六个算法的定位对比在深入细节之前先用一张表把这六个算法的核心思路和定位理清楚后面再逐个展开。算法核心思路关键点/预测单元主要优势典型短板CornerNet左上右下角点2个角点热力图无需Anchor框由角点确定角点配对易错训练慢ExtremeNet四极值点中心点4极值1中心对旋转/不规则目标更鲁棒极值点定义依赖分割标注CenterNet中心点宽高1个中心点结构极简速度快密集重叠目标易漏检FSAF在线特征选择逐像素自适应层级自动选最优特征层依赖FPN结构FCOS逐像素回归距离每位置4个距离完全无Anchor无关键点中心度定义需调FoveaBox中心区域尺度中心区域分类尺度回归正负样本更均衡中心区域比例敏感这张表是我自己复现后的总结不是论文里的原话。你会发现每个算法都在解决前一个的某个短板CornerNet角点配对难ExtremeNet就用极值点加中心点来约束CenterNet结构简单但密集场景差FCOS就用逐像素加中心度来缓解。理解这个演进逻辑比死记每个算法的公式有用得多。3. 关键点路线三剑客CornerNet、ExtremeNet、CenterNet3.1 CornerNet用一对角点框住目标CornerNet是我接触的第一个Anchor-Free检测器当时看到用左上角和右下角两个点确定一个框这个想法第一反应是这么简单怎么没人早想到。它的核心结构是这样的主干网络用Hourglass沙漏网络输出两个热力图分支一个预测左上角点一个预测右下角点。每个角点还配一个Embedding向量用来判断哪个左上角和哪个右下角属于同一个目标。热力图的训练用的是Focal Loss的变体因为角点本质上是稀疏的关键点正样本极少。具体来说对于每个真值角点在其位置画一个高斯核核中心是正样本周围按距离衰减。这样做的原因是角点定位允许一点点偏移高斯核让网络对微小偏移不那么敏感。角点配对是CornerNet最精妙也最容易出问题的地方。它用Associative Embedding让同一个目标的左上角和右下角的Embedding向量尽量接近不同目标的尽量远离。推理时先提取热力图上的峰值点然后根据Embedding距离把左上角和右下角配对。我复现时踩的第一个坑是角点配对错误。两个目标靠得近时左上角可能配到隔壁目标的右下角框就横跨了两个目标。论文里用Embedding来缓解但实际效果取决于Embedding的判别力。我的经验是在密集场景下CornerNet的配对错误率明显上升这时候要么加后处理约束比如框的宽高比过滤要么换方案。还有一个实操细节CornerNet的偏移预测Offset不能省。热力图是下采样的角点落在特征图上的位置和原图有量化误差所以每个角点还要额外预测一个亚像素偏移。这个偏移量很小但少了它小目标的框会明显偏。3.2 ExtremeNet四个极值点加一个中心点ExtremeNet的思路和CornerNet一脉相承但把角点换成了极值点——目标最上、最下、最左、最右的四个点再加一个中心点。为什么这么改因为角点对于非矩形目标其实不友好。比如一个斜着的物体它的左上角可能根本不在物体上而极值点一定在物体边界上。ExtremeNet的预测分支有五个四个极值点热力图加一个中心点热力图。配对逻辑是先找到中心点然后从中心点出发向上下左右四个方向找极值点如果四个极值点的几何中心和高斯中心点足够接近就认为它们属于同一个目标。这个几何中心一致性的约束比CornerNet的Embedding更硬配对错误率更低。但代价是ExtremeNet依赖更精细的标注。CornerNet只需要框标注就能算出角点而ExtremeNet的极值点严格来说需要分割掩码才能准确标注。如果只有框标注极值点只能从框的边界近似精度会打折扣。我在一个工业零件检测任务上试过ExtremeNet零件有旋转角度CornerNet的角点经常落在背景上而ExtremeNet的极值点始终贴着零件边缘效果确实更好。但训练数据必须带分割标注标注成本上去了。所以我的建议是如果任务里目标形状规则、以矩形为主CornerNet够用如果目标有旋转、形状不规则且你能拿到分割标注ExtremeNet更合适。3.3 CenterNet极简主义的胜利CenterNet这里指Objects as Points那一版是我个人最喜欢的一个。它的逻辑简单到令人发指每个目标就用一个中心点表示网络预测中心点热力图再在中心点位置回归宽高。没有角点配对没有极值点没有Embedding一个中心点加两个宽高值完事。结构上CenterNet的主干可以用Hourglass也可以用ResNet加反卷积输出三个头中心点热力图C通道C是类别数、宽高预测2通道、中心点偏移2通道。训练时真值中心点用高斯核撒在热力图上宽高直接回归。它的推理速度非常快因为不需要NMS——中心点热力图上的峰值本身就是分离的取top-k峰值每个峰值对应一个目标直接输出。这一点在部署时特别香NMS在密集场景下又慢又容易误删CenterNet直接绕过了。但CenterNet的短板也很明显密集重叠目标容易漏检。两个目标中心点靠得很近时高斯核会重叠热力图峰值可能合并成一个。我试过在人群计数场景用CenterNet人挤人的地方漏检率明显高于FCOS。缓解办法是减小高斯核的半径但半径太小又会导致训练不稳定。这个平衡点得根据你的数据密度来调。还有一个坑宽高回归的尺度问题。CenterNet直接回归绝对宽高不同数据集的目标尺度差异大时损失函数的权重很难设。我的做法是对宽高做归一化或者用log空间回归收敛更稳。4. 逐像素路线FSAF、FCOS、FoveaBox的工程取舍4.1 FSAF让网络自己选特征层FSAFFeature Selective Anchor-Free严格来说不是纯Anchor-Free检测器它是在RetinaNet基础上加了一个Anchor-Free分支核心创新是在线特征选择。传统FPN里哪个目标用哪一层特征预测是靠目标尺度和Anchor尺度匹配决定的这是个人为规则。FSAF说别人为定了让网络自己学。它的做法是每个目标在FPN的每一层都算一个Anchor-Free的损失分类加回归然后选损失最小的那一层作为这个目标的最优层只在这一层回传梯度。这样网络会自动把大目标分配到高层、小目标分配到低层而且这个分配是动态的、数据驱动的。FSAF的价值在于它解决了FPN层级分配的次优问题。我做过对比实验同样的RetinaNet结构加上FSAF分支后小目标的AP提升了大概2个点。但它的实现复杂度不低要维护每层的Anchor-Free损失并做在线选择训练代码比纯FCOS麻烦。4.2 FCOS逐像素回归的标杆FCOS是我认为工程上最优雅的Anchor-Free方案。它的逻辑是特征图上的每个位置直接预测它到目标四条边的距离左、上、右、下再加一个分类分支。如果一个位置落在某个目标的框内它就负责预测这个目标如果落在多个目标内选面积最小的那个负责。这里有个关键设计叫Center-ness。逐像素预测有个问题落在目标边缘的位置它预测的距离可能很准但分类置信度不高因为边缘特征不明显。这些低质量的位置如果参与NMS会拉低精度。FCOS的解法是加一个Center-ness分支预测这个位置到目标中心的归一化距离推理时把Center-ness乘到分类分数上边缘位置的分数就被压低了。我复现FCOS时最大的感受是它真的不需要调Anchor相关的任何参数。以前调RetinaNetAnchor尺度、比例、IoU阈值来回试FCOS直接把这些全省了。正负样本定义也简单落在框内就是正样本落在外就是负样本没有IoU匹配。但FCOS也有坑。第一个是模糊样本一个位置同时落在两个目标框内时选最小的那个这个规则在目标尺度差异大时可能不合理。第二个是Center-ness的监督信号它需要从回归目标里算出来实现时容易写错。第三个是训练初期不稳定因为正样本数量远多于Anchor方案损失尺度需要仔细调。4.3 FoveaBox中心区域加尺度预测FoveaBox的思路和FCOS类似但正负样本的定义不同。它把目标框缩放到一个中心区域比如原框的0.3倍落在中心区域内的位置是正样本落在中心区域外但在框内的位置忽略落在框外的是负样本。这个设计借鉴了人眼中央凹Fovea的概念——只有中心区域才高分辨率处理。正样本还要预测一个尺度用来把中心区域映射回原框。FoveaBox的正负样本比FCOS更均衡因为忽略区域的存在减少了模糊样本的干扰。但中心区域的比例那个0.3是个超参数设小了正样本太少设大了又回到FCOS的老问题。我在小目标数据集上对比过FCOS和FoveaBoxFoveaBox在小目标上略好因为中心区域机制让正样本更集中。但在大目标上FCOS更稳因为FoveaBox的尺度预测在大尺度范围内容易漂。5. 实操复现从数据准备到训练调参的完整链路5.1 数据准备与标注格式转换不管你选哪个Anchor-Free算法数据准备的第一步都是把标注转成算法需要的格式。关键点路线和逐像素路线对标注的要求不一样。CornerNet和ExtremeNet需要从框标注算出角点或极值点。CornerNet的角点就是框的左上和右下坐标直接算。ExtremeNet的极值点如果只有框标注就是框的四条边中点但这样精度有限最好有分割掩码。CenterNet只需要中心点和宽高中心点是框中心宽高是框的宽高最简单。FCOS和FoveaBox需要的是每个像素到框边界的距离这个在训练时动态算就行不需要预先转换标注。但要注意FCOS的正样本是落在框内的所有位置如果目标很大正样本数量会爆炸。我的做法是对大目标做下采样或者限制每个目标贡献的正样本数量。标注格式转换时最容易出错的是坐标系的统一。有的标注是左上角加宽高有的是左上角加右下角有的是中心点加宽高。转换时一定要确认清楚我就因为把中心点当左上角用过训练了半天loss不降排查了两小时才发现是标注读错了。5.2 损失函数配置与权重平衡Anchor-Free算法的损失函数通常由几部分组成权重平衡是调参的重头戏。以CenterNet为例损失是中心点热力图的Focal Loss加上宽高的L1 Loss再加上偏移的L1 Loss。论文里的权重是1、0.1、0.1。我实测下来宽高的权重如果设太大训练初期会主导梯度中心点学不好设太小框的精度上不去。我的经验是先用论文默认权重跑通再根据验证集上中心点AP和框AP的差距微调。FCOS的损失是分类Focal Loss加回归IoU Loss加Center-ness BCE Loss。这里回归用IoU Loss比L1 Loss收敛更快因为IoU Loss直接优化重叠度。Center-ness的权重不能太大否则会压制分类分支的学习。CornerNet的损失最复杂角点热力图损失、偏移损失、Embedding损失。Embedding损失有两个方向——同一个目标的角点拉近不同目标的推远。这两个方向的权重需要平衡拉近权重太大所有角点挤在一起推远权重太大同一个目标的角点也分开了。论文里用的是1和0.1我试过0.5和0.05在密集场景下配对错误率更低。5.3 训练策略与学习率调度Anchor-Free算法的训练普遍比Anchor-Based更敏感尤其是关键点路线。我的通用策略是预热阶段前500到1000次迭代用很小的学习率比如1e-5让热力图分支先稳定下来。关键点热力图初期全是噪声直接上大学习率会崩。主训练阶段用余弦退火或者阶梯下降初始学习率1e-3到1e-4之间。FCOS这类逐像素方案可以用大一点CornerNet这类关键点方案要小一点。数据增强随机翻转、随机裁剪、颜色抖动是标配。但要注意CornerNet对翻转敏感因为翻转后左上角变右上角角点的语义变了所以翻转增强要同时交换两个角点分支的输出。还有一个容易被忽略的点Batch Size对Anchor-Free的影响比Anchor-Based大。因为正样本定义变了Batch Size小的时候一个batch里的正样本可能太少梯度噪声大。我建议至少用8张卡每卡2到4张图保证每个batch有足够的正样本。6. 常见问题与排查技巧实录6.1 训练不收敛或Loss震荡这是最常见的问题尤其是刚上手Anchor-Free的时候。排查顺序我一般是这样的先看学习率是不是太大。Anchor-Free的正样本定义和Anchor-Based不同同样的学习率在Anchor-Free上可能就太大了。先把学习率降10倍试试如果loss开始降了那就是学习率问题。再看损失权重是不是失衡。把各个损失分量单独打印出来看哪个分量在主导。如果热力图损失一直是0.001级别而回归损失是10级别那回归在主导热力图根本没学。最后看数据标注是不是有问题。我遇到过一次标注里有一批框的宽高是负数导致回归目标全是负的loss直接NaN。排查时把真值可视化出来看一眼往往能发现标注的坑。6.2 小目标检测效果差Anchor-Free在小目标上理论上应该更好因为不需要Anchor匹配。但实际跑下来小目标AP经常不理想。原因通常有两个一是特征图分辨率不够。小目标在深层特征图上可能就剩一两个像素热力图峰值根本提不出来。解法是用高分辨率的特征层或者加FPN。CenterNet可以用更大的输出分辨率FCOS可以用P3层专门管小目标。二是高斯核半径设得不对。CenterNet和CornerNet都用高斯核撒真值半径是根据目标大小算的。小目标的高斯核半径很小正样本就几个像素训练信号太弱。我的做法是对小目标适当放大高斯核半径保证至少有9个像素的正样本。6.3 密集场景漏检与误检密集场景是Anchor-Free的软肋尤其是CenterNet这类单中心点方案。两个目标中心点距离小于高斯核半径时热力图峰值会合并导致漏检。缓解办法有几个减小高斯核半径让峰值更尖锐但训练会变难提高输出分辨率让中心点在像素级别上分得更开换FCOS这类逐像素方案因为每个位置都预测密集场景下正样本更多。误检则通常来自背景纹理被误认为目标。Anchor-Free没有Anchor的先验约束背景里的规则纹理可能被当成目标。解法是加负样本挖掘或者用更强的数据增强让网络见过更多背景。6.4 推理速度与部署优化Anchor-Free在部署上有天然优势——不需要生成大量Anchor不需要NMSCenterNet后处理简单。但关键点路线的热力图峰值提取和配对在CPU上可能比GPU还慢。我的优化经验热力图峰值提取用最大池化加阈值筛选比逐个像素比较快得多。配对逻辑能并行就并行CornerNet的Embedding配对可以矩阵化。CenterNet的top-k用GPU上的排序别拉回CPU。还有一个部署时的坑不同框架的热力图输出格式不一样有的输出是logits有的已经过了sigmoid。导出模型时一定要确认清楚不然推理结果全错。常见问题可能原因排查方法解决方向Loss不降学习率过大/权重失衡/标注错误降学习率、打印各损失分量、可视化真值调学习率、平衡权重、修标注小目标AP低分辨率不足/高斯核太小看小目标在特征图上的响应加高分辨率层、放大高斯核密集漏检中心点合并/峰值重叠可视化热力图峰值减小核半径、换逐像素方案背景误检无Anchor先验约束看误检位置的图像内容负样本挖掘、强增强推理慢峰值提取/配对未优化profile各阶段耗时池化提峰值、矩阵化配对7. 选型建议什么场景该用哪个方案聊完六个算法和实操细节最后说说选型。这个问题我被问过很多次我的回答从来不是哪个最好而是哪个最适合你的场景。如果你追求部署简单、速度快、目标不密集CenterNet是首选。结构极简后处理几乎没有移动端部署友好。我做过一个嵌入式项目CenterNet量化后跑在边缘设备上帧率比同精度的SSD高不少。如果你做的是通用检测、目标尺度跨度大、需要稳定复现FCOS是最稳的选择。无Anchor无关键点超参数少社区实现多调参经验丰富。我现在的默认baseline就是FCOS除非有特殊需求才换。如果你的目标有旋转、形状不规则且能拿到分割标注ExtremeNet值得一试。极值点对非矩形目标的适应性确实比角点好。如果你在FPN结构上做改进想解决层级分配问题FSAF的在线特征选择思路可以直接借鉴哪怕你不用完整的FSAF这个思想也能用在其他检测器上。如果你做的是小目标密集检测FoveaBox的中心区域机制可能比FCOS更合适但中心区域比例要仔细调。CornerNet我现在用得少了主要是角点配对在密集场景下不够稳训练也慢。但它的Associative Embedding思想影响了很多后续工作理解它有助于理解关键点检测这一派。说到底Anchor-Free不是银弹它解决的是Anchor机制的超参数和匹配问题但引入了关键点精度和密集场景的新问题。选型时把这两边的账算清楚比盲目追新要靠谱得多。我自己在实际项目里的体会是先用FCOS跑一个baseline看瓶颈在哪再决定要不要换更专门的方案。这个流程帮我省了很多来回折腾的时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑