You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于TensorFlow实现偏侧忽略检测的图像分类与物体计数

基于TensorFlow实现偏侧忽略检测图像分类模型的落地方案

你的需求可以拆为两个核心子任务:3分类结果输出、左右区域物体计数,不用强行做端到端单输出结构,拆分实现的可控性和准确率都会更高,以下是具体实现步骤:

1. 方案选型

你可以根据自己的标注成本选择两种实现路径:

  • 路径1:多任务端到端模型,同时输出分类结果和计数结果,适合标注资源少的场景
  • 路径2:先做通用物体检测,再基于检测框位置统计分类,适合物体形态多变、后续可能新增类别需求的场景

2. 多任务端到端实现步骤

2.1 数据集准备

  • 标注规则:每张图需要标注3个字段:左侧物体数量、右侧物体数量、分类标签(0=左侧无物体,1=右侧无物体,2=两侧均有物体)
  • 预处理规则:统一将图像resize到224224/448448尺寸,归一化到[-1,1]或[0,1]区间;如果数据集量小可以加随机亮度、缩放等增强,注意做水平翻转时要同步交换左右侧的计数和分类标注
  • 左右区域划分:明确定义划分规则,比如图像宽度的1/2为界,x坐标小于中点的属于左侧,大于等于的属于右侧,标注和推理必须用同一规则

2.2 模型结构搭建

用成熟的视觉Backbone做特征提取,加两个并行输出头即可,核心代码示例:

import tensorflow as tf
from tensorflow.keras import layers, models

# 加载预训练Backbone,可根据精度需求换成ResNet50、EfficientNet等
backbone = tf.keras.applications.MobileNetV2(
    input_shape=(224, 224, 3),
    include_top=False,
    weights='imagenet'
)
# 训练策略:先冻结Backbone训输出头,再解冻整体微调
backbone.trainable = False

inputs = layers.Input(shape=(224, 224, 3))
# 适配Backbone的预处理逻辑,用其他Backbone要换成对应预处理函数
x = tf.keras.applications.mobilenet_v2.preprocess_input(inputs)
x = backbone(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)

# 分类头:输出3类概率
class_output = layers.Dense(3, activation='softmax', name='class_output')(x)
# 计数头:如果单侧物体数不超过10,建议换成分类头(输出11类对应0-10个物体),准确率高于回归
count_output = layers.Dense(2, activation='linear', name='count_output')(x)

model = models.Model(inputs=inputs, outputs=[class_output, count_output])

2.3 训练配置

多任务损失采用加权求和即可,配置示例:

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
    loss={
        "class_output": "sparse_categorical_crossentropy",
        "count_output": "mse" # 计数头如果换为分类,这里换成对应交叉熵损失
    },
    loss_weights={
        "class_output": 1.0,
        "count_output": 0.5 # 可根据实际效果调整两个任务的权重
    },
    metrics={
        "class_output": "accuracy",
        "count_output": "mae"
    }
)

训练时输入为图像数组,标签传入{"class_output": 分类标签数组, "count_output": 左右计数二维数组}即可。

2.4 推理逻辑

推理时直接取两个头的输出处理:

  • 分类结果:取class_output概率最大值的索引,对应三类结果
  • 计数结果:对count_output的两个输出值取整,得到左右两侧的物体数量

3. 物体检测实现路径

如果你的场景物体形态多变、遮挡多,更推荐用这个方案:

  1. 用TensorFlow实现的YOLO/SSD/Faster RCNN等检测模型,训练通用物体检测能力,只需要标注所有物体的 bounding box 即可,不需要单独标注分类和计数标签
  2. 推理时先得到所有检测框的坐标和置信度,过滤低置信度结果后,判断每个检测框的中心点属于左半图还是右半图,分别统计左右侧的物体数量
  3. 根据统计结果直接生成分类标签:左侧计数为0则为左侧无物体,右侧计数为0则为右侧无物体,两者都大于0则为两侧均有物体

该方案的可解释性更强,新增物体类型不需要重新训练分类逻辑,只要检测模型能识别对应物体即可。

内容的提问来源于stack exchange,提问作者Ambreen Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:24:04