콘텐츠로 바로 가기

Kernel 작업#

이 항목에서는 커널이 무엇인지, 그리고 ‘ VisualApplets ’에서 노이즈 제거, 블러, 에지 감지와 같은 주변 영역 연산을 수행할 때 커널을 어떻게 사용하는지 설명합니다.

이 주제를 읽은 후에는 커널을 생성하고, 필터 연산자를 사용하여 처리한 다음, 다시 단일 픽셀로 변환하는 방법을 이해하게 됩니다. DmaToPC.

커널 구조#

커널이란 이미지 내 특정 위치 주변의 인접 픽셀 값들로 이루어진 작은 영역을 말합니다. 노이즈 감소, 블러, 에지 감지 등 많은 필터는 이 인접 영역을 바탕으로 새로운 출력 값을 산출합니다.

3×3 커널의 경우, 창에는 해당 위치의 현재 픽셀과 그 주변 8개의 픽셀을 포함한 총 9개의 값이 포함됩니다. 커널 크기가 홀수일 때는 현재 픽셀이 창의 중앙 에 위치합니다.

커널은 이미지를 왼쪽에서 오른쪽으로, 한 행씩 이동합니다. 각 위치에서 필터는 해당 픽셀 주변의 인접 픽셀들을 사용합니다:

9×9 이미지 위를 이동하는 3×3 커널 창

VisualApplets 에서 해당 영역은 링크 속성에 의해 정의됩니다. 창을 어떻게 구성하고, 현재 픽셀이 창 내에서 어디에 위치하는지는 연산자에 따라 달라집니다. 이에 대한 자세한 내용은 아래에 설명되어 있습니다.

커널 열과 커널 행#

커널 크기는 다음의 일부입니다. 링크 속성. KernelColumns 이것은 이웃 창(neighborhood window)의 너비입니다. KernelRows 는 그 높이입니다. 따라서 3×3 커널은 KernelColumns = 3 그리고 KernelRows = 3.

커널 크기는 링크 속성입니다.

VisualApplets 에서 N은 커널의 행 수이고, M은 커널의 열 수입니다. 커널 요소는 좌표 대신 인덱스로 참조됩니다. 인덱싱은 왼쪽 위부터 오른쪽 아래로 행 단위로 진행됩니다.

커널 인덱스와 이미지 위치 간의 정확한 대응 관계는 항상 운영자 설명서를 참조하십시오.

모든 연산자가 1×1보다 큰 커널을 허용하거나 전달하는 것은 아닙니다. 각 연산자는 허용되는 값을 해당 지원되는 Link Format 의 표 Operator 레퍼런스. 만약 커널 링크를 오직 다음만 허용하는 연산자에 연결하면 Kernel Columns = 1 및 Kernel Rows = 1, VisualApplets 에서 링크 형식 충돌이 발생했다고 보고합니다.

모든 링크 속성에 대한 개요는 ‘매개변수화 자습서’ 항목을 참조하십시오.

알갱이와 Parallelism#

Parallelism 커널과 커널 모두 클럭 사이클당 링크가 전달하는 데이터의 양을 늘리지만, 이들은 서로 다른 개념을 설명합니다:

Parallelism 커널
질문 클럭당 몇 개의 독립 픽셀이 통과하나요? 한 위치에 몇 개의 인접 값이 속해 있나요?
일반적인 용도 카메라 및 DMA 대역폭 조정 주변 지역이 필요한 사료 필터
링크 속성 Parallelism KernelColumns, KernelRows

커널을 사용하면 병렬도를 1로 유지하면서도 클럭당 더 많은 데이터를 전송할 수 있습니다. 즉, 링크가 하나의 이웃 영역(예: 3×3 값)을 하나의 데이터 워드로 전송합니다. 클럭당 데이터 양이 증가하는 이유는 클럭당 더 많은 새로운 이미지 위치가 처리되기 때문이 아니라, 클럭당 더 많은 값이 이동하기 때문입니다. Parallelism 커널 크기를 곱하지 않습니다.

두 가지를 함께 사용할 수도 있습니다. 연산자 CastKernel 입력과 출력 간의 병렬도 값과 커널 크기의 곱이 동일하게 유지되는 한, 이를 재해석할 수 있습니다. 예를 들어, 병렬도 1에 커널 3×2인 경우를 병렬도 6에 커널 1×1인 경우로 바꿀 수 있습니다.

Cast Kernel은 커널 및 병렬 구성 요소를 변환합니다.

자세한 내용은 ‘연산자 참조’의 CastKernel 항목과 Parallelism 튜토리얼 항목을 참조하십시오.

커널 빌드#

일반 픽셀 스트림에서 이웃 데이터를 생성하려면, 해당 연산자에서 커널 크기를 설정하는 연산자를 사용하십시오. 출력 링크. FIRkernelNxM 중앙에 정렬된 2D 커널 창을 생성합니다. LineNeighboursNx1 및 PixelNeighbours1xM 는 특수한 경우로, 중심에 위치한 창 대신 이전 행이나 이전 픽셀을 수집합니다. 연산자들은 현재 픽셀의 위치, 연산자 유형, FPGA 비용 및 지연 시간, 그리고 에지 처리 방식(아래 참조)에 따라 차이가 있습니다. 사용 사례에 맞는 연산자를 선택하십시오: 중심에 위치한 2D 필터 이웃 영역, 이전 행이나 픽셀 간의 비교, 또는 전체 FIR 스타일 창에 대한 자원 효율적인 대안 등입니다.

FIRkernelNxM#

오퍼레이터는 FIRkernelNxM (라이브러리 필터)는 각 픽셀을 중심으로 인접 픽셀을 포함하는 직사각형 커널 창을 생성합니다. 이름과는 달리, 이 알고리즘은 않습니다 FIR 필터를 구현합니다. 이 코드는 필터 연산자에 필요한 커널 데이터를 준비합니다. 커널 크기가 홀수인 경우, 현재 픽셀은 중앙 커널의. 크기가 짝수인 커널의 경우 정확한 중심은 없으며, 중심 위치는 왼쪽 상단으로 치우쳐 있다.

3×3 평균 필터를 사용한 평활화:

FIRkernelNxM을 사용하여 3×3 평균 필터로 평활화하기

이 설계는 중앙에 위치한 3×3 이웃을 구성하며, FIRkernelNxM (Filterkernel), 이를 다음과 같이 평균을 구하여 FIRoperatorNxM (Average), 그런 다음 결과를 스케일링하여 다시 8비트로 변환합니다. 시뮬레이션 프로브는 평균화 전후의 픽셀 값을 비교합니다. 이로 인해 선명했던 국부적인 피크가 더 부드럽고 균일한 값으로 변합니다.

커널 크기는 출력 링크를 편집하여 설정합니다 (Kernel Columns 및 Kernel Rows). 연산자는 전체 인접 영역이 확보될 때까지 필요한 픽셀을 버퍼링합니다. 이미지 가장자리에서는 인접 픽셀이 누락될 수 있습니다. 매개변수 EdgeHandling 누락된 값을 어떻게 채울지 선택합니다 (EdgeMirrored 또는 EdgeConstant).

FIRkernelNxM 는 M형 연산자. 3×3과 같은 중심을 기준으로 한 인접 영역을 구축하려면 버퍼링이 필요하므로, 아래에 설명된 라인 또는 픽셀 인접 연산자에 비해 더 많은 FPGA 리소스를 사용하고 지연 시간도 더 길어집니다. 사용 FIRkernelNxM 필터에 정말로 필요한 것은 중앙 정렬 2차원 근방 — 예를 들어 이전에는 FIRoperatorNxM 블러, 평균화 또는 가장자리 검출을 위해.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 FIRkernelNxM 항목을 참조하십시오.

LineNeighboursNx1 및 PixelNeighbours1xM#

LineNeighboursNx1 및 PixelNeighbours1xM 는 특별한 경우입니다. 이들은 일반적인 의미에서 중심이 정해진 커널을 구성하지 않습니다.

LineNeighboursNx1 N행 1열의 커널을 생성합니다. 현재 픽셀은 커널 인덱스 0; 나머지 요소들은 이전 줄(위쪽)의 픽셀들입니다. PixelNeighbours1xM 1행 M열로 구성된 커널을 생성합니다. 현재 픽셀은 다시 커널 인덱스 0; 나머지 요소들은 같은 줄의 앞쪽(왼쪽)에 있는 픽셀들입니다.

~과는 달리 FIRkernelNxM, 이 연산자들은 않습니다 현재 픽셀을 중앙에 두고, 아직 처리되지 않은 “미래” 인접 픽셀은 제공하지 않습니다. 이들은 오직 과거 (이전 줄 또는 이전 픽셀). 이들은 O형 연산자이며, 중심 주변 영역을 버퍼링할 때 발생하는 라인 또는 픽셀 지연이 발생하지 않습니다. 이로 인해 해당 방식은 더 간단할 뿐만 아니라, 일반적으로 FPGA 리소스 측면에서도 FIRkernelNxM. 더 큰 이웃 영역을 형성할 수도 있습니다(예를 들어 두 연산자를 결합하여 3×3 창을 만드는 방식 등). 하지만 선이나 이미지의 시작 부분에서는 과거의 이웃 데이터가 아직 확보되지 않았기 때문에, 충분한 이력이 수집될 때까지 해당 커널 요소들은 비어 있는 상태로 유지됩니다. 이미지 경계 밖의 누락된 픽셀은 매개변수 Constant; 미러링된 가장자리 처리는 지원되지 않습니다.

대표적인 사용 사례:

  • 다음 항목 간의 값을 비교하거나 줄이세요 앞의 줄들 (각각 LineNeighboursNx1 — 예를 들어, 현재 픽셀과 그 위쪽 줄들의 최소 픽셀 값을 구하려면:

    LineNeighboursNx1을 사용하여 행 간 값 비교하기

  • 다음 항목 간의 값을 비교하거나 줄이세요 같은 줄에 있는 이전 픽셀들 (각각 PixelNeighbours1xM.

    PixelNeighbours1xM을 사용한 픽셀 값 비교

  • 다음과 같은 환원 연산자에 MIN 또는 MAX: 이 연산자들은 입력에 커널이 적용되어 있을 것을 전제로 하며, 주변 영역에서 하나의 값(예: 가장 작은 픽셀)을 선택한 후, 1×1 결과. 해당 단계가 끝나면 커널이 다시 해결됩니다.

    인접한 라인 전반에 걸친 최소 픽셀 값:

    LineNeighboursNx1을 사용한 인접 라인 간 최소 픽셀 값

    인접 픽셀 중 최대 픽셀 값:

    PixelNeighbours1xM을 사용한 인접 픽셀 간의 최대 픽셀 값

2차원 커널을 구축하려면 다음을 결합할 수 있습니다. LineNeighboursNx1 그 다음으로 PixelNeighbours1xM.

연산자에 대한 자세한 내용은 ‘연산자 참조’의 LineNeighboursNx1 및 ‘연산자 참조’의 PixelNeighbours1xM을 참조하십시오.

ExpandToKernel#

오퍼레이터는 ExpandToKernel 단일 픽셀 입력을 임의의 커널 크기로 확장합니다. 이는 복제한다 모든 커널 구성 요소에 대한 입력 값입니다. 출력 링크에서 새로운 커널 크기를 정의합니다.

설정하려는 속성을 식별하려면 ExpandToKernel 후단 연산자가 입력으로 커널을 기대하지만, 여러분이 가지고 있는 것은 단지 싱글 픽셀 값 — 예를 들어 임계값, 평균값 또는 기준 픽셀 등이 있습니다. 일반적인 방식은 해당 상수나 기준을 확장하여 기존 이웃 영역과 일치하도록 하는 것입니다. FIRkernelNxM, LineNeighboursNx1, 또는 PixelNeighbours1xM. 그러면 다음과 같은 연산자를 적용할 수 있습니다. CMP, SUB, 또는 ADD 전체 커널에 걸쳐 요소별로 처리합니다(예를 들어, 모든 인접 요소를 동일한 임계값으로 비교하는 방식).

ExpandToKernel을 사용하여 임계값과 인접 셀 값 비교하기

이 연산자에 대한 자세한 내용은 연산자 참조의 “ExpandToKernel” 항목을 참조하십시오.

커널 처리#

커널을 생성한 후에는 필터링하거나, 부분 집합을 추출하거나, 커널 스트림을 병합하거나 분할하거나, 커널 구성 요소를 재정렬할 수 있습니다. 이 섹션에 소개된 연산자들은 기존 커널을 처리합니다. 그 전에 DmaToPC, 커널을 1×1로 줄여야 합니다 — 참조: DMA에 연결하기.

FIRoperatorNxM#

오퍼레이터는 FIRoperatorNxM 각 커널 요소에 계수를 곱한 뒤 그 곱들의 합을 구합니다. 이러한 계수는 다음을 사용하여 정의할 수 있습니다. Coefficients 파라미터에 HTML 로그 파일(*.html)의 경로와 이름을 지정할 수 있습니다.

의 출력은 FIRoperatorNxM 연산자의 커널 크기는 1×1이며, 이는 각 위치마다 하나의 필터링된 픽셀 값을 의미하므로 다음을 사용합니다. FIRkernelNxM, LineNeighboursNx1, 또는 PixelNeighbours1xM 필요한 입력 커널을 생성하기 위해.

링크에 이미 이웃 영역이 설정되어 있고, 각 위치마다 필터링된 출력 픽셀이 하나씩 필요한 경우, 고전적인 FIR 방식의 필터(평균, 가우시안, 소벨 등)에 이 연산자를 사용하십시오:

Sobel X 필터의 2etklzzwxh:0096f인 운영자

이 스크린샷은 VisualApplets 에 포함된 Examples\Processing\Filter\EdgeDetection\SobelGradientX 디자인 예제를 보여줍니다.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 FIRoperatorNxM 항목을 참조하십시오.

SelectSubKernel#

The SelectSubKernel 이 연산자는 입력 커널의 직사각형 부분 집합을 추출합니다. 이 연산자의 매개변수는 FirstROW 및 FirstCOL 부분 집합의 오프셋을 정의합니다. 새로운 커널 크기가 출력 링크에 설정됩니다.

을(를) 사용하면 SelectSubKernel 다음에서 추출합니다. 중앙 더 이상 전체 주변 영역이 필요하지 않을 때, 커널의 요소(일반적으로 해당 이미지 위치의 원래 픽셀)를 사용합니다.

일반적인 사용 사례는 필터를 적용하면서도 여전히 원본 이미지. 그 후 FIRkernelNxM 이웃을 구축한 후, 커널 링크를 분기시킵니다. 한 경로는 필터링된 결과를 계산하고, 다른 경로는 SelectSubKernel 1×1 서브커널, 즉 해당 이미지 위치의 원본 픽셀을 추출하기 위함입니다. 그러면 필터링된 데이터와 필터링되지 않은 이미지를 모두 얻게 됩니다.

필터 옆에 원본 이미지 데이터 저장하기:

SelectSubKernel을 사용하여 필터 옆에 원본 이미지 데이터 유지하기

이 설계는 3×3 크기의 구역을 구성하며, FIRkernelNxM, 그 다음 분기됩니다. 상단 경로는 SelectSubKernel 원본 픽셀을 추출하기 위해(1×1 서브커널). 아래쪽 경로는 FIRoperatorNxM 소벨 필터로서.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 SelectSubKernel 항목을 참조하십시오.

MergeKernel 및 SplitKernel#

오퍼레이터는 MergeKernel 여러 입력 링크를 하나의 출력 커널로 병합합니다. 이를 위해서는 모든 입력에서 커널의 한 차원(행 또는 열)이 일치해야 하며, 입력의 다른 차원은 서로 다를 수 있습니다. 이 Alignment 값이 지정된 매개변수 horizontal 또는 vertical 입력값이 어떻게 연결되는지를 정의합니다.

그 반대의 연산자는 SplitKernel. SplitKernel N×M 크기의 커널을 각각 1×1 크기의 커널을 가진 N×M개의 개별 출력 링크로 분할합니다. 출력 개수는 커널 구성 요소의 개수와 같아야 하며, 연산자를 인스턴스화할 때 고정됩니다.

전형적인 사용 사례는 다음을 결합하는 것입니다. 동일한 이미지의 여러 가지 변형 — 예를 들어, 서로 다른 그레이스케일 이미지나 보정된 이미지 등 —을 하나의 커널로 통합하여, 이를 함께 비교하거나 처리할 수 있습니다. 다음을 사용하세요. SplitKernel 개별 커널 구성 요소를 다시 별도의 경로에서 처리해야 할 때.

함께, MergeKernel 및 SplitKernel 또한, 그렇지 않으면 다음이 필요했을 디자인을 대체할 수도 있습니다. SYNC 연산자: SYNC 일반적으로 입력 측에 버퍼가 필요하기 때문에 FPGA 리소스를 소모합니다. 스트림을 커널 구성 요소로 처리할 수 있는 경우, 커널을 병합하거나 분할하는 것이 리소스 효율 측면에서 더 나은 접근 방식인 경우가 많습니다.

이 패턴은 다음 용도로만 사용하십시오. 동일한 이미지의 여러 가지 변형 여전히 공통된 소스를 공유하는 것들, 예를 들어 하나의 카메라 스트림을 서로 다른 방식으로 처리한 두 가지 사례와 같이. 않습니다 사용 MergeKernel 두 개의 독립적인 카메라를 병합하기 위해. 독립적인 카메라는 비동기 소스로 남아 있으며 여전히 SYNC (또는 비동기 입력을 지원하는 다른 연산자)와 버퍼. 다음을 참조하십시오. Operator 유형 및 Synchronization 튜토리얼 주제.

비동기 경로를 병합할 때 발생하는 동기화 오류:

비동기 경로를 병합할 때 발생하는 동기화 오류

여기서는 두 개의 분기가 동일한 이미지를 서로 다른 방식으로 처리한 다음, 공통된 CMP 연산자. 한 경로에 있는 M형 연산자로 인해 분기들이 비동기 상태가 되었기 때문에, VisualApplets 에서는 동기화 오류(보라색 링크)가 보고됩니다. 이 분기들을 직접 연결할 수는 없습니다. 이 예시는 여전히 하나의 카메라를 다루는 것이며, 두 대의 독립적인 카메라가 아닙니다.

버퍼와 SYNC를 사용하여 동기화 오류 해결:

버퍼와 SYNC를 사용하여 동기화 오류 해결

한 가지 효과적인 해결 방법은 ImageFifo (또는 다른 버퍼)를 각 경로에 배치하고 다음을 통해 다시 동기화합니다. SYNC 전 CMP. 이 방법은 효과가 있지만, 추가 버퍼로 인해 FPGA 리소스가 소모됩니다.

MergeKernel 및 SplitKernel을 통해 동기화 오류 해결:

MergeKernel 및 SplitKernel을 통해 동기화 오류 해결

자원 효율적인 대안에는 두 가지 변형이 모두 커널 구성 요소로 포함되어 있습니다: MergeKernel 두 경로를 하나의 커널 링크로 결합하고, 해당 링크에서 처리가 계속되며, SplitKernel ~하기 전에 구성 요소를 다시 분리합니다. CMP. 아니요 SYNC 또한 별도의 동기화 버퍼가 필요하지 않습니다.

동기화 및 동기화 오류에 대한 자세한 내용은 ‘연산자 유형 및 동기화 자습서’ 항목을 참조하십시오.

연산자에 대한 자세한 내용은 ‘연산자 참조’의 MergeKernel 및 ‘연산자 참조’의 SplitKernel을 참조하십시오.

CastKernel#

CastKernel 입력 데이터의 병렬 처리 수준과 커널 크기를 재구성합니다. 출력 링크에서 커널 크기를 변경할 수 있습니다. 커널 행, 커널 열, 병렬 처리 수준의 곱은 입력과 출력에서 동일해야 합니다.

을(를) 사용하면 CastKernel 변환할 수 있습니다 커널 내의 병렬 처리. 예를 들어, 커널 크기가 1×1인 병렬도 48은 48개의 커널 열을 갖는 병렬도 1이 됩니다. 동일한 48개의 픽셀 값은 여전히 한 클럭 사이클 내에 이동하지만, 이제는 병렬 픽셀이 아닌 커널 구성 요소가 됩니다. 이는 특정 병렬도만 허용하는 메모리 연산자가 사용되기 전에 유용합니다.

Parallelism 를 메모리 연산자 앞의 커널로 변환하기:

CastKernel을 사용하여 ‘ Parallelism 48’을 48열 커널로 변환하기

스크린샷에서, PARALLELup 병렬 처리 수준을 48로 높입니다(커널 1×1). CastKernel 이를 48개의 커널 열을 가진 병렬 처리 1로 재해석하므로, 다음 메모리 연산자가 해당 데이터를 받아들일 수 있습니다.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 ‘CastKernel’ 항목을 참조하십시오.

KernelRemap#

KernelRemap 입력과 출력 간에 커널 구성 요소를 재매핑합니다. 커널의 크기는 동일하게 유지됩니다. 다음을 사용하면 SourceSelect 매개변수를 사용하면 각 출력 커널 구성 요소에 입력 커널 인덱스를 할당할 수 있습니다.

이 연산자를 사용하면 커널 내용을 대칭 반전하거나 회전할 수 있고, 하나의 입력 요소를 여러 개의 출력 요소로 매핑하거나, 사용되지 않는 입력 요소를 제거할 수 있습니다.

KernelRemap을 사용하여 커널 컬럼 교환하기:

KernelRemap을 사용하여 커널 컬럼 교체하기

스크린샷에 나온 디자인은 다음과 같이 보여줍니다. KernelRemap 커널의 열을 서로 바꿉니다. 0번 열과 3번 열의 순서가 바뀌며(내부 열들도 이에 따라 순서가 바뀝니다). 이 매핑은 SourceSelect 매개변수, 여기 0, 1, 2, 3 → 3, 2, 1, 0. 시뮬레이션 프로브는 리맵 전후의 커널 구성 요소를 보여줍니다.

이 연산자에 대한 자세한 내용은 ‘연산자 참조’의 ‘KernelRemap’ 항목을 참조하십시오.

DMA에 연결하기#

생 커널 링크는 반드시 않습니다 바로 들어가기 DmaToPC. DmaToPC 다음만 허용합니다 Kernel Columns = 1 및 Kernel Rows = 1.

따라서, 커널 출력과 사이에 항상 다음 연산자 중 하나를 배치해야 합니다. DmaToPC. 이 연산자들은 커널을 단일 픽셀로 변환하거나, 이후 더 축소할 수 있는 더 작은 커널로 변환합니다:

  • FIRoperatorNxM
  • SelectSubKernel
  • SplitKernel
  • MIN 또는 MAX
  • Median

디자인 예시#

일반적인 필터 경로는 다음과 같습니다:

필터 작동

  1. 이 카메라는 단일 픽셀(커널 1×1)을 출력합니다.
  2. 예를 들어, 버퍼는 LineBuffer 또는 ImageBuffer, 카메라와 처리 과정을 분리하고, 이웃 연산자에 필요한 라인 데이터를 제공합니다.
  3. FIRkernelNxM 출력 링크에서 인접한 픽셀들(예: 3×3 또는 5×5)을 바탕으로 커널을 구성합니다.
  4. FIRoperatorNxM 필터 계수를 적용하고 위치당 하나의 픽셀을 출력합니다.
  5. DmaToPC 단일 픽셀 스트림을 호스트로 전송합니다.

평균화, 가우시안, 소벨, 적응형 임계값 처리 등 상세한 필터 예시는 ‘연산자 참조’의 ‘FIRkernelNxM’ 항목과 ‘연산자 참조’의 ‘FIRoperatorNxM’ 항목에 있는 ‘사용 예시’ 섹션에 나열되어 있습니다.

디자인 가이드라인

항상 다음을 확인하십시오. 지원되는 Link Format 링크에서 1×1보다 큰 커널을 생성하기 전에 다음 연산자를 사용해야 합니다. 특히 다음을 수행하기 전에 DmaToPC, 커널을 1×1로 줄입니다.