본문 바로가기
Flutter/Flutter Programming

Flutter에서 TensorFlow Lite를 사용하는 방법과 옵션

by Maccrey 2024. 7. 3.
반응형

TensorFlow Lite는 모바일 및 임베디드 기기에서 머신 러닝 모델을 실행하도록 최적화된 가볍고 효율적인 머신 러닝 프레임워크입니다.

플러터는 인기 있는 크로스 플랫폼 모바일 프레임워크로서, TensorFlow Lite를 사용하여 모바일 앱에 머신 러닝 기능을 쉽게 추가할 수 있도록 합니다.

이 가이드에서는 플러터에서 TensorFlow Lite를 사용하는 방법을 단계별로 자세히 살펴보고, 초보자가 쉽게 이해할 수 있도록 예제 코드와 설명을 제공합니다.

 

1. 환경 설정

TensorFlow Lite를 사용하기 전에 먼저 개발 환경을 설정해야 합니다. 다음은 필수 단계입니다.

  • Flutter 설치: 아직 Flutter를 설치하지 않았다면 https://docs.flutter.dev/get-started/install 에서 설치 가이드를 참조하세요.
  • Android Studio 설치: Android Studio는 안드로이드 앱 개발을 위한 공식 IDE입니다. https://developer.android.com/studio 에서 다운로드하고 설치할 수 있습니다.
  • TensorFlow Lite 플러그인 설치: 플러터 프로젝트에 TensorFlow Lite 플러그인을 추가하려면 다음 명령을 프로젝트 디렉터리에서 실행합니다.
flutter pub get
 

2. 간단한 예제: 이미지 분류

 

이제 간단한 예제를 통해 TensorFlow Lite를 사용하여 이미지를 분류하는 방법을 살펴보겠습니다.

 

단계 1: 모델 다운로드

 

먼저, 분류할 이미지를 위한 TensorFlow Lite 모델을 다운로드해야 합니다. MobileNet v1 모델을 예시로 사용해 보겠습니다.

  1. 다음 링크에서 MobileNet v1 모델을 다운로드합니다: https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub
  2. 다운로드한 .tflite 파일을 프로젝트의 assets 디렉터리에 복사합니다.

단계 2: 앱 만들기

  1. 새로운 Flutter 프로젝트를 생성합니다.
  2. main.dart 파일에 다음 코드를 추가합니다.
import 'package:flutter/material.dart';
import 'package:tflite_flutter/tflite_flutter.dart';

void main() async {
  // Load the model from the assets directory
  final model = await TFLiteFlutter.loadModel('assets/mobilenet_v1_1.0_quant.tflite');

  // Create an interpreter to run the model
  final interpreter = Interpreter(model);

  // Load an image to classify
  final image = Image.network('https://placehold.co/224x224'); // Replace with your image URL
  final bytes = await image.toByteData(format: ImageByteFormat.png);
  final inputData = bytes.buffer.asUint8List().sublist(bytes.offsetInBytes);

  // Resize the input data to match the model's input shape
  final inputShape = interpreter.getInputShape(0);
  final inputSize = inputShape[1] * inputShape[2];
  final resizedInput = ResizeBilinear(inputSize).convert(inputData);

  // Run inference on the resized input
  final outputData = interpreter.run(resizedInput);

  // Process the output data to get the predicted class
  final outputTensor = interpreter.getOutputTensor(0);
  final predictedClass = outputData.argmax(axis: 0);
  final labelIndex = outputTensor.labelsMap[predictedClass];

  // Display the predicted class
  print('Predicted class: $labelIndex');
}
 

단계 3: 앱 실행

  1. 위 코드를 저장하고 앱을 실행합니다.
  2. 콘솔에 예측된 클래스가 출력됩니다.

3. 사용자 정의 모델 사용

 

위의 예제는 기본적인 모델 사용 방법을 보여주었지만, TensorFlow Lite는 사용자 정의 모델을 사용할 수 있는 유연성을 제공합니다.

  • 모델을 직접 학습하고 변환하거나, 사전 훈련된 모델을 사용할 수 있습니다.
  • 다양한 모델 구조와 작업을 지원합니다.

4. 이미지 분류 예제를 확장

4.1. 이미지 분류 예제 확장하기

 

4.1.1 여러 이미지 분류

 

위의 예제는 단일 이미지를 분류했지만, 여러 이미지를 동시에 분류하도록 확장할 수 있습니다.

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:tflite_flutter/tflite_flutter.dart';

void main() async {
  // Load the model from the assets directory
  final model = await TFLiteFlutter.loadModel('assets/mobilenet_v1_1.0_quant.tflite');

  // Create an interpreter to run the model
  final interpreter = Interpreter(model);

  // Pick multiple images from the gallery
  final pickedFiles = await ImagePicker().pickMultipleImages(maxImages: 5);
  if (pickedFiles == null) return;

  // Classify each image
  for (final pickedFile in pickedFiles) {
    final imageFile = File(pickedFile.path);
    final image = Image.file(imageFile);
    final bytes = await image.toByteData(format: ImageByteFormat.png);
    final inputData = bytes.buffer.asUint8List().sublist(bytes.offsetInBytes);

    // Resize the input data to match the model's input shape
    final inputShape = interpreter.getInputShape(0);
    final inputSize = inputShape[1] * inputShape[2];
    final resizedInput = ResizeBilinear(inputSize).convert(inputData);

    // Run inference on the resized input
    final outputData = interpreter.run(resizedInput);

    // Process the output data to get the predicted class
    final outputTensor = interpreter.getOutputTensor(0);
    final predictedClass = outputData.argmax(axis: 0);
    final labelIndex = outputTensor.labelsMap[predictedClass];

    // Display the predicted class for each image
    print('Predicted class for image ${imageFile.path}: $labelIndex');
  }
}
 

4. 1.2 사용자 인터페이스 추가

이 예제에 사용자 인터페이스를 추가하여 사용자가 이미지를 선택하고 결과를 볼 수 있도록 만들 수 있습니다.

 

4.2. 성능 향상

 

4.2.1 Delegate 사용

TensorFlow Lite는 특정 하드웨어 가속기를 활용하여 모델 성능을 향상시키는 데 사용할 수 있는 Delegate를 제공합니다. 예를 들어, GPU Delegate를 사용하여 GPU에서 모델을 실행할 수 있습니다.

// Create an interpreter with a GPU delegate
final delegate = GpuDelegate();
final interpreter = Interpreter(model, delegate);
 

4.2.2 Threadpool 사용

Threadpool을 사용하여 여러 스레드에서 모델을 실행하여 성능을 향상시킬 수 있습니다.

// Create an interpreter with a threadpool
final threadpool = ThreadpoolExecutor();
final interpreter = Interpreter(model, options: InterpreterOptions(threadpool: threadpool));
 

4.3. 사용자 정의 모델 사용

 

4.3.1 모델 학습 및 변환

TensorFlow를 사용하여 직접 모델을 학습하고 변환하거나, 사전 훈련된 모델을 사용할 수 있습니다.

3.2 모델 사용

 

사용자 정의 모델을 사용하려면 다음 단계를 따르십시오.

  1. 모델을 TensorFlow Lite 형식으로 변환합니다.
  2. 플러터 앱에 모델을 로드합니다.
  3. 모델을 실행하고 결과를 처리합니다.

4. 결론

 

플러터에서 TensorFlow Lite는 모바일 앱에 머신 러닝 기능을 쉽게 추가할 수 있는 강력한 도구입니다.

 

 

 

 

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

나비일기장 [수발일기장] - Google Play 앱

수형자 수발가족및 수발인을 위한 일기장으로 수형생활시기에 따른 정보를 얻을 수 있습니다.

play.google.com

 

 
반응형