Flutter图像标签识别插件google_mlkit_image_labeling的使用

发布于 1周前 作者 caililin 来自 Flutter

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模型的兼容性要求,并按照以下步骤操作:

  1. 将tflite模型添加到pubspec.yaml文件中:
    assets:
      - assets/ml/
    
  2. 编写获取模型路径的方法:
    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;
    }
    
  3. 创建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

1 回复

更多关于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插件来处理图像并获取标签。

注意:

  1. 你需要添加image_picker依赖到你的pubspec.yaml文件中:
dependencies:
  image_picker: ^latest_version  # 请替换为最新的版本号
  1. 确保在iOS项目中配置好图像选择权限,具体可以参考image_picker的官方文档。

  2. ImageLabeler.instance.processImage方法返回的是一个List<ImageLabel>,每个ImageLabel对象包含标签文本和置信度。在上面的示例中,我们只提取了标签文本。

  3. ImageLabelingOptions允许你设置置信度阈值,只有置信度高于该阈值的标签才会被返回。

希望这个示例能帮助你理解如何在Flutter项目中使用google_mlkit_image_labeling插件进行图像标签识别。

回到顶部