Flutter目标检测插件dart_ncnn_yolov8的使用
Flutter目标检测插件dart_ncnn_yolov8的使用
本项目是一个使用ncnn驱动YOLOv8的Flutter插件。以下是关于如何使用该插件的详细步骤。
开始使用
这个项目是一个基于Flutter的插件,用于调用本地代码(使用Dart FFI)。
项目结构
本模板使用以下结构:
src
:包含本地源代码和用于构建动态库的Cmake文件。lib
:包含定义插件API的Dart代码,并使用dart:ffi
调用本地代码。- 平台文件夹(如
android
、ios
、windows
等):包含用于构建和捆绑本地代码库到平台应用的构建文件。
如何使用
目前,示例应用程序仅支持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为例:
- 下载NCNN(下载ncnn-xxxxxxx-android[-vulkan].zip)。
- 下载OpenCV-mobile(下载opencv-mobile-x.x.x-android.zip)。
- 解压Zip文件到
dart_ncnn_yolov8/android/src/main/cpp
。 - 在
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
更多关于Flutter目标检测插件dart_ncnn_yolov8的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用dart_ncnn_yolov8
插件进行目标检测的示例代码。dart_ncnn_yolov8
是一个用于Flutter的插件,它封装了ncnn库和YOLOv8模型,用于在移动设备上实现高效的目标检测。
前提条件
- 确保你已经安装并配置好了Flutter开发环境。
- 确保你的Flutter项目已经创建并初始化完成。
步骤
-
添加依赖
在你的
pubspec.yaml
文件中添加dart_ncnn_yolov8
依赖:dependencies: flutter: sdk: flutter dart_ncnn_yolov8: ^最新版本号 # 请替换为最新版本号
然后运行
flutter pub get
来安装依赖。 -
配置原生代码
对于iOS和Android,你可能需要做一些额外的配置来确保插件正常工作。这些配置通常包括将模型文件(如
.param
和.bin
文件)添加到项目中,并确保它们可以被正确加载。对于iOS,将模型文件添加到
ios/Runner
资源文件夹中,并在Info.plist
中添加相应的文件访问权限。对于Android,将模型文件添加到
android/app/src/main/assets
文件夹中。 -
编写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}); }
请注意,上述代码中的
paramPath
和binPath
应该指向你项目中实际的模型文件路径。同样,imagePath
应该指向你要进行目标检测的图像路径。此外,
DetectionResult
类是一个简单的数据类,用于存储检测到的对象的类名和置信度。在实际应用中,你可能需要根据你的需求扩展这个类以包含更多的信息,如边界框坐标等。 -
运行应用
使用
flutter run
命令运行你的Flutter应用,并查看目标检测结果。
注意事项
- 确保你的模型文件和图像文件路径正确无误。
- 在实际应用中,你可能需要对检测到的对象进行更复杂的处理,如在图像上绘制边界框等。
dart_ncnn_yolov8
插件的具体用法和API可能会随着版本的更新而发生变化,请参考插件的官方文档以获取最新的使用指南。