如何向TensorFlow CNN同时输入图像与数值数据完成分类训练及推理
方案可行性确认
你说的需求完全可以实现,属于典型的多模态输入CNN分类场景,目前RGBD图像分类、工业视觉检测等场景已经有大量成熟落地案例。
核心实现步骤
数据预处理
- 先完成RGB图像和深度图的空间对齐,确保两者分辨率、对应像素的空间位置完全匹配
- 深度图作为单通道数据处理,需做归一化操作,把距离数值映射到和RGB图像一致的01或者-11区间,避免单类输入尺度过大主导梯度更新
- 你可以选择两种输入组织方式:
- 简单方案:直接把深度图和RGB图像在通道维度拼接,变成4通道输入喂给普通单输入CNN,适合小数据集快速验证效果
- 效果更优方案:两类数据作为独立输入分开走特征提取分支,后续再做特征融合,更适配两类数据特征分布差异大的场景
模型构建
用TensorFlow Keras的函数式API即可快速搭建多输入模型,核心代码逻辑参考:
import tensorflow as tf # 定义两个输入层,尺寸按你的实际数据调整 rgb_input = tf.keras.Input(shape=(224, 224, 3), name="rgb_input") depth_input = tf.keras.Input(shape=(224, 224, 1), name="depth_input") # 分别搭建两个分支的特征提取网络,也可以用ResNet、MobileNet等预训练backbone做迁移学习 rgb_feature = tf.keras.layers.Conv2D(32, (3,3), activation='relu')(rgb_input) rgb_feature = tf.keras.layers.MaxPooling2D()(rgb_feature) rgb_feature = tf.keras.layers.Flatten()(rgb_feature) depth_feature = tf.keras.layers.Conv2D(32, (3,3), activation='relu')(depth_input) depth_feature = tf.keras.layers.MaxPooling2D()(depth_feature) depth_feature = tf.keras.layers.Flatten()(depth_feature) # 融合两类特征 concat_feature = tf.keras.layers.Concatenate()([rgb_feature, depth_feature]) # 接分类头输出结果 output = tf.keras.layers.Dense(128, activation='relu')(concat_feature) output = tf.keras.layers.Dense(你的分类类别数, activation='softmax')(output) # 实例化模型 model = tf.keras.Model(inputs=[rgb_input, depth_input], outputs=output) # 编译模型,和普通单输入模型逻辑一致 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
训练与推理
- 训练时按输入层的name传入字典格式的数据集即可:
model.fit({"rgb_input": 训练集RGB数据, "depth_input": 训练集深度数据}, y=训练集标签, epochs=10, batch_size=32) - 推理逻辑和训练完全对齐,把预处理好的待推理RGB、深度数据按同样格式传入
model.predict()就能拿到分类结果。
可选优化方向
- 若深度图存在噪声、空值,可先做中值滤波、邻域补全等预处理再输入,能明显提升模型鲁棒性
- 特征融合阶段可加入通道注意力机制,让模型自动分配两类输入的权重,比直接拼接的效果更好
- 数据集规模较小时,可以先分别在公开RGB数据集、深度数据集上预训练两个分支的backbone,再做下游任务微调,能大幅降低过拟合风险
内容的提问来源于stack exchange,提问作者Fin M.
相关产品推荐
相关产品推荐

