Flutter

[Flutter] 앱에서 인공지능 모델 활용하기 - tflite_flutter

izongg 2023. 7. 30. 01:38
반응형

tflite_flutter 패키지를 이용하여 Flutter 앱에 인공지능을 결합시키는 방법

 

tflite_flutter이 생기기 이전에는 tflite라는 패키지를 사용하였었다.

 

하지만 Flutter 버전이 업데이트되면서 tflite 패키지는 사용하지 못하도록 되었고,

 

tflite_flutter 패키지가 나왔다. 

 

나온 지 얼마 안된 패키지인 만큼 자료도 너무 없어 사용하기 힘들었다.

 

사용하는 flutter 버전을 flutter 2.2.3 으로 낮추면 기존의 tflite를 사용할 수 있지만, 다른 JDK버전에서 오류가 많이 나오고 다른 모든 연결된 것들을 저 버전에 맞추어야되서 번거로울 것 같았다.

그래서 tflite_flutter을 사용하였다.

 

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

 

 $ flutter pub add tflite_flutter
dependencies:
  tflite_flutter: ^0.10.1

pub add를 하고 pubspec.yaml 파일에 가보면 dependencies에 추가되어있다.

 

dart파일에서 사용할 땐 

import 'package:tflite_flutter/tflite_flutter.dart';

이 코드를 사용한다.

 

저는 이미지 분류모델을 적용하여 사진으로 사물을 인식하는 앱을 만들었다.

 

먼저 모델 tflite 파일을 assets폴더에 저장한다.

 

pubspec.yaml

flutter:
  uses-material-design: true
  assets:
    - assets/

 

main.dart

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


void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}


class _MyAppState extends State<MyApp> {


    modelrun() async{
      // 저장한 모델 파일을 가져옵니다.
      final interpreter = await Interpreter.fromAsset('assets/a_model.tflite');

      /*
 
       input 형식 전처리 과정 생략 
 
 
      */
 
 
      // 모델 output 형식으로 변수를 선언합니다.
      // 제가 사용할 모델의 아웃풋은 (1,7) 입니다.
      List<List<double>> output = [[0,0,0,0,0,0,0]];
     
      // interpreter.run(input,output),  input값과 모델을 거쳐서 가져올 결과값을 저장할 변수를 넣어줍니다.
      // input과 output형식은 모델에 따라 다르기 때문에 꼭 각자에 맞는 형식을 사용하세요.
      interpreter.run(imageArray,output);
     

      // 모델 실행한 결과를 변수에 저장합니다. 저는 output이 (1,7)이므로 첫번 째 인덱스를 가져왔습니다.
      List<double> model_result = output[0];
     
      // 모델 결과중 정확도가 가장 높은 index를 선택하는 코드입니다.
      int maxIndex = model_result.indexOf(model_result.reduce((a, b) => a > b ? a : b));

      print(model_result);
      print(maxIndex);

  }

   // Widget ...........
   
}

함수를 작성하고, 이후 모델을 실행할 버튼 클릭 이벤트를 통해 modelrun() 함수를 실행한다.

 

사실 모델을 가져오고 실행하는 코드는 복잡하지 않다.

 

하지만 이미지 분류모델이라 그런지 input형식을 맞추는게 힘들었다.

 

 

반응형