Flutter文本识别插件mediapipe_text的使用

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

Flutter文本识别插件mediapipe_text的使用

pub package

一个用于使用MediaPipe Text API的Flutter插件,其中包含多个基于文本的Mediapipe任务。

要了解更多关于MediaPipe的信息,请访问MediaPipe网站

开始使用

要开始使用MediaPipe,请参阅文档

支持的任务

任务 Android iOS Web Windows macOS Linux
分类
嵌入
语言检测

使用方法

要开始使用此插件,您必须处于master通道。 其次,您需要启用native-assets实验, 在使用$ dart命令行工具运行任何命令时,使用--enable-experiment=native-assets标志。

要在Flutter中全局启用此功能,请运行:

$ flutter config --enable-native-assets

要禁用此功能,请运行:

$ flutter config --no-enable-native-assets

添加依赖项

pubspec.yaml文件中添加mediapipe_coremediapipe_text依赖项:

dependencies:
  flutter:
    sdk: flutter
  mediapipe_core: latest
  mediapipe_text: latest

添加tflite模型

将必要的模型添加到您的assets目录中,以便为每个任务使用:

flutter:
  assets:
    - assets/bert_classifier.tflite
    - assets/language_detector.tflite
    - assets/universal_sentence_encoder.tflite

这些模型可以下载自以下位置:

初始化任务工作器

文本分类示例

import 'package:mediapipe_text/mediapipe_text.dart';

// 加载您的文本分类tflite模型到内存
ByteData? classifierBytes = await DefaultAssetBundle.of(context)
    .load('assets/bert_classifier.tflite');

// 创建一个 `TextClassifier`
final classifier = TextClassifier(
  TextClassifierOptions.fromAssetBuffer(
    classifierBytes.buffer.asUint8List(),
  ),
);

// 对一些文本进行分类!
final result = await classifier.classify('Hello, world!');
print(result.classifications.first);

语言检测示例

import 'package:mediapipe_text/mediapipe_text.dart';

// 加载您的语言检测tflite模型到内存
ByteData? bytes = await DefaultAssetBundle.of(context)
    .load('assets/language_detector.tflite');

// 创建一个 `LanguageDetector`
final detector = LanguageDetector(
  LanguageDetectorOptions.fromAssetBuffer(
    bytes.buffer.asUint8List(),
  ),
);

// 对一些文本进行语言检测!
final result = await detector.detect('Hello, world!');
print(result.predictions.first);

文本嵌入示例

import 'package:mediapipe_text/mediapipe_text.dart';

// 加载您的文本嵌入tflite模型到内存
ByteData? embedderBytes = await DefaultAssetBundle.of(context)
    .load('assets/universal_sentence_encoder.tflite');

// 创建一个 `TextEmbedder`
final embedder = TextEmbedder(
  TextEmbedderOptions.fromAssetBuffer(
    embedderBytes.buffer.asUint8List(),
  ),
);

// 对一些文本进行嵌入!
final result = await embedder.embed('Hello, world!');
final result2 = await embedder.embed('Hello, moon!');

// 比较结果
final similarity = embedder.cosineSimilarity(
  result.embeddings.first,
  result2.embeddings.first,
);

运行示例

要运行示例项目,请下载与您想要探索的任务相关的模型,并将它们放置在packages/mediapipe_task_text/example/assets目录中,然后在受支持的平台上运行项目。

问题反馈

请在我们的问题跟踪器中提交有关Flutter-MediaPipe的具体问题、错误或功能请求。

如果问题是特定于Flutter的,请在Flutter问题跟踪器中提交。

要向此插件贡献更改,请查看我们的贡献指南,并打开一个拉取请求

示例代码

以下是完整的示例代码,您可以参考它来了解如何在Flutter应用中集成文本识别功能。

import 'package:flutter/material.dart';
import 'language_detection_demo.dart';
import 'logging.dart';
import 'text_classification_demo.dart';
import 'text_embedding_demo.dart';

void main() {
  initLogging();
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  [@override](/user/override)
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  [@override](/user/override)
  Widget build(BuildContext context) =>
      const MaterialApp(home: TextTaskPages());
}

class TextTaskPages extends StatefulWidget {
  const TextTaskPages({super.key});

  [@override](/user/override)
  State<TextTaskPages> createState() => TextTaskPagesState();
}

class TextTaskPagesState extends State<TextTaskPages> {
  final PageController controller = PageController();

  final titles = <String>['Classify', 'Embed', 'Detect Languages'];
  int titleIndex = 0;

  [@override](/user/override)
  void initState() {
    controller.addListener(() {
      final newIndex = controller.page?.toInt();
      if (newIndex != null && newIndex != titleIndex) {
        setState(() {
          titleIndex = newIndex;
        });
      }
    });
    super.initState();
  }

  void switchToPage(int index) {
    controller.animateToPage(
      index,
      duration: const Duration(milliseconds: 200),
      curve: Curves.easeOut,
    );
    setState(() {
      titleIndex = index;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(titles[titleIndex])),
      body: PageView(
        controller: controller,
        children: const <Widget>[
          TextClassificationDemo(),
          TextEmbeddingDemo(),
          LanguageDetectionDemo(),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: titleIndex,
        onTap: switchToPage,
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            activeIcon: Icon(Icons.search, color: Colors.blue),
            label: 'Classify',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.arrow_downward),
            activeIcon: Icon(Icons.arrow_downward, color: Colors.blue),
            label: 'Embed',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.flag),
            activeIcon: Icon(Icons.flag, color: Colors.blue),
            label: 'Detect Languages',
          ),
        ],
      ),
    );
  }
}

更多关于Flutter文本识别插件mediapipe_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本识别插件mediapipe_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用mediapipe_text插件来实现文本识别的示例代码。这个插件基于Google的MediaPipe Text,能够在设备上实时进行文本检测和识别。

首先,确保你已经在你的Flutter项目中添加了mediapipe_text依赖。打开你的pubspec.yaml文件,并添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  mediapipe_text: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,我们将创建一个简单的Flutter应用,使用mediapipe_text插件来识别图片或相机预览中的文本。

1. 创建Flutter项目结构

确保你的项目结构大致如下:

your_flutter_project/
├── android/
├── ios/
├── lib/
│   ├── main.dart
│   └── text_recognition_screen.dart
├── pubspec.yaml
└── ...

2. 编写main.dart

main.dart中,我们将导入必要的包并设置主页面路由:

import 'package:flutter/material.dart';
import 'text_recognition_screen.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Text Recognition',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TextRecognitionScreen(),
    );
  }
}

3. 编写text_recognition_screen.dart

text_recognition_screen.dart中,我们将使用mediapipe_text插件来实现文本识别功能。这里我们将使用相机预览作为输入源:

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:mediapipe_text/mediapipe_text.dart';

List<CameraDescription> cameras;

class TextRecognitionScreen extends StatefulWidget {
  @override
  _TextRecognitionScreenState createState() => _TextRecognitionScreenState();
}

class _TextRecognitionScreenState extends State<TextRecognitionScreen> {
  CameraController? _controller;
  final MediaPipeText _textDetector = MediaPipeText();
  String _recognizedText = "";

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<void> _initializeCamera() async {
    cameras = await availableCameras();
    const firstCamera = cameras.first;
    _controller = CameraController(firstCamera, ResolutionPreset.high);
    _controller?.initialize().then((_) {
      if (mounted) {
        setState(() {});
      }
      _startCameraPreview();
    });
  }

  @override
  void dispose() {
    _controller?.dispose();
    _textDetector.close();
    super.dispose();
  }

  Future<void> _startCameraPreview() async {
    if (_controller!.value.isInitialized) {
      _controller!.startImageStream((image) async {
        final plane = image.planes.first;
        final bytes = plane.bytes;
        final width = plane.bytesPerRow;
        final height = plane.rows;

        final result = await _textDetector.processImage(
          bytes: bytes,
          width: width,
          height: height,
          rotation: 90,  // 根据你的相机方向调整
        );

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Text Recognition'),
      ),
      body: _controller!.value.isInitialized
          ? Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(
                    'Recognized Text:',
                    style: TextStyle(fontSize: 20),
                  ),
                  SizedBox(height: 10),
                  Text(
                    _recognizedText,
                    style: TextStyle(fontSize: 24, color: Colors.black),
                  ),
                ],
              ),
            )
          : Container(),
    );
  }
}

4. 添加相机权限

在你的AndroidManifest.xml文件中添加相机权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

并在ios/Runner/Info.plist中添加相机使用说明:

<key>NSCameraUsageDescription</key>
<string>We need your permission to use the camera for text recognition.</string>

5. 运行应用

确保你已经连接了一个支持相机的设备或启用了模拟器上的相机,然后运行你的Flutter应用:

flutter run

现在,你应该能够看到一个实时文本识别的应用,它会在相机预览中检测并显示识别的文本。

请注意,这只是一个基本示例,实际应用中你可能需要处理更多的错误和边界情况,例如处理相机初始化失败、处理不同的屏幕方向等。

回到顶部