질문이있다? TensorFlow 포럼 방문 포럼 에서 커뮤니티와 연결

마이크로 컨트롤러 시작하기

이 문서에서는 마이크로 컨트롤러를 사용하여 모델을 학습시키고 추론을 실행하는 방법을 설명합니다.

Hello World 예

Hello World 예제는 마이크로 컨트롤러 용 TensorFlow Lite 사용의 절대적인 기본 사항을 보여주기 위해 설계되었습니다. 우리는 사인 함수를 복제하는 모델을 훈련하고 실행합니다. 즉, 단일 숫자를 입력으로 취하고 숫자의 사인 값을 출력합니다. 마이크로 컨트롤러에 배포되면 예측을 사용하여 LED를 깜박이거나 애니메이션을 제어합니다.

종단 간 워크 플로에는 다음 단계가 포함됩니다.

  1. 모델 학습 (Python) : 기기에서 사용할 수 있도록 모델을 학습, 변환 및 최적화하는 jupyter 노트북입니다.
  2. 추론 실행 (C ++ 11) : C ++ 라이브러리를 사용하여 모델에서 추론을 실행하는 종단 간 단위 테스트입니다.

지원되는 장치 받기

우리가 사용할 예제 응용 프로그램은 다음 장치에서 테스트되었습니다.

마이크로 컨트롤러 용 TensorFlow Lite 에서 지원되는 플랫폼에 대해 자세히 알아보세요.

모델 훈련

Google colaboratory를 사용 하여 자신의 모델학습 시키십시오 . 자세한 내용은 README.md 참조하십시오.

Hello World 교육 README.md

추론 실행

장치에서 모델을 실행하기 위해 README.md 의 지침을 살펴 보겠습니다.

Hello World README.md

다음 섹션에서는 Microcontroller 용 TensorFlow Lite를 사용하여 추론을 실행하는 방법을 보여주는 단위 테스트 인 hello_world_test.cc 예제를 살펴 봅니다. 모델을로드하고 추론을 여러 번 실행합니다.

1. 라이브러리 헤더 포함

TensorFlow Lite for Microcontrollers 라이브러리를 사용하려면 다음 헤더 파일을 포함해야합니다.

#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"

2. 모델 헤더 포함

마이크로 컨트롤러 용 TensorFlow Lite 인터프리터는 모델이 C ++ 배열로 제공 될 것으로 예상합니다. 모델은 model.hmodel.cc 파일에 정의되어 있습니다. 헤더는 다음 행에 포함됩니다.

#include "tensorflow/lite/micro/examples/hello_world/model.h"

3. 단위 테스트 프레임 워크 헤더 포함

단위 테스트를 만들기 위해 다음 줄을 포함하여 Microcontrollers 단위 테스트 프레임 워크 용 TensorFlow Lite를 포함합니다.

#include "tensorflow/lite/micro/testing/micro_test.h"

테스트는 다음 매크로를 사용하여 정의됩니다.

TF_LITE_MICRO_TESTS_BEGIN

TF_LITE_MICRO_TEST(LoadModelAndPerformInference) {
  . // add code here
  .
}

TF_LITE_MICRO_TESTS_END

이제 위의 매크로에 포함 된 코드에 대해 설명합니다.

4. 로깅 설정

로깅을 설정하려면 tflite::MicroErrorReporter 인스턴스에 대한 포인터를 사용하여 tflite::ErrorReporter 포인터를 tflite::MicroErrorReporter .

tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = &micro_error_reporter;

이 변수는 인터프리터로 전달되어 로그를 작성할 수 있습니다. 마이크로 컨트롤러에는 로깅을위한 다양한 메커니즘이있는 경우가 tflite::MicroErrorReporter 구현은 특정 장치에 맞게 사용자 지정되도록 설계되었습니다.

5. 모델로드

다음 코드에서, 모델은 데이터를 사용하여 인스턴스화 char 배열 g_model 선언된다 model.h . 그런 다음 모델을 확인하여 스키마 버전이 사용중인 버전과 호환되는지 확인합니다.

const tflite::Model* model = ::tflite::GetModel(g_model);
if (model->version() != TFLITE_SCHEMA_VERSION) {
  TF_LITE_REPORT_ERROR(error_reporter,
      "Model provided is schema version %d not equal "
      "to supported version %d.\n",
      model->version(), TFLITE_SCHEMA_VERSION);
}

6. 작업 해석기 인스턴스화

AllOpsResolver 인스턴스가 선언됩니다. 이것은 인터프리터가 모델에서 사용하는 작업에 액세스하는 데 사용됩니다.

tflite::AllOpsResolver resolver;

AllOpsResolver 는 많은 메모리를 사용하는 마이크로 컨트롤러 용 TensorFlow Lite에서 사용할 수있는 모든 작업을로드합니다. 주어진 모델은 이러한 작업의 하위 집합 만 사용하므로 실제 응용 프로그램은 필요한 작업 만로드하는 것이 좋습니다.

다른 클래스 인 MicroMutableOpResolver 사용하여 수행됩니다. Micro Speech 예제의 micro_speech_test.cc 에서 사용 방법을 확인할 수 있습니다.

7. 메모리 할당

입력, 출력 및 중간 배열에 대해 일정량의 메모리를 미리 할당해야합니다. 이것은 tensor_arena_size 크기의 uint8_t 배열로 제공됩니다.

const int tensor_arena_size = 2 * 1024;
uint8_t tensor_arena[tensor_arena_size];

필요한 크기는 사용중인 모델에 따라 다르며 실험을 통해 결정해야 할 수도 있습니다.

8. 인터프리터 인스턴스화

tflite::MicroInterpreter 인스턴스를 만들고 앞에서 만든 변수를 전달합니다.

tflite::MicroInterpreter interpreter(model, resolver, tensor_arena,
                                     tensor_arena_size, error_reporter);

9. 텐서 할당

인터프리터에게 모델의 텐서에 대해 tensor_arena 에서 메모리를 할당하도록 tensor_arena 합니다.

interpreter.AllocateTensors();

10. 입력 모양 확인

MicroInterpreter 인스턴스는 .input(0) 을 호출하여 모델의 입력 텐서에 대한 포인터를 제공 할 수 있습니다. 여기서 0 은 첫 번째 (유일한) 입력 텐서를 나타냅니다.

  // Obtain a pointer to the model's input tensor
  TfLiteTensor* input = interpreter.input(0);

그런 다음이 텐서를 검사하여 모양과 유형이 우리가 기대하는 바인지 확인합니다.

// Make sure the input has the properties we expect
TF_LITE_MICRO_EXPECT_NE(nullptr, input);
// The property "dims" tells us the tensor's shape. It has one element for
// each dimension. Our input is a 2D tensor containing 1 element, so "dims"
// should have size 2.
TF_LITE_MICRO_EXPECT_EQ(2, input->dims->size);
// The value of each element gives the length of the corresponding tensor.
// We should expect two single element tensors (one is contained within the
// other).
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[1]);
// The input is a 32 bit floating point value
TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, input->type);

열거 형 값 kTfLiteFloat32 는 TensorFlow Lite 데이터 유형 중 하나에 대한 참조이며 common.h 정의되어 있습니다.

11. 입력 값 제공

모델에 입력을 제공하기 위해 다음과 같이 입력 텐서의 내용을 설정합니다.

input->data.f[0] = 0.;

이 경우 0 나타내는 부동 소수점 값을 입력합니다.

12. 모델 실행

모델을 실행하기 위해 tflite::MicroInterpreter 인스턴스에서 Invoke()Invoke() 할 수 있습니다.

TfLiteStatus invoke_status = interpreter.Invoke();
if (invoke_status != kTfLiteOk) {
  TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed\n");
}

반환 값인 TfLiteStatus 를 확인하여 실행이 성공했는지 확인할 수 있습니다. common.h 정의 된 TfLiteStatus 의 가능한 값은 kTfLiteOkkTfLiteError 입니다.

다음 코드는 값이 kTfLiteOk 이며 추론이 성공적으로 실행 kTfLiteOk 의미합니다.

TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

13. 출력 얻기

모델의 출력 텐서는 tflite::MicroInterpreter 에서 output(0) 을 호출하여 얻을 수 있습니다. 여기서 0 은 첫 번째 (유일한) 출력 텐서를 나타냅니다.

예제에서 모델의 출력은 2D 텐서에 포함 된 단일 부동 소수점 값입니다.

TfLiteTensor* output = interpreter.output(0);
TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[1]);
TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, output->type);

출력 텐서에서 직접 값을 읽고 그것이 우리가 기대하는 바라고 주장 할 수 있습니다.

// Obtain the output value from the tensor
float value = output->data.f[0];
// Check that the output value is within 0.05 of the expected value
TF_LITE_MICRO_EXPECT_NEAR(0., value, 0.05);

14. 추론 다시 실행

나머지 코드는 추론을 여러 번 실행합니다. 각 인스턴스에서 입력 텐서에 값을 할당하고 인터프리터를 호출하고 출력 텐서에서 결과를 읽습니다.

input->data.f[0] = 1.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(0.841, value, 0.05);

input->data.f[0] = 3.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(0.141, value, 0.05);

input->data.f[0] = 5.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(-0.959, value, 0.05);

15. 애플리케이션 코드 읽기

이 단위 테스트를 main_functions.cc 에있는 예제의 애플리케이션 코드를 이해할 수있을 main_functions.cc 입니다. 유사한 프로세스를 따르지만 실행 된 추론 수에 따라 입력 값을 생성하고 모델의 출력을 사용자에게 표시하는 장치 별 함수를 호출합니다.