Flutter文本识别插件mediapipe_text的使用
Flutter文本识别插件mediapipe_text的使用
一个用于使用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_core
和mediapipe_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
这些模型可以下载自以下位置:
- bert_classifier.tflite(用于文本分类)
- language_detector.tflite(用于语言检测)
- 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
更多关于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
现在,你应该能够看到一个实时文本识别的应用,它会在相机预览中检测并显示识别的文本。
请注意,这只是一个基本示例,实际应用中你可能需要处理更多的错误和边界情况,例如处理相机初始化失败、处理不同的屏幕方向等。