7.4. 모델 로드하기

ml.Model 은 플래시에서 모델 파일을 읽어 파싱하고, 추론 중에 신경망이 필요로 하는 RAM을 할당한 다음, 로드된 신경망에 대해 나머지 스크립트가 알아야 할 모든 정보를 담은 객체를 반환합니다.

7.4.1. 생성자

생성자는 경로와 선택적 후처리기를 인수로 받습니다:

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

/rom/ (플래시 상주 파일시스템)에 있는 모델은 그 자리에서 읽힙니다. 신경망의 가중치는 플래시에 그대로 남아 있고, 로드된 모델은 텐서 아레나만큼의 RAM만 소비합니다. /sdcard/ 에 있는 모델은 로드 시점에 RAM으로 복사되므로, 전체 비용은 모델 파일 크기에 텐서 아레나를 더한 값이 됩니다. 어느 경로든 동작하며, 절충 대상은 RAM입니다.

동일한 기본 이름을 가진 형제 .txt 파일이 존재하면, 그 내용이 자동으로 labels 에 로드됩니다. postprocess= 키워드는 predict() 가 각 추론 후에 실행하는 호출 가능 객체를 등록합니다.

7.4.2. 읽기 전용 속성

로드된 모델은 누구도 실행하지 않은 상태에서 신경망을 설명하는 소수의 읽기 전용 속성을 노출합니다.

파일 및 메모리.

  • len – 디스크상의 모델 파일 크기로, 바이트 단위입니다.

  • ram – 추론 중 중간 활성화값을 위해 신경망이 필요로 하는 텐서 아레나 의 크기로, 바이트 단위입니다.

입력 텐서.

  • input_shape – 입력 텐서마다 하나씩, 신경망이 기대하는 형태를 나타내는 튜플의 리스트입니다. 비전 신경망은 (1, H, W, C) 형태의 입력 하나를 가집니다.

  • input_dtype – 입력마다 하나씩의 단일 문자 dtype 코드 리스트입니다 ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32).

  • input_scaleinput_zero_point – 신경망이 학습된 실수값 입력과 카메라가 실제로 다루는 정수 표현 사이를 변환하는 양자화 매개변수 입니다.

출력 텐서. 입력 집합의 대응물입니다: output_shape, output_dtype, output_scale, output_zero_point. 검출 신경망은 두세 개의 출력 텐서(경계 상자, 신뢰도 점수, 경우에 따라 클래스 확률)를 생성하고, 분류 신경망은 하나를 생성합니다.

부가 정보. labels 는 형제 .txt 파일에서 로드된 클래스 이름 리스트이거나 None 입니다. postprocess 는 등록된 후처리기이거나 None 입니다.

7.4.3. BlazeFace 살펴보기

기본 제공되는 BlazeFace 모델을 로드하고 각 속성을 출력하면 실제 값을 얻을 수 있습니다:

import ml
from ml.postprocessing.mediapipe import BlazeFace

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

print("file size:    ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape:  ", model.input_shape)
print("input dtype:  ", model.input_dtype)
print("input scale:  ", model.input_scale)
print("input zp:     ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp:    ", model.output_zero_point)

이 숫자들은 신경망의 인터페이스를 구체적으로 식별해 줍니다. 단일 (1, 128, 128, 3) int8 입력 텐서와 두 개의 int8 출력 – 하나는 경계 상자 회귀 계수용, 다른 하나는 앵커별 신뢰도 점수용입니다. 양자화 매개변수는 이러한 int8 값들이 신경망이 학습된 실제 부동소수점 값으로 어떻게 매핑되는지를 설명하며, 후처리기는 경계 상자를 디코딩하기 전에 이 매개변수를 사용해 양자화를 되돌립니다.

모든 속성은 그것이 설명하는 대상에 대한 단일 진실 공급원입니다. 스크립트는 무엇을 캡처할지 알기 위해 input_shape 을 읽고, 텐서를 직접 디코딩하기 위해 output_scaleoutput_zero_point 을 읽으며, 사람이 읽을 수 있는 클래스 이름을 위해 labels 를 읽습니다. 절대 하드코딩하거나 가정하지 않습니다.