Flutter机器学习插件mlkit的使用

Flutter机器学习插件mlkit的使用

pub package

A Flutter plugin to use the Firebase ML Kit.

⭐*仅您的点赞会激励我!*⭐

这不是官方包

Flutter团队现在有firebase_ml_vision包用于Firebase ML Kit。请考虑尝试使用firebase_ml_vision。

注意:此插件仍在开发中,某些API可能尚未可用。欢迎提供反馈和提交Pull Requests!

功能

功能 Android iOS
识别文本(设备端) ✅ ✅
识别文本(云端) yet yet
检测人脸(设备端) ✅ ✅
扫描条形码(设备端) ✅ ✅
图像标注(设备端) ✅ ✅
图像标注(云端) yet yet
对象检测与跟踪 yet yet
识别地标(云端) yet yet
语言识别 ✅ ✅
翻译 yet yet
智能回复 yet yet
AutoML模型推理 yet yet
自定义模型(设备端) ✅ ✅
自定义模型(云端) ✅ ✅

了解哪些功能可在设备上或云端使用?

使用方法

要使用此插件,在pubspec.yaml文件中添加mlkit作为依赖项。

入门指南

检查example目录以获取使用Firebase Cloud Messaging的示例应用程序。

Android集成

要将插件集成到您的应用的Android部分,请按照以下步骤操作:

  1. 使用Firebase控制台为您的项目添加一个Android应用:按照助手提示操作,下载生成的google-services.json文件并将其放置在android/app目录下。接下来,修改android/build.gradle文件和android/app/build.gradle文件,按照Firebase助手描述的方式添加Google服务插件。

iOS集成

要将插件集成到您的应用的iOS部分,请按照以下步骤操作:

  1. 使用Firebase控制台为您的项目添加一个iOS应用:按照助手提示操作,下载生成的GoogleService-Info.plist文件,使用Xcode打开ios/Runner.xcworkspace,并在Xcode中将文件放置在ios/Runner目录下。不要遵循Firebase助手中的“添加Firebase SDK”和“添加初始化代码”步骤。

Dart/Flutter集成

从您的Dart代码中,您需要导入插件并实例化它:

import 'package:mlkit/mlkit.dart';

FirebaseVisionTextDetector detector = FirebaseVisionTextDetector.instance;

// 通过路径检测文件/图像
var currentLabels = await detector.detectFromPath(_file?.path);

// 从文件/图像的二进制数据中检测
var currentLabels = await detector.detectFromBinary(_file?.readAsBytesSync());

自定义模型解释器

native示例代码

import 'package:mlkit/mlkit.dart';
import 'package:image/image.dart' as img;

FirebaseModelInterpreter interpreter = FirebaseModelInterpreter.instance;
FirebaseModelManager manager = FirebaseModelManager.instance;

// 注册云端模型
manager.registerRemoteModelSource(
        FirebaseRemoteModelSource(modelName: "mobilenet_v1_224_quant"));

// 注册本地备份
manager.registerLocalModelSource(FirebaseLocalModelSource(modelName: 'mobilenet_v1_224_quant',  assetFilePath: 'ml/mobilenet_v1_224_quant.tflite'));

var imageBytes = (await rootBundle.load("assets/mountain.jpg")).buffer;
img.Image image = img.decodeJpg(imageBytes.asUint8List());
image = img.copyResize(image, 224, 224);

// 应用程序将下载远程模型。在远程模型下载期间,它将使用本地模型。
var results = await interpreter.run(
        remoteModelName: "mobilenet_v1_224_quant",
        localModelName: "mobilenet_v1_224_quant",
        inputOutputOptions: FirebaseModelInputOutputOptions([
          FirebaseModelIOOption(FirebaseModelDataType.FLOAT32, [1, 224, 224, 3])
        ], [
          FirebaseModelIOOption(FirebaseModelDataType.FLOAT32, [1, 1001])
        ]),
        inputBytes: imageToByteList(image));

// 整数模型
Uint8List imageToByteList(img.Image image) {
    var _inputSize = 224;
    var convertedBytes = new Uint8List(1 * _inputSize * _inputSize * 3);
    var buffer = new ByteData.view(convertedBytes.buffer);
    int pixelIndex = 0;
    for (var i = 0; i < _inputSize; i++) {
      for (var j = 0; j < _inputSize; j++) {
        var pixel = image.getPixel(i, j);
        buffer.setUint8(pixelIndex, (pixel >> 16) & 0xFF);
        pixelIndex++;
        buffer.setUint8(pixelIndex, (pixel >> 8) & 0xFF);
        pixelIndex++;
        buffer.setUint8(pixelIndex, (pixel) & 0xFF);
        pixelIndex++;
      }
    }
    return convertedBytes;
  }

// 浮点模型
Uint8List imageToByteList(img.Image image) {
  var _inputSize = 224;
  var convertedBytes = Float32List(1 * _inputSize * _inputSize * 3);
  var buffer = Float32List.view(convertedBytes.buffer);
  int pixelIndex = 0;
  for (var i = 0; i < _inputSize; i++) {
    for (var j = 0; j < _inputSize; j++) {
      var pixel = image.getPixel(i, j);
      buffer[pixelIndex] = ((pixel >> 16) & 0xFF) / 255;
      pixelIndex += 1;
      buffer[pixelIndex] = ((pixel >> 8) & 0xFF) / 255;
      pixelIndex += 1;
      buffer[pixelIndex] = ((pixel) & 0xFF) / 255;
      pixelIndex += 1;
    }
  }
  return convertedBytes.buffer.asUint8List();
}

示例代码

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mlkit/mlkit.dart';

import 'custom-models.dart';
import 'vision-text.dart';
import 'face-detect.dart';
import 'label-image.dart';

void main() {
  runApp(MaterialApp(
    title: 'Named Routes Demo',
    // 启动应用程序时使用"/"命名路由。在这种情况下,应用程序将从FirstScreen小部件开始
    initialRoute: '/',
    routes: {
      '/': (context) => StartScreen(),
      '/vision-text': (context) => VisionTextWidget(),
      '/custom-model': (context) => CustomModelWidget(),
      '/face-detect': (context) => FaceDetectWidget(),
      '/label-image': (context) => LabelImageWidget(),
    },
  ));
}

class StartScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('MLKit Demo'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            Center(
              child: RaisedButton(
                child: Text('MLKit vision text detection'),
                onPressed: () {
                  // 使用命名路由导航到第二个屏幕
                  Navigator.pushNamed(context, '/vision-text');
                },
              ),
            ),
            Center(
              child: RaisedButton(
                child: Text('Object detection with custom model'),
                onPressed: () {
                  // 使用命名路由导航到第二个屏幕
                  Navigator.pushNamed(context, '/custom-model');
                },
              ),
            ),
            Center(
              child: RaisedButton(
                child: Text('Face detection'),
                onPressed: () {
                  // 使用命名路由导航到第二个屏幕
                  Navigator.pushNamed(context, '/face-detect');
                },
              ),
            ),
            Center(
              child: RaisedButton(
                child: Text('Label Images'),
                onPressed: () {
                  // 使用命名路由导航到第二个屏幕
                  Navigator.pushNamed(context, '/label-image');
                },
              ),
            ),
          ],
        ));
  }
}

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

1 回复

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


Google 的 ML Kit 是一个强大的移动端机器学习 SDK,它提供了多种预训练的模型和 API,可以在 Flutter 应用中轻松集成机器学习功能。ML Kit 支持 Android 和 iOS 平台,并且可以通过 Flutter 插件 firebase_ml_model_downloader 或 google_ml_kit 来使用。

以下是使用 google_ml_kit 插件在 Flutter 中集成 ML Kit 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  google_ml_kit: ^0.10.0

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

2. 初始化 ML Kit

在你的 Flutter 项目中,你可以根据需要选择使用 ML Kit 提供的不同功能,例如文本识别、人脸检测、条形码扫描等。

以下是一个简单的例子,展示如何使用 ML Kit 进行文本识别:

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

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

class _TextRecognitionPageState extends State<TextRecognitionPage> {
  File? _image;
  String _recognizedText = '';

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

    if (pickedFile != null) {
      setState(() {
        _image = File(pickedFile.path);
      });

      _recognizeText();
    }
  }

  Future<void> _recognizeText() async {
    if (_image == null) return;

    final textRecognizer = GoogleMlKit.vision.textRecognizer();
    final inputImage = InputImage.fromFile(_image!);
    final RecognizedText recognizedText = await textRecognizer.processImage(inputImage);

    setState(() {
      _recognizedText = recognizedText.text;
    });

    textRecognizer.close();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Text Recognition'),
      ),
      body: Column(
        children: [
          _image != null
              ? Image.file(_image!, height: 200)
              : Container(),
          ElevatedButton(
            onPressed: _pickImage,
            child: Text('Pick Image'),
          ),
          Expanded(
            child: SingleChildScrollView(
              child: Text(_recognizedText),
            ),
          ),
        ],
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(
    home: TextRecognitionPage(),
  ));
}
回到顶部