7.16. 마무리¶
이 장에서는 추론 단계가 파이프라인의 일부일 때 OpenMV 애플리케이션이 사용하는 ml 의 구성 요소들을 살펴보았습니다:
개념 – 신경망이 산술적 관점에서 무엇인지(텐서를 텐서로 매핑하는 학습 가능한 연산자들의 스택), 머신 비전이 고전적인 이미지 처리에 비해 무엇을 바꾸었는지(사람이 작성한 요약 알고리즘이 사라지고, 레이블이 붙은 데이터로부터 학습된 가중치로 대체됨), 그리고 몇 줄 안 되는 Python 코드로 얼굴 검출기를 실행한 hello 데모를 다루었습니다.
ml 모듈 –
ml.Model객체와 입력 및 출력 텐서를 검사하기 위한 그 속성들, 이 객체가 받아들이는 모델 파일 경로, 그리고 그 파일들이 위치하는 곳: 플래시에서 직접 실행하기 위한 읽기 전용 ROMFS 파티션, 또는 로드 시점에 모델을 RAM으로 복사할 수 있는 그 밖의 모든 MicroPython 파일 시스템을 다루었습니다.추론 파이프라인 –
predict()가 순차적으로 실행하는 세 단계(전처리, 엔진 디스패치, 후처리), 첫 번째 단계의Normalization핸들, 세 번째 단계의 후처리기 핸들, 그리고 cam이 실행하는 정수 텐서를 신경망이 학습한 실숫값과 다시 연결하는 양자화 연산을 다루었습니다.추론 엔진 – TFLM(대부분의 cam이 실행하는 연산자 인터프리터), CMSIS-NN(Cortex-M에서 그 아래에 있는 SIMD 커널 라이브러리), 그리고 NPU(AE3의 Arm Ethos-U55는 Vela 오프라인 컴파일러와 짝을 이루고, N6의 ST Neural-ART는 STAI 및 STEdgeAI와 짝을 이룹니다)를 다루었습니다. 엔진은 cam에 의해 고정되며, 스크립트가 선택하지 않습니다.
출력 디코딩 – 원시 출력 텐서를 경계 상자, 키포인트, 또는 클래스별 목록으로 변환하는 후처리기, 겹치는 후보들을 합치는
NMS클래스, 역양자화 전에 임계값을 적용하여 디코딩을 빠르게 유지하는 방법을 보여주는 YOLOv8 설명, 그리고 카탈로그가 모델을 다루지 않을 때 커스텀 디코더를 작성하기 위한 프로토콜을 다루었습니다.
7.16.1. 이제 손이 닿는 범위¶
이 장이 준비해 준 세 가지:
학습된 모델을 로드하고 실행하기.
/rom/에 있는 모든 것은 추가 준비 없이 작동합니다. 외부에서 호환 가능한.tflite로 공급된 것은 대상 cam을 위한 오프라인 도구(AE3는 Vela, N6는 STEdgeAI)가 올바른 레이아웃을 생성한 후에 작동합니다.모든 출력 텐서 디코딩하기. 아키텍처가 카탈로그에 있을 때 올바른 후처리기는 기계적으로 정해집니다: YOLOv8 모델에는
YoloV8, BlazeFace에는BlazeFace, 이런 식입니다. 그렇지 않을 때는 writing-your-own 프로토콜이 그 규약을 다루며, YOLOv8 설명 이 복사해서 참고하기에 가장 깔끔한 레퍼런스입니다.성능에 대해 추론하기. NPU에서 30 FPS로 실행되는 모델이 Cortex-M7에서는 3 FPS로 실행될 수 있습니다. 그 비율은 cam이 신경망의 얼마만큼을 CPU에서 들어낼 수 있는지에 달려 있습니다. 양자화, ROMFS 배치, NPU 컴파일, 그리고 대상 엔진의 연산자 커버리지가 네 가지 레버이며, 이 장에서 그 각각을 다루었습니다.
7.16.2. ML은 cam의 나머지 부분과 조합됩니다¶
추론은 단독으로 실행되는 경우가 드뭅니다. image 모듈이 프레임을 캡처하고 전처리하며, ml 모듈이 신경망을 실행하고, ulab.numpy 는 양쪽 모두에 내장되어 있지 않은 수치 작업을 무엇이든 수행합니다. 일반적인 검출 스크립트는 이 세 가지를 모두 결합합니다: csi 로 캡처하고, 선택적으로 image 로 프레임을 조정하고, predict() 를 실행하고, ml.postprocessing 에서 알맞은 모듈로 결과를 후처리하고, 후처리기가 반환한 경계 상자 위에서 애플리케이션이 원하는 커스텀 수학 연산을 위해 ulab.numpy 를 사용합니다. 이 세 모듈은 동일한 메모리 모델을 공유하며, 가능한 모든 곳에서 그들 사이의 경계는 제로 카피입니다.