exponenta event banner

Анализ больших двоичных объектов

В этом примере показано, как реализовать алгоритм однопроходной 8-поточной маркировки компонентов и выполнить анализ больших двоичных объектов.

Анализ Blob - это компьютерная структура зрения для обнаружения и анализа связанных пикселей, называемых blobs. Этот алгоритм может быть сложно реализовать в потоковой схеме, поскольку он обычно включает в себя два или более прохода через изображение. Первый проход выполняет начальную маркировку, а дополнительные проходы соединяют любые большие двоичные объекты, не помеченные правильно на первом проходе. Потоковые проекты используют однопроходный алгоритм для применения и слияния меток в аппаратном обеспечении и сохранения статистики больших двоичных объектов в оперативной памяти. Этот пример имеет выходной каскад в программном обеспечении, который считывает результаты ОЗУ и накладывает их на входное видео. Этот пример помечает большие двоичные объекты и присваивает каждому большому двоичному объекту уникальный идентификатор. Каждый большой двоичный объект рисуется в выходном изображении различным цветом. В примере также вычисляется центроид, ограничивающая рамка и площадь до 1024 меченых блоков. Модель может поддерживать до 1080p @ 60 видео.

Обзор

Пример модели поддерживает совместное проектирование аппаратного и программного обеспечения. Подсистема BlobDetector является аппаратной частью проекта и поддерживает генерацию кода HDL. За один проход эта подсистема помечает каждый пиксель во входящем потоке пикселей, объединяет соединенные области и вычисляет центроид, область и ограничивающую рамку для каждого большого двоичного объекта. Выходной сигнал подсистемы представляет собой поток маркированных пикселей. Подсистема сохраняет статистику больших двоичных объектов в ОЗУ. Когда анализ больших двоичных объектов завершен, подсистема устанавливает data_ready выходной порт, чтобы указать, что статистика больших двоичных объектов готова к считыванию.

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

Подсистема BlobDetector предоставляет эти порты конфигурации, которые могут быть сопоставлены с регистрами AXI для управления программным обеспечением в реальном времени.

  • GradThresh: Пороговое значение, используемое для создания изображения интенсивности.

  • AreaThresh: количество пикселей, определяющих большой двоичный объект. Значение по умолчанию 1 означает, что все блоки обрабатываются.

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

  • VideyMode: поток пикселей, возвращаемый подсистемой. Можно выбрать входное видео (0), помеченные пикселы (1) или интенсивность видео после пороговой обработки (2). Эти различные виды видео можно использовать для отладки.

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

  • index_o: Индекс большого двоичного объекта, возвращающего статистику.

  • num_o: Количество блоков, удовлетворяющих пороговому значению площади.

  • totalNum_o: Общее число больших двоичных объектов, обнаруженных в текущем кадре. Сравнивая num_o и totalNum_o, можно точно настроить порог области ввода.

  • data_ready_o: Указывает, когда статистика больших двоичных объектов для текущего кадра готова для чтения из ОЗУ. В реализации совместного проектирования аппаратного и программного обеспечения этот сигнал можно отобразить в регистр AXI, и программное обеспечение может опросить значение регистра, чтобы определить, когда начать считывание статистики.

Детектор больших двоичных объектов

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

Алгоритм маркировки

Функциональный блок MATLAB labelandmerge выполняет 8-проходную маркировку пикселей относительно текущего пикселя. Возможные этикетки: предыдущая этикетка, главная этикетка, верхняя левая этикетка и верхняя правая этикетка. Функция назначает текущему пикселю существующую метку в порядке приоритета. Если метки отсутствуют, и пиксель является пикселем переднего плана, то функция назначает новую метку текущему пикселю путем приращения счетчика меток. Функция формирует окно маркировки, как показано на диаграмме, путем потоковой передачи в текущем пикселе, сохранения предыдущей метки в регистре и сохранения предыдущей строки меток пикселей в ОЗУ. Метки, идентифицированные с помощью labelandmerge, выводятся из блока по мере их идентификации. Дополнительные сведения об операции объединения см. в разделе Логика объединения.

Расчет статистики больших двоичных объектов

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

Подсистема area_accum увеличивает площадь большого двоичного объекта, представленного каждой обнаруженной меткой, увеличивая адрес ОЗУ, соответствующий метке.

Подсистемы x_accum и y_accum накапливают значения xpos и ypos из входных портов. Значения xpos и ypos являются координатами пикселя во входном кадре. Используя значения площади и накопленные координаты, центроид вычисляется из xaccum/area и yaccum/area. В этом вычислении используется взаимность с одной точностью для 1/area и затем умножает это обратное на xaccum и yaccum для поиска координат центроида. Использование собственной обратной плавающей точки обеспечивает высокую точность и поддерживает высокий динамический диапазон. При создании кода HDL кодер реализует обратную логику с фиксированной запятой, а не требует ресурсов с плавающей запятой в FPGA. Дополнительные сведения см. в разделе Начало работы с встроенным кодером HDL (HDL Coder).

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

Логика объединения

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

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

Функциональный блок labelandmerge MATLAB проверяет наличие слияний и возвращает uint32 значение, содержащее две объединенные метки. Подсистема MergeQueue хранит любые слияния, происходящие в текущей строке. В конце каждой строки подсистема cca считывает значения MergeQueue и корректирует значения области, центроида и ограничивающей рамки в накопителях. Накопленные значения для двух объединенных меток добавляются вместе и назначаются одной метке. Вход в каждую накопительную подсистему имеет мультиплексор 2:1, который обеспечивает приращение накопителя либо при обнаружении новой метки, либо при слиянии.

Выходной дисплей

В конце каждого кадра модель обновляет два видеодисплея. На видеоэкране «Результаты на изображении» отображается входное изображение с наложенными ограничивающими прямоугольниками (зелеными прямоугольниками) и центроидами (красными крестами). На видеоэкране «Изображение метки» отображаются результаты этапа маркировки перед объединением. На дисплее «Изображение метки» верхняя часть каждой монеты имеет метку, отличную от метки остальной монеты. Стадия объединения исправляет это поведение, объединяя две метки в одну. Ограничительная рамка, возвращаемая для каждого большого двоичного объекта, показывает, что каждая монета была обнаружена как одна метка.

Результаты внедрения

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

makehdl('BlobAnalysisHDL/BlobDetector')

Полученный код синтезировали для мишени Xilinx ZC706 SoC. Конструкция отвечала ограничению синхронизации 200 МГц. Конструкция использует очень мало аппаратных ресурсов, как показано в таблице.

T =

  5x2 table

    Resource       Usage    
    ________    ____________

    DSP48       7 (0.78%)   
    Register    4827 (1.1%) 
    LUT         3800 (1.74%)
    Slice       1507 (2.67%)
    BRAM        25.5 (4.68%)

Связанные темы