Flutter目标检测插件dart_ncnn_yolov8的使用

Flutter目标检测插件dart_ncnn_yolov8的使用

本项目是一个使用ncnn驱动YOLOv8的Flutter插件。以下是关于如何使用该插件的详细步骤。

开始使用

这个项目是一个基于Flutter的插件,用于调用本地代码(使用Dart FFI)。

项目结构

本模板使用以下结构:

  • src:包含本地源代码和用于构建动态库的Cmake文件。
  • lib:包含定义插件API的Dart代码,并使用dart:ffi调用本地代码。
  • 平台文件夹(如androidioswindows等):包含用于构建和捆绑本地代码库到平台应用的构建文件。

如何使用

目前,示例应用程序仅支持Android应用。

获取插件和示例应用依赖

dart pub get
cd example
flutter pub get

获取NCNN模型

使用Ultralytics导出NCNN模型(无需修改模型结构)。

yolo export model=yolov8n format=ncnn

并将模型文件放入example\assets\yolo目录下。example\lib\providers\ncnn_yolo_options.dart文件用于自定义您的模型。

添加NCNN与OpenCV-mobile库

以Android为例:

  1. 下载NCNN(下载ncnn-xxxxxxx-android[-vulkan].zip)。
  2. 下载OpenCV-mobile(下载opencv-mobile-x.x.x-android.zip)。
  3. 解压Zip文件到dart_ncnn_yolov8/android/src/main/cpp
  4. dart_ncnn_yolov8/src/CMakeLists.txt文件中更改相应的平台库路径。

使用ffigen生成FFI绑定(可选)

在项目根目录下运行:

dart run ffigen --config ffigen.yaml

使用Freezed生成代码(可选)

在项目根目录下运行:

dart run build_runner build

构建和捆绑本地代码

pubspec.yaml文件指定FFI插件如下:

plugin:
  platforms:
    some_platform:
      ffiPlugin: true

这种配置会为各种目标平台调用本地构建,并将二进制文件捆绑到使用这些FFI插件的Flutter应用程序中。

这可以与dartPluginClass结合使用,例如当FFI用于实现一个联邦插件的一个平台时:

plugin:
  implements: some_other_plugin
  platforms:
    some_platform:
      dartPluginClass: SomeClass
      ffiPlugin: true

插件可以同时具有FFI和方法通道:

plugin:
  platforms:
    some_platform:
      pluginClass: SomeName
      ffiPlugin: true

通过FFI(和方法通道)插件调用的本地构建系统包括:

  • 对于Android:Gradle,它调用Android NDK进行本地构建。
  • 对于iOS和MacOS:Xcode,通过CocoaPods。
  • 对于Linux和Windows:CMake。

绑定到本地代码

要使用本地代码,需要在Dart中创建绑定。为了不手动编写这些代码,它们是由package:ffigen从头文件(src/dart_ncnn_yolov8.h)生成的。通过运行flutter pub run ffigen --config ffigen.yaml来重新生成绑定。

调用本地代码

非常短的本地函数可以直接从任何隔离区调用。例如,查看lib/dart_ncnn_yolov8.dart中的sum函数。

较长的函数应该在一个辅助隔离区中调用,以避免在Flutter应用中丢帧。例如,查看lib/dart_ncnn_yolov8.dart中的sumAsync函数。

Flutter帮助

有关如何开始使用Flutter的帮助,请参阅我们的在线文档,其中提供了教程、示例、移动开发指南和完整的API参考。

参考资料


示例代码

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

import 'app_lifecycle_observer.dart';
import 'pages/home_page.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    const ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends HookConsumerWidget {
  const MyApp({super.key,});

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    return MaterialApp(
      title: "NCNN Camera",
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomePage(title: "NCNN Camera"),
      navigatorObservers: [
        ref.watch(appLifecycleObserver),
      ],
    );
  }
}

更多关于Flutter目标检测插件dart_ncnn_yolov8的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter目标检测插件dart_ncnn_yolov8的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dart_ncnn_yolov8插件进行目标检测的示例代码。dart_ncnn_yolov8是一个用于Flutter的插件,它封装了ncnn库和YOLOv8模型,用于在移动设备上实现高效的目标检测。

前提条件

  1. 确保你已经安装并配置好了Flutter开发环境。
  2. 确保你的Flutter项目已经创建并初始化完成。

步骤

  1. 添加依赖

    在你的pubspec.yaml文件中添加dart_ncnn_yolov8依赖:

    dependencies:
      flutter:
        sdk: flutter
      dart_ncnn_yolov8: ^最新版本号  # 请替换为最新版本号
    

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

  2. 配置原生代码

    对于iOS和Android,你可能需要做一些额外的配置来确保插件正常工作。这些配置通常包括将模型文件(如.param.bin文件)添加到项目中,并确保它们可以被正确加载。

    对于iOS,将模型文件添加到ios/Runner资源文件夹中,并在Info.plist中添加相应的文件访问权限。

    对于Android,将模型文件添加到android/app/src/main/assets文件夹中。

  3. 编写Flutter代码

    下面是一个简单的Flutter应用示例,演示如何使用dart_ncnn_yolov8插件进行目标检测:

    import 'package:flutter/material.dart';
    import 'package:dart_ncnn_yolov8/dart_ncnn_yolov8.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('YOLOv8 Target Detection'),
            ),
            body: Center(
              child: YOLOv8Demo(),
            ),
          ),
        );
      }
    }
    
    class YOLOv8Demo extends StatefulWidget {
      @override
      _YOLOv8DemoState createState() => _YOLOv8DemoState();
    }
    
    class _YOLOv8DemoState extends State<YOLOv8Demo> {
      List<DetectionResult> results = [];
    
      @override
      void initState() {
        super.initState();
        _initializeAndDetect();
      }
    
      Future<void> _initializeAndDetect() async {
        try {
          // 初始化ncnn和YOLOv8模型
          await YOLOv8.initialize(
            paramPath: 'assets/yolov8n.param',  // 模型参数文件路径
            binPath: 'assets/yolov8n.bin',      // 模型权重文件路径
          );
    
          // 加载图像并进行检测
          final imagePath = 'assets/sample.jpg';  // 替换为你的图像路径
          final bitmap = await YOLOv8.loadBitmap(imagePath);
          results = await YOLOv8.detect(bitmap);
    
          // 更新UI
          setState(() {});
        } catch (e) {
          print('Error: $e');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/sample.jpg'),  // 显示原始图像
            SizedBox(height: 20),
            Text('Detected Objects:'),
            SizedBox(height: 10),
            Wrap(
              spacing: 10,
              runSpacing: 10,
              children: results.map((result) => Text(
                '${result.className}: ${result.confidence.toStringAsFixed(2)}',
                style: TextStyle(fontSize: 18),
              )).toList(),
            ),
          ],
        );
      }
    }
    
    // DetectionResult 是一个简单的数据类,用于存储检测结果
    class DetectionResult {
      String className;
      double confidence;
    
      DetectionResult({required this.className, required this.confidence});
    }
    

    请注意,上述代码中的paramPathbinPath应该指向你项目中实际的模型文件路径。同样,imagePath应该指向你要进行目标检测的图像路径。

    此外,DetectionResult类是一个简单的数据类,用于存储检测到的对象的类名和置信度。在实际应用中,你可能需要根据你的需求扩展这个类以包含更多的信息,如边界框坐标等。

  4. 运行应用

    使用flutter run命令运行你的Flutter应用,并查看目标检测结果。

注意事项

  • 确保你的模型文件和图像文件路径正确无误。
  • 在实际应用中,你可能需要对检测到的对象进行更复杂的处理,如在图像上绘制边界框等。
  • dart_ncnn_yolov8插件的具体用法和API可能会随着版本的更新而发生变化,请参考插件的官方文档以获取最新的使用指南。
回到顶部