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

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

Разработайте файл кода MATLAB для генерации кода

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

Чтобы поддержать генерацию кода, этот пример реструктуризирует код существующего примера (См. Train детектора стоп-знака с использованием детектора объектов ACF) в функции, называемой detectObjectsUsingACF, который присутствует в текущей рабочей папке в качестве вспомогательного файла. The 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 Stop Sign Detector вне функции 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)