Flutter图像标签识别插件google_mlkit_image_labeling的使用
Flutter图像标签识别插件google_mlkit_image_labeling的使用
简介
Google’s ML Kit Image Labeling for Flutter 是一个用于在Flutter应用程序中实现图像标签识别功能的插件。它能够检测并提取图像中实体的信息,涵盖广泛的类别。
注意事项
- 平台支持:此插件仅适用于iOS和Android平台,Web或其他平台不被支持。
- 维护者:该插件并非由Google官方赞助或维护,而是由一群热爱机器学习的开发者创建,旨在将Google的原生API暴露给Flutter。
- 工作原理:通过Flutter平台通道(Platform Channels)调用iOS和Android的原生API进行图像处理,因此所有机器学习任务都在原生层执行,而非Dart代码中。
Requirements
iOS
- 最低iOS部署目标:15.5.0
- Xcode版本:15.3.0 或更新
- Swift版本:5
- 不支持32位架构(i386 和 armv7),仅支持64位架构(x86_64 和 arm64)
Podfile配置示例:
platform :ios, '15.5.0'
$iOSVersion = '15.5.0'
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7"
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
end
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'])
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion
end
end
end
end
Android
- minSdkVersion: 21
- targetSdkVersion: 33
- compileSdkVersion: 34
使用方法
创建InputImage实例
根据官方文档来创建InputImage
对象。
final InputImage inputImage;
创建ImageLabeler实例
final ImageLabelerOptions options = ImageLabelerOptions(confidenceThreshold: 0.5);
final imageLabeler = ImageLabeler(options: options);
处理图像
final List<ImageLabel> labels = await imageLabeler.processImage(inputImage);
for (ImageLabel label in labels) {
final String text = label.label;
final int index = label.index;
final double confidence = label.confidence;
}
释放资源
imageLabeler.close();
模型选项
Base Model
直接使用默认的基础模型。
final ImageLabelerOptions options = ImageLabelerOptions(confidenceThreshold: confidenceThreshold);
final imageLabeler = ImageLabeler(options: options);
Local Custom Model
如果需要使用本地自定义模型,请确保遵循ML Kit对于TensorFlow Lite模型的兼容性要求,并按照以下步骤操作:
- 将tflite模型添加到
pubspec.yaml
文件中:assets: - assets/ml/
- 编写获取模型路径的方法:
Future<String> getModelPath(String asset) async { final path = '${(await getApplicationSupportDirectory()).path}/$asset'; await Directory(dirname(path)).create(recursive: true); final file = File(path); if (!await file.exists()) { final byteData = await rootBundle.load(asset); await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); } return file.path; }
- 创建ImageLabeler实例:
final modelPath = await getModelPath('assets/ml/object_labeler.tflite'); final options = LocalLabelerOptions( confidenceThreshold: confidenceThreshold, modelPath: modelPath, ); final imageLabeler = ImageLabeler(options: options);
Android额外设置
在build.gradle
文件中加入以下内容以防止Gradle压缩模型文件:
android {
// ...
aaptOptions {
noCompress "tflite"
// or noCompress "lite"
}
}
Firebase Model
要使用存储在Firebase上的远程模型,需先完成Firebase项目的配置,并按如下方式使用:
final options = FirebaseLabelerOption(
confidenceThreshold: confidenceThreshold,
modelName: modelName,
);
final imageLabeler = ImageLabeler(options: options);
此外,还需管理Firebase模型:
final modelManager = FirebaseImageLabelerModelManager();
// 检查模型是否已下载
final bool isDownloaded = await modelManager.isModelDownloaded(modelName);
// 下载模型
final bool downloadResult = await modelManager.downloadModel(modelName);
// 删除模型
final bool deleteResult = await modelManager.deleteModel(modelName);
示例应用
可以参考官方提供的示例应用了解更多细节。
完整示例Demo
下面是一个完整的Flutter Demo,演示如何使用google_mlkit_image_labeling
插件进行图像标签识别:
import 'package:flutter/material.dart';
import 'package:google_mlkit_image_labeling/google_mlkit_image_labeling.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ImageLabelingScreen(),
);
}
}
class ImageLabelingScreen extends StatefulWidget {
@override
_ImageLabelingScreenState createState() => _ImageLabelingScreenState();
}
class _ImageLabelingScreenState extends State<ImageLabelingScreen> {
late ImageLabeler _imageLabeler;
List<ImageLabel>? _labels;
File? _image;
@override
void initState() {
super.initState();
final ImageLabelerOptions options = ImageLabelerOptions(confidenceThreshold: 0.5);
_imageLabeler = ImageLabeler(options: options);
}
@override
void dispose() {
_imageLabeler.close();
super.dispose();
}
Future<void> _pickImage() async {
final picker = ImagePicker();
final pickedFile = await picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
setState(() {
_image = File(pickedFile.path);
});
_processImage(_image!);
}
}
Future<void> _processImage(File image) async {
final inputImage = InputImage.fromFilePath(image.path);
final labels = await _imageLabeler.processImage(inputImage);
setState(() {
_labels = labels;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Image Labeling')),
body: Column(
children: [
if (_image != null) Image.file(_image!),
ElevatedButton(
onPressed: _pickImage,
child: Text('Pick Image'),
),
if (_labels != null)
Expanded(
child: ListView.builder(
itemCount: _labels!.length,
itemBuilder: (context, index) {
final label = _labels![index];
return ListTile(
title: Text('${label.label} (${label.confidence.toStringAsFixed(2)})'),
);
},
),
),
],
),
);
}
}
以上代码展示了如何构建一个简单的Flutter应用程序,允许用户从图库选择图片,并使用google_mlkit_image_labeling
插件对选定的图片进行标签识别。
更多关于Flutter图像标签识别插件google_mlkit_image_labeling的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图像标签识别插件google_mlkit_image_labeling的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用google_mlkit_image_labeling
插件来进行图像标签识别的代码示例。这个插件利用了Google的ML Kit来提供图像标签识别功能。
首先,确保你的Flutter项目已经设置好,并且已经添加了google_mlkit_image_labeling
依赖。在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
google_mlkit_image_labeling: ^latest_version # 请替换为最新的版本号
然后运行flutter pub get
来安装依赖。
接下来是主要的代码部分。首先,确保你的应用有权限访问设备的存储,以便能够加载图像。在AndroidManifest.xml
中添加以下权限(如果还没有):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
然后,在你的Flutter应用中,你可以使用以下代码来加载图像并识别标签:
import 'package:flutter/material.dart';
import 'package:google_mlkit_image_labeling/google_mlkit_image_labeling.dart';
import 'package:image_picker/image_picker.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ImageLabelingScreen(),
);
}
}
class ImageLabelingScreen extends StatefulWidget {
@override
_ImageLabelingScreenState createState() => _ImageLabelingScreenState();
}
class _ImageLabelingScreenState extends State<ImageLabelingScreen> {
final ImagePicker _picker = ImagePicker();
File? _imageFile;
List<String> _labels = [];
Future<void> _pickImage() async {
final XFile? image = await _picker.pickImage(source: ImageSource.gallery);
if (image != null && image.path != null) {
setState(() {
_imageFile = File(image.path!);
});
_labelImage();
}
}
Future<void> _labelImage() async {
if (_imageFile != null) {
try {
final List<ImageLabel> result = await ImageLabeler.instance.processImage(
_imageFile!.path,
options: ImageLabelingOptions(confidenceThreshold: 0.7)
);
setState(() {
_labels = result.map((label) => label.text).toList();
});
} catch (e) {
print('Error labeling image: $e');
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Image Labeling Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_imageFile == null
? Text('No image selected.')
: Image.file(_imageFile!),
SizedBox(height: 20),
_labels.isEmpty
? Text('No labels found.')
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: _labels.map((label) => Text(label)).toList(),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _pickImage,
child: Text('Pick Image'),
),
],
),
),
);
}
}
在这个示例中,我们使用了image_picker
插件来从设备的图库中选择图像。然后,我们使用google_mlkit_image_labeling
插件来处理图像并获取标签。
注意:
- 你需要添加
image_picker
依赖到你的pubspec.yaml
文件中:
dependencies:
image_picker: ^latest_version # 请替换为最新的版本号
-
确保在iOS项目中配置好图像选择权限,具体可以参考
image_picker
的官方文档。 -
ImageLabeler.instance.processImage
方法返回的是一个List<ImageLabel>
,每个ImageLabel
对象包含标签文本和置信度。在上面的示例中,我们只提取了标签文本。 -
ImageLabelingOptions
允许你设置置信度阈值,只有置信度高于该阈值的标签才会被返回。
希望这个示例能帮助你理解如何在Flutter项目中使用google_mlkit_image_labeling
插件进行图像标签识别。