当前位置: 首页 > news >正文

BEVFormer报错(预测场景与真值场景的sample_token不匹配)

在运行test.py时报错:

BEVFormer/projects/mmdet3d_plugin/datasets/nuscnes_eval.py: init()函数报错

assert set(self.pred_boxes.sample_tokens) == set(self.gt_boxes.sample_tokens), \
    "Samples in split doesn't match samples in predictions."

一、评估流程:

整体流程:

数据预处理:CustomNuScenesDataset (projects/mmdet3d_plugin/datasets/nuscenes_dataset.py)加载多帧数据,支持点云和图像的联合输入,增加了夜晚场景的专项处理。
评估流程:NuScenesEval_custom (projects/mmdet3d_plugin/datasets/nuscnes_eval.py) 提供灵活的评估框架,支持按可见性、场景重叠等条件过滤数据,计算指标并可视化结果。

  • results_nusc.json 加载检测结果,包含6019个样本
  • 通过 get_night_scenes() 获取val子集中的15个夜晚场景
  • 过滤检测结果,只保留这15个夜晚场景的602帧数据
  • 将过滤后的结果保存为新的json文件:filtered_results_nusc.json
  • 使用 NuScenesEval_custom 进行评估:
    • 加载真值(GT)数据
    • 计算检测指标(mAP、NDS等)
    • 生成评估报告

results_nusc.json 文件中的内容

test/bevformer_base/Fri_Mar_21_01_24_36_2025/pts_bbox/results_nusc.json:

{
    "meta": {
        "use_lidar": false,
        "use_camera": true,
        "use_radar": false,
        "use_map": false,
        "use_external": true
    },
    "results": {
        "sample_token_1": [
            {
                "sample_token": "xxx",
                "translation": [x, y, z],
                "size": [l, w, h],
                "rotation": [w, x, y, z],
                "velocity": [vx, vy],
                "detection_name": "car",
                "detection_score": 0.9,
                "attribute_name": "vehicle.parked"
            },
            // ... 更多检测结果
        ],
        // ... 更多样本
    }
}

二、错误原因分析

NuScenesEval_custom load_gt函数加载了整个 eval_set**(这里是 val)**的 ground truth 数据,而不是只加载与过滤后预测结果对应的样本
结果是预测数据只有 602 个样本的 token,而 ground truth 有 6019 个样本的 token,导致断言失败。

三、解决方案

修改 NuScenesEval_custom 的初始化逻辑,确保 ground truth 只加载与预测结果匹配的样本 token,而不是整个 eval_set 的所有样本。可以通过以下步骤实现:

  1. 获取预测结果的样本 token: 在加载预测结果后,提取 self.pred_boxes.sample_tokens
  2. 过滤Ground Truth: 修改load_gt调用,使用预测结果的样本 token 集合来过滤 ground truth 数据。
  3. 更新 _evaluate_single: 将过滤后的样本 token 传递给 NuScenesEval_custom,确保评估只针对这602 个样本。

在projects/mmdet3d_plugin/datasets/nuscnes_eval.py中的__init__中加入:
        # 只加载与预测结果匹配的 ground truth
        pred_sample_tokens = set(self.pred_boxes.sample_tokens)
        if verbose:
            print(f"Loading ground truth for {len(pred_sample_tokens)} predicted samples...")
        self.gt_boxes = load_gt(self.nusc, self.eval_set, DetectionBox_modified, verbose=verbose)
        self.gt_boxes = filter_by_sample_token(self.gt_boxes, pred_sample_tokens, verbose=verbose)
        # 验证样本 token 匹配
        assert set(self.pred_boxes.sample_tokens) == set(self.gt_boxes.sample_tokens), \
            "Samples in split don't match samples in predictions after filtering."
http://www.dtcms.com/a/84907.html

相关文章:

  • springCloud集成tdengine(原生和mapper方式) 其一
  • Springboot之RequestAttributes学习笔记
  • 使用selenium来获取数据集
  • 在Ubuntu 22.04 中安装Docker的详细指南
  • elasticsearch 通用笔记
  • windows 安装 Elasticsearch
  • 六、GPIO中断控制器(1)—— pcf8575
  • CSRF跨站请求伪造(Cross - Site Request Forgery)
  • 蓝桥杯 劲舞团
  • 简要分析IPPROTO_TCP参数
  • 解决Selenium滑动页面到指定元素,点击失效的问题
  • Swagger2 使用教程
  • 为什么 Redis 选择单线程模型?
  • 【3-22 list 详解STL C++ 】
  • RAG知识库的数据方案:图数据库、向量数据库和知识图谱怎么选?
  • React Native进阶(六十):webview实现屏蔽所嵌套web页面异常弹窗
  • 数据通信与计算机网络——网络模型
  • AI 代理错误的复合效应
  • 如何在MySQL中创建定时任务?
  • Web3网络生态中数据保护合规性分析
  • Redis主从复制实验
  • STM32定时器-01定时器概述
  • vue如何获取 sessionStorage的值,获取token
  • 全文 - MLIR: A Compiler Infrastructure for the End of Moore’s Law
  • 【并发编程】聊聊forkJoin的原理和最佳实践
  • 融合与创新:人工智能、数字化转型及计算机科学在高中教育管理中的应用探索
  • 六西格玛遇上Python:统计学的高效实践场
  • 平台与架构:深度解析与开发实践
  • ccfcsp1901线性分类器
  • MAC+PHY 的硬件连接