一、案例背景
这篇文章记录一个 P2PNet 模型优化案例。项目场景是无人机俯拍图像中的人群计数与人头中心点定位,数据集使用 VisDrone2020-CC。
这类图像有几个典型难点:目标尺度小、遮挡多、密集区域容易漏检,背景纹理也容易干扰模型判断。因此,单纯把模型训练跑通并不够,还需要结合实际指标判断模型是否真的变好。
本次优化重点围绕三个问题展开:
1、模型对小目标细节表达不够。
2、密集区域候选点覆盖不足。
3、前景点和背景点比例不均衡,训练容易被大量背景样本影响。
二、优化前存在的问题
优化前模型采用双尺度 FPN,只融合 /8 和 /16 两个尺度特征。对于无人机高空俯拍场景,小目标细节容易在深层特征中被弱化,导致密集人群区域出现漏检。
同时,原模型每个特征网格使用 2x2 个锚点,候选点密度偏低。在人数较多的区域,候选点数量不足会影响点匹配和最终计数效果。
另外,点预测任务中背景候选点远多于前景点,如果分类损失没有针对这种不均衡做处理,模型容易更偏向背景判断,影响前景点召回。
三、优化方案
1、三尺度注意力FPN
第一处优化是将特征融合从双尺度改为三尺度。
优化前主要使用:
/8 特征 + /16 特征
优化后改为:
/4 特征 + /8 特征 + /16 特征
其中 /4 浅层特征保留更多空间细节,适合补充小目标定位信息;/16 特征提供更强语义表达;/8 作为统一输出尺度。模型中还加入了轻量通道注意力和空间注意力,用于增强目标区域响应。
2、3x3密集锚点与约束回归
第二处优化是提高候选点密度,并限制坐标偏移范围。
优化前每个网格使用 2x2=4 个锚点,优化后改为 3x3=9 个锚点,候选点覆盖更密集。
坐标回归部分加入 tanh 约束:
pred_offsets = torch.tanh(raw_offsets) * cell_size.view(1, 1, 2) * self.offset_scale
pred_pts = (anchors.unsqueeze(0) + pred_offsets).clamp(0.0, 1.0)
这样可以减少预测点大范围漂移。推理阶段再增加点级半径去重,过滤邻近重复响应,降低重复计数风险。
3、Focal Loss + SmoothL1
第三处优化是调整损失函数。
分类分支使用 Focal Loss,降低大量易分类背景样本的影响,让模型更关注前景点和难样本。
定位分支使用 SmoothL1 Loss,仅对匹配成功的正样本计算坐标误差,提高点位回归稳定性。
四、实验设置
| 项目 | 设置 |
|---|---|
| 数据集 | VisDrone2020-CC |
| 模型 | P2PNet |
| 训练轮数 | 200 Epoch |
| 验证集划分 | 从带标注训练序列中按 val_ratio=0.15 划分 |
| 随机种子 | 2026 |
| 推理阈值 | 0.5 |
| 验证样本数 | 360 张 |
指标来自项目中的训练与评估产物,优化前后使用同一验证集口径进行对比。
五、实验结果
| 指标 | 优化前 | 优化后 | 变化 |
|---|---|---|---|
| 最优 MAE | 26.291667 | 21.742360 | 下降 17.30% |
| 最优 MSE | 30.667618 | 27.418905 | 下降 10.59% |
| 最终 MAE | 28.438889 | 22.318475 | 下降 21.52% |
| 最终 MSE | 32.915630 | 28.106332 | 下降 14.61% |
| 最优 MAE 轮次 | Epoch 180 | Epoch 70 | 提前 110 轮 |
从结果看,优化后模型的 MAE 和 MSE 都有明显下降。最佳验证效果也从第 180 轮提前到第 70 轮,说明模型收敛速度更快。
六、结果分析
最优 MAE 从 26.291667 降到 21.742360,说明平均计数误差明显降低。这个提升主要来自三尺度特征融合和密集锚点设计:前者增强小目标特征表达,后者提高密集区域候选点覆盖。
最优 MSE 从 30.667618 降到 27.418905,说明大误差样本也得到缓解。约束回归和点级去重减少了异常点漂移和重复响应,对密集场景更有帮助。
最佳验证轮次从第 180 轮提前到第 70 轮,说明优化后的结构更容易学习到有效特征,训练效率更高。
七、总结
这个案例的重点不是简单换一个模型,而是围绕实际问题做针对性优化:
1、三尺度注意力 FPN 解决小目标细节表达不足。
2、3x3 密集锚点和约束回归提升候选点覆盖并减少点位漂移。
3、Focal Loss 和 SmoothL1 提升分类与定位训练稳定性。
系统开发和算法优化类项目,最终不只是要能运行,还要能讲清楚实现思路、代码改动、指标来源和结果变化。
目前可支持 Python、Java、Web系统、小程序、PyQt桌面端、深度学习模型、目标检测、图像分类、图像分割、数据处理等方向的系统开发、模型训练、算法优化、调参、指标分析和项目说明整理。
咨询时请先简单说明:项目类型、核心需求、预算范围、期望工期、当前进度和目标效果,方便判断是否能接。







