Этот пример демонстрирует генерацию кода с пакетными размерами, больше, чем 1. Эта демонстрация содержит два примера, во-первых, cnncodegen
использования сгенерировать код, который берет в пакете изображений, как введено. Второй пример создает файл MEX с помощью
codegen
и передает пакет изображений, как введено.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
NVIDIA cuDNN и библиотека TensorRT.
Библиотеки OpenCV 3.1.0 для видео чтения и изображения отображают операции.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).
Этот пример не поддержан на MATLAB® онлайн.
Используйте coder.checkGpuInstall
функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'tensorrt'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Пример использует сеть DAG ResNet-50 в классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB). Используйте analyzeNetwork
функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.
net = resnet50; analyzeNetwork(net);
Для цели NVIDIA с TensorRT, генерацией кода и выполнением выполняется на компьютере разработчика хоста. Чтобы запустить сгенерированный код, ваш компьютер разработчика должен иметь графический процессор NVIDIA с, вычисляют возможность по крайней мере 3,2. Используйте cnncodegen
команда, чтобы сгенерировать код для платформы NVIDIA при помощи 'tensorrt'
опция. По умолчанию, cnncodegen
команда генерирует код, который использует 32-битную точность с плавающей точкой во входных параметрах тензора к сети. В предсказать вызове повторные изображения могут быть обработаны в пакетном режиме в один вызов и переданы как вход. Этот вызов выполняет предсказания по пакету входных параметров параллельно. Значение по умолчанию пакетного размера равняется 1.
Можно задать входной размер пакета при помощи 'batchsize'
опция. Во время выполнения сгенерированный код ожидает, что то же пакетное значение размера будет использоваться. Передача различного пакетного значения размера в ошибках причин во время выполнения. В этом примере 15 изображений рассматриваются как пакет.
Чтобы сгенерировать код с помощью cuDNN задают 'cudnn'
вместо 'tensorrt'
для 'targetlib'
опция.
status = evalc("cnncodegen(net,'targetlib','tensorrt', 'batchsize', 15)");
presetup()
и postsetup()
функции выполняют дополнительную настройку, требуемую для TensorRT. Классы слоя в папке сгенерированного кода вызывают в библиотеки TensorRT.
Основной файл создает и настраивает сетевой объект CnnMain со слоями и весами. Это использует OpenCV VideoCapture
метод, чтобы считать системы координат из входного видео. Это выполняет предсказание для каждой системы координат и выбирает выход от итогового полносвязного слоя.
Системы координат получены из OpenCV VideoCapture
объект преобразован от упакованного BGR (OpenCV) формат к плоскому RGB (MATLAB) формат. Буфер выделен и заполнен данными изображения. Этот необработанный буфер является входом к сети.
void readBatchData(float *input, vector<Mat>& orig, int batchSize) { for (int i=0; i<batchSize; i++) { if (orig[i].empty()) { orig[i] = Mat::zeros(ROWS,COLS, orig[i-1].type()); continue; }
Mat tmpIm; resize(orig[i], tmpIm, Size(COLS,ROWS));
for (int j=0; j<ROWS*COLS; j++) { // BGR packed to RGB planar conversion input[CH*COLS*ROWS*i + 2*COLS*ROWS + j] = (float)(tmpIm.data[j*3+0]); input[CH*COLS*ROWS*i + 1*COLS*ROWS + j] = (float)(tmpIm.data[j*3+1]); input[CH*COLS*ROWS*i + 0*COLS*ROWS + j] = (float)(tmpIm.data[j*3+2]); } } }
Загрузите демонстрационный видеофайл.
if ~exist('./object_class.avi', 'file') url = 'https://www.mathworks.com/supportfiles/gpucoder/media/object_class.avi.zip'; websave('object_class.avi.zip',url); unzip('object_class.avi.zip'); end
Используйте make
команда, чтобы создать resnet_batchSize_exe
исполняемый файл. Запустите исполняемый файл и задайте пакетный размер в качестве первого аргумента и имени видеофайла в качестве второго аргумента.
if isunix system(['make -f Makefile_resnet_batchsize_linux.mk ','tensorrt']); system('./resnet_batchSize_exe 15 object_class.avi'); elseif ispc system('make_resnet_batchsize_win.bat'); system('resnet_predict.exe 15 object_class.avi'); end
resnet_predict
ФункцияСгенерировать код CUDA для resnet_predict
функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать TensorRT
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Запустите codegen
команда и задает вход как 4D матрица размера [224,224,3, batchSize]. Это значение соответствует входному размеру слоя сети ResNet-50.
batchSize = 5; cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt'); codegen -config cfg resnet_predict -args {ones(224,224,3,batchSize,'uint8')} -report
Code generation successful: To view the report, open('codegen/mex/resnet_predict/html/report.mldatx').
im = imread('peppers.png');
im = imresize(im, [224,224]);
Конкатенация 5 изображений начиная с batchSize = 5
.
imBatch = cat(4,im,im,im,im,im); predict_scores = resnet_predict_mex(imBatch);
Станьте лучшими 5 баллов вероятности и их метки для каждого изображения в пакете.
[val,indx] = sort(transpose(predict_scores), 'descend'); scores = val(1:5,:)*100; net = resnet50; classnames = net.Layers(end).ClassNames; for i = 1:batchSize labels = classnames(indx(1:5,i)); disp(['Top 5 predictions on image, ', num2str(i)]); disp(labels); end
Top 5 predictions on image, 1 {'bell pepper' } {'cucumber' } {'lemon' } {'acorn squash'} {'hamper' } Top 5 predictions on image, 2 {'bell pepper' } {'cucumber' } {'lemon' } {'acorn squash'} {'hamper' } Top 5 predictions on image, 3 {'bell pepper' } {'cucumber' } {'lemon' } {'acorn squash'} {'hamper' } Top 5 predictions on image, 4 {'bell pepper' } {'cucumber' } {'lemon' } {'acorn squash'} {'hamper' } Top 5 predictions on image, 5 {'bell pepper' } {'cucumber' } {'lemon' } {'acorn squash'} {'hamper' }
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;