主要内容

利用grado - cam研究语义分割网络

此示例显示了如何使用Grad-Cam探索语义分段网络的预测。

语义分割网络对图像中的每个像素进行分类,从而对图像进行分类。您可以使用grado - 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(outputfolder,“labels.zip”);imagesZip = fullfile (outputFolder,“images.zip”);如果~存在(labelsZip“文件”) | | ~存在(imagesZip“文件”mkdir (outputFolder) disp (“下载16mb CamVid数据集标签……”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“正在下载557 MB CamVid数据集图像……”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束
下载16 MB Camvid数据集标签......
下载557 MB Camvid数据集图像......

负载CamVid图片

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

imgdir = fullfile(outputfolder,“图片”701 _stillsraw_full);IMDS = IMAGEDATASTORE(IMGDIR);

数据集包含32个类。要使培训更容易,请通过将多个类从组合在一起进行分组多个类别来减少类别的数量。例如,创建一个“"类的组合"”、“SUVPickupTruck”、“Truck_bus.”、“火车“, 和 ”OtherMoving,从原始数据集。使用支持函数返回分组标签id金宝appcamvidPixelLabelIDs,在此示例结束时列出。

类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“栅栏”“汽车”“行人”“骑自行车的人”];labelids = camvidpixellabelids;

使用类和标签ID来创建一个pixelLabelDatastore

labelDir = fullfile (outputFolder,“标签”);pxds = pixelLabelDatastore (labelDir、类labelIDs);

负载预训练语义分割网络

加载佩带的语义分段网络。佩带的模型允许您运行整个示例,而无需等待培训完成。此示例加载培训的DEEPLAB V3 +网络,其重量从预制RESET-18网络初始化。有关建设和培训语义分割网络的更多信息,请参阅基于深度学习的语义分割

pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/deeplabv3plusResnet18CamVid.mat”;pretrinedfolder = fullfile(tempdir,“pretrainedNetwork”);pretrainedNetwork = fullfile (pretrainedFolder,“deeplabv3plusResnet18CamVid.mat”);如果~存在(pretrainedNetwork“文件”mkdir (pretrainedFolder);disp ('下载预训练网络(58mb)…');websave (pretrainedNetwork pretrainedURL);结束
下载预训练网络(58mb)…
pretraynet = load(pretraynetwork);net = pretraynet.net;

测试网络

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

加载测试图像。

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

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

predLabels = semanticseg (img,净);

显示结果。

提出= camvidColorMap;predLabels segImg = labeloverlay (img,'colormap'提出,“透明”, 0.4);图imshow (segImg,'InitialMagnification',40)Pixellabelolorbar(CMAP,类)

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

探索网络预测

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

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

在语义分割任务中,网络的softmax层对原始图像中的每个像素为每个类输出一个分数。这与标准的图像分类问题相反,在标准图像分类问题中,softmax层为整个图像的每个类输出一个分数。班级的毕业凸轮图 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 SoftMax是患者类别的分数。对于语义分割,可以获得 y c 通过将感兴趣的类的像素级分数减少到一个标量。例如,对softmax层的空间维度求和: y c j P y j c , 在哪里 P 为语义分割网络[3]的输出层像素。在本例中,输出层在像素分类层之前是softmax层。地图 c 亮点影响课堂决定的领域 c .较高的值表示对像素分类决策的图像的区域。

要使用grado - cam,必须选择一个特征层来提取特征图,并选择一个缩减层来提取输出激活。使用分析找到grado - cam使用的图层。

analyzeNetwork(净)

指定一个特性层。通常这是一个ReLU层,它在网络的末端接收卷积层的输出。

featureLayer =“dec_relu4”

指定一个还原层。的gradCAM函数总和为指定类别的还原层的空间尺寸,以产生标量值。然后,该标标值相对于特征层中的每个特征差异化。对于语义分割问题,还原层通常是Softmax层。

reductionLayer ='softmax-out'

计算道路和路面类的Grad-Cam地图。

类= [“路”“路面”];gradCAMMap = gradCAM(净,img、类......“ReductionLayer”reductionLayer,......“FeatureLayer”, featureLayer);

将这两个类的grado - cam映射与语义分割映射进行比较。

predLabels = semanticseg (img,净);predLabels segMap = labeloverlay (img,'colormap'提出,“透明”, 0.4);图;次要情节(2、2、1)imshow (img)标题('测试图像') subplot(2,2,2) imshow(segMap) title('语义细分')子图(2,2,3)imshow(img)持有ImageC(Gradcammap(:,:1),“AlphaData”,0.5)标题(“Grad-CAM:”(1) colormap +类喷射次要情节(2,2,4)imshow (img)ImagesC(Gradcammap(:,:,2),“AlphaData”,0.5)标题(“Grad-CAM:”(2) colormap +类喷射

grado - cam图和语义分割图也有类似的高亮显示。所有的地图都没有区分十字路口左侧的道路,语义分割地图将其标记为人行道。从路面类的gradc - cam图可以看出,在网络分类决策中,路面边缘比中心更重要。由于路面边缘能见度较差,该网络可能会对十字路口左侧的道路进行错误分类。

探讨过渡层

当您使用靠近网络末端的一层进行计算时,grado - cam映射类似于语义分割映射。您还可以使用grado - cam来研究经过训练的网络中的中间层。与网络末端的层相比,早期的层具有较小的接受域大小和学习较小、低水平的特征。

为网络中依次更深的层计算梯度凸轮图。

层= [“Res5b_relu”“catapp”“dec_relu1”];numLayers =长度(层);

Res5b_relu.层靠近网络的中间,然而dec_relu1就在网络的尽头。

研究网络分类决策的汽车,道路和路面类。对于每一层和类,计算grado - cam映射。

类= [“汽车”“路”“路面”];numClasses =长度(类);gradCAMMaps = [];i = 1:numlayers gradcampaps(::::,i)= gradcam(net,img,classes,......“ReductionLayer”reductionLayer,......“FeatureLayer”,层数(i));结束

显示每一层和每个类的grado - cam地图。这些行代表每一层的映射,层的顺序从网络的早期到网络的末端。

图;idx = 1;我= 1:numLayersj=1:numClasses subplot(numLayers,numClasses,idx) imshow(img)保持显示亮度图像(gradCAMMaps (:,:, j,我)“AlphaData”,0.5)标题(Sprintf(“% s (% s)”,类(j),图层(i)),......“翻译”“没有”) colormap喷射IDX = IDX + 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] Selvaraju,R. R.,M. Cogswell,A. Das,R. Vedantam,D. Parikh和D. Batra。“Grad-Cam:通过基于梯度的本地化的深度网络的视觉解释。”在IEEE计算机愿景(ICCV)的国际会议中,2017年,第618-626页。可用AT.Grad-Cam在电脑Vision Foundation Open Access网站上。

Vinogradova, Kira, Alexandr Dibrov和Gene Myers。“基于梯度加权类激活映射的可解释语义分割”(学生摘要)。AAAI人工智能会议论文集34岁的没有。10(2020年4月3日):13943-44。https://doi.org/10.1609/aaai.v34i10.7244

金宝app支持功能

函数labelIDs = camvidPixelLabelIDs ()返回每个类对应的标签id。CamVid数据集有32个类。将他们分成11个班%原赛格网培训方法[1]。%11课程是:%的“天空”,“建设”、“极”,“路”,“路面”、“树”、“SignSymbol”,%“栅栏”,“汽车”,“行人”和“自行车”。% CamVid像素标签id作为RGB颜色值提供。集团成%11类并将其作为M×3矩阵的单元格数组返回。的%原始Camvid类名与每个RGB值一起列出。笔记%表示Other/Void类被排除在下面。labelIDs = {......%“天空”[128 128 128;......%“天空”%“建设”[000 128 064;......%“桥”128 000 000;......%“建设”064 192 000;......%的“墙”064 000 064;......% “隧道”192 000 128;......%的“拱门”%“极”[19219128;......%“column_pole”000 000 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;......%“植被媒体”%“signsymbol”[192 128 128;......%“signsymbol”128 128 064;......%”Misc_Text”000 064 064;......% “红绿灯”%“栅栏”[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(CMAP,ClassNames)%将彩色条添加到当前轴。彩色键格式化了%以与颜色显示类名。甘氨胆酸colormap(提出)%添加一个颜色栏到当前的数字。c =彩色杆(“对等”甘氨胆酸,);%使用类名作为标记。C.Ticklabels = ClassNames;numclasses = size(cmap,1);%Center Tick标签。c.Ticks = 1 / (numClasses * 2): 1 / numClasses: 1;%删除勾号。c.ticklength = 0;结束函数提出= camvidColorMap%定义Camvid数据集使用的ColorMap。CMAP = [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;结束