В этом примере показана генерация кода для приложения сегментации изображений, которое использует глубокое обучение. Он использует codegen
команда для генерации MEX-функции, которая выполняет предсказание для объекта DAG Network для SegNet [1], нейронной сети для глубокого обучения для сегментации изображений.
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
Графический процессор NVIDIA с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Используйте 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 классам, которые включают Sky, создание, Pole, Road, Trainment, Tree, SignSymbol, Fence, Car, Pedestrian и Bicyclist.
Для получения информации о обучении сети семантической сегментации в MATLAB с помощью набора данных CamVid [2], смотрите Семантическая сегментация с использованием глубокого обучения (Computer Vision Toolbox).
segnet_predict
Функция точки входаThe 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
(Deep Learning Toolbox) функция для отображения интерактивной визуализации архитектуры нейронной сети для глубокого обучения.
analyzeNetwork(net);
Чтобы сгенерировать код CUDA для segnet_predict.m
функция точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
функция для создания CuDNN
объект строения глубокого обучения и присвоение его DeepLearningConfig
свойство объекта строения кода GPU. Запуск 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 является трехмерной матрицей, которая имеет 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] Бадринараянан, Виджай, Алекс Кендалл и Роберто Чиполла. «SegNet: Архитектура глубокого сверточного энкодера-декодера для сегментации изображений». arXiv preprint arXiv:1511.00561, 2015.
[2] Brostow, Gabriel J., Julien Fauqueur, and Roberto Cipolla. Semantic object classes in video: A high-definition основная истина database (неопр.) (недоступная ссылка). Pattern Recognition Letters Vol 30, Issue 2, 2009, pp 88-97.