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

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

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

  • CUDA® включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall Функция (GPU Coder), чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

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], смотрите, что Семантическая Сегментация Использует Глубокое обучение (Computer Vision Toolbox).

segnet_predict Функция точки входа

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

type('segnet_predict.m')
function out = segnet_predict(in)
%#codegen
% Copyright 2018-2021 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();

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

analyzeNetwork(net);

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

Сгенерировать код CUDA для segnet_predict.m функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig (GPU Coder) функция, чтобы создать 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: View report

Запустите сгенерированный 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.

Похожие темы