主要内容

使用Grad-CAM探索语义分割网络

这个例子展示了如何使用Grad-CAM探索语义分割网络的预测。

语义分割网络对图像中的每个像素进行分类,从而得到按类分割的图像。您可以使用深度学习可视化技术Grad-CAM来查看图像的哪些区域对于像素分类决策是重要的。

负载数据集

本例使用CamVid数据集[1]来自剑桥大学的培训。该数据集是包含在驾驶时获得的街道视图的图像集合。该数据集为32个语义类提供像素级标签,包括汽车、行人和道路。

下载CamVid数据集

下载CamVid数据集。

rng (“默认”imageURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/files/701_StillsRaw_full.zip”;labelURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/LabeledApproved_full.zip”;outputFolder = fullfile(tempdir,“CamVid”);labelsZip = fullfile(输出文件夹,“labels.zip”);imagesZip = fullfile(输出文件夹,“images.zip”);如果~存在(labelsZip“文件”) || ~exist(imagesZip,“文件”mkdir(输出目录)“下载16mb CamVid数据集标签…”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“下载557 MB CamVid数据集图像…”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束
正在下载16mb CamVid数据集标签…
下载557 MB CamVid数据集图像…

加载CamVid图像

使用一个imageDatastore加载CamVid图像。的imageDatastore使您能够有效地在磁盘上加载大量映像。

imgDir = fullfile(输出文件夹,“图片”“701 _stillsraw_full”);imds = imageDatastore(imgDir);

数据集包含32个类。为了使训练更容易,可以将原始数据集中的多个类分组在一起,从而将类的数量减少到11个。例如,创建一个“类,该类将”、“SUVPickupTruck”、“Truck_Bus”、“火车,和OtherMoving原始数据集中的类。使用支持函数返回分组的标签id金宝appcamvidPixelLabelIDs,在本例的末尾列出。

类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“篱笆”“汽车”“行人”“自行车”];labelIDs = camvidPixelLabelIDs;

使用类和标签id创建一个pixelLabelDatastore

labelDir = fullfile(输出文件夹,“标签”);pxds = pixelLabelDatastore(labelDir,classes,labelIDs);

加载预训练的语义分割网络

加载一个预先训练好的语义分割网络。预训练模型允许您运行整个示例,而不必等待训练完成。这个例子加载了一个经过训练的Deeplab v3+网络,权重初始化自预先训练的ResNet-18网络。要获得预训练的ResNet-18,请安装resnet18.有关构建和训练语义分割网络的更多信息,请参见基于深度学习的语义分割

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;

测试网络

经过训练的语义分割网络预测图像中每个像素的标签。您可以通过预测图像的像素标签来测试网络。

加载一个测试图像。

图img = readimage(imds,615);imshow (img InitialMagnification = 35)

使用semanticseg利用训练好的语义分割网络预测图像的像素标签。

predLabels = semanticseg(img,net);

显示结果。

cmap = camvidColorMap;segImg = labeloverlay(img,predLabels,Colormap=cmap,Transparency=0.4);图imshow(segImg,InitialMagnification=40)

你可以看到网络相当准确地标记了图像的各个部分。该网络确实对一些区域进行了错误的分类,例如,十字路口左侧的道路被部分错误地分类为人行道。

探索网络预测

深度网络是复杂的,所以理解一个网络如何决定一个特定的预测是困难的。您可以使用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映射与语义分割映射进行比较。

predLabels = semanticseg(img,net);segMap = labeloverlay(img,predLabels,Colormap=cmap,透明度=0.4);图;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:numLayersj=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支持功能

函数labelIDs = camvidPixelLabelIDs()返回每个类对应的标签id。CamVid数据集有32个类。把他们分成11个类%原始SegNet训练方法[1]。这11个类是:%的“天空”,“建设”、“极”,“路”,“路面”、“树”、“SignSymbol”,“栅栏”、“汽车”、“行人”和“骑自行车的人”。CamVid像素标签id作为RGB颜色值提供。把它们分成% 11类,并将它们作为m × 3矩阵的单元格数组返回。的%原始CamVid类名与每个RGB值一起列出。请注意%,其他/Void类被排除在下面。labelIDs = {...%的“天空”[128 128 128;...%的“天空”%“建设”[000 128 064;...%“桥”12.80万;...%“建设”064 192 000;...%的“墙”064 000 064;...%的“隧道”192 000 128;...%的“拱门”%“极”[192 192 128;...%”Column_Pole”064;...%”TrafficCone”%的道路[128 064 128;...%的“路”128 000 192;...%”LaneMkgsDriv”192 000 064;...%”LaneMkgsNonDriv”%“路面”[000 000 192;...%“人行道”064 192 128;...%”ParkingBlock”128 128 192;...%”RoadShoulder”%的“树”[128 128 000;...%的“树”192 192 000;...%”VegetationMisc”%”SignSymbol”[192 128 128;...%”SignSymbol”128 128 064;...%”Misc_Text”000 064 064;...%”TrafficLight”%“栅栏”[064 064 128;...%“栅栏”%的“汽车”[064 000 128;...%的“汽车”064 128 192;...%”SUVPickupTruck”192 128 192;...%”Truck_Bus”192 064 128;...%“训练”128 064 064;...%”OtherMoving”%“行人”[064 064 000;...%“行人”192 128 064;...%的“孩子”064 000 192;...%”CartLuggagePram”064 128 064;...%的“动物”%“自行车”[000 128 192;...%“自行车”192 000 192;...%”MotorcycleScooter”]};结束
函数一会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;结束

另请参阅

|(计算机视觉工具箱)|(计算机视觉工具箱)

相关的话题