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_downloadergoogle_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(),
  ));
}
回到顶部