Этот пример демонстрирует генерацию кода для приложения сегментации изображений, которое использует глубокое обучение. Это использует команду codegen, чтобы сгенерировать MEX-функцию, которая запускает прогноз на Сетевом объекте DAG для SegNet [1], популярной нейронной сети для глубокого обучения для сегментации изображений.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN v7 или выше.
Deep Learning Toolbox™, чтобы использовать Сетевой объект DAG.
Image Processing Toolbox™ для чтения и отображения изображений.
Computer Vision Toolbox™ для функции labeloverlay используется в этом примере.
GPU Coder™ для генерации кода CUDA.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
SegNet [1] является популярным типом сверточной нейронной сети (CNN), разработанной для семантической сегментации изображений. Это - глубокий мультикласс декодера энкодера мудрая пикселем сеть сегментации, обученная на наборе данных CamVid [2] и импортированная в MATLAB® для вывода. SegNet [1] обучен сегментировать пиксели, принадлежащие 11 классам, которые включают Небо, Создание, полюс, Дорогу, Тротуар, Дерево, SignSymbol, Забор, Автомобиль, Пешехода и Велосипедиста.
Для получения информации относительно обучения семантической сети сегментации в MATLAB с помощью набора данных CamVid [2], смотрите, что Семантическая Сегментация Использует Глубокое обучение.
Функция segnet_predict.m берет вход изображений и запускает прогноз на изображении с помощью нейронной сети для глубокого обучения, сохраненной в файле SegNet.mat. Функция загружает сетевой объект от SegNet.mat в персистентную переменную mynet. На последующих вызовах функции постоянный объект снова используется для прогноза.
type('segnet_predict.m')
% Copyright 2018 The MathWorks, Inc.
function out = segnet_predict(in)
%#codegen
% A persistent object mynet is used to load the DAG network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused
% to call predict on inputs, thus avoiding reconstructing and reloading the
% network object.
persistent mynet;
if isempty(mynet)
mynet = coder.loadDeepLearningNetwork('SegNet.mat');
end
% pass in input
out = predict(mynet,in);
net = getSegNet();
Сеть DAG содержит 91 слой включая свертку, пакетную нормализацию, объединение, необъединение и классификацию пикселей выходные слои.
net.Layers
ans =
91x1 Layer array with layers:
1 'inputImage' Image Input 360x480x3 images with 'zerocenter' normalization
2 'conv1_1' Convolution 64 3x3x3 convolutions with stride [1 1] and padding [1 1 1 1]
3 'bn_conv1_1' Batch Normalization Batch normalization with 64 channels
4 'relu1_1' ReLU ReLU
5 'conv1_2' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
6 'bn_conv1_2' Batch Normalization Batch normalization with 64 channels
7 'relu1_2' ReLU ReLU
8 'pool1' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0]
9 'conv2_1' Convolution 128 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
10 'bn_conv2_1' Batch Normalization Batch normalization with 128 channels
11 'relu2_1' ReLU ReLU
12 'conv2_2' Convolution 128 3x3x128 convolutions with stride [1 1] and padding [1 1 1 1]
13 'bn_conv2_2' Batch Normalization Batch normalization with 128 channels
14 'relu2_2' ReLU ReLU
15 'pool2' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0]
16 'conv3_1' Convolution 256 3x3x128 convolutions with stride [1 1] and padding [1 1 1 1]
17 'bn_conv3_1' Batch Normalization Batch normalization with 256 channels
18 'relu3_1' ReLU ReLU
19 'conv3_2' Convolution 256 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
20 'bn_conv3_2' Batch Normalization Batch normalization with 256 channels
21 'relu3_2' ReLU ReLU
22 'conv3_3' Convolution 256 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
23 'bn_conv3_3' Batch Normalization Batch normalization with 256 channels
24 'relu3_3' ReLU ReLU
25 'pool3' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0]
26 'conv4_1' Convolution 512 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
27 'bn_conv4_1' Batch Normalization Batch normalization with 512 channels
28 'relu4_1' ReLU ReLU
29 'conv4_2' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
30 'bn_conv4_2' Batch Normalization Batch normalization with 512 channels
31 'relu4_2' ReLU ReLU
32 'conv4_3' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
33 'bn_conv4_3' Batch Normalization Batch normalization with 512 channels
34 'relu4_3' ReLU ReLU
35 'pool4' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0]
36 'conv5_1' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
37 'bn_conv5_1' Batch Normalization Batch normalization with 512 channels
38 'relu5_1' ReLU ReLU
39 'conv5_2' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
40 'bn_conv5_2' Batch Normalization Batch normalization with 512 channels
41 'relu5_2' ReLU ReLU
42 'conv5_3' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
43 'bn_conv5_3' Batch Normalization Batch normalization with 512 channels
44 'relu5_3' ReLU ReLU
45 'pool5' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0]
46 'decoder5_unpool' Max Unpooling Max Unpooling
47 'decoder5_conv3' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
48 'decoder5_bn_3' Batch Normalization Batch normalization with 512 channels
49 'decoder5_relu_3' ReLU ReLU
50 'decoder5_conv2' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
51 'decoder5_bn_2' Batch Normalization Batch normalization with 512 channels
52 'decoder5_relu_2' ReLU ReLU
53 'decoder5_conv1' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
54 'decoder5_bn_1' Batch Normalization Batch normalization with 512 channels
55 'decoder5_relu_1' ReLU ReLU
56 'decoder4_unpool' Max Unpooling Max Unpooling
57 'decoder4_conv3' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
58 'decoder4_bn_3' Batch Normalization Batch normalization with 512 channels
59 'decoder4_relu_3' ReLU ReLU
60 'decoder4_conv2' Convolution 512 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
61 'decoder4_bn_2' Batch Normalization Batch normalization with 512 channels
62 'decoder4_relu_2' ReLU ReLU
63 'decoder4_conv1' Convolution 256 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1]
64 'decoder4_bn_1' Batch Normalization Batch normalization with 256 channels
65 'decoder4_relu_1' ReLU ReLU
66 'decoder3_unpool' Max Unpooling Max Unpooling
67 'decoder3_conv3' Convolution 256 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
68 'decoder3_bn_3' Batch Normalization Batch normalization with 256 channels
69 'decoder3_relu_3' ReLU ReLU
70 'decoder3_conv2' Convolution 256 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
71 'decoder3_bn_2' Batch Normalization Batch normalization with 256 channels
72 'decoder3_relu_2' ReLU ReLU
73 'decoder3_conv1' Convolution 128 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1]
74 'decoder3_bn_1' Batch Normalization Batch normalization with 128 channels
75 'decoder3_relu_1' ReLU ReLU
76 'decoder2_unpool' Max Unpooling Max Unpooling
77 'decoder2_conv2' Convolution 128 3x3x128 convolutions with stride [1 1] and padding [1 1 1 1]
78 'decoder2_bn_2' Batch Normalization Batch normalization with 128 channels
79 'decoder2_relu_2' ReLU ReLU
80 'decoder2_conv1' Convolution 64 3x3x128 convolutions with stride [1 1] and padding [1 1 1 1]
81 'decoder2_bn_1' Batch Normalization Batch normalization with 64 channels
82 'decoder2_relu_1' ReLU ReLU
83 'decoder1_unpool' Max Unpooling Max Unpooling
84 'decoder1_conv2' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
85 'decoder1_bn_2' Batch Normalization Batch normalization with 64 channels
86 'decoder1_relu_2' ReLU ReLU
87 'decoder1_conv1' Convolution 11 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
88 'decoder1_bn_1' Batch Normalization Batch normalization with 11 channels
89 'decoder1_relu_1' ReLU ReLU
90 'softmax' Softmax softmax
91 'labels' Pixel Classification Layer Class weighted cross-entropy loss with 'Sky', 'Building', and 9 other classes
Чтобы сгенерировать код CUDA из файла проекта segnet_predict.m, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте функцию coder.DeepLearningConfig, чтобы создать объект настройки глубокого обучения CuDNN и присвоить ее свойству DeepLearningConfig объекта настройки графического процессора кода. Запустите команду codegen, задающую вход размера [360,480,3]. Это значение соответствует входному размеру слоя SegNet.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg segnet_predict -args {ones(360,480,3,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/segnet_predict/html/report.mldatx').
Загрузите и отобразите входное изображение.
im = imread('gpucoder_segnet_image.png');
imshow(im);

Вызовите segnet_predict на входном изображении.
predict_scores = segnet_predict_mex(im);
predict_scores переменная является 3D матрицей, имеющей 11 каналов, соответствующих мудрой пикселем музыке прогноза к каждому классу. Вычислите канал с максимальным счетом прогноза, чтобы получить мудрые пикселем метки.
[~,argmax] = max(predict_scores,[],3);
Наложите сегментированные метки по входу, отображают и отображают сегментированную область
classes = [
"Sky"
"Building"
"Pole"
"Road"
"Pavement"
"Tree"
"SignSymbol"
"Fence"
"Car"
"Pedestrian"
"Bicyclist"
];
cmap = camvidColorMap();
SegmentedImage = labeloverlay(im,argmax,'ColorMap',cmap);
figure
imshow(SegmentedImage);
pixelLabelColorbar(cmap,classes);

[1] Badrinarayanan, Виджай, Алекс Кендалл и Роберто Сиполья. "SegNet: Глубокая Сверточная Архитектура Декодера Энкодера для Сегментации Изображений". arXiv предварительно распечатывают arXiv:1511.00561, 2015.
[2] Brostow, Габриэль Дж., Жюльен Фокер и Роберто Сиполья. "Семантические классы объектов в видео: наземная база данных истины высокой четкости". Vol 30 Букв Распознавания образов, Выпуск 2, 2009, стр 88-97.