Сгенерируйте код для обнаружения объектов в изображениях при помощи детектора объектов ACF

В этом примере показано, как сгенерировать код от функции MATLAB, которая обнаруживает объекты в изображениях при помощи acfObjectDetector объект. Когда вы намереваетесь сгенерировать код от своей функции MATLAB, которая использует acfObjectDetector объект, необходимо создать объект за пределами функции MATLAB. Пример объясняет, как изменить код MATLAB в, Обучают Детектор Знака Стоп Используя Детектор объектов ACF поддерживать генерацию кода.

Спроектируйте файл кода MATLAB для генерации кода

Чтобы сгенерировать код С, MATLAB Coder требует, чтобы код MATLAB был в форме функции. Аргументы функции не могут быть объектами MATLAB. Это требование представляет проблему для генерации кода от функции MATLAB, которая использует acfObjectDetector объекты создаются за пределами функции MATLAB. Чтобы решить эту задачу, используйте toStruct функционируйте, чтобы преобразовать acfObjectDetector объект в структуру и передачу структура к функции MATLAB.

Чтобы поддержать генерацию кода, этот пример реструктурирует код существующего примера (См., Обучают Детектор Знака Стоп Используя Детектор объектов ACF) в функции под названием detectObjectsUsingACF, который присутствует в текущей рабочей папке как вспомогательный файл. detectObjectsUsingACF функционируйте берет изображение в качестве входа и загружает предварительно обученный детектор знака Стоп ACF.

type('detectObjectsUsingACF.m')
function [bboxes,scores] = detectObjectsUsingACF(InputImage)
% Load a trained detector from a MAT file
S = coder.load('detectorStruct.mat');
% Define a persistent variable
persistent detector
if isempty(detector)
% Re-create the ACF Object Detector
detector = acfObjectDetector(S.detectorStruct.Classifier,S.detectorStruct.TrainingOptions);
end
% Use the detect function to detect objects in the input image 
[bboxes,scores] = detect(detector,InputImage);
end

Создайте детектор знака Стоп ACF за пределами функции MATLAB

Загрузите обучающие данные.

load('stopSignsAndCars.mat')

Выберите основную истину для знаков Стоп. Достоверные данные являются набором известных местоположений знаков Стоп в изображениях.

stopSigns = stopSignsAndCars(:,1:2);

Добавьте полный путь в файлы изображений.

stopSigns.imageFilename = fullfile(toolboxdir('vision'),...
    'visiondata',stopSigns.imageFilename);

Используйте trainACFObjectDetector функция, чтобы обучить детектор ACF. Выключите процесс обучения, выведенный установкой 'Verbose' to false.

detector = trainACFObjectDetector(stopSigns,'NegativeSamplesFactor',2,'Verbose',false);       

Сгенерируйте C-MEX-ФУНКЦИЮ

Поскольку вы намереваетесь сгенерировать код для функции MATLAB detectObjectsUsingACF, преобразуйте созданный detector в структуру.

detectorStruct = toStruct(detector);

Сохраните обученную структуру объекта как файл MAT.

save('detectorStruct.mat','detectorStruct');   

Сгенерируйте код C-MEX, который можно запустить в среде MATLAB. Используйте codegen (MATLAB Coder) команда.

codegen detectObjectsUsingACF -report -args { coder.typeof(uint8(0), [inf inf 3])}
Code generation successful: To view the report, open('codegen/mex/detectObjectsUsingACF/html/report.mldatx').

Обнаружьте объекты Используя сгенерированную C-MEX-ФУНКЦИЮ

Чтобы обнаружить объекты в изображении, загрузите тестовое изображение.

img = imread('stopSignTest.jpg');

Вызовите сгенерированную C-MEX-ФУНКЦИЮ путем передачи загруженного изображения img как вход.

[bboxes, scores] = detectObjectsUsingACF_mex(img);

Отобразите результаты обнаружения и вставьте ограничительные рамки для объектов в изображение.

img = insertObjectAnnotation(img,'rectangle',bboxes,scores);
figure
imshow(img)

Figure contains an axes. The axes contains an object of type image.

Очистка

Выпустите системную память, используемую, чтобы сохранить сгенерированный файл MEX на C.

clear ObjectDetectionFromImages_mex;

Смотрите также

| (MATLAB Coder)