Flutter机器学习插件mlkit的使用
Flutter机器学习插件mlkit的使用
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部分,请按照以下步骤操作:
- 使用Firebase控制台为您的项目添加一个Android应用:按照助手提示操作,下载生成的
google-services.json
文件并将其放置在android/app
目录下。接下来,修改android/build.gradle
文件和android/app/build.gradle
文件,按照Firebase助手描述的方式添加Google服务插件。
iOS集成
要将插件集成到您的应用的iOS部分,请按照以下步骤操作:
- 使用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());
自定义模型解释器
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
更多关于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(),
));
}