You need to enable JavaScript to run this app. TensorFlow2 Webcam自定义目标检测模型分类别计数集成问题求助
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow2 Webcam自定义目标检测模型分类别计数集成问题求助

按类别实时计数功能的改造实现

你当前的代码已经完整拿到了所有检测环节的核心数据,不需要强行适配第三方计数库,仅需在现有流程上补充少量逻辑,就能匹配你当前的TensorFlow 2.4.1、Python 3.7运行环境,实现每帧按类别统计检测数量的效果。

前期冗余清理

首先删掉代码开头两处无用的导入:

  • from api import object_counting_api
  • from utils import backbone
    这两行对应的依赖和你当前的官方检测流程无关,留着反而容易触发导入报错。

核心改造逻辑(对应run_inference函数内部)

在调用run_inference_for_single_image拿到单帧推理结果output_dict之后,按以下步骤补充逻辑:

  1. 增加检测置信度过滤,剔除误检的低分数结果,避免计数不准
    一般设置0.5的分数阈值即可,可根据自己模型的实际检测效果调整。
  2. 遍历通过过滤条件的有效检测结果,按类别名称累计数量
    借助你已经加载好的category_index,直接拿到每个检测结果对应的类别名,无需额外查标签映射。
  3. 将统计好的类别计数,逐行绘制在画面左上角
    使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 04:24:04