exponenta event banner

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

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

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

Для генерации кода 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

Создание детектора знака остановки 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).

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.

Очистить

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

clear ObjectDetectionFromImages_mex;

См. также

| (кодер MATLAB)