Генерация кода для семантической сети сегментации

Этот пример демонстрирует генерацию кода для приложения сегментации изображений, которое использует глубокое обучение. Это использует команду 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'

Функция 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);


Получите предварительно обученный сетевой объект SegNet DAG

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

Запустите генерацию кода MEX для функции 'segnet_predict'

Чтобы сгенерировать код 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').

Запустите сгенерированный MEX

Загрузите и отобразите входное изображение.

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.

Похожие темы