使用Grad-CAM探索语义分割网络
这个例子展示了如何使用Grad-CAM探索预训练的语义分割网络的预测。
语义分割网络对图像中的每个像素进行分类,从而得到按类分割的图像。您可以使用深度学习可视化技术Grad-CAM来查看图像的哪些区域对于像素分类决策是重要的。
下载预训练网络
下载一个经过训练的语义分割网络CamVid数据集[1]来自剑桥大学。有关构建和训练语义分割网络的更多信息,请参见基于深度学习的语义分割(深度学习工具箱).
pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/deeplabv3plusResnet18CamVid.mat”;pretrainedFolder = fullfile(tempdir,“pretrainedNetwork”);pretrainedNetwork = fullfile(pretrainedFolder,“deeplabv3plusResnet18CamVid.mat”);如果~存在(pretrainedNetwork“文件”mkdir (pretrainedFolder);disp (下载预训练的网络(58 MB)…);websave (pretrainedNetwork pretrainedURL);结束pretrainedNet = load(pretrainedNetwork);net = pretrainedNet.net;
执行语义分割
在使用Grad-CAM分析网络预测之前,使用预训练的网络对测试图像进行分割。
加载一个测试图像并调整它的大小以匹配网络所需的大小。
Img = imread(“highway.png”);inputSize = net.Layers(1).InputSize(1:2);img = imresize(img,inputSize);
使用semanticseg
函数预测图像的像素标签。
predLabels = semanticseg(img,net);
将分割结果叠加在原始图像上并显示。
cmap = camvidColorMap;segImg = labeloverlay(img,predLabels,Colormap=cmap,Transparency=0.4);图imshow(segImg,InitialMagnification=40) classes = camvidClasses();pixelLabelColorbar(提出类)
该网络确实对一些区域进行了错误的分类,例如,轮胎附近的道路被错误地归类为汽车。接下来,您将使用Grad-CAM探索网络预测,以深入了解网络错误分类某些区域的原因。
探索网络预测
深度网络是复杂的,所以理解一个网络如何决定一个特定的预测是困难的。您可以使用Grad-CAM来查看语义分割网络正在使用测试图像的哪些区域进行像素分类。
Grad-CAM计算可微输出的梯度,例如类分数,相对于所选层中的卷积特征。Grad-CAM通常用于图像分类任务[2];但是,它也可以扩展到语义分割问题[3]。
在语义分割任务中,网络的softmax层为原始图像中的每个像素输出每个类的分数。这与标准的图像分类问题形成对比,在标准的图像分类问题中,softmax层为整个图像的每个类输出一个分数。班级的Grad-CAM地图 是
在哪里
是像素的数量, 是感兴趣的特征图,和 对应于标量类分数。对于一个简单的图像分类问题, 是感兴趣的类的软最大分数。对于语义分割,可以得到 通过将感兴趣的类的像素级类分数减少为一个标量。例如,对softmax层的空间维度求和: ,在那里 是语义分割网络[3]的输出层像素。在这个例子中,输出层是在像素分类层之前的softmax层。地图 强调影响课程决策的领域 .较高的值表示图像中对像素分类决策很重要的区域。
要使用Grad-CAM,必须选择一个特征层来提取特征映射,并选择一个还原层来提取输出激活。使用analyzeNetwork
找到要用Grad-CAM制作的图层。
analyzeNetwork(净)
指定一个特性层。通常这是一个ReLU层,它接受网络末端卷积层的输出。
featureLayer =“dec_relu4”;
指定还原层。的gradCAM
函数对指定类的约简层的空间维度求和,以产生标量值。然后,这个标量值相对于特征层中的每个特征进行区分。对于语义分割问题,约简层通常是软最大层。
reductionLayer =“softmax-out”;
计算道路和路面类的Grad-CAM地图。
类= [“路”“汽车”];gradCAMMap = gradCAM(net,img,classes,...ReductionLayer = ReductionLayer,...FeatureLayer = FeatureLayer);
将这两个类的Grad-CAM地图与网络预测的像素标签进行比较。
图subplot(2,2,1)“测试图像”) subplot(2,2,2)“语义分割”) subplot(2,2,3) imshow(img) hold在显示亮度图像(gradCAMMap (:,: 1), AlphaData = 0.5)标题(”Grad-CAM:“+类(1))颜色映射飞机Subplot (2,2,4) imshow(img) hold住在显示亮度图像(gradCAMMap (:,: 2), AlphaData = 0.5)标题(”Grad-CAM:“+类(2))色彩地图飞机
Grad-CAM图和语义分割图高亮显示相似。道路分类的Grad-CAM地图表明,场景中心对网络的分类决策更为重要。由于轮胎和道路边界之间的分辨率较差,该网络可能会错误地分类靠近汽车底部的道路区域。
探索中间层
当你使用接近网络末端的层进行计算时,Grad-CAM映射类似于语义分割映射。您还可以使用Grad-CAM来研究训练网络中的中间层。与网络末端的层相比,早期层具有较小的接受域大小,并学习较小的低级特征。
计算在网络中依次较深的层的Grad-CAM映射。
层= [“res5b_relu”,“catAspp”,“dec_relu1”];numLayers =长度(层);
的res5b_relu
层接近网络的中间,而dec_relu1
接近网络的末端。
研究汽车和道路类别的网络分类决策。对于每个层和类,计算Grad-CAM映射。
类= [“汽车”“路”];numClasses =长度(类);gradCAMMaps = [];为i = 1:numLayers gradCAMMaps(:,:,:,i) = gradCAM(net,img,classes,...ReductionLayer = ReductionLayer,...FeatureLayer =层(i));结束
显示每个图层和每个类的Grad-CAM地图。行表示每一层的映射,层的顺序是从网络的早期到网络的末尾。
图;Idx = 1;为我= 1:numLayers为j=1:numClasses subplot(numLayers,numClasses,idx) imshow(img) hold在显示亮度图像(gradCAMMaps (:,:, j,我),AlphaData = 0.5)标题(sprintf (“% s (% s)”层、类(j),(我)),...翻译=“没有”) colormap飞机Idx = Idx + 1;结束结束
后面的层生成的映射非常类似于分割映射。然而,网络中较早的层产生更抽象的结果,通常更关心较低级别的特征,如边,对语义类的意识较低。例如,在早期图层的地图中,你可以看到对于汽车和道路类别,天空都是高亮的。这表明,早期的层集中在图像中与类相关但不一定属于该类的区域。
参考文献
[1] Brostow, Gabriel J., Julien Fauqueur和Roberto Cipolla。视频中的语义对象类:一个高清地面真相数据库。模式识别信30日,没有。2(2009年1月):88-97。https://doi.org/10.1016/j.patrec.2008.04.005。
[2]塞尔瓦拉朱,R. R., M.科格斯韦尔,A.达斯,R.韦丹塔姆,D.帕里克,D.巴特拉。“梯度- cam:基于梯度定位的深度网络视觉解释。”《IEEE计算机视觉国际会议》(ICCV), 2017,第618-626页。可以在Grad-CAM
计算机视觉基金会开放获取网站。
维诺格拉多娃,基拉,亚历山大·迪布罗夫和吉恩·迈尔斯。基于梯度加权类激活映射的可解释语义分割(学生摘要)AAAI人工智能会议论文集34岁的没有。10(2020年4月3日):13943-44。https://doi.org/10.1609/aaai.v34i10.7244.
金宝app支持功能
函数classes = camvidClasses()返回网络训练时使用的CamVid类名。%CamVid数据集有32个类。把他们分成11个类%原始SegNet训练方法[1]。%这11个类是:%的“天空”,“建设”、“极”,“路”,“路面”、“树”、“SignSymbol”,“栅栏”、“汽车”、“行人”和“骑自行车的人”。%类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“篱笆”“汽车”“行人”“自行车”];结束
函数一会pixelLabelColorbar(提出)在当前轴上添加一个颜色条。颜色条被格式化%显示带有颜色的类名。甘氨胆酸colormap(提出)向当前图形添加颜色条。C = colorbar(“对等”甘氨胆酸,);使用类名作为标记。c.TickLabels = classNames;numClasses = size(cmap,1);%中心打勾标签。c.Ticks = 1/(numClasses*2):1/numClasses:1;删除标记。c.TickLength = 0;结束函数cmap = camvidColorMap定义CamVid数据集使用的颜色映射。Cmap = [128 128 128 128%的天空128 0 0%的建筑192 192 192%极128 64 128%的道路60 40 222%的人行道上128 128 0%的树192 128 128% SignSymbol64 64 128%的栅栏64 0 128%的车64 64 0%行人0 128 192%骑自行车];%在[0 1]之间归一化。Cmap = Cmap ./ 255;结束