В этом примере показано, как сгенерировать код из функции MATLAB, которая обнаруживает объекты на изображениях с помощью acfObjectDetector
объект. Когда вы намерены сгенерировать код из функции MATLAB, которая использует acfObjectDetector
объект должен быть создан вне функции MATLAB. Пример объясняет, как изменить код MATLAB в Обучите Детектор Стоп-Знака Используя Детектор Объектов ACF для поддержки генерации кода.
Чтобы сгенерировать код С, 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
Загрузите обучающие данные.
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);
Потому что вы намерены сгенерировать код для функции 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').
Чтобы обнаружить объекты в изображении, загрузите тестовое изображение.
img = imread('stopSignTest.jpg');
Вызовите сгенерированную функцию C-MEX путем передачи загруженного изображения img
как вход.
[bboxes, scores] = detectObjectsUsingACF_mex(img);
Отобразите результаты обнаружения и вставьте ограничительные рамки для объектов в изображение.
img = insertObjectAnnotation(img,'rectangle',bboxes,scores);
figure
imshow(img)
Отпустите системную память, используемую для хранения сгенерированного файла MEX на C.
clear ObjectDetectionFromImages_mex;
Введение в генерацию кода с совпадением функций и регистрацией | Сгенерируйте код, чтобы обнаружить ребра на изображениях (MATLAB Coder)