You need to enable JavaScript to run this app. TensorFlow目标检测中基于检测分数的对象计数问题求助
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow目标检测中基于检测分数的对象计数问题求助

基于EdjeElectronics模板的目标检测计数恒为0排查方案

高频踩坑点按排查优先级排序

  • 输出张量维度未对齐:EdjeElectronics提供的检测模板中,模型输出的detection_scores默认带有1维的batch size维度(形状为[1, N],N为单帧最多检测的目标数),如果没有通过np.squeeze()去掉batch维就直接遍历,实际遍历的是二维数组的外层,根本拿不到具体的分数值,判断逻辑自然不会触发。
    常见错误写法:
    # 直接遍历带batch维度的scores数组
    for score in output_dict['detection_scores']:
        if 0.6 < score <= 1.0:
            current_count +=1
    
    修正方式:在遍历前先对输出做维度压缩,拿到单帧的一维分数数组。
  • 输出字段键名错配:模板中各输出张量的键名是固定的,如果写计数逻辑时误将detection_boxes(坐标值,数值范围通常为0~图像尺寸,远大于1)、detection_classes(类别id,为整数)等字段当作detection_scores遍历,所有判断都不会满足分数区间要求,计数自然恒为0。
  • 判断逻辑写反或符号错误:如果分数比较的符号写反(比如将score >0.6写为score <0.6),就会只统计低于阈值的无效检测项;由于模板中无实际检测结果的填充项分数固定为0,最终累加得到的有效计数自然为0。
  • 张量类型比较失效:如果直接对TensorFlow的EagerTensor/会话返回的张量值做数值比较,没有转换为Python原生浮点数,部分旧版本TensorFlow环境下会出现布尔判断失效的问题,导致累加逻辑永远不执行。
  • 代码执行顺序错位:将计数累加循环放在模型推理之前,每帧运行时拿到的始终是上一帧的空输出字典,有效检测数为0,无法触发累加。
  • 变量作用域错误:如果将current_count的变量定义放在了可视化绘制函数的内部,外部循环累加的current_count和画面上绘制的current_count不是同一个变量,就会出现内部循环累加正常、但画面上始终显示初始值0的情况。

可直接参考的正确计数实现

结合模板的常用流程,计数逻辑写在可视化代码之前即可:

# 每帧检测执行完成、拿到output_dict输出字典后
current_count = 0  # 每帧计数前先清零,避免跨帧累计
# 压缩batch维度,拿到单帧检测分数
scores = np.squeeze(output_dict['detection_scores'])
# 遍历所有检测项
for score in scores:
    score_val = float(score) # 转成原生浮点数避免类型问题
    if 0.6 < score_val <= 1.0:
        current_count += 1
# 后续执行可视化逻辑,把current_count绘制到画面上

快速定位调试方法

在计数循环中临时打印调试信息,快速定位问题:

  • 打印遍历拿到的score值和类型,确认拿到的是0~1区间的分数而非其他字段值
  • 打印判断条件的返回结果,确认当score大于0.6时条件是否能被正确判定为True
  • 打印current_count在累加前后的数值,确认变量是否被意外重置

内容的提问来源于stack exchange,提问作者darkKnight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 07:06:03