我现在想做基于激光点云的目标检测算法,目前算法检测结果如下,我的场景是悬挂式单轨交通,主要是小目标检...
Creado el: 26 de diciembre de 2025
Respondido usando GPT-5.2 Thinking por Chat01
Creado el: 26 de diciembre de 2025
Respondido usando GPT-5.2 Thinking por Chat01
我现在想做基于激光点云的目标检测算法,目前算法检测结果如下,我的场景是悬挂式单轨交通,主要是小目标检测和不规则结果,请根据我的场景特点和算法检测结果,选择一个可行的算法检测方案,要确保检测精度和结果以及FPS的综合最优,我目前的方案是想基于体素取进行检测,请选择一个比较好改的算法,考虑主流改进的基础模型去进行改进,我的雷达是揽沃tele-15,,点云范围在算法里X轴[0,160]m,Y轴(横向)[-20,+20]m,Z轴(垂向)[-2,6]m,本文将体素网格尺寸设定为[0.1,0.1,0.2]m,实时性要求在不要很差劲即可,我现在的是OpenPCDet,我是用是3090的24G的GPU,同时要确保可以参考的改进的的中英文文章很多,要不我从哪里知道怎么改,改哪些内容呢,我有个其他类似模型或者模块的更改依据也更快实现,比如基于体素的改进或者基于PILLAR,以及其他,比如基于点的检测方法有哪些可以拿来用的开源算法或者论文呢,类似这样,理解吗,我想选择的基础模型是单阶段的检测模型,体素化模型,请再进行分析,以及大家选择体素化的改进点,同时给出改进算法的来源和改进点,请将下面的人的论文去除:Lian等人,RAE3D: Multiscale Aggregation-Enhanced 3D Object Detection for Rail Transit Obstacle Perception,RVSA‑3D(Voxel-based fully sparse attention 3D object detection for rail transit obstacle perception)这两个作者的论文都包括我们实验室的,我们不能重复,同样的这个作者的其他论文也不要推荐给我,同时现在给我一个可执行的替换思路
pythonfrom PIL import Image img = Image.open('/mnt/data/image.png') img.size (1317, 381)
pythonimport matplotlib.pyplot as plt, numpy as np plt.figure(figsize=(14,4)) plt.imshow(img) plt.axis('off') plt.show()
下面我按“单阶段 + 体素化 + OpenPCDet里好改 + 小目标/不规则物体优先 + 精度/FPS综合最优”给你一个可执行的替换思路(并且不推荐你点名要排除的那位作者/团队的任何论文,包括你列出的两篇及其同作者其它工作)。
从你表里单阶段且“体素/BEV”路线(不算 PointRCNN / PV-RCNN / PartA2 / VoxelRCNN 这些两阶段):
同时你的小目标类里(Plastic sheet / Kite / Bird)在体素单阶段里普遍偏低,说明瓶颈大概率来自:
虽然你现在 CenterPoint 指标略低于 SECOND,但我仍建议你把 CenterPoint-VOXEL当底座(而不是 SECOND)原因是:
小目标/不规则物体更适配 anchor-free
你这些目标(塑料布/风筝/鸟)3D box 的“尺寸、姿态、形状”波动大,anchor-based 很容易出现 anchor 匹配/回归不稳定;CenterPoint 的中心热力图思路更稳,改进空间也更大。
OpenPCDet 里模块化最好改
你后续要加:更高分辨率BEV、多尺度头、IoU质量分支、注意力模块、Soft-NMS/DIoU-NMS、以及多帧融合 —— CenterPoint 路线改动成本最低。
可参考中英文资料最多
CenterPoint 本身、以及围绕“center-based / heatmap head / quality-aware score / multi-sweep fusion”的改法,中文复现/解读/改进文章非常多,落地快。
你“想走体素网格 [0.1,0.1,0.2]m + range[0,160]×[-20,20]×[-2,6]”完全没问题,就用它做底座继续改。
下面这套是我建议你按顺序做的 V1→V4,每一步都能在 OpenPCDet 里比较快落地,并且每一步都有大量公开论文/开源实现可参考(都避开你要求排除的作者线)。
改动目标:让小目标在 BEV 特征图上不至于“只有1格”。
做法(OpenPCDet层面)
out_size_factor 从常见的 8 改到 4(必要时到2,但先别上2)收益
可参考来源(关键词)
问题本质:Tele-15 点本来就少,你如果用很弱的 VFE,很容易把少量点的几何差异“平均没了”。
做法
(x,y,z, intensity, Δx/Δy/Δz, distance) 这类稳定增益(distance 对远处小目标通常有帮助)收益
可参考来源(关键词)
你这些目标不规则,分类分数≠定位质量,很容易出现“分高但框飘”。
做法
score = cls_score * quality_score(或类似融合),再做 NMS收益
可参考来源(关键词)
这是你场景里我认为收益/成本比最高的一类改动,因为 Tele-15 对远处小目标太吃亏。
在单轨交通里平台运动相对可控(轨道约束),多帧对齐更容易。
time_lag 特征(Δt),让网络学会“动态/静态”区别收益
可参考来源(关键词)
如果你希望“立刻不掉精度/FPS”,可以先以 SECOND为主干(你现在106FPS且mAP最高),但把检测头逐步往 CenterPoint 风格靠拢:
这条路线的好处是:你从当前最优(SECOND)出发,不会一上来“换模型掉点”。
给你按“你能拿来改模块”的角度列(都避开你要求排除的作者线):
如果你愿意,我可以根据你 OpenPCDet 当前用的具体 config(yaml)(尤其是:out_size_factor / backbone stride / VFE类型 / target assigner / NMS配置 / 数据增强与DB采样)直接给你一份“按你数据范围和体素尺寸改好的配置改动清单”(逐项告诉你改哪几个字段、为什么、预期影响)。你把 yaml 贴出来即可。
CenterPoint的原始配置文件如下:我下来怎么改进呢,CLASS_NAMES: ['Drone', 'Plastic_sheet', 'Kite', 'Balloon', 'Bird']
DATA_CONFIG:
BASE_CONFIG: /media/jd/4997BB1603CFE2C4/lw/Openpcdet/tools/cfgs/dataset_configs/custom_dataset.yaml
MODEL:
NAME: CenterPoint
textVFE: NAME: MeanVFE BACKBONE_3D: NAME: VoxelResBackBone8x MAP_TO_BEV: NAME: HeightCompression NUM_BEV_FEATURES: 256 BACKBONE_2D: NAME: BaseBEVBackbone LAYER_NUMS: [5, 5] LAYER_STRIDES: [1, 2] NUM_FILTERS: [128, 256] UPSAMPLE_STRIDES: [1, 2] NUM_UPSAMPLE_FILTERS: [256, 256] DENSE_HEAD: NAME: CenterHead CLASS_AGNOSTIC: False CLASS_NAMES_EACH_HEAD: [ ['Drone', 'Plastic_sheet', 'Kite', 'Balloon', 'Bird'] ] SHARED_CONV_CHANNEL: 64 USE_BIAS_BEFORE_NORM: True # TODO NUM_HM_CONV: 2 # TODO SEPARATE_HEAD_CFG: HEAD_ORDER: ['center', 'center_z', 'dim', 'rot'] HEAD_DICT: { 'center': {'out_channels': 2, 'num_conv': 2}, 'center_z': {'out_channels': 1, 'num_conv': 2}, 'dim': {'out_channels': 3, 'num_conv': 2}, 'rot': {'out_channels': 2, 'num_conv': 2}, } TARGET_ASSIGNER_CONFIG: FEATURE_MAP_STRIDE: 8 NUM_MAX_OBJS: 500 GAUSSIAN_OVERLAP: 0.1 MIN_RADIUS: 2 DENSE_REG: 1 LOSS_CONFIG: LOSS_WEIGHTS: { 'cls_weight': 1.0, 'loc_weight': 1.0, 'code_weights': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] } POST_PROCESSING: SCORE_THRESH: 0.1 POST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -5.0, 75.2, 75.2, 3.0] MAX_OBJ_PER_SAMPLE: 500 NMS_CONFIG: MULTI_CLASSES_NMS: False NMS_TYPE: nms_gpu NMS_THRESH: 0.01 NMS_PRE_MAXSIZE: 4096 NMS_POST_MAXSIZE: 500 POST_PROCESSING: RECALL_THRESH_LIST: [0.3, 0.5, 0.7] OUTPUT_RAW_SCORE: False EVAL_METRIC: kitti
OPTIMIZATION:
BATCH_SIZE_PER_GPU: 4
NUM_EPOCHS: 80
textOPTIMIZER: adam_onecycle LR: 0.01 WEIGHT_DECAY: 0.01 MOMENTUM: 0.9 MOMS: [0.95, 0.85] PCT_START: 0.4 DIV_FACTOR: 10 DECAY_STEP_LIST: [35, 45] LR_DECAY: 0.1 LR_CLIP: 0.0000001 LR_WARMUP: False WARMUP_EPOCH: 1 GRAD_NORM_CLIP: 35
pythonimport math def gaussian_radius(det_size, min_overlap=0.7): height, width = det_size a1 = 1 b1 = (height + width) c1 = width * height * (1 - min_overlap) / (1 + min_overlap) sq1 = math.sqrt(b1 ** 2 - 4 * a1 * c1) r1 = (b1 + sq1) / 2 a2 = 4 b2 = 2 * (height + width) c2 = (1 - min_overlap) * width * height sq2 = math.sqrt(b2 ** 2 - 4 * a2 * c2) r2 = (b2 + sq2) / 2 a3 = 4 * min_overlap b3 = -2 * min_overlap * (height + width) c3 = (min_overlap - 1) * width * height sq3 = math.sqrt(b3 ** 2 - 4 * a3 * c3) r3 = (b3 + sq3) / 2 return min(r1, r2, r3) for overlap in [0.1,0.3,0.5,0.7,0.9]: print(overlap, gaussian_radius((2,2), overlap), gaussian_radius((3,6), overlap))
下面我按“你这份 CenterPoint 配置 + Tele-15 稀疏点云 + 小目标/不规则目标 + 单阶段/体素化/OpenPCDet 好改”给你一套从能立刻涨点的工程修正 → 到真正针对小目标的结构性改进的可执行路线。你可以按 S0→S3 逐步做消融,每一步都能在 OpenPCDet 里落地。
POST_CENTER_LIMIT_RANGE 跟你点云范围不一致(会直接裁掉 x>75.2 的预测)你场景是 X:[0,160],Y:[-20,20],Z:[-2,6],但现在是:
yamlPOST_CENTER_LIMIT_RANGE: [-75.2, -75.2, -5.0, 75.2, 75.2, 3.0]
这会把 x>75.2 的候选框直接过滤掉(你 160m 的一半都没了),小目标远距离更惨。
✅ 立刻改成(建议加一点 margin):
yamlPOST_CENTER_LIMIT_RANGE: [0.0, -20.0, -2.5, 160.0, 20.0, 6.5]
NMS_THRESH: 0.01 太极端(很容易误杀召回)IoU>0.01 就互相抑制,哪怕只轻微重叠也会杀掉;小目标框本来抖动大,召回会很受伤。
✅ 建议先改:
yamlMULTI_CLASSES_NMS: True NMS_THRESH: 0.1 # 先从 0.1 起步,后面再按类调
先做 S0,你很可能就会看到 mAP/召回明显回升(尤其是远距离类)。
你现在 FEATURE_MAP_STRIDE: 8,且 voxel_xy=0.1m
=> BEV 上一个格子代表 0.8m。
对 Bird/Kite/Plastic_sheet 这种小目标,中心热力图很容易“挤在一个格子里”,学不稳。
✅ 目标:做到 stride=4,让 BEV 网格变成 0.4m/格(小目标会明显好很多)。
把:
yamlTARGET_ASSIGNER_CONFIG: FEATURE_MAP_STRIDE: 8
改为:
yamlTARGET_ASSIGNER_CONFIG: FEATURE_MAP_STRIDE: 4
你当前 BACKBONE_3D: VoxelResBackBone8x,它天然是 8x 下采样。
你有两条可执行路径(选更省事的那条):
方案A(推荐,如果你版本里有):直接换 4x backbone
yamlBACKBONE_3D: NAME: VoxelResBackBone4x
方案B(如果没有 4x):复制 8x backbone 改成 4x(最小代码改动)
在 pcdet/models/backbones_3d/spconv_backbone.py 里复制一份 VoxelResBackBone8x 成 VoxelResBackBone4x:
核心思路:少做一次 stride=2 的下采样(原来 2×2×2=8,现在 2×2=4)。
这一步是你“小目标涨点幅度最大”的结构改动;FPS 会降一点,但你 3090 24G 通常扛得住。
MeanVFE 换成更强的 VFE(Tele-15 稀疏点特别需要)你现在:
yamlVFE: NAME: MeanVFE
MeanVFE 对“点很少的体素/远距离小目标”非常吃亏:信息一平均就没了。
✅ 建议换成更强的体素特征编码(OpenPCDet 常见可选项是 VoxelVFE 或带 PFN 的实现;你装的版本里叫什么就用什么,原则是别再用 mean)。
一个常见改法(示例,字段名以你仓库实现为准):
yamlVFE: NAME: VoxelVFE WITH_DISTANCE: True USE_ABSLOTE_XYZ: True NUM_FILTERS: [32, 128]
同时强烈建议把点特征里加上 distance(到雷达距离) 和相对坐标(Δx/Δy/Δz),对远距离小目标更稳。
你做完 S1(stride=4)再做 S2(强VFE),通常 Bird/Kite 这类会继续涨,而且涨得“更稳定”。
你现在 CenterHead 只有:
yamlHEAD_ORDER: ['center', 'center_z', 'dim', 'rot']
对于 Plastic_sheet / Kite 这种形状不规则、框漂移大的目标,“分类分数”经常不能代表“定位质量”,导致:
✅ 做法:在 head 里加一个 quality/iou 分支,推理时用:
final_score = cls_score * quality_score
yamlSEPARATE_HEAD_CFG: HEAD_ORDER: ['center', 'center_z', 'dim', 'rot', 'iou'] HEAD_DICT: ... 'iou': {'out_channels': 1, 'num_conv': 2}
pcdet/models/dense_heads/center_head.py:
这一步往往不是暴涨,但会让结果“更干净”:误检少、框更稳,尤其适合你“不规则目标”的诉求。
先做 S0 + S1(最建议的最短路径):
yaml# S0: 修正范围 + NMS POST_PROCESSING: SCORE_THRESH: 0.1 POST_CENTER_LIMIT_RANGE: [0.0, -20.0, -2.5, 160.0, 20.0, 6.5] NMS_CONFIG: MULTI_CLASSES_NMS: True NMS_TYPE: nms_gpu NMS_THRESH: 0.1 NMS_PRE_MAXSIZE: 4096 NMS_POST_MAXSIZE: 500 # S1: stride 4 DENSE_HEAD: TARGET_ASSIGNER_CONFIG: FEATURE_MAP_STRIDE: 4 GAUSSIAN_OVERLAP: 0.1 MIN_RADIUS: 1 # 小目标建议先从 1 起(你现在 2 可能太糊)
然后再做 S2:
yamlVFE: NAME: VoxelVFE WITH_DISTANCE: True USE_ABSLOTE_XYZ: True NUM_FILTERS: [32, 128]
这些在 custom_dataset.yaml 里的 DATA_AUGMENTOR 做:
DB Sampling(针对小类强过采样)
对 Bird/Kite/Plastic_sheet 提高采样概率(它们天然样本少、远距少)。
距离分桶重采样 / loss reweight
把 x 距离分桶(例如 0–40 / 40–80 / 80–160),强制训练看到足够多远距离小目标。
Tele-15 远距离点稀疏,这一招经常比堆网络更有效。
你把下面两样贴出来,我就能把 “你仓库里能用的 VFE/backbone 名称” 精确对上,给你一份更像“补丁说明”的修改表(改哪几行、在哪个文件):
custom_dataset.yaml 里关于 POINT_CLOUD_RANGE / VOXEL_SIZE / DATA_AUGMENTOR / MAX_NUMBER_OF_VOXELS / MAX_POINTS_PER_VOXEL 那段pcdet/models/backbones_3d/spconv_backbone.py 里有哪些 backbone 类名(看一下有没有现成 VoxelResBackBone4x)你不用重新解释场景,我已经按你“单轨悬挂、小目标、不规则、体素单阶段、OpenPCDet、Tele-15、range/voxel size”这个约束给你设计路线了。