【MATLAB第45期】基于MATLAB的深度学习SqueezeNet卷积神经网络混凝土裂纹图像识别预测模型
引言
该文章展示如何微调名为SqueezeNet的预训练深度卷积网络,以执行裂纹图像分类预测。并使用一种称为Grad-CAM的技术来解释和分析分类输出。文章使用L.Zhang介绍的混凝土裂缝图像数据集。
SqueezeNet卷积神经网络是Matlab官方支持的网络中最小的预训练网络。
SqueezeNet已经对超过一百万张图像进行了训练,可以将图像分类为1000个对象类别(如键盘、咖啡杯、铅笔和许多动物)。该网络已经为广泛的图像学习了丰富的特征表示。该网络将图像作为输入,并输出图像中对象的标签以及每个对象类别的概率。
常见的还有迁移学习,通常用于深度学习应用。可以把一个预先训练好的网络作为学习新任务的起点。使用迁移学习对网络进行微调通常比从头开始训练具有随机初始化权重的网络更快、更容易。可以使用少量的训练图像将学习到的功能快速转移到新任务中。
本文以SqueezeNet卷积神经网络为例。
数据下载链接:https://data.mendeley.com/datasets/5y9wdsg2zt/1
一、加载数据
首先,请从上述链接下载图像。然后将其解压缩,命名为Concrete Crack Images for Classification。请在确认文件在您的当前目录中后运行此代码,如下所示。
clear;clc;close all
imds = imageDatastore('Concrete Crack Images for Classification','IncludeSubfolders',true, 'LabelSource','foldernames');
numExample=16;
idx = randperm(numel(imds.Files),numExample);
for i=1:numExampleI=readimage(imds,idx(i));I_tile{i}=insertText(I,[1,1],string(imds.Labels(idx(i))),'FontSize',20);
end
I_tile = imtile(I_tile);
figure;imshow(I_tile);title('examples of the dataset')
使用imageDatastore功能存储带有标签信息的图像。标签信息是根据文件“Concrete Crack Images for Classification”中的文件夹名称识别的。
该数据集包含正常(负)和裂纹图像(正)。数据是从各个 METU 校园建筑收集的。
将数据集分为两部分,即负裂纹图像和正裂纹图像,以进行图像分类。每个类有 20000 张图像,总共 40000 张 227 x 227 像素、RGB 通道的图像。该数据集是根据Zhang等人(2016)提出的方法从458张高分辨率图像(4032x3024像素)生成的。
高分辨率图像在表面光洁度和照明条件方面存在差异。不应用随机旋转或翻转方面的数据增强。
二、分割图像
将数据划分为训练、验证和测试数据集。函数splitEachLabel将图像数据存储拆分为两个新的数据存储。该数据集包含20k个正常图像和20k个裂纹图像。由于数据集有许多图像,因此需要一些时间进行训练。
为了方便演示,您可以将训练图像的比例设置为较低,例如0.01,以使图像数量非常少。imds之后的比率表示确定训练、验证和测试数据的图像数量的比率。
例如,如果比率为0.01,则图像数量为40k*0.01=400。
[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.01,0.01,0.01,'randomized');
计算训练数据集中的图像数量。确认数字是否符合上述预期。
numTrainImages = numel(imdsTrain.Labels)
三、加载预训练网络
net = squeezenet;
使用analyzeNetwork可以显示网络体系结构的交互式可视化以及有关网络层的详细信息。
analyzeNetwork(net)
第一层,即图像输入层,需要大小为227×227×3的输入图像,其中3是颜色通道的数量。
inputSize = net.Layers(1).InputSize;
四、替换最终图层
由于SqueezeNet的原始版本是一个可容纳1000个类的网络,必须将其调整为正常/裂纹分类(2类)。从经过训练的网络中提取层图。
lgraph = layerGraph(net);
在大多数网络中,具有可学习权重的最后一层是完全连接层。在一些网络中,例如SqueezeNet,最后一个可学习层是1乘1的卷积层。在这种情况下,在softmax层之前添加了一个完全连接的层。
numClasses = numel(categories(imdsTrain.Labels))
五、数据增强
网络需要大小为227×227×3的输入图像,但是图像数据存储中的图像具有不同的大小。使用增强图像数据存储自动调整训练图像的大小。指定要在训练图像上执行的其他增强操作:
(1)沿垂直轴随机翻转训练图像,并在水平和垂直方向上随机平移最多30个像素。
(2)数据增强有助于防止网络过拟合和记忆训练图像的确切细节。
pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...'RandXReflection',true, ...'RandXTranslation',pixelRange, ...'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...'DataAugmentation',imageAugmenter);
要在不执行进一步数据扩充的情况下自动调整验证和测试图像的大小,请使用扩充图像数据存储,而不指定任何额外的预处理操作。
六、训练网络
指定参数选项。使用adam优化器。
options = trainingOptions('adam', ...'MiniBatchSize',100, ...'MaxEpochs',5, ...'InitialLearnRate',2e-4, ...'Shuffle','every-epoch', ...'ValidationData',augimdsValidation, ...'ExecutionEnvironment',"auto", ...'ValidationFrequency',30, ...'Verbose',false, ...'Plots','training-progress');
网络在GPU上进行训练(如果可用)。它由ExecutionEnvironment指定,如上所述为“auto”。
对测试图像进行分类以计算分类精度,使用微调网络对正常图像和裂纹图像的测试图像进行分类。
[YPred,scores] = classify(netTransfer,augimdsTest);
显示四个样本验证图像及其预测标签。计算验证集上的分类精度。准确度是网络正确预测的标签的分数。
YTest = imdsTest.Labels;
accuracy = mean(YPred == YTest)
figure()plot(YPred)hold onplot(YTest)legend('预测值','实测值')
xlabel('测试样本')
正确率:accuracy = 0.9925
七、结果分析
grad-cam揭示深度学习决策背后的原因。从图层图创建一个dlnetwork。
dlnet = dlnetwork(lgraph);
指定Grad-cam的名称
softmaxName = 'softmax_layer';
featureLayerName = 'relu_conv10';
dispNum控制要使用grad-cam的图像数量,如设为12。使用自动区分,请将sherlock图像转换为dlarray。
dlImg = dlarray(single(img),'SSC');
通过调用gradcam函数上的dlfeval来计算图像的Grad-CAM梯度。将gradient map的大小调整为SqueezeNet图像的大小,并将分数缩放到适当的级别以进行显示。
gradcamMap = sum(featureMap .* sum(dScoresdMap, [1 2]), 3);
gradcamMap = extractdata(gradcamMap);
gradcamMap = rescale(gradcamMap);
imagesc(imresize(gradcamMap,inputSize(1:2) ,'Method', 'bicubic'),'AlphaData',0.5;
使用“AlphaData”值0.5在图像顶部显示gradCAM级别。颜色图的深蓝色值最低,深红色值最高。这种显示分类重要性的可视化也可以在训练过程中进行。可以确认,网络逐步学习了用于分类的良好特征。
参考文献:
[1] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. “SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size.” arXiv preprint arXiv:1602.07360 (2016).
[2] Matlab Documentation: Train Deep Learning Network to Classify New Images
[3] Matlab Documentation: Grad-CAM Reveals the Why Behind Deep Learning Decisions
[4] Zhang, Lei, et al. “Road crack detection using deep convolutional neural network.” 2016 IEEE international conference on image processing (ICIP). IEEE, 2016.
八、代码获取
后台私信回复“45期”即可获取下载链接。