TensorFlow目标检测中len()返回检测对象数量错误如何解决?
问题原因
TensorFlow 官方目标检测模型默认固定返回100个检测候选结果,output_dict["detection_scores"] 存储的就是这100个候选对应的置信度得分,无论有效检测的实际数量多少,这个数组的长度都是固定值100。
你看到可视化结果里的框数量远少于100,是因为 visualize_boxes_and_labels_on_image_array 方法默认内置了0.5的置信度阈值,低于这个阈值的候选框不会被绘制,但这些低置信度的结果依然保留在输出数组中,所以直接取数组长度统计数量必然得到100的结果。
解决方案
你只需要增加置信度过滤逻辑,统计高于阈值的有效检测结果即可,和可视化默认阈值保持一致的话,统计的数量就会和页面上显示的框数量完全匹配,代码修改如下:
# 置信度阈值可根据业务需求自行调整,默认和可视化阈值对齐设为0.5 SCORE_THRESHOLD = 0.5 # 过滤后统计有效检测数 valid_obj_count = sum(score > SCORE_THRESHOLD for score in output_dict["detection_scores"]) print("Found %d objects." % valid_obj_count)
如果使用numpy写法性能更高:
import numpy as np SCORE_THRESHOLD = 0.5 valid_obj_count = np.sum(output_dict["detection_scores"] > SCORE_THRESHOLD) print("Found %d objects." % valid_obj_count)
可选调整(非必需)
如果需要修改模型默认返回的候选结果总数量,可以在模型训练的pipeline配置文件中修改 max_total_detections 参数,重新导出模型后即可生效,一般场景下不需要做这个调整,仅靠阈值过滤即可满足需求。
内容的提问来源于stack exchange,提问作者porschewitz
相关产品推荐
相关产品推荐

