콘텐츠로 바로 가기

Kernel 작업#

이 항목에서는 kernel이 무엇이며 Noise Reduction, 흐림 효과, 엣지 검출 같은 이웃 연산을 위해 VisualApplets에서 kernel을 사용하는 방법을 설명합니다.

이 항목을 읽고 나면 kernel을 빌드하고, 필터 연산자로 이를 처리하며, 다시 단일 픽셀로 변환하는 방법을 이해하게 됩니다. DmaToPC.

Kernel 구조#

kernel은 이미지 내 한 위치를 중심으로 하는 주변 픽셀 값들의 작은 윈도우입니다. Noise Reduction, 흐림 효과, 엣지 검출 같은 많은 필터는 해당 이웃 영역으로부터 새로운 출력 값을 계산합니다.

3×3 kernel의 경우 윈도우는 해당 위치의 현재 픽셀과 8개의 이웃을 포함하여 총 9개의 값을 포함합니다. 홀수 kernel 크기의 경우 현재 픽셀은 윈도우의 중앙에 위치합니다.

kernel은 이미지 위를 왼쪽에서 오른쪽으로, 행 단위로 이동합니다. 각 위치에서 필터는 해당 픽셀 주변의 이웃 영역을 사용합니다.

9×9 이미지 위를 이동하는 3×3 Kernel 윈도우

VisualApplets에서 해당 이웃 영역은 링크 속성(link properties)에 의해 정의됩니다. 윈도우를 빌드하는 방식과 윈도우 내에서 현재 픽셀이 위치하는 곳은 연산자에 따라 다릅니다. 이에 대한 자세한 내용은 아래에 설명되어 있습니다.

Kernel 열 및 Kernel 행#

kernel 크기는 다음의 일부입니다. 링크 속성. KernelColumns 은 이웃 윈도우의 너비입니다. KernelRows 은 그 높이입니다. 따라서 3×3 kernel은 다음을 사용합니다. KernelColumns = 3 및 KernelRows = 3.

Kernel 크기는 링크 속성입니다.

VisualApplets에서 N은 kernel 행의 수이고 M은 kernel 열의 수입니다. Kernel 요소는 좌표 대신 인덱스로 지정됩니다. 인덱싱은 왼쪽 위에서 오른쪽 아래로 행 단위로 실행됩니다.

kernel 인덱스와 이미지 위치 간의 정확한 매핑에 대해서는 항상 연산자 설명서를 확인하십시오.

모든 오퍼레이터가 1×1보다 큰 커널을 허용하거나 전달하는 것은 아닙니다. 각 오퍼레이터는 허용되는 값을 해당 문서에서 설명합니다. 지원되는 Link Format 의 Operator 레퍼런스. Kernel Columns = 1 및 Kernel Rows = 1허용하는 오퍼레이터에 커널 링크를 연결하면 VisualApplets에서 링크 형식 충돌이 보고됩니다.

모든 링크 속성에 대한 개요는 Parameterization 튜토리얼 주제를 참조하십시오.

Kernel 및 Parallelism#

Parallelism과 커널은 모두 클럭 주기당 링크가 전달하는 데이터 양을 증가시키지만 서로 다른 개념을 설명합니다.

Parallelism 커널
질문 클럭 주기당 몇 개의 독립적인 픽셀이 통과합니까? 한 위치에 몇 개의 이웃 값이 속합니까?
일반적인 용도 카메라 / DMA 대역폭 일치 이웃 값이 필요한 필터 공급
링크 속성 Parallelism KernelColumns, KernelRows

커널을 사용하여 Parallelism을 1로 유지하면서도 클럭 주기당 더 많은 데이터를 전달할 수 있습니다. 링크는 하나의 이웃(예: 3×3 값)을 하나의 데이터 워드로 전달합니다. 클럭 주기당 더 많은 새 이미지 위치가 처리되기 때문이 아니라 더 많은 값이 이동하기 때문에 클럭 주기당 데이터 양이 증가합니다. Parallelism 튜토리얼 주제의 픽셀 레이트 대역폭 공식에는 커널 크기가 곱해지지 않습니다.

또한 두 가지를 결합할 수도 있습니다. 오퍼레이터 CastKernel 는 해당 곱이 유지되는 한 입력과 출력 간의 Parallelism과 커널 크기의 곱을 다시 해석할 수 있습니다. 예를 들어, 커널 3×2의 Parallelism 1은 커널 1×1의 Parallelism 6이 될 수 있습니다.

Cast Kernel은 Kernel 및 Parallel Components를 변환합니다.

자세한 내용은 오퍼레이터 레퍼런스의 CastKernel과 Parallelism 튜토리얼 주제를 참조하십시오.

Kernel 빌드#

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

FIRkernelNxM#

오퍼레이터는 FIRkernelNxM (라이브러리 필터)은(는) 이웃 픽셀을 포함하여 각 픽셀 주위에 직사각형 커널 창을 생성합니다. 이름과 달리 FIR 필터를 구현 않습니다 하지 않습니다. 필터 오퍼레이터에 필요한 커널 데이터를 준비합니다. 홀수 커널 크기의 경우 현재 픽셀이 중앙 커널의 크기입니다. 짝수 크기 커널의 경우 정확한 중심이 없으며, 중심 위치가 왼쪽 위로 치우칩니다.

3×3 Average Filter를 사용한 스무딩:

FIRkernelNxM을 사용한 3×3 Average Filter 스무딩

이 디자인은 중심이 3×3인 이웃 영역을 생성합니다. FIRkernelNxM (Filterkernel), 평균을 계산합니다. FIRoperatorNxM (Average), 그런 다음 결과를 스케일링하고 8비트로 캐스팅합니다. 시뮬레이션 프로브는 평균화 전후의 픽셀 값을 비교합니다. 날카로운 로컬 피크가 더 부드럽고 균일한 값으로 바뀝니다.

출력 링크를 편집하여 커널 크기를 정의합니다(Kernel Columns 및 Kernel Rows). 이 연산자는 전체 이웃 영역을 사용할 수 있게 될 때까지 필요한 픽셀을 버퍼링합니다. 이미지 경계에서는 이웃 픽셀이 누락될 수 있습니다. 매개변수 EdgeHandling 는 누락된 값이 채워지는 방식을 선택합니다(EdgeMirrored 또는 EdgeConstant).

FIRkernelNxM 은(는) M-type 연산자입니다. 3×3과 같은 중심 이웃 영역을 구축하려면 버퍼링이 필요하므로, 아래의 라인 또는 픽셀 이웃 연산자보다 더 많은 FPGA 리소스를 사용하고 지연 시간이 추가됩니다. 다음을 사용하세요. FIRkernelNxM 필터에 진정으로 중심 2D 이웃 영역이 필요할 때 — 예를 들어 FIRoperatorNxM 블러, 평균화 또는 에지 검출 전에 사용합니다.

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

LineNeighboursNx1 및 PixelNeighbours1xM#

LineNeighboursNx1 및 PixelNeighbours1xM 은(는) 특수한 경우입니다. 일반적인 의미의 중심 커널을 생성하지 않습니다.

LineNeighboursNx1 은(는) N개의 행과 1개의 열로 이루어진 커널을 생성합니다. 현재 픽셀은 kernel index 0에 위치하며, 다른 요소들은 이전 라인(위쪽)의 픽셀들입니다. PixelNeighbours1xM 은(는) 1개의 행과 M개의 열로 이루어진 커널을 생성합니다. 현재 픽셀은 다시 kernel index 0에 위치하며, 다른 요소들은 동일 라인의 이전 픽셀들(왼쪽)입니다.

달리 FIRkernelNxM, 이러한 연산자들은 않습니다 현재 픽셀을 중앙에 두지 않으며 아직 처리되지 않은 "미래의" 이웃을 제공하지 않습니다. 이 연산자들은 오직 과거 (이전 라인 또는 이전 픽셀). 이 오퍼레이터들은 O-type 오퍼레이터이며 중심 주변 영역을 버퍼링할 때 발생하는 라인 또는 픽셀 지연을 추가하지 않습니다. 따라서 구조가 더 단순하고 일반적으로 에측되는 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을 참조하세요.

Kernel 처리#

커널을 구축한 후에는 필터링하고, 하위 집합을 추출하고, 커널 스트림을 병합 또는 분할하거나, 커널 구성 요소를 재정렬할 수 있습니다. 이 섹션의 오퍼레이터는 기존 커널을 처리합니다. 이전 DmaToPC, 커널을 1×1로 줄여야 합니다. 참조: DMA에 연결.

FIRoperatorNxM#

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

출력 FIRoperatorNxM 오퍼레이터의 커널 크기는 1×1이므로 위치당 단일 필터링된 픽셀 값이 생성됩니다. 사용 FIRkernelNxM, LineNeighboursNx1, 또는 PixelNeighbours1xM 필요한 입력 커널을 생성합니다.

링크에 이미 이웃이 있고 위치당 하나의 필터링된 출력 픽셀이 필요한 경우 클래식 FIR 스타일 필터(평균화, 가우스, 소벨 및 유사한 필터)에 이 오퍼레이터를 사용합니다.

klzzwxh:0096 Sobel X 필터의 오퍼레이터

스크린샷은 VisualApplets와 함께 제공되는 디자인 예제 Examples\Processing\Filter\EdgeDetection\SobelGradientX를 보여줍니다.

오퍼레이터에 대한 자세한 내용은 오퍼레이터 참조의 FIRoperatorNxM을 참조하세요.

SelectSubKernel#

The SelectSubKernel 오퍼레이터는 입력 커널의 직사각형 하위 집합을 추출합니다. 해당 파라미터 FirstROW 및 FirstCOL 은 하위 집합의 오프셋을 정의합니다. 새 커널 크기는 출력 링크에 설정됩니다.

을(를) 사용하면 SelectSubKernel 추출 대상: 중앙 전체 이웃이 더 이상 필요하지 않을 때 커널의 요소(일반적으로 해당 이미지 위치의 원본 픽셀)입니다.

일반적인 사용 사례는 필터를 적용하면서도 다음을 유지하는 것입니다. 원본 이미지. 완료 후 FIRkernelNxM 인접 영역이 생성되면 커널 링크를 분기합니다. 한 경로에서는 필터링된 결과가 계산되고, 다른 경로에서는 SelectSubKernel 을(를) 사용하여 1×1 서브 커널, 즉 해당 이미지 위치의 원본 픽셀을 추출합니다. 이렇게 하면 필터링된 데이터와 필터링되지 않은 이미지를 모두 얻을 수 있습니다.

필터 옆에 원본 이미지 데이터 유지:

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

이 디자인은 FIRkernelNxM(으)로 3×3 인접 영역을 구축한 다음 분기합니다. 상단 경로는 SelectSubKernel 을(를) 사용하여 원본 픽셀(1×1 서브 커널)을 추출합니다. 하단 경로는 FIRoperatorNxM 을(를) Sobel 필터로 적용합니다.

연산자에 대한 자세한 내용은 연산자 참조의 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 및 추가 동기화 버퍼가 필요하지 않습니다.

동기화 및 동기화 오류에 대한 자세한 내용은 Operator Types and Synchronization 튜토리얼 항목을 참조하십시오.

오퍼레이터에 대한 자세한 내용은 오퍼레이터 참조서의 MergeKernel 및 오퍼레이터 참조서의 SplitKernel을 참조하십시오.

CastKernel#

CastKernel 은(는) 수신 데이터의 Parallelism 및 커널 크기를 재조직합니다. 출력 링크에서 커널 크기를 변경할 수 있습니다. 커널 행, 커널 열, Parallelism의 곱은 입력과 출력에서 동일해야 합니다.

을(를) 사용하면 CastKernel 을(를) 통해 Parallelism을 커널(으)로 변환할 수 있습니다. 예를 들어, Parallelism 48과 커널 1×1은 48개의 커널 열을 가진 Parallelism 1이 됩니다. 동일한 48개의 픽셀 값이 여전히 하나의 클럭 사이클에 이동하지만, 이제는 병렬 픽셀 대신 커널 구성 요소가 됩니다. 이는 특정 Parallelism만 허용하는 메모리 오퍼레이터 앞에서 유용합니다.

메모리 오퍼레이터 앞에서 Parallelism을 커널로 변환:

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

스크린샷에서 PARALLELup Parallelism을 48(커널 1×1)로 높입니다. CastKernel 후속 메모리 오퍼레이터가 데이터를 수용할 수 있도록 이를 48개의 커널 열을 가진 Parallelism 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 단일 픽셀 스트림을 호스트로 전송합니다.

평균화, 가우시안, 소벨, 적응형 임계값 등 상세한 필터 예시는 Operator Reference의 FIRkernelNxM 및 FIRoperatorNxM의 Examples of Use 섹션에 나와 있습니다.

설계 지침

링크에서 1×1보다 큰 커널을 생성하기 전에 항상 다음 연산자의 지원되는 Link Format 을(를) 확인하십시오. 특히 DmaToPC하기 전에 커널을 1×1로 줄이십시오.