主要内容

使用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(提出类)

图中包含一个轴对象。axis对象包含一个image类型的对象。

该网络确实对一些区域进行了错误的分类,例如,轮胎附近的道路被错误地归类为汽车。接下来,您将使用Grad-CAM探索网络预测,以深入了解网络错误分类某些区域的原因。

探索网络预测

深度网络是复杂的,所以理解一个网络如何决定一个特定的预测是困难的。您可以使用Grad-CAM来查看语义分割网络正在使用测试图像的哪些区域进行像素分类。

Grad-CAM计算可微输出的梯度,例如类分数,相对于所选层中的卷积特征。Grad-CAM通常用于图像分类任务[2];但是,它也可以扩展到语义分割问题[3]。

在语义分割任务中,网络的softmax层为原始图像中的每个像素输出每个类的分数。这与标准的图像分类问题形成对比,在标准的图像分类问题中,softmax层为整个图像的每个类输出一个分数。班级的Grad-CAM地图 c

c R e l U k α c k 一个 k 在哪里 α c k 1 / N j d y c d 一个 j k

N 是像素的数量, 一个 k 是感兴趣的特征图,和 y c 对应于标量类分数。对于一个简单的图像分类问题, y c 是感兴趣的类的软最大分数。对于语义分割,可以得到 y c 通过将感兴趣的类的像素级类分数减少为一个标量。例如,对softmax层的空间维度求和: y c j P y j c ,在那里 P 是语义分割网络[3]的输出层像素。在这个例子中,输出层是在像素分类层之前的softmax层。地图 c 强调影响课程决策的领域 c .较高的值表示图像中对像素分类决策很重要的区域。

要使用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))色彩地图飞机

图中包含4个轴对象。标题为Test Image的坐标轴对象1包含一个Image类型的对象。标题为Semantic Segmentation的坐标轴对象2包含一个image类型的对象。标题为Grad-CAM: Road的坐标轴对象3包含2个图像类型的对象。标题为Grad-CAM: Car的坐标轴对象4包含2个image类型的对象。

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:numLayersj=1:numClasses subplot(numLayers,numClasses,idx) imshow(img) hold显示亮度图像(gradCAMMaps (:,:, j,我),AlphaData = 0.5)标题(sprintf (“% s (% s)”层、类(j),(我)),...翻译=“没有”) colormap飞机Idx = Idx + 1;结束结束

图中包含6个轴对象。标题为Car (res5b_relu)的Axes对象1包含2个image类型的对象。标题为Road (res5b_relu)的Axes对象2包含2个image类型的对象。标题为Car (catAspp)的坐标轴对象3包含2个image类型的对象。带有Road标题的Axes对象4 (catAspp)包含2个image类型的对象。标题为Car (dec_relu1)的Axes对象5包含2个image类型的对象。标题为Road (dec_relu1)的Axes对象6包含2个image类型的对象。

后面的层生成的映射非常类似于分割映射。然而,网络中较早的层产生更抽象的结果,通常更关心较低级别的特征,如边,对语义类的意识较低。例如,在早期图层的地图中,你可以看到对于汽车和道路类别,天空都是高亮的。这表明,早期的层集中在图像中与类相关但不一定属于该类的区域。

参考文献

[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;结束