Предсказание глубокого обучения при помощи различных пакетных размеров

Этот пример демонстрирует генерацию кода с пакетными размерами, больше, чем 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);

Классификация при помощи сети ResNet-50

Пример использует сеть DAG ResNet-50 в классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB). Используйте analyzeNetwork функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.

net = resnet50;
analyzeNetwork(net);

Сгенерируйте код для NVIDIA графические процессоры при помощи библиотеки TensorRT

Для цели 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.

MainFile

Основной файл создает и настраивает сетевой объект 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

Сгенерируйте MEX CUDA для 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;