В этом примере показано, как создать код из функции MATLAB, которая обнаруживает объекты на изображениях с помощью acfObjectDetector объект. При создании кода из функции MATLAB, использующей acfObjectDetector объект необходимо создать вне функции MATLAB. В этом примере объясняется, как изменить код MATLAB в детекторе знака остановки поезда с использованием детектора объекта ACF для поддержки генерации кода.
Для генерации кода C кодер MATLAB требует, чтобы код 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
Загрузите данные обучения.
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).
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)
Освободите системную память, используемую для хранения созданного файла C-MEX.
clear ObjectDetectionFromImages_mex;Введение в создание кода с сопоставлением и регистрацией функций | Создание кода для обнаружения ребер на изображениях (кодер MATLAB)