Flutter机器学习集成插件tensorflutt的使用

Flutter机器学习集成插件tensorflutt的使用


概述

TensorFlow Lite Flutter 插件为访问 TensorFlow Lite 解释器并执行推理提供了灵活且快速的解决方案。其 API 与 TensorFlow Lite 的 Java 和 Swift API 类似。它直接绑定到 TensorFlow Lite C API,使其高效(低延迟)。支持通过 NNAPI、Android 上的 GPU 委托、iOS 上的 Metal 和 CoreML 委托、桌面平台上的 XNNPack 委托进行加速。


主要功能

  • 多平台支持:支持 Android、iOS、Windows、Mac 和 Linux。
  • 灵活性:可以使用任何 TensorFlow Lite 模型。
  • 加速:通过多线程和委托支持实现加速。
  • 结构相似:类似于 TensorFlow Lite Java API。
  • 接近原生速度:推理速度接近使用 Java API 构建的原生 Android 应用。
  • 自定义版本:可以选择使用本地构建的任何 TensorFlow 版本。
  • 隔离运行:可以在不同的隔离中运行推理,以避免 UI 线程卡顿。

初始化设置:在应用中添加动态库

Android

  1. 将脚本 install.sh(适用于 Linux/Mac)或 install.bat(适用于 Windows)放置在项目的根目录下。
  2. 在项目的根目录下执行以下命令以自动下载并放置二进制文件到适当的文件夹:
    sh install.sh  # Linux/Mac
    install.bat    # Windows
    

    注意:安装的二进制文件不包括对 GpuDelegateV2NnApiDelegate 的支持,但仍然可以使用 InterpreterOptions().useNnApiForAndroid

  3. 如果希望使用 GpuDelegateV2NnApiDelegate,请使用以下命令:
    sh install.sh -d  # Linux/Mac
    install.bat -d    # Windows
    

这些脚本基于最新的稳定 TensorFlow 发行版安装预构建的二进制文件。有关使用其他 TensorFlow 版本的信息,请参阅 wiki 中的说明。

iOS

  1. 下载 <code>TensorFlowLiteC.framework</code>。有关构建自定义版本 TensorFlow 的信息,请参阅 wiki
  2. <code>TensorFlowLiteC.framework</code> 放置在该包的 pub-cache 文件夹中。

pub-cache 文件夹位置:

  • Linux/Mac: ~/.pub-cache/hosted/pub.dartlang.org/tflite_flutter-<plugin-version>/ios/
  • Windows: %LOCALAPPDATA%\Pub\Cache\hosted\pub.dartlang.org\tflite_flutter-<plugin-version>\ios\

桌面

有关构建和使用桌面二进制文件的说明,请参阅 此指南


TFLite Flutter 辅助库

一个具有简单架构的专用库,用于处理和操作 TensorFlow Lite 模型的输入和输出。其 API 设计和文档与 TensorFlow Lite Android 支持库相同。强烈建议与 <code>tflite_flutter_plugin</code> 一起使用。了解更多请访问 GitHub


示例

标题 代码 Demo Blog/Tutorial
文本分类应用 代码 博客/教程
图像分类应用 代码 -
目标检测应用 代码 博客/教程
强化学习应用 代码 博客/教程

导入

import 'package:tflite_flutter/tflite_flutter.dart';

使用说明

创建解释器

从资源文件中加载模型

<code>your_model.tflite</code> 放置在 <code>assets</code> 目录中,并确保在 <code>pubspec.yaml</code> 中包含资产。

final interpreter = await tfl.Interpreter.fromAsset('your_model.tflite');

有关从缓冲区或文件创建解释器的详细信息,请参阅文档。


执行推理

推荐使用 TFLite Flutter Helper Library 来简化输入和输出的处理。

单输入单输出

// 输入张量形状为 [1, 5],类型为 float32
var input = [[1.23, 6.54, 7.81, 3.21, 2.22]];

// 输出张量形状为 [1, 2],类型为 float32
var output = List.filled(1 * 2, 0).reshape([1, 2]);

// 推理
interpreter.run(input, output);

// 打印输出
print(output);

多输入多输出

var input0 = [1.23];
var input1 = [2.43];

// 输入列表
var inputs = [input0, input1, input0, input1];

var output0 = List<double>.filled(1, 0);
var output1 = List<double>.filled(1, 0);

// 输出映射
var outputs = {0: output0, 1: output1};

// 推理
interpreter.runForMultipleInputs(inputs, outputs);

// 打印输出
print(outputs);

关闭解释器

interpreter.close();

提高性能:使用委托支持

注意:此功能尚处于测试阶段,某些构建和设备上可能不稳定。

Android NNAPI 委托

var interpreterOptions = InterpreterOptions()..useNnApiForAndroid = true;
final interpreter = await Interpreter.fromAsset('your_model.tflite', options: interpreterOptions);

或者:

var interpreterOptions = InterpreterOptions()..addDelegate(NnApiDelegate());
final interpreter = await Interpreter.fromAsset('your_model.tflite', options: interpreterOptions);

Android 和 iOS GPU 委托

Android GpuDelegateV2
final gpuDelegateV2 = GpuDelegateV2(
  options: GpuDelegateOptionsV2(
    false,
    TfLiteGpuInferenceUsage.fastSingleAnswer,
    TfLiteGpuInferencePriority.minLatency,
    TfLiteGpuInferencePriority.auto,
    TfLiteGpuInferencePriority.auto,
  ),
);

var interpreterOptions = InterpreterOptions()..addDelegate(gpuDelegateV2);
final interpreter = await Interpreter.fromAsset('your_model.tflite', options: interpreterOptions);
iOS Metal 委托
final gpuDelegate = GpuDelegate(
  options: GpuDelegateOptions(true, TFLGpuDelegateWaitType.active),
);
var interpreterOptions = InterpreterOptions()..addDelegate(gpuDelegate);
final interpreter = await Interpreter.fromAsset('your_model.tflite', options: interpreterOptions);

更多关于Flutter机器学习集成插件tensorflutt的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter机器学习集成插件tensorflutt的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成机器学习功能,可以使用tflite_flutter插件,这是一个用于在Flutter应用中运行TensorFlow Lite模型的插件。tflite_flutter提供了与TensorFlow Lite的接口,允许你在Flutter应用中加载和运行预训练的机器学习模型。

以下是如何在Flutter项目中使用tflite_flutter插件的基本步骤:

1. 添加依赖

首先,在pubspec.yaml文件中添加tflite_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  tflite_flutter: ^0.9.0

然后运行flutter pub get来安装依赖。

2. 添加TensorFlow Lite模型

将你的TensorFlow Lite模型文件(.tflite)添加到assets目录中,并在pubspec.yaml中声明:

flutter:
  assets:
    - assets/model.tflite

3. 加载模型

在Flutter应用中加载TensorFlow Lite模型:

import 'package:tflite_flutter/tflite_flutter.dart';

class TFLiteModel {
  Interpreter? _interpreter;

  Future<void> loadModel() async {
    try {
      _interpreter = await Interpreter.fromAsset('assets/model.tflite');
      print('Model loaded successfully');
    } catch (e) {
      print('Failed to load model: $e');
    }
  }

  void dispose() {
    _interpreter?.close();
  }
}

4. 运行推理

加载模型后,你可以使用Interpreter对象来运行推理。假设你的模型接受一个输入并产生一个输出:

class TFLiteModel {
  Interpreter? _interpreter;

  Future<void> loadModel() async {
    try {
      _interpreter = await Interpreter.fromAsset('assets/model.tflite');
      print('Model loaded successfully');
    } catch (e) {
      print('Failed to load model: $e');
    }
  }

  List<double> runInference(List<double> input) {
    if (_interpreter == null) {
      throw Exception('Model not loaded');
    }

    // 假设输入是一个1xN的浮点数数组
    var inputBuffer = Float32List.fromList(input);
    var outputBuffer = Float32List(1); // 假设输出是一个1x1的浮点数数组

    _interpreter!.run(inputBuffer, outputBuffer);

    return outputBuffer;
  }

  void dispose() {
    _interpreter?.close();
  }
}

5. 在UI中使用模型

你可以在Flutter的UI中使用这个模型类来进行推理:

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TFLiteModel _model = TFLiteModel();
  List<double> _output = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    _model.loadModel();
  }

  [@override](/user/override)
  void dispose() {
    _model.dispose();
    super.dispose();
  }

  void _runInference() {
    setState(() {
      _output = _model.runInference([1.0, 2.0, 3.0]); // 示例输入
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TensorFlow Lite in Flutter'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Output: $_output'),
            ElevatedButton(
              onPressed: _runInference,
              child: Text('Run Inference'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部