7.1. 신경망이란 무엇인가¶
신경망(neural network) 은 그 동작이 사람이 직접 코딩한 것이 아니라 예시로부터 학습되는 알고리즘입니다. 동일한 신경망 아키텍처에 백만 장의 얼굴 이미지를 주면 얼굴을 검출하도록 학습합니다. 동일한 아키텍처에 백만 장의 손 이미지를 주면 손을 검출하도록 학습합니다. 동일한 아키텍처에 여러 객체 범주를 아우르는 레이블이 달린 집합을 주면 그것들을 한 번에 모두 검출하도록 학습합니다. 대상마다 바뀌는 것은 가중치뿐이며, 이 가중치는 신경망의 예측을 레이블이 달린 예시와 비교하면서 둘이 일치할 때까지 가중치를 조정하는, 보드 외부의 학습 과정에서 생성됩니다.
7.1.1. 메커니즘¶
신경망은 여러 계층(layer)이 쌓인 구조입니다. 각 계층은 이전 계층의 출력에 가중치(weights) 행렬을 곱하고, 편향 벡터를 더한 뒤, 그 결과에 비선형 함수를 적용합니다. 한 계층의 출력은 다음 계층의 입력이 됩니다. 캡처된 이미지는 이 스택의 맨 위로 들어가서, 수십 내지 수백 개의 계층을 따라 아래로 흐른 다음, 맨 아래에서 이미지에 무엇이 있었는지를 그 값으로 나타내는 텐서로 나옵니다.
각 계층의 가중치가 무엇을 하는지 는 신경망이 무엇으로 학습되었는지에 달려 있습니다. 비전 신경망에서 초기 계층의 가중치 행렬은 짧은 수평 에지에 반응할 수 있고, 그보다 조금 더 깊은 계층은 모서리에 반응할 수 있으며, 더 깊은 계층은 둥근 눈 모양에 반응할 수 있고, 가장 깊은 계층은 얼굴 전체의 배치에 반응할 수 있습니다. 이 중 어느 것도 사람이 직접 작성하지 않았습니다. 학습 과정이 수백만 개의 레이블이 달린 예시를 반복하면서 손실 함수를 따라 가중치를 아래로 조금씩 밀어 나갔고, 에지에서 모서리, 눈, 그리고 얼굴로 이어지는 계층 구조가 데이터로부터 자연스럽게 나타난 것입니다.
계층이 쌓인 구조로 표현한 작은 분류 신경망입니다. 입력 텐서는 캡처된 이미지의 모양으로 맨 위에서 들어가 계층들을 따라 아래로 흐르며, 각 계층이 텐서의 차원을 변환합니다. 맨 아래의 출력 텐서는 클래스마다 하나씩의 값을 가집니다. 검출(detection) 신경망과 키포인트(keypoint) 신경망도 동일하게 계층이 쌓인 형태를 공유하며, 출력 텐서의 해석만 달라집니다.¶
신경망의 아키텍처 – 계층들이 어떻게 배치되어 있고 어떤 연산이 그것들을 연결하는지 – 는 신경망이 할 수 있는 것 입니다. 가중치는 신경망이 학습한 것 입니다. 이 과정에서 카메라의 역할은 학습으로 생성된 가중치 파일을 불러오고, 학습기가 수행한 것과 동일한 산술 연산을 학습 집합 대신 캡처된 프레임에 대해 실행하는 것입니다.
7.1.2. 무엇이 입력되고, 무엇이 출력되는가¶
신경망의 양 끝은 모두 텐서(tensor) 입니다 – 즉, numpy 장에서 막 소개한 것과 같은 종류의 객체인 다차원 숫자 배열입니다. 비전 신경망의 입력 텐서는 캡처된 이미지를 신경망이 기대하는 레이아웃으로 재배열한 것입니다. 일반적으로 (B, H, W, C) 4-튜플 모양을 가지는데, 여기서 B 는 배치 차원(카메라에서는 한 번에 한 프레임씩 처리하므로 항상 1)이고, H 와 W 는 신경망이 기대하는 픽셀 높이와 너비이며, C 는 채널 수(RGB 신경망은 3, 그레이스케일은 1)입니다.
출력 텐서는 신경망이 무엇을 위한 것인지에 따라 달라집니다:
분류 신경망은 클래스마다 하나씩의 신뢰도 점수로 이루어진 1차원 텐서를 만들어냅니다. 가장 큰 점수의 인덱스가 예측된 클래스입니다. 대부분의 카메라에 기본 탑재된 MobileNet 기반 사람 검출기가 이 형태입니다 – “사람”에 대한 점수 하나와 “사람 아님”에 대한 점수 하나, 이렇게 두 개의 점수입니다.
검출 신경망은 경계 상자 목록과 클래스 확률을 그 값으로 나타내는 2차원 텐서를 만들어냅니다. YOLOv8이 이 형태입니다 –
(84, N)텐서로, 84개의 행 중 4개는 상자 회귀 값이고 나머지 80개는 클래스별 확률이며, 이것이N개의 앵커 위치에 걸쳐 반복됩니다.키포인트 신경망은 명명된 랜드마크의 픽셀 위치를 그 값으로 가지는 텐서를 만들어냅니다. MediaPipe 얼굴 랜드마크 모델이 이 형태입니다 – 검출된 얼굴마다 468개의 키포인트를 갖습니다.
세그멘테이션 신경망은 픽셀별 클래스 레이블을 그 값으로 가지는 2차원 텐서를 만들어냅니다 – 입력과 동일한 차원을 가지며, 모든 위치에 범주 인덱스가 있습니다.
회귀(regression) 신경망은 단일 숫자 또는 짧은 숫자 벡터를 만들어냅니다 – 깊이 추정치, 각도, 온도 같은 것들입니다.
각 형태에는 원시 출력 텐서를 애플리케이션의 나머지 부분이 사용하는 결과 형태 – 경계 상자, 키포인트 목록, 클래스 레이블, 수치 추정치 – 로 다시 변환하는, 카메라 측의 고유한 후처리기(post-processor) 가 있습니다. 후처리기는 신경망의 출력 레이아웃을 아는 애플리케이션 측 코드이며, 신경망 자체는 그 텐서를 만들어내는 산술 연산일 뿐입니다.
7.1.3. 이것이 카메라에서 동작하는 이유¶
두 가지 산술 기법이 마이크로컨트롤러급 부품에서 이를 실용적으로 만들어 줍니다. 첫째는 양자화(quantization) 입니다. 학습은 32비트 부동소수점 산술로 이루어지지만, 추론은 대부분의 신경망에서 정확도 손실이 거의 없이 8비트 정수 산술로 실행할 수 있습니다. 8비트 가중치는 저장 공간의 4분의 1만 차지하며 32비트 부동소수점보다 몇 배 빠르게 실행됩니다. 카메라에 기본 탑재된 모든 모델은 이미 보드 외부에서 양자화되어 있습니다.
둘째는 하드웨어 가속(hardware acceleration) 입니다. 마이크로컨트롤러의 CPU가 한 번에 하나의 명령어씩 더디게 처리하는 그 산술 연산을, 신경망 가속기는 한 번에 수백 개의 연산으로 실행합니다. 최신 카메라(AE3와 N6)에는 전용 신경망 처리 장치(neural processing unit, NPU) – SoC 상의 텐서 가속기 – 가 탑재되어 있어, CPU에서 실행하면 1초가 걸렸을 모델을 수십 밀리초 만에 실행되도록 바꿔 줍니다. 이 과정에서 카메라의 역할이 어떻게 생겼는지는 추론 엔진 장에서 다룹니다.
7.1.4. 이 장에서 다루는 내용¶
학습은 카메라의 역할이 아닙니다. 학습된 모델은 .tflite 파일로 카메라에 도착하고, 카메라는 이를 불러와 캡처된 각 프레임을 통과시킨 뒤, 그 결과로 나온 텐서를 애플리케이션이 활용할 수 있는 결과로 디코딩합니다. 이후의 모든 내용은 이러한 각 단계에 관한 것입니다:
모델을 불러오고 검사하기;
모델 파일이 저장되는 플래시 파티션;
추론 호출의 네 단계;
실제로 산술 연산을 수행하는 엔진;
그리고 출력 텐서를 다시 상자, 키포인트, 클래스의 목록으로 바꿔 주는 후처리기.
이미지 장의 검출기들은 각각 특정 대상에 한정되어 있었습니다. 이 장의 나머지 부분에서 다루는 것들은 대신 데이터로부터 학습되며, 동일한 엔진이 스크립트가 불러오는 어떤 모델이든 실행합니다. 이와 함께 찾아온 워크플로의 변화 – 대상별 알고리즘이 대상별 가중치 파일로 대체된 것 – 가 다음으로 짚어 볼 내용입니다.