TensorFlow Lite 모델에 메타데이터 추가

TensorFlow Lite 메타데이터는 모델 설명을 위한 표준을 제공합니다. 이 메타데이터는 모델의 기능과 모델에 대한 모델에 대한 입력 / 출력 정보 메타데이터는

Kaggle에 게시된 모든 이미지 모델 모델은 모델 레지스트리에 메타데이터로 변환할 수 있습니다.

메타데이터 형식이 있는 모델

model_with_metadata
드림
그림 1. 메타데이터 및 관련 파일이 있는 TFLite 모델

모델 메타데이터는 다음에 정의되어 있습니다. metadata_schema.fbs, a FlatBuffer 파일에서 참조됩니다. 그림 1과 같이 메타데이터 필드(예: TFLite 모델)'는 스키마, 이름 아래 "TFLITE_METADATA"를 사용합니다. 일부 모델에는 관련 파일이 있을 수 있으며, 예를 들어 분류 라벨 파일을 참고하세요. 이 파일은 원래 모델 파일 끝에 ZIP 파일로 연결됩니다. ZipFile "append" 모드 ('a' 모드)로 설정합니다. TFLite 인터프리터는 이전과 같은 방식으로 새 파일 형식을 사용할 수 있습니다. 자세한 내용은 패키지를 참조하세요. 관련 파일을 참고하세요.

메타데이터를 채우고, 시각화하고, 읽는 방법은 아래 안내를 참고하세요.

메타데이터 도구 설정

모델에 메타데이터를 추가하기 전에 Python 프로그래밍을 수행해야 합니다. TensorFlow 실행을 위한 환경 설정입니다. Ad Manager에서 여기에서 설정하세요.

Python 프로그래밍 환경을 설정한 후에는 추가 도구:

pip install tflite-support

TensorFlow Lite 메타데이터 도구는 Python 3를 지원합니다.

Flatbuffers Python API를 사용하여 메타데이터 추가

아래의 모델 메타데이터에는 스키마를 참조하세요.

  1. 모델 정보 - 모델 및 상품에 대한 전반적인 설명입니다. (예: 라이선스 약관) 자세한 내용은 ModelMetadata를 나타냅니다.
    1. 입력 정보: 입력 및 사전 처리에 관한 설명 표준화와 같은 필수 작업을 처리할 수 있습니다 자세한 내용은 SubGraphMetadata.input_tensor_metadata로 작업할 수 있습니다.
      1. 출력 정보 - 출력에 관한 설명과 후처리가 필요합니다. 자세한 내용은 SubGraphMetadata.output_tensor_metadata로 작업할 수 있습니다.

이 시점에서 TensorFlow Lite는 단일 하위 그래프만 지원하므로 TensorFlow Lite 코드 생성기Android 스튜디오 ML 바인딩 특성ModelMetadata.nameModelMetadata.descriptionSubGraphMetadata.nameSubGraphMetadata.description(표시 시) 메타데이터와 코드를 생성합니다.

지원되는 입력 / 출력 유형

입력 및 출력용 TensorFlow Lite 메타데이터가 입력 및 출력 유형을 염두에 두는 것이 좋습니다. 뭐든 상관없어 입력 및 출력 유형이 다음 중 하나 또는 다음 항목의 조합으로 TensorFlow에서 지원됩니다. 라이트 메타데이터:

  • 기능 - 부호 없는 정수 또는 float32인 숫자
  • 이미지 - 메타데이터는 현재 RGB 및 그레이 스케일 이미지를 지원합니다.
  • 경계 상자 - 직사각형 모양 경계 상자입니다. 스키마는 a 다양한 번호 매기기 스키마를 참고하세요.

관련 파일 패키징

TensorFlow Lite 모델에는 다양한 관련 파일이 제공될 수 있습니다. 예를 들어 자연어 모델에는 일반적으로 단어 조각을 단어에 매핑하는 어휘 파일이 있습니다. ID 분류 모델에는 객체 카테고리를 나타내는 라벨 파일이 있을 수 있습니다. 연결된 파일 (있는 경우)이 없으면 모델이 제대로 작동하지 않습니다.

이제 관련 파일을 메타데이터를 통해 모델과 번들로 묶을 수 있습니다. 사용할 수 있습니다. 새로운 TensorFlow Lite 모델은 모델 및 관련 파일이 모두 포함됩니다 일반 ZIP 파일로 압축 해제할 수 있습니다. 있습니다. 이 새 모델 형식은 동일한 파일 확장자(.tflite)를 계속 사용합니다. 그것은 기존 TFLite 프레임워크 및 인터프리터와 호환됩니다. 자세한 내용은 팩 메타데이터입니다. 관련 파일을 모델을 참고하세요.

관련 파일 정보는 메타데이터에 기록할 수 있습니다. 사용 빈도에 따라 파일 형식 및 파일이 첨부된 위치 (예: ModelMetadata, SubGraphMetadata, TensorMetadata), TensorFlow Lite Android 코드 생성기는 전/후에 적용할 수 있음 자동으로 처리합니다 자세한 내용은 <Codegen usage> 섹션 각 연결 파일 유형 참조하세요

정규화 및 양자화 매개변수

정규화는 머신러닝에서 일반적으로 사용되는 데이터 전처리 기술입니다. 이 정규화의 목표는 값을 공통 척도로 변경하는 것입니다. 왜곡할 수 있다는 것을 배웠습니다.

모델 양자화는 이를 통해 가중치의 정밀도 표현을 줄일 수 있고, 선택적으로 활성화될 수 있습니다.

전처리 및 후처리의 측면에서 정규화와 양자화는 독립적인 단계입니다. 세부정보는 다음과 같습니다.

정규화 양자화

예시 매개변수 값으로 입력 이미지 float 및 양자 모델, 각각 1개의 값으로 사용합니다.
부동 소수점 수 모델:
- 평균: 127.5
- 표준: 127.5
퀀트 모델:
- 평균: 127.5
- 표준: 127.5
부동 소수점 수 모델:
- 제로포인트: 0
- 배율: 1.0
퀀트 모델:
- zeroPoint: 128.0
- scale:0.0078125f




호출 시점


입력: 입력인 경우 데이터는 입력은 추론이 필요한 데이터와 정규화될 때까지 변경할 수 있습니다
출력: output 데이터가 일반적으로 정규화됩니다
부동 소수점 수 모델은 양자화가 필요하지 않습니다.
양자화 모델은 kubectl 명령어 자체에서 사전/사후의 양자화 가장 적합합니다 경우에 따라 다름 데이터 유형에 대한 입력/출력 텐서
- 부동 텐서: 아니요 사전/사후의 양자화 5개의 nginx 포드가 필요합니다 퀀트 비수술 연산과 비 양자 연산은 모델에 적용 그래프에서 찾을 수 있습니다.
- int8/uint8 텐서: 양자화가 필요하고 전/후 처리에 사용합니다


공식


정규화된_입력 = (입력 - 평균) / 표준
입력을 위해 양자화: <ph type="x-smartling-placeholder">
</ph> q = f / 척도 + zeroPoint
비양자화: 출력:
f = (q - 제로포인트) * 체중계

어디에 매개변수
모델 제작자가 입력함 모델에 저장되어 있고 메타데이터, NormalizationOptions 자동 입력: TFLite 변환기 tflite 모델에 저장됨 파일에서 참조됩니다.
얻는 방법 매개변수? API MetadataExtractor개 [2] TFLite를 통해 Tensor API [1] 또는 를 통해 MetadataExtractor API [2]
부동 소수점 수 및 양자 처리 모델이 동일한 값은 무엇인가요? 예, 부동 소수점 수 및 양자 모델이 정규화 매개변수 아니요. 플로팅 모델은 양자화가 필요하지 않습니다.
TFLite 코드 실행 생성기 또는 Android Studio ML 결합 자동 생성 어떻게 해야 할까요?

[1] TensorFlow Lite Java APITensorFlow Lite C++ API를 참고하세요.
[2] 메타데이터 추출기 라이브러리

uint8 모델의 이미지 데이터를 처리할 때 정규화와 양자화는 가끔 건너뜁니다 픽셀 값이 [0, 255] 그러나 일반적으로는 항상 정규화 및 양자화 매개변수(해당하는 경우)

다양한 동영상 세트에 대해 메타데이터를 채우는 방법의 예를 확인할 수 있습니다. 다음 링크를 참조하세요.

이미지 분류

스크립트 다운로드 여기mobilenet_v1_0.75_160_quantized.tflite. 다음과 같이 스크립트를 실행합니다.

python ./metadata_writer_for_image_classifier.py \
    --model_file=./model_without_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --label_file=./model_without_metadata/labels.txt \
    --export_directory=model_with_metadata

다른 이미지 분류 모델의 메타데이터를 채우려면 모델 사양을 추가하세요. 좋아요 삽입해야 합니다. 이 가이드의 나머지 부분에서는 Google Ad Manager 사용 시 주요 요소를 설명할 수 있습니다.

이미지 분류 예시 자세히 알아보기

모델 정보

메타데이터는 새 모델 정보를 만들어 시작합니다.

from tflite_support import flatbuffers
from tflite_support import metadata as _metadata
from tflite_support import metadata_schema_py_generated as _metadata_fb

""" ... """
"""Creates the metadata for an image classifier."""

# Creates model info.
model_meta = _metadata_fb.ModelMetadataT()
model_meta.name = "MobileNetV1 image classifier"
model_meta.description = ("Identify the most prominent object in the "
                          "image from a set of 1,001 categories such as "
                          "trees, animals, food, vehicles, person etc.")
model_meta.version = "v1"
model_meta.author = "TensorFlow"
model_meta.license = ("Apache License. Version 2.0 "
                      "http://www.apache.org/licenses/LICENSE-2.0.")

입력 / 출력 정보

이 섹션에서는 모델의 입력 및 출력 서명을 설명하는 방법을 보여줍니다. 이 메타데이터는 자동 코드 생성기가 사전 및 사후 데이터를 생성하기 위해 처리하려고 한다고 가정해 보겠습니다 텐서에 대한 입력 또는 출력 정보를 만들려면 다음 안내를 따르세요.

# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()

이미지 입력

이미지는 머신러닝의 일반적인 입력 유형입니다. TensorFlow Lite 메타데이터 색상 공간과 같은 정보와 사전 처리 정보(예: 정규화를 사용합니다. 이미지 크기는 수동 지정이 필요하지 않습니다. 이미 입력 텐서의 형태에 의해 제공되고 자동으로 추론됩니다.

input_meta.name = "image"
input_meta.description = (
    "Input image to be classified. The expected image is {0} x {1}, with "
    "three channels (red, blue, and green) per pixel. Each value in the "
    "tensor is a single byte between 0 and 255.".format(160, 160))
input_meta.content = _metadata_fb.ContentT()
input_meta.content.contentProperties = _metadata_fb.ImagePropertiesT()
input_meta.content.contentProperties.colorSpace = (
    _metadata_fb.ColorSpaceType.RGB)
input_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.ImageProperties)
input_normalization = _metadata_fb.ProcessUnitT()
input_normalization.optionsType = (
    _metadata_fb.ProcessUnitOptions.NormalizationOptions)
input_normalization.options = _metadata_fb.NormalizationOptionsT()
input_normalization.options.mean = [127.5]
input_normalization.options.std = [127.5]
input_meta.processUnits = [input_normalization]
input_stats = _metadata_fb.StatsT()
input_stats.max = [255]
input_stats.min = [0]
input_meta.stats = input_stats

라벨 출력

라벨은 다음을 사용하여 연결된 파일을 통해 출력 텐서에 매핑될 수 있습니다. TENSOR_AXIS_LABELS

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
output_meta.name = "probability"
output_meta.description = "Probabilities of the 1001 labels respectively."
output_meta.content = _metadata_fb.ContentT()
output_meta.content.content_properties = _metadata_fb.FeaturePropertiesT()
output_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.FeatureProperties)
output_stats = _metadata_fb.StatsT()
output_stats.max = [1.0]
output_stats.min = [0.0]
output_meta.stats = output_stats
label_file = _metadata_fb.AssociatedFileT()
label_file.name = os.path.basename("your_path_to_label_file")
label_file.description = "Labels for objects that the model can recognize."
label_file.type = _metadata_fb.AssociatedFileType.TENSOR_AXIS_LABELS
output_meta.associatedFiles = [label_file]

메타데이터 Flatbuffers 만들기

다음 코드는 모델 정보를 입력 및 출력과 결합합니다. 있습니다.

# Creates subgraph info.
subgraph = _metadata_fb.SubGraphMetadataT()
subgraph.inputTensorMetadata = [input_meta]
subgraph.outputTensorMetadata = [output_meta]
model_meta.subgraphMetadata = [subgraph]

b = flatbuffers.Builder(0)
b.Finish(
    model_meta.Pack(b),
    _metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
metadata_buf = b.Output()

메타데이터 및 관련 파일을 모델에 패킹

메타데이터 Flatbuffers가 생성되면 메타데이터와 라벨 파일은 populate 메서드를 통해 TFLite 파일에 작성됩니다.

populator = _metadata.MetadataPopulator.with_model_file(model_file)
populator.load_metadata_buffer(metadata_buf)
populator.load_associated_files(["your_path_to_label_file"])
populator.populate()

다음을 통해 연관 파일을 원하는 만큼 모델에 패킹할 수 있습니다. load_associated_files 그러나 적어도 이러한 파일을 패킹해야 합니다. 메타데이터에 문서화됩니다 이 예에서 라벨 파일의 패킹은 필수 항목입니다.

메타데이터 시각화

Netron을 사용하여 네트워크를 시각화하면 메타데이터를 사용하여 TensorFlow Lite 모델에서 JSON으로 메타데이터를 읽을 수 있습니다. MetadataDisplayer:

displayer = _metadata.MetadataDisplayer.with_model_file(export_model_path)
export_json_file = os.path.join(FLAGS.export_directory,
                                os.path.splitext(model_basename)[0] + ".json")
json_file = displayer.get_metadata_json()
# Optional: write out the metadata as a json file
with open(export_json_file, "w") as f:
  f.write(json_file)

Android 스튜디오는 Android 스튜디오 ML을 통한 메타데이터 표시도 지원합니다. 바인딩 기능을 참조하세요.

메타데이터 버전 관리

메타데이터 스키마 시맨틱 버전 관리 번호를 기준으로 버전이 관리되며, 이 번호는 Flatbuffers 파일 식별을 통해 스키마 파일을 찾을 수 있습니다. 유지되어야 합니다.

시맨틱 버전 관리 번호

메타데이터 스키마의 버전은 시맨틱 버전 관리에 따라 관리됩니다. 숫자, MAJOR.MINOR.PATCH 등입니다. 규칙에 따라 스키마 변경사항을 추적합니다. 여기에서 확인할 수 있습니다. Google의 역사 필드 버전 1.0.0 이후에 추가되었습니다.

Flatbuffers 파일 식별

시맨틱 버전 관리는 규칙을 준수하면 호환성을 보장하지만 진정한 비호환성을 의미하는 것은 아닙니다. MAJOR 번호를 위로 올리게 되면 이전 버전과의 호환성이 손상되었다는 의미는 아닙니다. 따라서 Flatbuffers 파일 식별, file_identifier, 메타데이터 스키마의 실제 호환성을 나타냅니다. 파일 식별자는 정확히 4자여야 합니다. 특정 메타데이터 스키마에 고정되며 사용자에 의해 변경될 수 있습니다. 메타데이터 스키마의 하위 호환성이 어떤 이유로 손상되어야 하는 경우 file_identifier가 급증합니다. 예를 들면 'M001'에서 'M002'로 변경합니다. File_identifier가 훨씬 적게 변경될 것으로 예상됩니다. metadata_version보다 자주 지정해야 합니다.

필요한 최소 메타데이터 파서 버전

필요한 최소 메타데이터 파서 버전 메타데이터 파서 (Flatbuffers 생성 코드)의 최소 버전입니다. 메타데이터 Flatbuffers를 완전히 읽을 수 있습니다. 버전은 사실상 채워진 모든 필드의 버전 중에서 가장 큰 버전 번호와 파일 식별자에 의해 표시되는 호환 가능한 가장 작은 버전입니다. 최소 필요한 메타데이터 파서 버전이 MetadataPopulator: 메타데이터가 TFLite 모델에 채워지는 경우 자세한 내용은 메타데이터 추출기를 사용하여 필요한 최소 메타데이터 파서 버전이 사용됩니다.

모델에서 메타데이터를 읽습니다.

메타데이터 추출기 라이브러리는 메타데이터를 읽고 추출하는 데 편리한 도구입니다. 여러 플랫폼의 모델에서 연결된 파일을 찾을 수 있습니다 (Java 및 버전C++ 버전). 다음을 사용하여 다른 언어로 메타데이터 추출기 도구를 직접 빌드할 수 있습니다. Flatbuffers 라이브러리

Java에서 메타데이터 읽기

Android 앱에서 메타데이터 추출기 라이브러리를 사용하려면 TensorFlow Lite Metadata AAR은 MavenCentral. 여기에는 MetadataExtractor 클래스와 FlatBuffers Java가 포함되어 있습니다. 메타데이터의 바인딩 스키마 모델이 스키마를 참고하세요.

다음과 같이 build.gradle 종속 항목에서 이를 지정할 수 있습니다.

dependencies {
    implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0'
}

야간 스냅샷을 사용하려면 Sonatype 스냅샷을 추가해야 합니다. 저장소를 사용합니다.

MetadataExtractor 객체를 가리키는 ByteBuffer로 초기화할 수 있습니다. 다음 명령어를 실행합니다.

public MetadataExtractor(ByteBuffer buffer);

ByteBufferMetadataExtractor 객체. Flatbuffers 파일이 모델 메타데이터의 식별자가 메타데이터 파서의 식별자와 일치하지 않습니다. 자세한 내용은 메타데이터 버전 관리를 참조하세요.

일치하는 파일 식별자가 있는 경우 메타데이터 추출기는 Flatbuffers'로 인해 모든 과거 및 향후 스키마에서 생성된 메타데이터 최신 버전과 하위 호환성 메커니즘을 지원합니다. 그러나 future의 필드는 이전 메타데이터 추출기로는 스키마를 추출할 수 없습니다. 필요한 최소한의 메타데이터의 파서 버전 메타데이터를 읽을 수 있는 메타데이터 파서의 최소 버전을 나타냅니다. 전체 플랫 버퍼. 다음 메서드를 사용하여 최소 필요한 파서 버전 조건이 충족되었는지 확인합니다.

public final boolean isMinimumParserVersionSatisfied();

메타데이터 없이 모델을 전달할 수 있습니다. 그러나 런타임 오류가 발생합니다 모델이 선행 학습된 BERT 모델에서 hasMetadata 메서드를 호출하여 메타데이터를 업데이트합니다.

public boolean hasMetadata();

MetadataExtractor는 입력/출력 텐서 메타데이터로 변환할 수 있습니다. 예를 들면 다음과 같습니다.

public int getInputTensorCount();
public TensorMetadata getInputTensorMetadata(int inputIndex);
public QuantizationParams getInputTensorQuantizationParams(int inputIndex);
public int[] getInputTensorShape(int inputIndex);
public int getoutputTensorCount();
public TensorMetadata getoutputTensorMetadata(int inputIndex);
public QuantizationParams getoutputTensorQuantizationParams(int inputIndex);
public int[] getoutputTensorShape(int inputIndex);

TensorFlow Lite 모델은 스키마 여러 하위 그래프를 지원하지만 TFLite 인터프리터는 현재 단일 하위 그래프로 표시됩니다. 따라서 MetadataExtractor는 하위 그래프 색인을 입력으로 생략합니다. 인수를 사용하는 것이 좋습니다.

모델에서 관련 파일 읽기

메타데이터와 관련 파일이 있는 TensorFlow Lite 모델은 본질적으로 .zip 파일로 압축 해제하여 관련 파일을 가져올 수 있습니다. 예를 들어, mobilenet_v1_0.75_160_quantized 로 이동하여 다음과 같이 모델에서 라벨 파일을 추출합니다.

$ unzip mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
Archive:  mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
 extracting: labels.txt

메타데이터 추출기 라이브러리를 통해 관련 파일을 읽을 수도 있습니다.

Java에서는 파일 이름을 MetadataExtractor.getAssociatedFile에 전달합니다. 메서드를 사용하여 축소하도록 요청합니다.

public InputStream getAssociatedFile(String fileName);

마찬가지로, C++에서는 메서드인 ModelMetadataExtractor::GetAssociatedFile:

tflite::support::StatusOr<absl::string_view> GetAssociatedFile(
      const std::string& filename) const;