项目:基于多输入卷积神经网络的图像分类系统
项目简介
本项目实现了一个基于MATLAB深度学习工具箱的多输入卷积神经网络(Multi-Input CNN)。旨在演示如何处理非单一来源的数据输入,通过构建双流并行网络分别提取特征,并在深层进行融合以完成最终的分类任务。
项目以经典的手写数字识别为场景,创新性地将单一图像数据在预处理阶段分割为“上半部分”和“下半部分”两个独立的视图。这两个部分作为独立的输入流进入网络,模拟了多模态或多视角融合的深度学习应用场景。
功能特性
- 多视角数据分割:自动将28x28的灰度图像从中间水平分割,生成用于模拟双输入的两个14x28图像片段。
- 组合数据存储(Combined Datastore):使用了MATLAB的Datastore机制,特别是
combine方法,实现了多输入数据与标签的同步读取和批处理。 - LayerGraph网络架构:构建了具有分支结构的DAG(有向无环图)网络,而非传统的串行网络。
- 双流特征提取:网络包含两个独立的卷积分支,分别负责学习图像上半部和下半部的局部特征。
- 特征融合机制:利用拼接层(Concatenation Layer)在全连接层之后将两个分支的高级特征向量进行合并。
- 可视化结果验证:训练完成后,不仅输出准确率,还提供直观的可视化窗口,展示重组后的图像、预测标签、真实标签以及分割线示意。
系统要求
- MATLAB (建议R2019b或更高版本)
- Deep Learning Toolbox (深度学习工具箱)
- Parallel Computing Toolbox (可选,用于加速训练)
详细功能与实现逻辑
本项目代码主要分为数据准备、网络构建、模型训练和结果评估四个核心模块,具体逻辑如下:
1. 数据加载与预处理
- 数据源:使用MATLAB内置的
digitTrain4DArrayData数据集,无需外部下载,包含5000张手写数字图像。 - 数据集划分:实现了随机打乱算法,按80%训练集和20%测试集的比例划分数据,并设置了随机种子(seed 42)以确保实验结果的可复现性。
- 图像切分:这是本项目的核心预处理步骤。系统将每张(28, 28, 1)的图像在第14行和第15行之间进行物理切割,生成两个(14, 28, 1)的子图像张量,分别代表Top视角和Bottom视角。
2. 构建多输入数据管道
- 为了向网络同时馈送两组图像数据和一组标签,代码分别创建了对应的
arrayDatastore。 - 使用了
combine函数将“上半部图像数据”、“下半部图像数据”和“分类标签”三个数据流合并为一个统一的对象。这种处理方式确保了在训练迭代过程中,多源输入数据与标签的一一对应关系。
3. 多输入CNN架构设计
网络不使用简单的
SeriesNetwork,而是基于
LayerGraph构建,结构如下:
*
分支1 (Top Branch):包含输入层、两个卷积层(Convolution2D)、批量归一化(BatchNorm)、ReLU激活函数以及最大池化层(MaxPooling)。末端为一个全连接层(FC),输出32维特征向量。
*
分支2 (Bottom Branch):结构与分支1完全相同,用于独立处理下半部分图像,同样输出32维特征向量。
* 使用
concatenationLayer,沿特征维度将两个分支的输出(32+32)拼接,形成一个64维的综合特征向量。这模拟了将不同视角信息整合的过程。
- 分类头 (Classification Head):
* 融合后的特征进入公共的全连接层、ReLU激活层和Dropout层(用于防止过拟合)。
* 最后通过Softmax层和分类输出层计算10个数字类别的概率分布。
4. 模型训练与评估
- 使用随机梯度下降(SGDM)优化器进行训练。
- 配置了实时训练曲线绘制,可动态观察Loss和Accuracy的变化。
- 通过
trainNetwork函数,利用组合好的Datastore自动适配网络的多输入层接口进行训练。 - 训练结束后,使用保留的测试集进行预测,并计算全局准确率。
5. 结果可视化
- 实现了一个自定义的可视化函数,随机抽取测试集样本。
- 将分割的图像在视觉上重新拼接,并在接缝处绘制黄色虚线以示区分。
- 根据预测结果自动标注颜色:绿色代表预测正确,红色代表预测错误,并显示具体的预测值与真实值。
关键算法与技术细节
- LayerGraph 连接管理:代码展示了如何使用
addLayers和connectLayers手动编织复杂的网络拓扑,这对于非串行网络(如ResNet、Inception或多输入网络)是必须的技能。 - 维度匹配:在构建卷积层时,使用了
Padding='same'以保持空间维度在卷积操作中的稳定性,确保经过池化后的特征图尺寸符合预期。 - Datastore 迭代维度:在创建
arrayDatastore时,明确指定了IterationDimension,这对于处理4D图像数组(Height x Width x Channels x Samples)至关重要,确保数据按样本被正确切分和读取。
使用方法
直接运行主脚本即可启动全流程:
- 系统将自动清理环境并加载数据。
- 控制台将输出数据处理进度。
- 弹出的训练窗口将展示深度学习训练过程。
- 训练结束后,控制台输出最终测试准确率。
- 系统将弹出一个新的图形窗口,展示模型对部分测试样本的实际预测效果及图像分割示意。