SIMD-accelerated computer vision on a $2 microcontroller
2달러 마이크로컨트롤러에서 SIMD로 가속한 컴퓨터 비전
ESP32-S3의 128비트 SIMD 명령으로 FAST 특징점 검출기를 구현해 기준 구현보다 약 2.2배 빠른 초당 11.2메가픽셀 처리량을 얻었습니다. 정렬되지 않은 데이터 접근과 부호 있는 8비트 비교, 포화 연산 제약을 우회한 방법도 설명합니다.
- 주제
에디터 노트
초당 5.1메가픽셀에서 11.2메가픽셀로 늘어난 결과는 기준 구현보다 약 2.2배 빠르다는 뜻입니다. 글의 앞부분에 적힌 '대략 두 배'와도 맞으며, 초당 30프레임 VGA 처리 가능이라는 주장은 이 처리량이 640x480 영상의 초당 약 9.2메가픽셀 요구량을 넘는 데 근거합니다. 다만 원문은 측정 환경과 기준 구현의 구체적인 조건을 제시하지 않아 다른 보드나 구현과 성능을 직접 비교할 자료는 없습니다. 가장 재사용하기 좋은 부분은 SIMD 명령의 제한을 데이터 표현으로 우회한 대목입니다. 부호 없는 픽셀값의 최상위 비트를 뒤집어 부호 있는 비교로 옮기고, 레지스터 구간 추출로 정렬되지 않은 동서 방향 픽셀을 구성합니다. 작성자는 FAST 사전 검사와 점수 계산을 구현했지만, 상세 설명은 사전 검사에 한정됩니다. Lobsters 댓글은 없어 독자 반응에서 보완할 경험이나 반론은 확인되지 않습니다.
AI 요약
ESP32-S3에서 SIMD 명령을 활용해 FAST 특징점 검출기를 구현하고, 칩의 제약에 맞춰 데이터 접근과 비교 연산을 구성한 과정을 다룹니다. 테스트 결과 기준 구현의 초당 5.1메가픽셀에서 초당 11.2메가픽셀로 처리량이 늘었으며, QVGA(320x240) 프레임 처리에는 약 6밀리초가 걸립니다.
SIMD와 FAST 사전 검사
ESP32-S3는 최대 240MHz로 동작하는 듀얼 코어 마이크로컨트롤러로 Wi-Fi와 Bluetooth Low Energy를 지원합니다. 작성자는 기술 참조 설명서에서 128비트 SIMD 명령을 확인하고, 컴퓨터 비전용 FAST 특징점 검출기를 구현했습니다. SIMD 레지스터 하나에는 8비트 값 16개를 담을 수 있어, 한 번에 16개 픽셀을 처리하는 함수를 작성했습니다.
FAST 사전 검사 단계에서는 중심 픽셀과 동서남북 방향의 픽셀 밝기 차이를 확인합니다. 차이가 임계값을 넘는 픽셀이 충분한지 검사해 후보점을 걸러냅니다. 작성자는 각 방향에서 픽셀 묶음을 읽고 중심 픽셀 묶음과 비교하는 방식으로 벡터 연산을 구성했습니다.
정렬과 부호 문제 우회
ESP32-S3의 명령 집합은 정렬되지 않은 메모리 값을 바로 읽지 못합니다. 중심 픽셀 묶음이 정렬돼 있으면 동쪽과 서쪽 묶음은 정렬되지 않는 문제가 생깁니다. 작성자는 이웃한 두 레지스터에서 값을 읽은 뒤, 두 레지스터를 이어 붙인 값에서 필요한 구간을 추출하는 명령으로 동서 방향 데이터를 만들었습니다.
비교 명령은 부호 있는 8비트 값만 처리합니다. 픽셀은 0부터 255까지의 부호 없는 값이므로 그대로 부호 있는 값으로 해석하면 128부터 255까지가 -128부터 -1로 바뀌어 순서 비교가 깨집니다. 값을 0~255에서 -128~127로 옮기려 했지만, SIMD 산술 명령이 포화 연산을 하므로 128을 빼는 방식도 쓸 수 없었습니다. 포화 연산은 표현 범위를 벗어난 결과를 최솟값이나 최댓값으로 고정합니다.
작성자는 각 픽셀의 최상위 비트를 0x80과 XOR해 이 문제를 해결했습니다. 8비트 값 x에 0x80을 XOR하면 최상위 비트만 뒤집히며, 이는 x에서 128을 뺀 값과 같습니다. 따라서 변환 뒤에는 부호 있는 비교가 원래 픽셀 밝기의 순서를 보존합니다.
성능 결과
작성자의 테스트에서 FAST 검출기 처리량은 초당 5.1메가픽셀에서 초당 11.2메가픽셀로 늘었습니다. 원문은 이를 약 220%의 처리량으로 설명하며, QVGA 한 프레임 처리 시간은 약 6밀리초라고 밝힙니다. 작성자는 이 성능으로 VGA(640x480) 영상을 초당 30프레임 처리할 수 있다고 설명합니다. 별도로 SIMD 기반 점수 계산 함수도 작성했지만, 세부 구현은 글에서 다루지 않습니다.
원문: shraiwi.com / 번역·요약: Trawling
Lobsters 반응
댓글이 없습니다.