Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การใช้ Machine Learning ใน Flutter ด้วย TensorFlow Lite

บทความนี้แนะนำการใช้งาน TensorFlow Lite (TFLite) ใน Flutter เพื่อนำ Machine Learning มาใช้ในแอปพลิเคชันมือถืออย่างมีประสิทธิภาพ โดยครอบคลุมตั้งแต่การติดตั้ง `tf...

การใช้ Machine Learning ใน Flutter ด้วย TensorFlow Lite

ในยุคปัจจุบัน Machine Learning (ML) ได้เข้ามามีบทบาทสำคัญในหลากหลายอุตสาหกรรม การนำ ML มาประยุกต์ใช้ในแอปพลิเคชันมือถือช่วยเพิ่มขีดความสามารถในการวิเคราะห์ข้อมูล, ทำนายผลลัพธ์, และสร้างประสบการณ์ที่ชาญฉลาดให้กับผู้ใช้งาน Flutter ก็เป็น Framework ที่รองรับการใช้งาน ML ได้อย่างมีประสิทธิภาพ และ TensorFlow Lite (TFLite) คือเครื่องมือสำคัญที่ช่วยให้เราสามารถรันโมเดล ML บนอุปกรณ์มือถือได้อย่างรวดเร็วและมีประสิทธิภาพ

บทความนี้จะพาคุณไปรู้จักกับการใช้งาน TensorFlow Lite ใน Flutter ตั้งแต่การติดตั้ง package, การโหลดโมเดล, ไปจนถึงการทำ Inference เพื่อให้คุณสามารถนำ ML มาประยุกต์ใช้ในแอป Flutter ของคุณได้อย่างง่ายดาย

TensorFlow Lite คืออะไร?

TensorFlow Lite คือ Framework สำหรับการรันโมเดล Machine Learning บนอุปกรณ์มือถือ, อุปกรณ์ IoT และอุปกรณ์ Edge อื่นๆ TFLite ถูกออกแบบมาให้มีขนาดเล็ก, รวดเร็ว, และประหยัดพลังงาน ทำให้เหมาะสำหรับการใช้งานในสภาพแวดล้อมที่มีข้อจำกัดด้านทรัพยากร

ข้อดีของการใช้ TensorFlow Lite ใน Flutter:

  • ประสิทธิภาพ: TFLite ถูกปรับแต่งให้ทำงานได้อย่างรวดเร็วบนอุปกรณ์มือถือ
  • ขนาดเล็ก: โมเดล TFLite มีขนาดเล็กกว่าโมเดล TensorFlow แบบเต็ม ทำให้ใช้พื้นที่จัดเก็บน้อยลง
  • ความเป็นส่วนตัว: การรันโมเดลบนอุปกรณ์ (on-device inference) ช่วยรักษาความเป็นส่วนตัวของผู้ใช้งาน เนื่องจากข้อมูลไม่ต้องถูกส่งไปยัง Server
  • การทำงานแบบออฟไลน์: แอปสามารถทำงานได้แม้ไม่มีการเชื่อมต่ออินเทอร์เน็ต

การติดตั้ง tflite Package

ในการใช้งาน TensorFlow Lite ใน Flutter เราต้องติดตั้ง tflite package ซึ่งเป็น Plugin ที่ช่วยให้ Flutter สามารถสื่อสารกับ TensorFlow Lite Runtime ได้

เพิ่ม dependency tflite ในไฟล์ pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  tflite: ^1.1.2

หลังจากแก้ไขไฟล์ pubspec.yaml แล้ว ให้รันคำสั่ง flutter pub get เพื่อดาวน์โหลดและติดตั้ง package

การโหลดโมเดล TensorFlow Lite

ก่อนที่จะทำการ Inference ได้ เราต้องโหลดโมเดล TensorFlow Lite เข้ามาในแอปก่อน โมเดล TFLite มักจะอยู่ในรูปแบบไฟล์ .tflite

1. เตรียมโมเดล TFLite: คุณสามารถดาวน์โหลดโมเดล TFLite ที่ผ่านการ Train มาแล้วจากแหล่งต่างๆ เช่น TensorFlow Hub หรือ Train โมเดลของคุณเองด้วย TensorFlow แล้วแปลงเป็นรูปแบบ TFLite

2. เพิ่มโมเดลใน Project: สร้าง directory assets ใน root ของ project และคัดลอกไฟล์ .tflite ไปไว้ใน directory นี้

3. กำหนด Assets ใน pubspec.yaml: แก้ไขไฟล์ pubspec.yaml เพื่อระบุว่าไฟล์ .tflite เป็น asset ของแอป:

flutter:
  assets:
    - assets/your_model.tflite

4. โหลดโมเดลใน Code: ใช้ method Tflite.loadModel() เพื่อโหลดโมเดล:

import 'package:flutter/material.dart';
import 'package:tflite/tflite.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  bool _isModelLoaded = false;

  @override
  void initState() {
    super.initState();
    _loadModel();
  }

  Future<void> _loadModel() async {
    try {
      String? res = await Tflite.loadModel(
        model: "assets/your_model.tflite",
        labels: "assets/your_labels.txt", // Optional: If your model requires labels
      );
      print("Model loaded: $res");
      setState(() {
        _isModelLoaded = true;
      });
    } catch (e) {
      print("Error loading model: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TensorFlow Lite Example'),
      ),
      body: Center(
        child: Text(_isModelLoaded ? 'Model Loaded!' : 'Loading Model...'),
      ),
    );
  }
}

เหตุผลเชิงออกแบบ: การโหลดโมเดลใน initState() ช่วยให้มั่นใจได้ว่าโมเดลจะถูกโหลดเพียงครั้งเดียวเมื่อ Widget ถูกสร้างขึ้น การใช้ setState() เพื่ออัปเดต _isModelLoaded ทำให้ UI สามารถแสดงสถานะการโหลดโมเดลได้อย่างถูกต้อง

แนวปฏิบัติที่ดี: ควรจัดการ Error ที่อาจเกิดขึ้นระหว่างการโหลดโมเดล และแสดงข้อความที่เหมาะสมให้กับผู้ใช้งาน นอกจากนี้ ควรตรวจสอบให้แน่ใจว่าไฟล์โมเดลและ label ถูกต้องและอยู่ในตำแหน่งที่ระบุ

การทำ Inference

เมื่อโหลดโมเดลเรียบร้อยแล้ว เราก็สามารถทำการ Inference ได้ การ Inference คือกระบวนการในการป้อนข้อมูลให้กับโมเดล และรับผลลัพธ์ที่โมเดลทำนาย

tflite package มี method หลายตัวสำหรับการทำ Inference ขึ้นอยู่กับประเภทของข้อมูลที่เราต้องการประมวลผล ตัวอย่างเช่น:

  • Tflite.runModelOnImage(): สำหรับการประมวลผลรูปภาพ
  • Tflite.runModelOnFrame(): สำหรับการประมวลผล Frame จาก Camera
  • Tflite.runModelOnBinary(): สำหรับการประมวลผลข้อมูล Binary

ตัวอย่าง: การทำ Image Classification

สมมติว่าเรามีโมเดล TFLite ที่ถูก Train มาสำหรับการทำ Image Classification เราสามารถใช้ Tflite.runModelOnImage() เพื่อทำนายว่ารูปภาพนั้นคืออะไร

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

class ImageClassificationExample extends StatefulWidget {
  @override
  _ImageClassificationExampleState createState() => _ImageClassificationExampleState();
}

class _ImageClassificationExampleState extends State<ImageClassificationExample> {
  File? _image;
  List? _outputs;
  final picker = ImagePicker();

  @override
  void initState() {
    super.initState();
    loadModel();
  }

  Future<void> loadModel() async {
    await Tflite.loadModel(
      model: "assets/your_model.tflite",
      labels: "assets/your_labels.txt",
      numThreads: 1, // Defaults to 1
      isAsset: true, // Defaults to true, specify asset: false if this is not an asset
      useGpuDelegate: false // Defaults to false
    );
  }

  Future<void> pickImage() async {
    final pickedFile = await picker.getImage(source: ImageSource.gallery);

    setState(() {
      if (pickedFile != null) {
        _image = File(pickedFile.path);
        classifyImage(_image!);
      } else {
        print('No image selected.');
      }
    });
  }

  Future<void> classifyImage(File image) async {
    var output = await Tflite.runModelOnImage(
        path: image.path,
        imageMean: 0.0,   // defaults to 117.0
        imageStd: 255.0,  // defaults to 1.0
        numResults: 2,    // defaults to 5
        threshold: 0.2,   // defaults to 0.1
        asynch: true      // defaults to true
    );
    setState(() {
      _outputs = output;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Image Classification'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image == null
                ? Text('No image selected.')
                : Image.file(_image!),
            SizedBox(height: 20),
            _outputs != null
                ? Text(
                    "Prediction: ${_outputs![0]["label"]} - Confidence: ${(_outputs![0]["confidence"] as double).toStringAsFixed(2)}")
                : Text('Waiting to classify...'),
            ElevatedButton(
              onPressed: pickImage,
              child: Text('Select an Image'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    Tflite.close();
    super.dispose();
  }
}

คำอธิบาย Code:

  • pickImage(): เลือกรูปภาพจาก Gallery โดยใช้ image_picker package
  • classifyImage(): ทำการ Inference บนรูปภาพที่เลือก โดยใช้ Tflite.runModelOnImage()
  • Tflite.runModelOnImage(): รับ path ของรูปภาพ, ค่าเฉลี่ยและความแปรปรวนของสี (imageMean, imageStd), จำนวนผลลัพธ์ที่ต้องการ (numResults), และ threshold เป็น Parameter
  • ผลลัพธ์ที่ได้ (_outputs) จะเป็น List ของ Map แต่ละ Map จะมี key "label" (ชื่อของ Class ที่ทำนาย) และ "confidence" (ความน่าจะเป็นของการทำนาย)

เหตุผลเชิงออกแบบ: การใช้ async/await ทำให้การโหลดโมเดลและการทำ Inference ทำงานแบบ Asynchronous ซึ่งช่วยป้องกันไม่ให้ UI ค้าง การใช้ setState() เพื่ออัปเดต UI หลังจากที่ได้ผลลัพธ์ ทำให้ UI แสดงผลลัพธ์ได้อย่างถูกต้อง

แนวปฏิบัติที่ดี: ควรจัดการ Error ที่อาจเกิดขึ้นระหว่างการเลือกรูปภาพและการทำ Inference และแสดงข้อความที่เหมาะสมให้กับผู้ใช้งาน นอกจากนี้ ควรปรับแต่ง Parameter ต่างๆ ของ Tflite.runModelOnImage() ให้เหมาะสมกับโมเดลและข้อมูลที่ใช้

ข้อควรระวังและข้อจำกัด

  • ความเข้ากันได้ของโมเดล: ตรวจสอบให้แน่ใจว่าโมเดล TFLite ของคุณเข้ากันได้กับ tflite package และ TensorFlow Lite Runtime ที่ใช้
  • ประสิทธิภาพ: การทำ Inference อาจใช้ทรัพยากรของอุปกรณ์มาก ควรทดสอบประสิทธิภาพของแอปบนอุปกรณ์จริง และปรับแต่งโมเดลหรือ Code เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด
  • ขนาดของโมเดล: โมเดลขนาดใหญ่อาจใช้พื้นที่จัดเก็บมากและใช้เวลาในการโหลดนาน ควรพิจารณาใช้เทคนิคต่างๆ เช่น Model Quantization เพื่อลดขนาดของโมเดล
  • การจัดการ Memory: ควรปิดโมเดลเมื่อไม่ใช้งานแล้ว โดยใช้ Tflite.close() เพื่อป้องกัน Memory Leak

สรุป

TensorFlow Lite เป็นเครื่องมือที่มีประสิทธิภาพในการนำ Machine Learning มาประยุกต์ใช้ในแอป Flutter การใช้ tflite package ช่วยให้การโหลดโมเดลและการทำ Inference เป็นเรื่องง่าย อย่างไรก็ตาม ควรระมัดระวังในเรื่องของความเข้ากันได้ของโมเดล, ประสิทธิภาพ, ขนาดของโมเดล, และการจัดการ Memory เพื่อให้แอป Flutter ของคุณสามารถทำงานได้อย่างราบรื่นและมีประสิทธิภาพ

ในบทความถัดไป เราจะมาเรียนรู้เกี่ยวกับการสร้าง Custom Render Objects ใน Flutter เพื่อสร้าง UI ที่มีความยืดหยุ่นและปรับแต่งได้สูงยิ่งขึ้น

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service