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
相关产品推荐
相关产品推荐

