tflite_flutter 사용법
'차량 데이터 딥러닝을 통한 위험운전행동 예측 앱'을 주제로 졸업 프로젝트를 하면서 크로스플랫폼 개발 도구로 Flutter 를 선택했습니다.
Flutter를 사용해 차량데이터를 학습한 결과를 실시간으로 연동하기 위해 tflite를 사용하기로 했습니다.
https://pub.dev/packages/tflite_flutter
tflite_flutter | Flutter package
TensorFlow Lite Flutter plugin provides an easy, flexible, and fast Dart API to integrate TFLite models in flutter apps across mobile and desktop platforms.
pub.dev
데이터 기반으로 Tenserflow에 학습모델을 구축을 해둔상태이고, 해당 학습모델을 flutter와 연동하였습니다.
기기별 설정
크로스 플랫폼이기 때문에 기기별로 각각 알맞은 경로에 파일을 두고, plugin을 install 해야합니다.
Android 설정
- install.bat 파일을 프로젝트 root경로에 저장
- 해당 파일을 클릭하고 install plugin 버튼 클릭
IOS 설정
- TensorFlowLiteC.framework. zip 파일 다운로드
- 패키지 파일의 pub-cache폴더에 두기
- pub-cache 폴더 위치
- ~/.pub-cache/hosted/pub.dartlang.org/tflite_flutter-/ios/ (Linux/ Mac)
- %LOCALAPPDATA%\Pub\Cache\hosted\pub.dartlang.org\tflite_flutter-\ios\ (Windows)
패키지 설치
dependencies:
tflite_flutter: ^0.9.0
- import
import 'package:tflite_flutter/tflite_flutter.dart';
사용과정
late List result;
@override
void initState() {
//json을 받아오기 위한 초기화
super.initState();
loadModel();
}
//...build 코드 생략
loadModel() async {
final _interpreter = await Interpreter.fromAsset('exam_model.tflite');//assets 폴더 내의 tflite 파일 가져오기
print('Interpreter loaded successfully');
List<List<double>> input = [/*입력 List*/];
var output = List<double>.filled(input.length, 0).reshape([input.length, 1]); // model output 초기화
// inference
_interpreter.run(input, output);
print("load model successfully");
result = output;//List 형태로 결과 저장됨
_interpreter.close();
}
- 모델이 로드 완료되면, 지정한 input으로 Run을 수행합니다.
- run의 역할은 주피터(Jupyter)에서 Predict와 동일한 역할을 합니다.
- 예측한 결과가 output에 저장됩니다.
상세 내용
1. 인터프리터 생성
final interpreter = await Interpreter.fromAsset('assets/your_model.tflite');
- fromAsset
- assets 폴더 내의 tflite 파일 가져옵니다.
- assets 폴더 내에는 pubspec.yaml 파일이 포함되어야합니다.
2. inference 수행
1) 단일 입력과 출력
_interpreter.run(input, output);
- void run(Object input, Object output) 함수를 호출해서 inference를 수행합니다.
- 입력과 출력을 모델의 입출력과 동일하게 구성합니다.
2) 다중 입력과 출력
var input0 = [1.23];
var input1 = [2.43];
// input: List<Object>
var inputs = [input0, input1, input0, input1];
var output0 = List<double>.filled(1, 0);
var output1 = List<double>.filled(1, 0);
// output: Map<int, Object>
var outputs = {0: output0, 1: output1};
// inference
interpreter.runForMultipleInputs(inputs, outputs);
3) 인터프리터 종료
_interpreter.close();
- 생성한 인터프리터를 종료하는 함수도 존재합니다다.
- 마치 DB 연결을 종료하는 역할과 동일한 일을 수행합니다.
참고자료