主要内容

使用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(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(Imagezip,imageurl);解压缩(Imagezip,fullfile(outputfolder,“图片”));结束
下载16 MB Camvid数据集标签......
下载557 MB Camvid数据集图像......

加载Camvid映像

用A.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,类,标签ID);

负载预训练语义分割网络

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

pretrowsurl ='//www.tatmou.com/金宝appsupportfiles/vision/data/deeplabv3plusresnet18camvid.mat';pretrinedfolder = fullfile(tempdir,'pretrownetwork');pretrainedNetwork = fullfile (pretrainedFolder,'deeplabv3plusresnet18camvid.mat');如果〜存在(pretratingnetwork,'文件'mkdir (pretrainedFolder);disp ('下载掠夺网络(58 MB)......');websave (pretrainedNetwork pretrainedURL);结束
下载预训练网络(58mb)…
pretrainedNet =负载(pretrainedNetwork);网= pretrainedNet.net;

测试网络

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

加载测试图像。

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

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

predlabels = semanticseg(img,net);

显示结果。

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

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

探索网络预测

深层网络是复杂的,所以理解一个网络如何决定一个特定的预测是困难的。您可以使用grado - 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 SoftMax是患者类别的分数。对于语义分割,可以获得 y c 通过将感兴趣的类的像素级分数减少到一个标量。例如,对softmax层的空间维度求和: y c σ. j P y j c , 在哪里 P 是语义分段网络的输出层中的像素[3]。在该示例中,输出层是像素分类层之前的软MAX层。地图 c 强调影响班级决策的领域 c .较高的值表示对像素分类决策的图像的区域。

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

分析(净)

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

featureLayer =“dec_relu4”

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

reductionLayer ='softmax-out'

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

类= [“路”“路面”];Gradcammap = Gradcam(Net,IMG,课程,......'Reganslayer'reductionLayer,......“FeatureLayer”,featurexayer);

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

predlabels = semanticseg(img,net);segmap = labeloverlay(img,predlabels,'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 +类喷射

Grad-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,......'Reganslayer'reductionLayer,......“FeatureLayer”,层数(i));结束

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

图;idx = 1;我= 1:numLayersJ = 1:NumClasses子图(Numlayers,NumClasses,IDX)IMSHOW(IMG)保持显示亮度图像(gradCAMMaps (:,:, j,我)“AlphaData”,0.5)标题(Sprintf(“% s (% s)”层、类(j),(我)),......“翻译”“没有”) 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网站上。

[3] Vinogradova,Kira,Alexandr Dibrov和基因迈尔斯。“通过梯度加权类激活映射(学生摘要)向解释语义分割。”AAAI人工智能会议论文集34岁的没有。10(2020年4月3日):13943-44。https://doi.org/10.1609/aai.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;......%的“拱门”%“杆子”[192 192 128;......%“column_pole”000 000 064;......% “交通拥挤”% 路[128 064 128;......%的“路”128 000 192;......%“lanemkgsdriv”192 000 064;......%”LaneMkgsNonDriv”%“路面”[000 000 192;......%“人行道”064 192 128;......%“停车盆”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(GCA,CMAP)%添加一个颜色栏到当前的数字。c =彩色杆(“对等”,GCA);%使用刻度线的类名称。c.TickLabels =一会;numClasses =大小(提出,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;结束

另请参阅

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

相关话题