Этот пример показывает генерацию кода для приложения сегментации изображений что глубокое обучение использования. Это использует codegen
команда, чтобы сгенерировать MEX-функцию, которая выполняет предсказание на Сетевом объекте DAG для SegNet [1], нейронной сети для глубокого обучения для сегментации изображений.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA® включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование (GPU Coder) и Подготовка Необходимых как условие продуктов (GPU Coder).
Используйте 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], смотрите, что Семантическая Сегментация Использует Глубокое обучение.
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);
net = getSegNet();
Downloading pretrained SegNet (107 MB)...
Сеть DAG содержит 91 слой включая свертку, нормализацию партии., объединение, необъединение и классификацию пикселей выходные слои. Используйте analyzeNetwork
функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.
analyzeNetwork(net);
Чтобы сгенерировать код 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: To view the report, open('codegen/mex/segnet_predict/html/report.mldatx').
Загрузите и отобразите входное изображение. Вызовите 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.