开源地址:https://github.com/ultralytics/yolo-flutter-app

1、配置环境

作为测试,在Android手机端运行quickstart.md步骤,需要提前安装的如下:

jdk17

https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html

添加环境变量:

JAVA_HOME → C:\Program Files\Java\jdk-17

Path 新增:%JAVA_HOME%\bin

Flutter

下载地址:https://docs.flutter.cn/get-started/install/windows

解压即可,环境变量 Path → 新增:E:\DevelopmentTool\flutter\bin

添加环境变量 FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

添加环境变量 PUB_HOSTED_URL=https://pub.flutter-io.cn

CMD执行:flutter -v 查看安装,显示版本安装成功

Android Studio

下载地址:Android Studio

安装时勾选:Android SDK、Android SDK Command-line Tools、Intel HAXM(虚拟机加速)

也可在安装后安装后:

打开 Android Studio -> 设置 -> Languages & Frameworks -> Android SDK -> SDK Tools

勾选需要安装的选项后 -> OK

添加环境变量:

Path 新增:C:\Users\52884\AppData\Local\Android\Sdk\cmdline-tools\latest\bin

Git For Winddows

下载地址:https://git-scm.com/downloads/win(安装时需勾选"Use Git from Windows Command Prompt")

2、yolo_demo测试

根据开源地址中的quickstart.md步骤

1)Create New Flutter App

flutter create yolo_demo
cd yolo_demo

创建成功后结果如下:

2) Add YOLO Plugin

在自动生成的pubspec.yaml文件中添加:

dependencies:
  flutter:
    sdk: flutter
  ultralytics_yolo: ^0.1.25
  image_picker: ^0.8.7 # For image selection

保存后命令行执行 

flutter pub get

安装依赖,结果如下:

3)Add a model

下载预训练权重,3种方式下载:

  1. Download from the release assets of this repository

  2. Get it from Ultralytics Hub

  3. Export it from Ultralytics/ultralytics (CoreML/TFLite)

这里以第1种为例,下载yolo11n.tflite

添加到 "E:\Development\flutter\yolo_demo\android\app\src\assets "中,若src中没有assets就新建

4)Minimal Detection Code

用以下内容替换"E:\Development\flutter\yolo_demo\lib\main.dart"的内容:

import 'package:flutter/material.dart';
import 'package:ultralytics_yolo/yolo.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';

void main() => runApp(YOLODemo());

class YOLODemo extends StatefulWidget {
  @override
  _YOLODemoState createState() => _YOLODemoState();
}

class _YOLODemoState extends State<YOLODemo> {
  YOLO? yolo;
  File? selectedImage;
  List<dynamic> results = [];
  bool isLoading = false;

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

  Future<void> loadYOLO() async {
    setState(() => isLoading = true);

    yolo = YOLO(
      modelPath: 'yolo11n',
      task: YOLOTask.detect,
    );

    await yolo!.loadModel();
    setState(() => isLoading = false);
  }

  Future<void> pickAndDetect() async {
    final picker = ImagePicker();
    final image = await picker.pickImage(source: ImageSource.gallery);

    if (image != null) {
      setState(() {
        selectedImage = File(image.path);
        isLoading = true;
      });

      final imageBytes = await selectedImage!.readAsBytes();
      final detectionResults = await yolo!.predict(imageBytes);

      setState(() {
        results = detectionResults['boxes'] ?? [];
        isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('YOLO Quick Demo')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              if (selectedImage != null)
                Container(
                  height: 300,
                  child: Image.file(selectedImage!),
                ),

              SizedBox(height: 20),

              if (isLoading)
                CircularProgressIndicator()
              else
                Text('Detected ${results.length} objects'),

              SizedBox(height: 20),

              ElevatedButton(
                onPressed: yolo != null ? pickAndDetect : null,
                child: Text('Pick Image & Detect'),
              ),

              SizedBox(height: 20),

              // Show detection results
              Expanded(
                child: ListView.builder(
                  itemCount: results.length,
                  itemBuilder: (context, index) {
                    final detection = results[index];
                    return ListTile(
                      title: Text(detection['class'] ?? 'Unknown'),
                      subtitle: Text(
                        'Confidence: ${(detection['confidence'] * 100).toStringAsFixed(1)}%'
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

5)Run Your App

这里需要接受SDK许可证(参考:https://blog.csdn.net/qiuyu6958334/article/details/106842880),执行:sdkmanager.bat --licenses,根据提示一直输入 y

再将Android手机连接上电脑(参考:windows连接Android手机

如果不连接手机执行flutter run会显示如下界面,选择windows为例,得到的界面传入图片将无法识别

这里以Escrpy为例,WIFI无线连接

注意若是第二次或多次测试,首先需要执行命令 adb uninstall com.example.yolo_demo卸载原始app,即使手机上已卸载过,其中com.example.yolo_demo名称来自 Android/app/build.gradle.kts文件中的applicationId,否则手机不会显示任何数据):

命令行执行

flutter run

显示(ALN AL00即连接的手机设备名称):

等待完成即可,手机上会安装一个app

测试结果,使用自己训练的数据转为tflite的结果(自己训练的yolo权重文件转tflite参考:pt格式转tflite

 开源默认的最大检测数量是30,根据需要修改(这里以目标检测为例,放大为1500)

修改 ObjectDetector.kt 中的值:(默认地址在依赖的路径C:\Users\52884\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\ultralytics_yolo-0.1.36\android\src\main\kotlin\com\ultralytics\yolo\ObjectDetector.kt)

保存后重新执行:

flutter clean
flutter pub get
flutter run

更多推荐