TensorFlow2 Webcam自定义目标检测模型分类别计数集成问题求助
按类别实时计数功能的改造实现
你当前的代码已经完整拿到了所有检测环节的核心数据,不需要强行适配第三方计数库,仅需在现有流程上补充少量逻辑,就能匹配你当前的TensorFlow 2.4.1、Python 3.7运行环境,实现每帧按类别统计检测数量的效果。
前期冗余清理
首先删掉代码开头两处无用的导入:
from api import object_counting_apifrom utils import backbone
这两行对应的依赖和你当前的官方检测流程无关,留着反而容易触发导入报错。
核心改造逻辑(对应run_inference函数内部)
在调用run_inference_for_single_image拿到单帧推理结果output_dict之后,按以下步骤补充逻辑:
- 增加检测置信度过滤,剔除误检的低分数结果,避免计数不准
一般设置0.5的分数阈值即可,可根据自己模型的实际检测效果调整。 - 遍历通过过滤条件的有效检测结果,按类别名称累计数量
借助你已经加载好的category_index,直接拿到每个检测结果对应的类别名,无需额外查标签映射。 - 将统计好的类别计数,逐行绘制在画面左上角
使用OpenCV内置的文字绘制函数,不会遮挡中间区域的检测框。
改后对应位置的参考代码
def run_inference(model, category_index, cap): min_score_thresh = 0.5 # 可根据模型实际效果调整的置信度阈值 while True: ret, image_np = cap.read() if not ret: break # 原有推理逻辑不变 output_dict = run_inference_for_single_image(model, image_np) # 新增:初始化类计数字典 class_count = {} # 新增:遍历有效检测结果做计数 for score, cls_id in zip(output_dict['detection_scores'], output_dict['detection_classes']): if score >= min_score_thresh: cls_name = category_index[cls_id]['name'] class_count[cls_name] = class_count.get(cls_name, 0) + 1 # 原有检测框可视化逻辑不变 vis_util.visualize_boxes_and_labels_on_image_array( image_np, output_dict['detection_boxes'], output_dict['detection_classes'], output_dict['detection_scores'], category_index, instance_masks=output_dict.get('detection_masks_reframed', None), use_normalized_coordinates=True, line_thickness=8) # 新增:在画面左上角绘制计数结果 y_position = 30 for cls_name, count in class_count.items(): cv2.putText( image_np, f"{cls_name}: {count}", (20, y_position), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2 ) y_position += 35 # 逐行下移,避免文字重叠 # 原有窗口展示逻辑不变 cv2.imshow('object_detection', cv2.resize(image_np, (1920, 1080))) if cv2.waitKey(25) & 0xFF == ord('q'): cap.release() cv2.destroyAllWindows() break
补充说明
- 上述代码实现的是当前帧画面内的实时计数,也就是每帧统计一次画面里能看到的某类物体总数,完全匹配你一开始的需求。
- 之前尝试对接的第三方计数库,核心能力是跨帧跟踪(即同一个运动物体在连续画面里移动时不会被重复计数),如果后续需要实现这种“进出画面一次只计数一次”的效果,再叠加对应的跟踪逻辑即可,不需要一开始就把整套依赖拉进来适配。
内容的提问来源于stack exchange,提问作者E Koziko
相关产品推荐
相关产品推荐

