Этот пример демонстрирует генерацию кода для приложения сегментации изображений, которое использует глубокое обучение. Это использует команду 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.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).
Используйте 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.