主要内容

训练和部署完全卷积网络语义分割

这个例子展示了如何训练和部署一个完全回旋的语义分割网络使用GPU的NVIDIA GPU®编码器™。

语义分割图像的每个像素分类网络,导致图像分割的类。应用语义分割包括自主驾驶的道路分割为医学诊断和癌症细胞分割。欲了解更多,请看开始使用语义分割使用深度学习(计算机视觉工具箱)

为了说明培训过程,这个例子列车FCN-8s[1],一种卷积神经网络(CNN)设计语义图像分割。其他类型的语义分割网络包括完全卷积网络,如SegNet和U-Net。你可以把这个培训过程这些网络。

下面的例子使用了CamVid数据集[2]来自剑桥大学的培训。这个数据集是一个包含街道开车时视图获得的图像集合。数据集提供了32进行像素级标签语义类包括汽车、行人、道路。

第三方的先决条件

要求

  • CUDA®启用NVIDIA GPU和兼容的驱动程序。

可选

  • NVIDIA CUDA工具包。

  • 英伟达cuDNN图书馆。

  • 环境变量的编译器和库。信息的支持版本的编译器和库,明白了万博1manbetx第三方硬件(GPU编码器)。设置环境变量,看到设置必备产品s manbetx 845(GPU编码器)

验证GPU环境

使用coder.checkGpuInstall(GPU编码器)函数来确认所需的编译器和库运行这个例子是正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

设置

这个示例创建了完全回旋的语义分割网络VGG-16网络权值初始化。vgg16函数检查存在的深度学习工具箱VGG-16网络模型支持包,并返回一个pretrained VGG-16模型。万博1manbetx

vgg16 ();

下载一个FCN pretrained版本。这个pretrained模型使您能够运行整个示例没有等待培训完成。doTraining标志控制示例的示例使用训练网络或pretrained FCN网络代码生成。

doTraining = false;如果~ doTraining pretrainedURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/gpucoder/cnn_models/fcn/FCN8sCamVid.mat”;disp (“下载pretrained FCN (448 MB)……”);websave (“FCN8sCamVid.mat”,pretrainedURL);结束
下载pretrained FCN (448 MB)…

下载CamVid数据集

从这些url下载CamVid数据集。

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 (pwd,“CamVid”);如果~存在(outputFolder“dir”mkdir (outputFolder) labelsZip = fullfile (outputFolder,“labels.zip”);imagesZip = fullfile (outputFolder,“images.zip”);disp (“下载数据集16 MB CamVid标签…”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“下载557 MB CamVid数据集图像…”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束

数据下载时间取决于您的网络连接。示例执行不继续,直到操作完成下载。另外,使用web浏览器的第一个数据集下载到您的本地磁盘。然后,使用outputFolder变量指向下载文件的位置。

负载CamVid图片

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

imgDir = fullfile (outputFolder,“图片”,701 _stillsraw_full);imd = imageDatastore (imgDir);

显示一个图像。

I = readimage (imd, 25);I = histeq(我);imshow(我)

负载CamVid Pixel-Labeled图片

使用pixelLabelDatastore(计算机视觉工具箱)加载CamVid像素标签图像数据。pixelLabelDatastore封装了像素标签数据和标签ID到一个类名称映射。

以下描述的训练方法SegNet论文[3],集团在CamVid 32原始类11类。指定这些类。

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

减少32类分为11类,多个类从原始数据集被组合在一起。例如,“车”是“汽车”的结合,“SUVPickupTruck”,“Truck_Bus”、“训练”和“OtherMoving”。通过使用返回分组标签idcamvidPixelLabelIDs万博1manbetx支持功能。

labelIDs = camvidPixelLabelIDs ();

使用的类和标签id创建pixelLabelDatastore。

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

读取和显示一个pixel-labeled图像覆盖上面的图像。

C = readimage (pxds 25);提出= camvidColorMap;我= labeloverlay (C“ColorMap”,提出);imshow (B) pixelLabelColorbar(提出、类);

没有颜色叠加的地区没有像素标签和培训期间不习惯。

统计分析数据集

看到CamVid类标签的数据集的分布,使用countEachLabel(计算机视觉工具箱)。这个函数计算像素的数量类标签。

台= countEachLabel (pxds)
台=11×3表名字PixelCount __________ ImagePixelCount * * *售予{‘天空’}7.6801 4.8315 e + e + 07年08年{“建筑”}1.1737 e + 08年4.8315 e + 08年{“极点”}4.7987 4.8315 e + e + 06年08年{‘路’}1.4054 e + 08年4.8453 e + 08年{“路面”}3.3614 4.7209 e + e + 07年08年{‘树’}5.4259 4.479 e + e + 07年08年{‘SignSymbol} 5.2242 4.6863 e + e + 06年08年{“栅栏”}6.9211 2.516 e + e + 06年08年{‘汽车’}2.4437 4.8315 e + e + 07年08年{“行人”}3.4029 4.4444 e + e + 06年08年{“骑自行车”}2.5912 e + e + 08年06 2.6196

可视化类的像素数量。

频率= tbl.PixelCount /笔(tbl.PixelCount);栏(1:元素个数(类),频率)xticks(1:元素个数(类))xticklabels (tbl.Name) xtickangle (45) ylabel (“频率”)

理想情况下,所有类都有一个相同数量的观察。CamVid的类是不平衡的,这是一个常见的问题在汽车数据集的街景。这样的场景有更多的天空、建筑和道路比行人和骑自行车的像素像素,因为天空,建筑和道路覆盖更多的地区形象。如果不能正确处理,这种不平衡会对学习过程是不利的,因为学习是有偏见的主要类。稍后在本例中,您使用类权重来处理这个问题。

调整CamVid数据

CamVid中的图像数据集是720 - 960。减少训练时间和内存使用情况,调整图像和像素标签图片360 - 480使用resizeCamVidImagesresizeCamVidPixelLabels万博1manbetx支持功能。

imageFolder = fullfile (outputFolder,“imagesResized”,filesep);imd = resizeCamVidImages (imd, imageFolder);labelFolder = fullfile (outputFolder,“labelsResized”,filesep);pxds = resizeCamVidPixelLabels (pxds labelFolder);

准备训练集和测试集

SegNet通过使用60%的训练数据集的照片。其余的图片是用于测试。下面的代码随机将图像和像素标签数据分为训练集和测试集。

[imdsTrain, imdsTest pxdsTrain pxdsTest] = partitionCamVidData (imd, pxds);

60/40分割结果在以下数量的训练和测试图片:

numTrainingImages =元素个数(imdsTrain.Files)
numTrainingImages = 421
numTestingImages =元素个数(imdsTest.Files)
numTestingImages = 280

创建网络

使用fcnLayers(计算机视觉工具箱)创建充分利用VGG-16权重卷积网络层初始化。的fcnLayers函数执行网络转换权重转移VGG-16并添加所需的额外层语义分割。的输出fcnLayers函数是一个表示FCN LayerGraph对象。LayerGraph对象封装了网络层与层之间的连接。

图象尺寸= (360 - 480);numClasses =元素个数(类);lgraph = fcnLayers(图象尺寸,numClasses);

选择图像大小是基于图像数据集的大小。类的数量选择基于CamVid中的类。

平衡类通过使用类权重

中的类CamVid并不平衡。提高培训,您可以使用像素标签数量计算的countEachLabel(计算机视觉工具箱)函数和计算中值频率类权重[3]。

imageFreq =(资源。PixelCount。/ tbl.ImagePixelCount;classWeights =值(imageFreq)。/ imageFreq;

指定类的权重通过使用pixelClassificationLayer(计算机视觉工具箱)

pxLayer = pixelClassificationLayer (“名字”,“标签”,“类”tbl.Name,“ClassWeights”classWeights)
pxLayer = PixelClassificationLayer属性:名称:“标签”类:[11×1分类]ClassWeights:[11×1双]OutputSize:‘汽车’Hyperparameters LossFunction:“crossentropyex”

更新SegNet网络的新的pixelClassificationLayer删除当前pixelClassificationLayer和添加新层。当前pixelClassificationLayer被命名为“pixelLabels”。删除它通过使用removeLayers通过使用函数,添加新的addLayers功能,将新层连接到其他网络使用connectLayers函数。

lgraph = removeLayers (lgraph,“pixelLabels”);lgraph = addLayers (lgraph pxLayer);lgraph = connectLayers (lgraph,“softmax”,“标签”);

选择培训选项

培训是亚当的优化算法,这是来自自适应估计时刻。使用trainingOptions函数来指定hyperparameters用于亚当。

选择= trainingOptions (“亚当”,“InitialLearnRate”1 e - 3,“MaxEpochs”,100,“MiniBatchSize”4“洗牌”,“every-epoch”,“CheckpointPath”tempdir,“VerboseFrequency”2);

的MiniBatchSize四减少内存使用培训。你可以增加或减少该值基于GPU的数量在你的系统内存。

“CheckpointPath”设置为一个临时位置。这个名称-值对支持网络检查点的储蓄,每个培训时代的终结。如果训练中断是由于系统故障或停电时,你可以从保存的检查点恢复训练。确保“CheckpointPath”所指定的位置有足够的空间来存储网络的检查点。

数据增加

数据扩展为网络提供更多的例子,因为它有助于提高网络的准确性。这里,随机左/右反射和随机X / Y翻译+ / - 10像素用于数据增大。使用imageDataAugmenter函数来指定这些数据增加参数。

增量= imageDataAugmenter (“RandXReflection”,真的,“RandXTranslation”-10年[10],“RandYTranslation”,-10年[10]);

的imageDataAugmenter增加功能支持其他类万博1manbetx型的数据。选择其中需要实证分析和另一个层面的hyperparameter调优。

开始训练

结合训练数据和数据增加选择使用pixelLabelImageDatastore(计算机视觉工具箱)函数。的pixelLabelImageDatastore函数读取批训练数据,应用数据,并发送增强数据训练算法。

pximds = pixelLabelImageDatastore (imdsTrain pxdsTrain,“DataAugmentation”、增压器);

如果doTraining国旗是真的,开始训练使用trainNetwork函数。

培训了一个NVIDIA™泰坦Xp与12 GB的GPU内存。如果你的GPU内存更少,你可能会耗尽内存。如果你没有足够的内存系统,尽量降低MiniBatchSize财产trainingOptions为1。训练该网络需要大约5个小时或更长时间取决于你的GPU硬件。

如果doTraining[网,信息]= trainNetwork (pximds、lgraph选项);保存(“FCN8sCamVid.mat”,“净”);结束

保存DAG网络对象作为MAT-file命名FCN8sCamVid.mat。这个MAT-file期间使用代码生成。

墨西哥人执行代码生成

fcn_predict.m函数接受一个图像输入和执行预测图像通过使用保存在深度学习网络FCN8sCamVid.mat文件。函数加载网络对象FCN8sCamVid.mat到一个持续的变量mynet在随后的预测调用和重用持久对象。

类型(“fcn_predict.m”)
函数= fcn_predict () % # codegen % MathWorks版权2018 - 2019,公司持续mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“FCN8sCamVid.mat”);结束%通过在输入=预测(mynet,);

生成一个GPU配置对象为墨西哥人目标设定目标语言c++。使用coder.DeepLearningConfig(GPU编码器)函数创建一个cuDNN深度学习配置对象,并将其分配给DeepLearningConfigGPU代码配置对象的属性。运行codegen(MATLAB编码器)命令指定一个输入大小(360、480、3)。这个尺寸对应于FCN的输入层。

cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);codegen配置cfgfcn_predictarg游戏{(360480 3 uint8)}报告
代码生成成功:查看报告

运行生成的墨西哥人

加载和显示一个输入图像。

我= imread (“testImage.png”);imshow (im);

运行预测通过调用fcn_predict_mex在输入图像。

predict_scores = fcn_predict_mex (im);

predict_scores变量是一个三维矩阵有11个频道对应pixel-wise预测分数为每个类。计算通道通过使用最大预测分数pixel-wise标签。

[~,argmax] = max (predict_scores [], 3);

覆盖输入图像上的分段标签和显示分割区域。

类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“篱笆”“汽车”“行人”“自行车”];提出= camvidColorMap ();argmax SegmentedImage = labeloverlay (im,“ColorMap”,提出);图imshow (SegmentedImage);pixelLabelColorbar(提出、类);

清理

清晰的静态网络对象在内存中加载。

清晰的墨西哥人;

引用

[1],J。,E. Shelhamer, and T. Darrell. "Fully Convolutional Networks for Semantic Segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2015, pp. 3431–3440.

[2]Brostow g J。,J. Fauqueur, and R. Cipolla. "Semantic object classes in video: A high-definition ground truth database."模式识别的字母。问题2卷。30日,2009年,页88 - 97。

[3]Badrinarayanan, V。,A. Kendall, and R. Cipolla. "SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation." arXiv preprint arXiv:1511.00561, 2015.