如何基于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. 物体检测实现路径
如果你的场景物体形态多变、遮挡多,更推荐用这个方案:
- 用TensorFlow实现的YOLO/SSD/Faster RCNN等检测模型,训练通用物体检测能力,只需要标注所有物体的 bounding box 即可,不需要单独标注分类和计数标签
- 推理时先得到所有检测框的坐标和置信度,过滤低置信度结果后,判断每个检测框的中心点属于左半图还是右半图,分别统计左右侧的物体数量
- 根据统计结果直接生成分类标签:左侧计数为0则为左侧无物体,右侧计数为0则为右侧无物体,两者都大于0则为两侧均有物体
该方案的可解释性更强,新增物体类型不需要重新训练分类逻辑,只要检测模型能识别对应物体即可。
内容的提问来源于stack exchange,提问作者Ambreen Khan
相关产品推荐
相关产品推荐

