exponenta event banner

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

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

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

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

Проверка среды графического процессора

Используйте 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, Building, Pole, Road, Pavement, Tree, SignSymbol, Fence, Car, Peduan и Bicyclist.

Сведения об обучении сети семантической сегментации в 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-2019 The MathWorks, Inc.

persistent mynet;

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

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


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

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

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

analyzeNetwork(net);

Запуск создания кода MEX

Создание кода CUDA для segnet_predict.m создание объекта конфигурации кода GPU для цели 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 представляет собой трехмерную матрицу, которая имеет 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 препринт arXiv:1511.00561, 2015.

[2] Бростоу, Габриэль Дж., Жюльен Фокер и Роберто Чиполла. «Классы семантических объектов в видео: база данных истинности земли высокой четкости». Письма для распознавания образов Том 30, Выпуск 2, 2009, стр. 88-97.

См. также

Функции

Объекты

Связанные примеры

Подробнее