exponenta event banner

Обнаружение углов FAST

В этом примере показано, как выполнить обнаружение углов с помощью алгоритма тестирования с ускорением по функциям (FAST). Алгоритм подходит для FPGA.

Обнаружение углов используется в системах компьютерного зрения для поиска признаков изображения. Это часто является одним из первых шагов в таких приложениях, как обнаружение движения, отслеживание, регистрация изображения и распознавание объекта.

Алгоритм FAST определяет наличие угла путем проверки круговой области вокруг потенциального центра угла. Тест обнаруживает угол, если смежный участок пикселей либо ярче центра плюс порог, либо темнее центра минус порог. Другой алгоритм обнаружения углов для FPGA см. в примере Harris Corner Detection.

В программной реализации алгоритм FAST позволяет быстро протестировать потенциальные углы, проверяя только четыре пикселя вдоль осей. Программные алгоритмы выполняют полный тест только в том случае, если быстрый тест проходит успешно. Аппаратная реализация может легко выполнять все тесты параллельно, так что быстрый тест не является особенно выгодным и не включен в этот пример.

Алгоритм FAST может использоваться в различных размерах или масштабах. В этом примере углы определяются с помощью шестнадцатикиксельной окружности. В этих шестнадцати пикселях, если любые девять смежных пикселей удовлетворяют более яркому или темному пределу, то обнаруживается угол.

Обнаружение углов MATLAB FAST

Система компьютерного зрения Toolbox™ включает программный алгоритм обнаружения углов FAST в detectFASTFeatures функция. В этом примере эта функция используется в качестве поведенческой модели для сравнения с конструкцией алгоритма FAST для оборудования Simulink ®. Функция имеет параметры для установки минимального контраста и минимального качества.

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

Минимальные параметры качества, определяющие обнаруженные углы, «достаточно сильны», чтобы быть помеченными как фактические углы. Показатель прочности в исходной бумаге FAST основан на суммировании разностей пикселей в круговой области с центральным пикселем [2]. Более поздние версии этого алгоритма используют другую метрику силы, основанную на наименьшем изменении значения пикселя, что делает обнаружение больше не углом. detectFastFeatures использует метрику наименьшего изменения.

Этот код считывает первый кадр видео, преобразует его в серую шкалу и вызывает detectFASTFeatures. Результатом является вектор угловых расположений. Чтобы отобразить угловые расположения, используйте вектор, чтобы нарисовать ярко-зеленые точки поверх угловых пикселов в выходном кадре.

v = VideoReader('rhinos.avi');
I = rgb2gray(readFrame(v));
% create output RGB frame
Y = repmat(I,[1 1 3]);
corners = detectFASTFeatures(I,'minContrast',15/255,'minQuality',1/255);
locs = corners.Location;
for ii = 1:size(locs,1)
    Y(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end
imshow(Y)

Ограничения алгоритма FAST

Другие методы обнаружения углов работают совсем не так, как метод FAST, и неожиданным результатом является то, что FAST не обнаруживает углы на созданных компьютером изображениях, которые идеально выровнены с x и y оси. Так как обнаруженный угол должен иметь кольцо с более темными или более светлыми значениями пикселей вокруг центра, которое включает в себя оба края угла, хрустящие изображения работают плохо. Например, попробуйте использовать алгоритм FAST для входного изображения, используемого в примере определения угла Харриса Харриса.

I = imread('cornerboxes.png');
Ig = rgb2gray(I);
corners = detectFASTFeatures(Ig,'minContrast',15/255,'minQuality',1/255)
corners = 

  0x1 cornerPoints array with properties:

    Location: [0x2 single]
      Metric: [0x1 single]
       Count: 0

Видно, что функция обнаружила нулевые углы. Это происходит потому, что алгоритм FAST требует кольца контрастных пикселей более чем на полпути к центру угла. В созданном компьютером изображении оба края коробки в углу находятся в кольце используемого пикселя, поэтому тест на угол не проходит. Обходом этой проблемы является добавление размытия (путем применения гауссова фильтра) к изображению, чтобы углы были менее точными, но могли быть обнаружены. После размытия алгоритм FAST обнаруживает более 100 углов.

h = fspecial('gauss',5);
Ig = imfilter(Ig,h);
corners = detectFASTFeatures(Ig,'minContrast',15/255,'minQuality',1/255)
locs = corners.Location;
for ii = 1:size(locs,1)
    I(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end
imshow(I)
corners = 

  136x1 cornerPoints array with properties:

    Location: [136x2 single]
      Metric: [136x1 single]
       Count: 136

Поведенческая модель для проверки

Модель Simulink использует detectFASTFeatures функционировать как поведенческая модель для проверки результатов аппаратного алгоритма. Функциональный блок MATLAB можно использовать для запуска кода MATLAB в Simulink.

modelname = 'FASTCornerHDL';
open_system(modelname);
set_param(modelname,'SampleTimeColors','on');
set_param(modelname,'SimulationCommand','Update');
set_param(modelname,'Open','on');
set(allchild(0),'Visible','off');

Код в функциональном блоке MATLAB должен либо генерировать код C, либо объявляться внешним. Внешнее объявление позволяет выполнять указанную функцию в MATLAB, в то время как остальной блок функции MATLAB работает в Simulink. detectFASTFeatures функция не поддерживает генерацию кода, поэтому блок MATLAB Function должен использовать внешнюю вспомогательную функцию.

Для покадрового визуального сравнения и возможности изменения параметра контрастности вспомогательная функция принимает входное изображение и минимальную контрастность в качестве входных данных. Он возвращает выходное изображение с зелеными точками, обозначающими обнаруженные углы.

function Y = FASTHelper(I,minContrast)
Y = I;
corners = detectFASTFeatures(I(:,:,1),'minContrast',double(minContrast)/255,'minQuality',1/255);
locs = corners.Location;
for ii = 1:size(locs,1)
    Y(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end

end

Функциональный блок MATLAB должен иметь определенный размер для выходного массива. Быстрый способ определения размера выходных данных - копирование входных данных в выходные данные перед вызовом вспомогательной функции. Это код внутри функционального блока MATLAB:

function Y = fcn(I,minContrast)
    coder.extrinsic('FASTHelper');
    Y = I;
    Y = FASTHelper(I,minContrast);
end

Внедрение для ЛПВП

Алгоритм FAST, реализованный в блоке обнаружения углов панели инструментов Vision HDL в этой модели, проверяет 9 смежных пикселей из кольца 16 пикселей и сравнивает их значения со значением центрального пикселя. Ядро 7x7 пиксели вокруг каждого тестового пикселя включают в себя кольцо из 16 пикселей. Диаграмма показывает центральный пиксель и кольцо из 16 пикселей вокруг него, которое используется для теста. Пикселы кольца, по часовой стрелке от верхней середины, равны

  indices = [22 29 37 45 46 47 41 35 28 21 13 5 4 3 9 15];

Эти индексы пикселей используются для выбора и сравнения. Порядок должен быть непрерывным, но кольцо может начинаться в любой точке.

После вычисления угловых метрик с использованием этих колец пикселей алгоритм определяет максимальную угловую метрику в каждой области и подавляет другие обнаруженные углы. Затем модель накладывает не подавленные угловые маркеры на исходное входное изображение.

Аппаратный алгоритм находится в подсистеме FASTHDLAlgorithm. Эта подсистема поддерживает генерацию кода HDL.

open_system([modelname '/FASTHDLAlgorithm'],'force');

Обнаружение углов

Чтобы определить наличие угла, найдите все возможные 9-пиксельные смежные сегменты кольца, которые имеют значения больше или меньше порогового значения.

В аппаратном обеспечении все эти сравнения можно выполнять параллельно. Каждый блок компаратора расширяется до 16 компараторов. Выход блока составляет 16 двоичных решений, представляющих каждый сегмент кольца.

Несимметричное подавление

Алгоритм FAST идентифицирует множество потенциальных углов. Чтобы уменьшить последующую обработку, можно удалить или подавить все углы, за исключением углов с максимальной метрикой угла в определенной области. Существует множество алгоритмов несимметричного подавления, подходящих для программной реализации, но мало подходящих для аппаратных средств. В программном обеспечении используется градиентный подход, который может быть ресурсоемким в аппаратном обеспечении. В этой модели простой, но очень эффективный метод заключается в сравнении угловых метрик в 5x5 и создать логический результат. Логический выход равен true, если угловая метрика в центре ядра больше нуля (т.е. это угол), а также является максимумом всех других угловых метрик в 5x5 регион. Условие больше нуля соответствует параметру minQuality кому 1 для detectFASTFeatures функция.

Поскольку обработка потока пикселей происходит слева направо и сверху вниз, результаты содержат некоторые эффекты направления, такие как то, что обнаруженные углы не всегда полностью выравниваются с объектами. Подсистема NonMaxSuppress включает постоянный блок, который позволяет отключить подавление и визуализировать все результаты.

open_system([modelname '/FASTHDLAlgorithm/NonMaxSuppress'],'force');

Выравнивание и наложение

На выходе подсистемы NonMaxSuppress поток пикселей включает маркеры для самого сильного угла в каждой области 5x5. Затем модель выравнивает обнаруженные углы с исходным потоком пикселей с помощью блока «Выравнивание потока пикселей». После выравнивания исходного потока и маркеров по времени модель накладывается зеленой точкой на углы. Подсистема Overlay содержит альфа-микшер с константами для значений цвета и альфа.

Средства просмотра выходных данных отображают наложенные зеленые точки для обнаруженных углов. В Behavioral Video Viewer отображаются выходные данные detectFastFeatures функция, и HDL Video Viewer показывает выходные данные алгоритма HDL.

Идти дальше

Не максимальный алгоритм подавления может быть улучшен путем следования градиентам и использования многопроходной стратегии, но это вычисление также будет использовать больше аппаратных ресурсов.

Заключение

В этом примере показано, как начать использовать detectFASTFeatures в MATLAB, а затем перейдите в Simulink для части конструкции FPGA. Аппаратный алгоритм в блоке Corner Detector включает в себя проверку кольца вокруг центрального пикселя в ядре и метрику угловой силы. Модель использует функцию несимметричного подавления для удаления всех обнаруженных углов, кроме самых сильных. Затем конструкция накладывает угловые расположения на исходный видеовход, выделяя углы зеленым цветом.

Ссылки

[1] Ростен, Э. и Т. Драммонд. Материалы Международной конференции IEEE по компьютерному зрению, том 2 (октябрь 2005 года): стр. 1508-1511.

[2] Ростен, Э. и Т. Драммонд. «Машинное обучение для высокоскоростного углового компьютерного видения» обнаружения - примечания лекции ECCV 2006 года в информатике, 2006, 430-43. doi:10.1007/11744023_34.