Детектор линий разметки

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

Обнаружение маршрута является критическим этапом обработки в Усовершенствованных ведущих системах помощи (ADAS). Автоматически обнаружение контуров маршрута от видеопотока в вычислительном отношении сложно, и поэтому аппаратные акселераторы, такие как FPGAs и графические процессоры часто требуются, чтобы достигать оперативной эффективности.

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

Системный обзор

Систему LaneDetectionHDL.slx показывают ниже. Подсистема HDLLaneDetector представляет аппаратно ускоренную часть проекта, в то время как подсистема SWLaneFitandOverlay представляет основанный на программном обеспечении полином подходящий механизм. До блока Frame to Pixels вход RGB преобразован в цветовое пространство интенсивности.

Детектор маршрута HDL

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

Вид с высоты птичьего полета

Блок Birds-Eye View преобразовывает обращенное к передней стороне поле зрения камеры к перспективе птичьего глаза. Работа с изображениями в этом представлении упрощает требования к обработке нисходящих алгоритмов обнаружения маршрута. Обращенное к передней стороне представление страдает от перспективного искажения, заставляя маршруты сходиться на пределе. Перспективное искажение корректируется путем применяния обратного перспективного преобразования.

Обратное перспективное отображение (IPM) дано следующим выражением:

$$(\hat{x},\hat{y}) = round\left(\frac{h_{11}x + h_{12}y + h_{13}}{h_{31}x + h_{32}y + h_{33}}, \frac{h_{21}x + h_{22}y + h_{23}}{h_{31}x + h_{32}y + h_{33}}\right)$$

Матрица homography, h, выведена из четырех внутренних параметров физической настройки камеры, а именно, фокусное расстояние, тангаж, высота и принципиальная точка (из модели камеры с точечной диафрагмой). Для получения дополнительной информации обратитесь к документации Computer Vision Toolbox™.

Можно оценить матрицу homography при помощи estimateGeometricTransform2D Computer Vision Toolbox™ функционируйте или fitgeotrans Image Processing Toolbox™ функция, чтобы создать projective2d объект. Эти функции требуют набора совпадающих точек между исходной системой координат и системой координат вида с высоты птичьего полета. Исходные точки системы координат взяты в качестве вершин трапециевидной необходимой области и могут расширить мимо исходных пределов системы координат, чтобы получить более крупную область. Для трапецоида, показанного отображение точки:

$$sourcePoints = [c_{x},c_{y};\ d_{x},d_{y};\ a_{x},a_{y};\ b_{x},b_{y}]$$

$$birdsEyePoints = [1,1;\ bAPPL,1;\ 1,bAVL;\ bAPPL,bAVL]$$

Где bAPPL и bAVL являются видом с высоты птичьего полета активные пиксели на строку и активные видео линии соответственно.

Прямая оценка источника (обращенного к передней стороне) месту назначения (птичий глаз), сопоставляющий в режиме реального времени на оборудовании FPGA/ASIC, сложна. Требование для деления наряду с потенциалом для непоследовательного доступа к памяти от кадрового буфера означает, что вычислительные требования этой части проекта являются существенными. Поэтому вместо того, чтобы непосредственно оценить вычисление IPM в режиме реального времени, оффлайновый анализ входа, чтобы вывести отображение выполнялся и использовался, чтобы предварительно вычислить схему отображения. Это возможно, когда матрица homography фиксируется после калибровки/установки фабрики камеры, из-за положения камеры, высоты и зафиксированного тангажа.

В этом конкретном примере выходное изображение птичьего глаза является системой координат [700x640] размерности, тогда как обращенное к передней стороне входное изображение имеет [480x640] размерности. Нет достаточного очищения, доступного для того, чтобы вывести полную систему координат птичьего глаза, прежде чем следующий обращенный к передней стороне вход камеры будет передан потоком в. Блок Вида с высоты птичьего полета поэтому не примет новых данных о системе координат, пока это не закончило обрабатывать текущий кадр птичьего глаза.

Буферизация линии и расчет адреса

Проективное преобразование в натуральную величину от входа, чтобы вывести привело бы к [900x640] выходное изображение. Это требует, чтобы полное [480x640] входное изображение хранилось в памяти, в то время как местоположение исходного пикселя вычисляется с помощью исходного местоположения и матрицы homography. Идеально память на чипе должна использоваться с этой целью, удаляя требование для кадрового буфера вне кристалла.

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

% Source & Birds-Eye Frame Parameters
%   AVL:  Active Video Lines, APPL: Active Pixels Per Line
sAVL  = 480;
sAPPL = 640;
% Birds-Eye Frame
bAVL  = 700;
bAPPL = 640;
% Determine Homography Matrix
%   Point Mapping [NW; NE; SW; SE]
sourcePoints   = [218,196; 421,196; -629,405; 1276,405];
birdsEyePoints = [001,001; 640,001;  001,900;  640,900];
%   Estimate Transform
tf = estimateGeometricTransform2D(sourcePoints,birdsEyePoints,'projective');
%   Homography Matrix
h = tf.T;
% Visualize Birds-Eye ROI on Source Frame
vidObj   = VideoReader('visionhdl_caltech.avi');
vidFrame = readFrame(vidObj);
vidFrameAnnotated = insertShape(vidFrame,'Polygon',[sourcePoints(1,:) ...
    sourcePoints(2,:) sourcePoints(4,:) sourcePoints(3,:)],           ...
    'LineWidth',5,'Color','red');
vidFrameAnnotated = insertShape(vidFrameAnnotated,'FilledPolygon',    ...
    [sourcePoints(1,:) sourcePoints(2,:) sourcePoints(4,:)            ...
    sourcePoints(3,:)],'LineWidth',5,'Color','red','Opacity',0.2);
figure(1);
subplot(2,1,1);
imshow(vidFrameAnnotated)
title('Source Video Frame');
% Determine Required Birds-Eye Line Buffer Depth
%   Inverse Row Mapping at Frame Centre
x = round(sourcePoints(2,1)-((sourcePoints(2,1)-sourcePoints(1,1))/2));
Y = zeros(1,bAVL);
for ii = 1:1:bAVL
    [~,Y(ii)] = transformPointsInverse(tf,x,ii);
end
numRequiredRows = ceil(Y(0.98*bAVL) - Y(1));
% Visualize Inverse Row Mapping
subplot(2,1,2);
plot(Y,'HandleVisibility','off');   % Inverse Row Mapping
xline(0.98*bAVL,'r','98%','LabelHorizontalAlignment','left',          ...
    'HandleVisibility','off');      % Line Buffer Depth
yline(Y(1),'r--','HandleVisibility','off')
yline(Y(0.98*bAVL),'r')
title('Birds-Eye View Inverse Row Mapping');
xlabel('Output Row');
ylabel('Input Row');
legend(['Line Buffer Depth: ',num2str(numRequiredRows),' lines'],     ...
    'Location','northwest');
axis equal;
grid on;

График показывает отображение входной линии, чтобы вывести линию, показывающую, что для того, чтобы сгенерировать первые 700 линий верхней части вниз выходное изображение птичьего глаза, приблизительно 50 линий входного изображения требуются. Это - приемлемое количество линий, чтобы сохранить использование память на чипе.

Детектор линий разметки

С полученным изображением вида с высоты птичьего полета может быть выполнено фактическое обнаружение маршрута. Существует много методов, которые могут быть рассмотрены с этой целью. Достигнуть реализации, которая устойчива, работает хорошо над потоковой передачей данных изображения и который может быть реализован в оборудовании FPGA/ASIC по разумной стоимости ресурса, этот пример использует подход, описанный в [1]. Этот алгоритм выполняет свертку полного образа с вертикально ориентированным первым порядком Гауссово производное ядро фильтра, сопровождаемое обработкой подобласти.

Вертикально ориентированная свертка фильтра

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

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

Кандидат маршрута генерация

После свертки с Гауссовым производным ядром выполняется обработка подобласти выхода для того, чтобы найти координаты, где маркировка маршрута присутствует. Каждая область состоит из 18 линий со схемой memory пинг-понга на месте, чтобы гарантировать, что данные могут постоянно передаваться потоком через подсистему.

Количество столбцов гистограммы

Во-первых, HistogramColumnCount считает количество пороговых пикселей в каждом столбце по 18 областям линии. Высокое количество столбцов указывает, что маршрут, вероятно, присутствует в области. Это количество выполняется и для положительного и для отрицательных пороговых изображений. Положительные количества гистограммы возмещены с учетом ширины ядра. Кандидаты маршрута происходят, где положительное количество и отрицательные количества оба высоки. Это использует ранее отмеченное свойство свертки выход, где положительные дорожки появляются рядом с отрицательными дорожками.

Внутренне, столбец, считая гистограмму генерирует управление, сигнализирующее, который выбирает 18 областей линии, вычисляет гистограмму столбца и выводит результат, когда готовый. Схема буферизации пинг-понга существует, который позволяет одной гистограмме читать, в то время как следующее пишет.

Перекройтесь и умножьтесь

Как отмечено, когда маршрут будет присутствовать в изображении птичьего глаза, результат свертки произведет полосы высокой интенсивности положительный выход, расположенный рядом с полосами высокой интенсивности отрицательный выход. Положительные и отрицательные гистограммы количества столбцов определяют местоположение таких областей. Для того, чтобы усилить эти местоположения, положительное количество, выход задерживается 8 тактами (внутренний параметр, связанный с шириной ядра), и положительные и отрицательные количества умножаются вместе. Это усиливает столбцы, где положительные и отрицательные количества соглашаются, и минимизирует области, где существует разногласие между положительными и отрицательными количествами. Проект является конвейерным для того, чтобы гарантировать высокую операцию пропускной способности.

Нулевой фильтр пересечения

При выходе Перекрытия и Умножают подсистему, peaks появляется, где существуют существующие маркировки маршрута. Пиковый алгоритм обнаружения определяет столбцы, где маркировки маршрута присутствуют. Поскольку ОСШ относительно высок в данных, этот пример использует простую КИХ-операцию фильтрации, сопровождаемую нулевым обнаружением пересечения. Нулевой Фильтр Пересечения реализуется с помощью блока Discrete FIR Filter из DSP System Toolbox™. Это является конвейерным для высокопроизводительной операции.

Сохраните доминирующие маршруты

Нуль, пересекающий фильтр выход, затем передается в Хранилище Доминирующая подсистема Маршрутов. Эта подсистема имеет максимальную память о 7 записях и сбрасывается каждый раз, когда новый пакет 18 линий достигнут. Поэтому для каждой подобласти 7 потенциальных кандидатов маршрута сгенерированы. В этой подсистеме Zero Crossing Filter выход передан потоком через и исследован на потенциальные нулевые пересечения. Если нулевое пересечение действительно происходит, то различие между адресом сразу до нулевого пересечения и адресом после нулевого пересечения взято для того, чтобы получить измерение размера пика. Подсистема хранит нулевые местоположения пересечения самой высокой величиной.

Вычислите маршруты эго

Подсистема Обнаружения Маршрута выводит 7 самых жизнеспособных маркировок маршрута. Во многих приложениях мы больше всего интересуемся маркировками маршрута, которые содержат маршрут, в котором транспортное средство является ведущим. Путем вычисления так называемых "Маршрутов Эго" на аппаратной стороне проекта мы можем уменьшать полосу пропускания памяти между аппаратным и программным обеспечением путем отправки 2 маршрутов, а не 7 к процессору. Расчет Маршрута Эго разделен в две подсистемы. Подсистема FirstPassEgoLane принимает, что столбец центра изображения соответствует середине маршрута, когда транспортное средство правильно действует в контурах маршрута. Кандидаты маршрута, которые являются самыми близкими к центру, поэтому приняты как маршруты эго. Подсистема Удаления выбросов обеспечивает среднюю ширину расстояния от маркировок маршрута, чтобы центрировать координату. Отклоняются маркеры маршрута, которые не являются в допуске текущей ширины. Выполнение раннего отклонения маркеров маршрута дает лучшие результаты при выполнении аппроксимирования кривыми позже в проекте.

Интерфейс управления

Наконец, вычисленные маршруты эго отправляются в подсистему функции MATLAB CtrlInterface. Этот конечный автомат использует четыре входных параметров управляющего сигнала - включают, hwStart, hwDone, и swStart, чтобы определить, когда начать буферизовать, признать, что новая координата маршрута в 40x1 буферизует и наконец указывает к программному обеспечению, что все 40 координат маршрута были буферизованы и так подбор кривой маршрута, и наложение может быть выполнено. Сигнал dataReady гарантирует, что программное обеспечение не будет делать попытку маршрута, соответствующего, пока все 40 координат не были буферизованы, в то время как сигнал swStart гарантирует, что текущий набор 40 координат будет сохранен, пока подбор кривой маршрута не завершается.

Подгонка маршрута программного обеспечения и наложение

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

Драйвер

Подсистема функции MATLAB Драйвера управляет синхронизацией между аппаратным и программным обеспечением. Первоначально это находится в состоянии опроса, где это производит вход dataReady равномерно на систему координат, чтобы определить, когда оборудование буферизовало полное [40x1] вектор из координат маршрута. Если это происходит, это переходит в программное обеспечение, обрабатывающее состояние, где swStart и процесс выходные параметры сохранены высоко. Драйвер остается в программном обеспечении, обрабатывающем состояние, пока swDone вход не высоко. При наблюдении, когда процесс вывел циклы назад к входу swDone с промежуточным блоком перехода уровня, существует эффективно постоянный бюджет времени, заданный для подсистемы FitLanesandOverlay, чтобы выполнить подбор кривой и наложение. Когда swDone будет высок, Драйвер перейдет в состояние синхронизации, где swStart, как сохранилось, низко указывает к оборудованию, что обработка завершена. Синхронизация между программным и аппаратным обеспечением такова, что оборудование будет содержать [40x1] вектор из координат маршрута до переходов сигнала swStart назад к низко. Когда это произойдет, dataReady выход оборудования затем перейдет назад к низко.

Подходящие маршруты и наложение

Подходящая подсистема Маршрутов и Наложения включена Драйвером. Это выполняет необходимую арифметику, требуемую для того, чтобы соответствовать полиному на данные о координате маршрута, полученные во входе, и затем чертит подходящий маршрут и координаты маршрута на изображение "Бердз Ай".

Подходящие маршруты

Подходящая подсистема Маршрутов запускается, RANSAC основывал соответствующую линии стандартную программу на сгенерированных кандидатах маршрута. RANSAC является итеративным алгоритмом, который создает таблицу inliers на основе меры по расстоянию между предложенной кривой и входными данными. При выходе этой подсистемы, существует [3x1] вектор, который задает полиномиальные коэффициенты, найденные стандартной программой RANSAC.

Наложите маркировки маршрута

Подсистема Маркировок Маршрута Наложения выполняет операции визуализации изображений. Это накладывает маршруты эго и кривые, найденные соответствующей маршруту стандартной программой.

Результаты симуляции

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

Из-за больших форматов кадра, используемых в этой модели, симуляция может относительно занять много времени, чтобы завершиться. Если у вас есть лицензия HDL Verifier™, можно ускорить скорость симуляции непосредственно рабочим подсистема Детектора Маршрута HDL в оборудовании с помощью FPGA в Loop(TM).

Генерация HDL-кода

Проверять и сгенерировать HDL-код сослались в этом примере, у вас должна быть лицензия HDL Coder™.

Чтобы сгенерировать HDL-код, используйте следующую команду.

makehdl('LaneDetectionHDL/HDLLaneDetector')

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

makehdltb('LaneDetectionHDL/HDLLaneDetector')

Для более быстрой симуляции испытательного стенда можно сгенерировать испытательный стенд SystemVerilog DPIC используя следующую команду.

makehdltb('LaneDetectionHDL/HDLLaneDetector','GenerateSVDPITestBench','ModelSim')

Заключение

Этот пример обеспечил понимание проблем разработки систем ADAS в целом с особым акцентом, заплаченным за ускорение критических частей проекта в оборудовании.

Ссылки

[1] Р. К. Сэцода и Моан М. Триведи, "Основанный на видении Анализ Маршрута: Исследование Проблем и Подходы для Встроенной Реализации", 2 013 Конференций по IEEE по Компьютерному зрению и Распознаванию образов.

[2] Видео от Набора данных Маршрутов Калифорнийского технологического института - Мохамеда Али, "Оперативное Обнаружение Маркеров Маршрута на Городских улицах", 2 008 IEEE Интеллектуальный Симпозиум Транспортных средств - используемый с разрешением.

Похожие темы