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. 읽기 전용 속성¶
로드된 모델은 누구도 실행하지 않은 상태에서 신경망을 설명하는 소수의 읽기 전용 속성을 노출합니다.
파일 및 메모리.
입력 텐서.
input_shape– 입력 텐서마다 하나씩, 신경망이 기대하는 형태를 나타내는 튜플의 리스트입니다. 비전 신경망은(1, H, W, C)형태의 입력 하나를 가집니다.input_dtype– 입력마다 하나씩의 단일 문자 dtype 코드 리스트입니다 ('b'int8,'B'uint8,'h'int16,'H'uint16,'f'float32).input_scale과input_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_scale 과 output_zero_point 을 읽으며, 사람이 읽을 수 있는 클래스 이름을 위해 labels 를 읽습니다. 절대 하드코딩하거나 가정하지 않습니다.