Flutter图像识别插件vision的使用

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

Flutter图像识别插件vision的使用

Pub Version LICENSE

离线图像标注

  • +5000 标签
  • 离线
  • 预训练AI模型
  • 支持PNG, JPEG, JPG和GIF
  • 由TFLite支持

为什么编写这个插件?

该插件的主要优势是在不与用户设备外部通信的情况下对照片进行标签处理。结论是,对于我们所有人来说最重要的问题是隐私。最初,这个插件就是基于这一愿景开始的,但它主要关注三个主题:速度、准确性和隐私安全。

您需要什么?

在这个示例中,您需要添加image_picker插件。

如何使用Vision?

简单地

// Vision插件
final vision = Vision();
// image_picker插件
final ImagePicker picker = ImagePicker();
// 初始化Vision
var initialed = await _vision.initial();
// 如果成功初始化,则可以使用图像标注代码
if (initialed){
  // 运行图像标注代码
}

图像标注代码

String jsonLabels = await _vision.runModelOnByteArray(uint8list, /** 你可以更改置信度(重要) **/ 0.3);

这里可能需要将字节转换为Uint8List,例如:

// 通过以下代码从文件图像中获取字节
var bytes = await _fileImage.readAsBytes();
var uint8list = Uint8List.fromList(bytes.toList());

然后运行图像标注代码…

_vision.runModelOnByteArray 返回置信度大于0.3时的JSON字符串项目,例如:

[
  {
    "index": 567,
    "confidence": 0.7956880331039429,
    "label": "/m/01gq53",
    "description": "Performance"
  },
  {
    "index": 2629,
    "confidence": 0.7695709466934204,
    "label": "/m/04_5hy",
    "description": "Stage"
  },
  {
    "index": 3131,
    "confidence": 0.6444675326347351,
    "label": "/m/05qjc",
    "description": "Performing arts"
  },
  {
    "index": 1613,
    "confidence": 0.583440899848938,
    "label": "/m/02jjt",
    "description": "Entertainment"
  },
  {
    "index": 643,
    "confidence": 0.5553570985794067,
    "label": "/m/01jddz",
    "description": "Concert"
  },
  {
    "index": 3361,
    "confidence": 0.49405911564826965,
    "label": "/m/06mg_j",
    "description": "Rock concert"
  },
  {
    "index": 2990,
    "confidence": 0.32111555337905884,
    "label": "/m/0557q",
    "description": "Musical theatre"
  }
]

您可以将其转换为

List<Map<String, dynamic>>

通过以下代码:

var labels = List<Map<String, dynamic>>.from(json.decode(jsonLabels));

您是否感到困惑?

查看这里

在Dart文件的开头添加以下导入语句:

import 'dart:convert';
import 'dart:typed_data';
import 'dart:async';
import 'dart:developer' as dev;

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

import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'package:vision/vision.dart';

现在,使用以下代码,仅此而已:

final _vision = Vision();
final ImagePicker picker = ImagePicker();
try {
  var initialed = await _vision.initial();
  if(initialed){
    final XFile? image = await picker.pickImage(source: ImageSource.gallery);
    if (image != null){
      var bytes = await image.readAsBytes();
      String jsonLabels = await _vision.runModelOnByteArray(Uint8List.fromList(bytes.toList()), 0.3);
      var labels = List<Map<String, dynamic>>.from(json.decode(jsonLabels));
      if (kDebugMode){
        dev.log(labels.toString());
      }
    }
  }
} on PlatformException {
  if (kDebugMode){
    print('Failed to initial');
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用vision插件(即google_ml_kit,因为firebase_ml_vision已经被google_ml_kit替代)来进行图像识别的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了google_ml_kit依赖:

dependencies:
  flutter:
    sdk: flutter
  google_ml_kit: ^0.10.0  # 请检查最新版本号

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

接下来是Flutter应用的代码示例:

  1. 主应用代码 (main.dart)
import 'package:flutter/material.dart';
import 'package:google_ml_kit/vision/common.dart';
import 'package:google_ml_kit/vision/label.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageRecognitionScreen(),
    );
  }
}

class ImageRecognitionScreen extends StatefulWidget {
  @override
  _ImageRecognitionScreenState createState() => _ImageRecognitionScreenState();
}

class _ImageRecognitionScreenState extends State<ImageRecognitionScreen> {
  List<String> _labels = [];

  void _detectLabels(InputImage image) async {
    final labelDetector = LabelDetector.client();
    final List<DetectedLabel> labels = await labelDetector.process(image);

    setState(() {
      _labels = labels.map((label) => label.text).toList();
    });

    labelDetector.close();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Recognition with ML Kit'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Image.asset('assets/sample_image.jpg', width: 300, height: 300), // 使用你自己的图片
            SizedBox(height: 20),
            Text(
              'Detected Labels:',
              style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 10),
            Expanded(
              child: ListView.builder(
                shrinkWrap: true,
                itemCount: _labels.length,
                itemBuilder: (context, index) {
                  return Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      _labels[index],
                      style: TextStyle(fontSize: 18),
                    ),
                  );
                },
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 假设你已经有一个`InputImage`实例,这里使用本地图片作为示例
                final image = InputImage.fromFilePath(
                  'assets/sample_image.jpg', // 替换为你的图片路径
                  metadata: InputImageMetadata.create(
                    size: Size(300, 300), // 图片尺寸
                    rotation: InputImageRotation.degrees0,
                    scaleMode: InputImageScaleMode.fit,
                  ),
                );
                _detectLabels(image);
              },
              child: Text('Detect Labels'),
            ),
          ],
        ),
      ),
    );
  }
}
  1. 确保你有一张图片 (assets/sample_image.jpg)

    • 将你的图片放置在assets文件夹中(如果还没有,请创建一个)。
    • pubspec.yaml文件中添加对图片的引用:
flutter:
  assets:
    - assets/sample_image.jpg
  1. 运行应用

    使用flutter run命令来运行你的应用。点击“Detect Labels”按钮,你应该能看到检测到的标签显示在屏幕上。

这个示例展示了如何使用google_ml_kitLabelDetector来识别图像中的标签。你可以根据需要替换为其他类型的检测器,如文本检测器、人脸检测器等。更多详细信息,请参考google_ml_kit的官方文档

回到顶部