본 문서에서는 Tensorflow Lite의 C/C++ API를 활용하여 딥러닝 모델을 활용하는 방법을 소개합니다.
먼저 아래 튜토리얼을 참고하여 TFLite C/C++를 설치 후 활용합니다.
모델 초기화 하기
파일로 부터 모델 로드하기
// 파일(*.tflite)로 부터 모델 로드하기
TfLiteModel* tflite_model = TfLiteModelCreateFromFile(model_path.c_str());
C++
복사
버퍼로 부터 모델 로드하기
TfLiteModel* tflite_model = TfLiteModelCreate(tflite_buf, tflite_buf_size);
C++
복사
모델 옵션 설정하기
// 모델 옵션 설정하기
TfLiteInterpreterOptions* tflite_options = TfLiteInterpreterOptionsCreate();
// 스레드 개수 설정
TfLiteInterpreterOptionsSetNumThreads(tflite_options, num_threads);
C++
복사
인터프리터 생성하기
// 모델과 옵션을 이용하여 인터프리터 생성하기
TfLiteInterpreter* tflite_interpreter = \
TfLiteInterpreterCreate(tflite_model, tflite_options);
C++
복사
최종 세팅하기
// 할당할 텐서값(입력,출력) 세팅하기
TfLiteStatus tflite_status = TfLiteInterpreterAllocateTensors(tflite_interpreter);
// 정상적으로 세팅됬는지 확인
if (tflite_status != kTfLiteOk) { return; }
C++
복사
Delegate를 활용하여 CPU/GPU/NPU 설정하기
// CPU의 경우 별도 처리를 하지 않습니다.
// GPU를 사용할 경우
TfLiteDelegate* delegate_tflite = \
TfLiteGpuDelegateV2Create(/*default options=*/nullptr);
tflite_status = TfLiteInterpreterModifyGraphWithDelegate(
interpreter_tflite, delegate_tflite);
// NPU를 사용할 경우
TfLiteInterpreterOptionsSetUseNNAPI(options_tflite, true);
// Delegate 삭제
TfLiteGpuDelegateV2Delete(delegate_tflite);
// NPU 사용 끄기
TfLiteInterpreterOptionsSetUseNNAPI(options_tflite, false);
C++
복사
모델 실행하기
// 입력값 (example. Opencv::Mat Class)
cv::Mat &input_mat
// 입력 텐서 설정
int input_tensor_idx = 0;
TfLiteTensor* input_tensor = \
TfLiteInterpreterGetInputTensor(tflite_interpreter, input_tensor_idx);
// 입력 텐서에 입력값 세팅. 포인터 전달
tflite_status = \
TfLiteTensorCopyFromBuffer(
input_tensor, input_mat.ptr<float>(0), model_input_size * sizeof(float));
// 모델 실행
tflite_status = TfLiteInterpreterInvoke(tflite_interpreter);
// 출력 텐서 개수 세기
int output_count = TfLiteInterpreterGetOutputTensorCount(tflite_interpreter);
// 출력 텐서 가져오기
int output_tensor_idx = 0;
const TfLiteTensor* output_tensor = \
TfLiteInterpreterGetOutputTensor(tflite_interpreter, output_tensor_idx);
C++
복사
모델 삭제하기
// 모델 삭제
TfLiteModelDelete(tflite_model);
// 인터프리터 삭제
TfLiteInterpreterDelete(tflite_interpreter);
// 모델 옵션 삭제
TfLiteInterpreterOptionsDelete(tflite_options);
C++
복사