【MATLAB第45期】基于MATLAB的深度学习SqueezeNet卷积神经网络混凝土裂纹图像识别预测模型

本文涉及的产品
图像搜索,7款服务类型 1个月
简介: 【MATLAB第45期】基于MATLAB的深度学习SqueezeNet卷积神经网络混凝土裂纹图像识别预测模型

【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:numExample
    I=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 on
    plot(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期”即可获取下载链接。

相关文章
|
14天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
6天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
12天前
|
机器学习/深度学习 分布式计算 自动驾驶
深度学习在图像识别中的革命性应用####
【10月更文挑战第29天】 本文深入探讨了深度学习技术如何彻底革新图像识别领域,通过卷积神经网络(CNN)的架构优化、数据集增强策略及迁移学习的应用,显著提升了图像分类与目标检测的准确率。文章概述了深度学习模型训练的关键挑战,如过拟合、计算资源依赖性,并提出了创新性解决方案,包括正则化技术、分布式计算框架及自适应学习率调整策略。强调了深度学习在自动驾驶、医疗影像分析等领域的广阔应用前景,同时指出了隐私保护、模型可解释性等伦理法律问题的重要性,为未来研究提供了方向。 ####
35 5
|
14天前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的革命性突破###
本文探讨了深度学习如何彻底变革图像识别技术,从传统方法的局限到深度学习的崛起,再到其在不同领域的广泛应用,揭示了这一领域内的创新性进展。 ###
|
17天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
18 2
|
7天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
21 0
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
11天前
|
机器学习/深度学习 算法 固态存储
深度学习在图像识别中的革命性进展####
本文旨在深入探讨深度学习技术在图像识别领域的最新进展,重点阐述卷积神经网络(CNN)的演变、创新架构及在实际应用中的卓越表现。通过对比传统图像处理技术与现代深度学习方法,揭示后者如何显著提升图像分类、目标检测与分割任务的精度与效率。文章还将简要介绍当前面临的挑战与未来发展趋势,为相关领域研究者提供有价值的参考。 ####
|
16天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。

热门文章

最新文章