Этот пример демонстрирует генерацию кода с пакетными размерами, больше, чем 1. Эта демонстрация содержит два примера, во-первых, cnncodegen
использования, чтобы сгенерировать код, который берет в пакете изображений, как введено. Второй пример создает файл MEX с помощью codegen
и передает пакет изображений, как введено.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Библиотека NVIDIA TensorRT.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.
Computer Vision Toolbox™ для видео средства чтения и средства просмотра используется в примере.
Deep Learning Toolbox™ для использования SeriesNetwork или объектов DAGNetwork.
Image Processing Toolbox™ для чтения и отображения изображений.
Этот пример пользуется библиотекой TensorRT, которая только поддержана в платформах Linux.
Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'tensorrt'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Следующий код создает папку в вашей текущей рабочей папке (pwd). Новая папка содержит только файлы, которые важны для этого примера. Если вы не хотите влиять на текущую папку (или если вы не можете сгенерировать файлы в этой папке), измените свою рабочую папку.
gpucoderdemo_setup('gpucoderdemo_resnet_batchsize');
Пример использует популярную сеть DAG ResNet-50 для классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).
net = resnet50;
% To see all the layers, use |net.Layers|
Для цели NVIDIA с TensorRT, генерацией кода и выполнением выполняется на компьютере разработчика хоста. Чтобы запустить сгенерированный код, ваш компьютер разработчика должен иметь графический процессор NVIDIA с, вычисляют возможность по крайней мере 3,2. Используйте cnncodegen команду, чтобы сгенерировать код для платформы NVIDIA при помощи опции 'tensorrt'
. По умолчанию команда cnncodegen
генерирует код, который использует 32-битную точность плавающую для входных параметров тензора к сети. В предсказать вызове повторные изображения могут быть обработаны в пакетном режиме в один вызов и переданы как вход. Это запускает прогнозы по пакету входных параметров параллельно. Значение по умолчанию пакетного размера равняется 1.
% Input batch size can be specified using the |'batchsize'| option. This is % the batch size that should be passed to the generated code. Here % 15 images are considered as a batch, and so batch size is 15. % Passing different batch size at runtime causes errors.
Примечание: Чтобы сгенерировать использование кода CuDNN, мы должны задать 'cudnn'
вместо 'tensorrt'
для опции 'targetlib'
.
cnncodegen(net,'targetlib','tensorrt', 'batchsize', 15);
nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWAdditionLayer.o" "MWAdditionLayer.cpp" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWBatchNormalizationLayer.o" "MWBatchNormalizationLayer.cpp" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWConvLayer.o" "MWConvLayer.cpp" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "cnn_api.o" "cnn_api.cpp" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWAdditionLayerImpl.o" "MWAdditionLayerImpl.cu" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWBatchNormalizationLayerImpl.o" "MWBatchNormalizationLayerImpl.cu" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWCNNLayerImpl.o" "MWCNNLayerImpl.cu" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWConvLayerImpl.o" "MWConvLayerImpl.cu" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWTargetNetworkImpl.o" "MWTargetNetworkImpl.cu" nvcc -c -rdc=true -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include" -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "cnn_exec.o" "cnn_exec.cpp" nvcc -lib -Xlinker -rpath,"/bin/glnxa64",-L"/bin/glnxa64" -lc -Xnvlink -w -Wno-deprecated-gpu-targets -arch sm_35 -std=c++11 -o cnnbuild.a MWAdditionLayer.o MWBatchNormalizationLayer.o MWConvLayer.o cnn_api.o MWAdditionLayerImpl.o MWBatchNormalizationLayerImpl.o MWCNNLayerImpl.o MWConvLayerImpl.o MWTargetNetworkImpl.o cnn_exec.o -L".." -lcudnn -lnvcaffe_parser -lnvinfer_plugin -lnvinfer -lcublas -lcudart -lcusolver ### Created: cnnbuild.a ### Successfully generated all binary outputs.
Предварительная настройка () и постнастройка () функции выполняют дополнительную настройку, требуемую для 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]); } } }
Используйте make
, чтобы создать исполняемый файл resnet_batchSize_exe
.
system(['make ','tensorrt']); or system(['make ','cudnn']);
Запустите исполняемый файл с входным видеофайлом с пакетным размером в качестве первого аргумента и имени видеофайла в качестве второго аргумента. Например./resnet_batchSize_exe 15 testVideo.avi
system(['./resnet_batchSize_exe ', 15 , 'testVideo.avi']);
Создайте объект настройки графического процессора для цели MEX и установите выходной язык на C++. На объекте настройки, набор DeepLearningConfig с targetlib 'tensorrt'. Чтобы сгенерировать MEX CUDA, используйте команду codegen
и задайте вход как 4D матрица размера [224,224,3, batchSize]. Это значение соответствует входному размеру слоя resnet сети.
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]); % % Concatenating 5 images since |batchSize = 5| imBatch = cat(4,im,im,im,im,im); predict_scores = resnet_predict_mex(imBatch); % % get top 5 probability scores and their labels, for each image in the batch [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' 'acorn squash' 'lemon' 'zucchini' Top 5 predictions on image, 2 'bell pepper' 'cucumber' 'acorn squash' 'lemon' 'zucchini' Top 5 predictions on image, 3 'bell pepper' 'cucumber' 'acorn squash' 'lemon' 'zucchini' Top 5 predictions on image, 4 'bell pepper' 'cucumber' 'acorn squash' 'lemon' 'zucchini' Top 5 predictions on image, 5 'bell pepper' 'cucumber' 'acorn squash' 'lemon' 'zucchini'
Очистите статический сетевой объект, загруженный в памяти.
clear mex;
Предупреждение о необъединенном доступе состоит в том, потому что команда codegen
генерирует столбец главный код. Однако в целях этого примера, это предупреждение может быть проигнорировано.
Очистите mex, чтобы очистить статический сетевой объект, загруженный в памяти.
clear mex;
cleanup