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

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

Используйте 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 классам, которые включают Sky, создание, Pole, Road, Trainment, Tree, SignSymbol, Fence, Car, Pedestrian и Bicyclist.

Для получения информации о обучении сети семантической сегментации в MATLAB с помощью набора данных CamVid [2], смотрите Семантическая сегментация с использованием глубокого обучения (Computer Vision Toolbox).

The 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);


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

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

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

analyzeNetwork(net);

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

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

Запуск сгенерированного MEX

Загрузка и отображение входа изображения. Функции 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.

Похожие темы