Tensorflow Object Detection API 如何将检测到的类别输出到终端
提取检测类别文本并输出到终端的实现方法
这套实现不需要额外引入新依赖,你现有代码里的组件已经足够完成类名字符串的提取:存了类别id、置信度的detections字典,以及把类别id映射为人类可读名称的category_index字典,只需要按照可视化时的相同筛选规则遍历检测结果,就能把对应文本输出到终端。
操作注意事项
- 打印内容的筛选阈值、最大输出检测数要和可视化设置完全对齐,保证终端输出和图上绘制的检测框一一对应,不会出现图上没画的目标却在终端输出的错位情况
- 遍历检测结果时必须补上原代码定义的
label_id_offset = 1,因为API返回的检测类id是从0开始计数的,而category_index中的id从1开始计数,偏移量不匹配会直接取不到正确的类名 - TensorFlow Object Detection API返回的检测结果默认按置信度从高到低排序,遇到第一个低于置信度阈值的结果就可以终止遍历,不需要走完所有检测项,能减少实时检测时的无效运算
可直接复用的代码片段
把下面这段代码插到原代码中viz_utils.visualize_boxes_and_labels_on_image_array调用完成的位置即可:
# 和可视化保持一致的筛选参数 min_score_thresh = 0.5 max_boxes_to_draw = 3 frame_detect_results = [] # 遍历有效检测范围 for idx in range(min(num_detections, max_boxes_to_draw)): score = detections['detection_scores'][idx] # 低于阈值直接终止遍历 if score < min_score_thresh: break # 计算真实类别id,匹配类名字符串 real_class_id = detections['detection_classes'][idx] + label_id_offset class_name = category_index[real_class_id]['name'] frame_detect_results.append(f"{class_name}(置信度{score:.2f})") # 输出到终端 if frame_detect_results: print("当前检测到目标:" + "、".join(frame_detect_results)) else: print("当前帧无满足置信度要求的检测目标")
实用优化技巧
实时摄像头检测时,逐帧打印会导致终端滚动速度极快,可以简单加个帧计数做节流,比如每处理15帧再打印一次结果,避免输出内容过于杂乱看不清;如果需要把检测到的类别字符串传给其他后续逻辑使用,直接保存上面代码里的frame_detect_results列表即可,不需要额外做格式转换。
内容的提问来源于stack exchange,提问作者Kshitij Vijayvergiya
相关产品推荐
相关产品推荐

