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

Этот пример показывает генерацию кода для приложения сегментации изображений что глубокое обучение использования. Это использует codegen команда, чтобы сгенерировать MEX-функцию, которая выполняет прогноз на Сетевом объекте DAG для SegNet [1], нейронной сети для глубокого обучения для сегментации изображений.

Предпосылки

  • CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Библиотека NVIDIA cuDNN.

  • Интерфейс 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 Функция точки входа

segnet_predict.m функция точки входа берет вход изображений и выполняет прогноз на изображении при помощи нейронной сети для глубокого обучения, сохраненной в SegNet.mat файл. Функция загружает сетевой объект от SegNet.mat файл в персистентную переменную mynet и повторные использования персистентная переменная на последующих вызовах прогноза.

type('segnet_predict.m')
function out = segnet_predict(in)
%#codegen
% Copyright 2018-2019 The MathWorks, Inc.

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('SegNet.mat');
end

% pass in input
out = predict(mynet,in);


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

net = getSegNet();
Downloading pretrained SegNet (107 MB)...

Сеть DAG содержит 91 слой включая свертку, пакетную нормализацию, объединение, необъединение и классификацию пикселей выходные слои. Используйте analyzeNetwork функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.

analyzeNetwork(net);

Запустите генерацию кода MEX

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

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

im = imread('gpucoder_segnet_image.png');
imshow(im);
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, Габриэль Дж., Жюльен Фокер и Роберто Сиполья. "Семантические классы объектов в видео: база данных основной истины высокой четкости". Pattern Recognition Letters. Vol. 30, Issue 2, 2009, стр 88-97.