一款基于 .NET MAUI 的跨平台实时目标检测应用,集成 NCNN 高性能推理引擎和 YOLOv11 模型,支持 Android、iOS、macOS 和 Windows 平台。
中文 | English
- 🎥 实时目标检测 - 基于相机预览流的实时物体识别(支持 15-30 FPS)
- 📸 拍照检测 - 单张图片的高精度目标检测
- 🎨 可视化叠加 - 检测框和置信度实时绘制
- ⚡ 性能自适应 - 根据设备性能自动调整推理策略
- 🔄 双引擎支持 - NCNN (移动端) + ONNX Runtime (桌面端)
- 🚀 多模型支持 - YOLOv11n、YOLOv8n、YOLOv5n 可选
- 🌐 跨平台 - Android、iOS、macOS Catalyst、Windows 统一代码库
- 双推理引擎架构
- 🔥 NCNN - 移动端优化,推理速度提升 3 倍,内存占用减少 47%
- 💻 ONNX Runtime - 桌面端备选,支持 CPU/GPU 加速
- 原生 C++ 集成 - JNI/P/Invoke 直接调用,零序列化开销
- Vulkan GPU 加速 - Android/iOS 硬件加速,推理耗时降至 55ms
- 智能 ROI 检测 - 低端设备自动启用中心区域检测,性能提升 40%
- 异步推理流水线 - 生产者-消费者模式,支持跳帧策略
- 原生图像预处理 - Android Bitmap API,性能提升 5-10 倍
- YOLO11 模型 - 最新 Ultralytics YOLO11n,支持 80 种 COCO 类别
| 组件 | 版本 | 说明 |
|---|---|---|
| .NET MAUI | 9.0 | 跨平台 UI 框架 |
| C# | 12.0 | 编程语言 |
| NCNN | 20250916 | 主推理引擎 (Android/iOS) |
| ONNX Runtime | 1.23.2 | 备用推理引擎 (Windows) |
| ImageSharp | 3.1.12 | 图像处理库 |
| Camera.MAUI | 1.5.1 | 跨平台相机组件 |
MauiYoloApp
├── Native/ # NCNN 原生代码层 ⭐ 新增
│ ├── ncnn_wrapper.h # C 接口头文件
│ ├── ncnn_wrapper.cpp # C++ 包装器实现
│ └── CMakeLists.txt # CMake 构建配置
├── Services/ # 核心服务层
│ ├── NcnnYoloService.cs # NCNN 推理服务 ⭐ 主引擎
│ ├── NcnnInterop.cs # NCNN P/Invoke 绑定 ⭐ 新增
│ ├── YoloService.cs # ONNX 推理服务 (备用)
│ ├── AsyncDetectionPipeline.cs # 异步推理流水线 ⭐ 新增
│ ├── YoloInferenceEngine.cs # ONNX 推理引擎核心
│ ├── ModelSelector.cs # 智能模型选择器
│ ├── PerformanceOptimizer.cs # 性能优化器
│ ├── DevicePerformanceDetector.cs # 设备性能检测 ⭐ 新增
│ ├── NativeImagePreprocessor.cs# 原生图像预处理
│ ├── CameraManager.cs # 相机管理
│ └── ModelConfig.cs # 模型配置
├── Views/ # 界面层
│ ├── CameraDetectionPage.xaml # 相机检测页面
│ ├── DetectionOverlayView.cs # 检测结果叠加层
│ ├── ModelSettingsPage.xaml # 模型设置页面 ⭐ 新增
│ └── About.xaml # 关于页面
├── Resources/ # 资源文件
│ └── Raw/ # 原始资源
│ └── yolov8n.onnx # ONNX 模型文件 (备用)
├── yolo11n_ncnn_model/ # NCNN 模型文件 ⭐ 新增
│ ├── model.ncnn.param # 模型结构文件
│ └── model.ncnn.bin # 模型权重文件
├── libs/ # 原生库 ⭐ 新增
│ ├── android/ # NCNN Android 预编译库
│ └── ios/ # NCNN iOS 框架
└── Platforms/ # 平台特定代码
├── Android/ # Android 适配
│ ├── libs/ # libncnn_wrapper.so ⭐ 编译产物
│ ├── jni/ # NDK 构建配置 ⭐ 新增
│ ├── NativeCameraService.cs# 原生相机服务 ⭐ 新增
│ └── build_android.sh # 编译脚本 ⭐ 新增
├── iOS/ # iOS 适配
│ ├── NativeCameraService.cs# 原生相机服务 ⭐ 新增
│ └── build_ios.sh # 编译脚本 ⭐ 新增
├── MacCatalyst/ # macOS 适配
└── Windows/ # Windows 适配
用户交互 → 相机捕获 → 推理引擎选择 → 图像预处理 → YOLO 推理 → 结果后处理 → UI 渲染
↑ │ ↓ ↓ ↓ ↓
│ │ ┌───────────────┐ ┌──────────┐ ┌──────────┐ │
│ │ │ NCNN (移动端) │ │ Vulkan │ │ NMS │ │
│ │ │ ONNX (桌面端) │ │ NNAPI │ │ 置信度过滤│ │
│ │ └───────────────┘ └──────────┘ └──────────┘ │
│ └──────────────────────────────────────────────────────────────┘
└────────────────── 异步流水线 & 性能监控 & 自适应优化 ────────────────────┘
- Visual Studio 2022 (17.8 或更高版本)
- .NET 9.0 SDK
- MAUI 工作负载 (通过 Visual Studio Installer 安装)
- Android: API 24+ (Android 7.0+)
- iOS: iOS 15.0+
- macOS: macOS 11.0+ (Catalyst)
- Windows: Windows 10.0.17763.0+
git clone https://github.com/yourusername/MauiYoloApp.git
cd MauiYoloAppNCNN 模型 (推荐 - 移动端):
# 项目已包含 YOLOv11n NCNN 模型
yolo11n_ncnn_model/
├── model.ncnn.param # 模型结构 (16 KB)
└── model.ncnn.bin # 模型权重 (12 MB)
# 或从 Ultralytics 导出自定义模型
python export_yolo11n_ncnn.pyONNX 模型 (可选 - 桌面端备用): 从 Ultralytics Assets 下载:
yolov8n.onnx # Nano 版本 - 平衡性能 (6.3 MB)
yolov5n.onnx # YOLOv5 Nano - 速度优先 (3.9 MB)将 ONNX 模型文件放置到:
MauiYoloApp/Resources/Raw/yolov8n.onnx
dotnet restoreAndroid:
# 安装 Android NDK r21+
export ANDROID_NDK=/path/to/ndk
cd Platforms/Android
./build_android.sh # 或 build_android.ps1 (Windows)iOS:
# 需要 macOS + Xcode 14+
cd Platforms/iOS
./build_ios.sh💡 提示: Windows 平台使用 ONNX Runtime,无需编译 NCNN
Android:
dotnet build -f net9.0-androidiOS:
dotnet build -f net9.0-iosWindows:
dotnet build -f net9.0-windows10.0.19041.0在 Visual Studio 中:
- 选择目标平台 (Android Emulator / iOS Simulator / Windows Machine)
- 按
F5启动调试
或使用命令行:
# Android
dotnet run -f net9.0-android
# iOS (需 macOS)
dotnet run -f net9.0-iosMauiYoloApp/
│
├── App.xaml.cs # 应用程序入口
├── AppShell.xaml # Shell 导航容器
├── MainPage.xaml # 主页面
├── MauiProgram.cs # 服务配置 & 启动逻辑
│
├── Services/ # 核心业务逻辑
│ ├── YoloService.cs # YOLO 服务主类 (检测入口)
│ ├── YoloInferenceEngine.cs # 推理引擎 (预处理/推理/后处理)
│ ├── ModelSelector.cs # 模型选择器 (自动选择最优模型)
│ ├── PerformanceOptimizer.cs # 性能优化器 (动态调频)
│ ├── NativeImagePreprocessor.cs # 原生图像预处理 (高性能)
│ ├── CameraManager.cs # 相机管理器
│ └── ModelConfig.cs # 模型配置 (枚举/参数)
│
├── Views/ # 界面页面
│ ├── CameraDetectionPage.xaml # 相机检测页面
│ ├── DetectionOverlayView.cs # 检测框绘制组件
│ └── About.xaml # 关于页面
│
├── Resources/ # 资源文件
│ ├── Raw/ # 原始资源 (模型文件)
│ │ └── yolov8n.onnx
│ ├── Images/ # 图片资源
│ ├── Fonts/ # 字体文件
│ ├── Styles/ # XAML 样式
│ ├── AppIcon/ # 应用图标
│ └── Splash/ # 启动画面
│
└── Platforms/ # 平台特定代码
├── Android/ # Android 配置
│ ├── AndroidManifest.xml
│ └── MainActivity.cs
├── iOS/ # iOS 配置
├── MacCatalyst/ # macOS 配置
└── Windows/ # Windows 配置
项目采用双引擎设计,根据平台自动选择最优方案:
NCNN 引擎 (主要 - Android/iOS):
// 在 MauiProgram.cs 中注册
builder.Services.AddSingleton<NcnnYoloService>();
// 使用 NCNN 进行检测
var results = await _ncnnYoloService.DetectAsync(imageData, confidenceThreshold: 0.5f);核心特性:
- ✅ 极致性能: Vulkan GPU 加速,推理耗时 55-120ms
- ✅ 低内存占用: 仅需 80-90MB (ONNX Runtime 需 150MB+)
- ✅ 原生集成: C++ JNI 调用,零序列化开销
- ✅ 智能 ROI: 低端设备自动启用中心区域检测
ONNX Runtime 引擎 (备用 - Windows):
// 备用引擎(Windows 或调试)
var results = await _yoloService.DetectAsync(imageData, confidenceThreshold: 0.5f);职责:
- 生产者-消费者异步模式
- 有界通道防止内存溢出
- 智能跳帧策略
- 实时性能监控
核心 API:
// 创建流水线
var pipeline = new AsyncDetectionPipeline(
_yoloService,
_performanceOptimizer,
channelCapacity: 5, // 通道容量
enableFrameSkip: true, // 启用跳帧
ncnnYoloService: _ncnnYoloService,
useNcnn: true // 使用 NCNN
);
// 启动流水线
await pipeline.StartAsync();
// 推送帧数据
await pipeline.PushFrameAsync(imageData, confidenceThreshold: 0.6f);
// 停止流水线
await pipeline.StopAsync();性能优势:
- 📊 并发处理: 主线程捕获 + 后台推理
- 🚀 零阻塞: UI 始终保持 60 FPS
- 🎯 智能调度: 忙时跳帧,闲时全速
职责:
- NCNN 模型加载与初始化
- 高效 RGB 预处理
- JNI 原生调用
- ROI 智能检测
核心 API:
// 初始化 NCNN 服务
var paramPath = Path.Combine(FileSystem.AppDataDirectory, "model.ncnn.param");
var binPath = Path.Combine(FileSystem.AppDataDirectory, "model.ncnn.bin");
await _ncnnYoloService.InitializeAsync(paramPath, binPath, useGpu: true);
// 异步检测
var results = await _ncnnYoloService.DetectAsync(imageData, confidenceThreshold: 0.5f);
// 配置 ROI 检测(低端设备优化)
_ncnnYoloService.SetRoiDetection(enable: true, centerRatio: 0.6f);
// 检查服务状态
if (_ncnnYoloService.IsReady())
{
// 执行检测...
}ROI 检测原理:
原始图像 (1920x1080) → ROI 裁剪 (1152x648, 60%) → 推理 (640x640)
┌─────────────────────┐ ┌─────────────────┐ ┌──────────┐
│ │ │█████████████████│ │██████████│
│ ┌─────────────┐ │ → │█████████████████│ → │██████████│
│ │ ROI 区域 │ │ │█████████████████│ │██████████│
│ └─────────────┘ │ └─────────────────┘ └──────────┘
│ │ 性能提升: 40% 内存节省: 35%
└─────────────────────┘
职责:
- 模型加载与初始化
- 懒加载机制 (首次调用时自动初始化)
- 多模型切换支持
- CPU/GPU 加速配置
核心 API:
// 初始化服务 (可选,支持懒加载)
await _yoloService.InitializeAsync(modelPath, ModelType.YOLOv8n, useGpu: true);
// 异步检测
var results = await _yoloService.DetectAsync(imageData, confidenceThreshold: 0.6f);
// 同步检测
var results = _yoloService.Detect(imageData, confidenceThreshold: 0.5f);
// 获取当前模型类型
var modelType = _yoloService.GetCurrentModelType();检测结果:
public class DetectionBox
{
public string ClassName { get; set; } // 类别名称 (如 "person")
public float Confidence { get; set; } // 置信度 (0.0-1.0)
public float X { get; set; } // 中心点 X (归一化)
public float Y { get; set; } // 中心点 Y (归一化)
public float Width { get; set; } // 宽度 (归一化)
public float Height { get; set; } // 高度 (归一化)
}职责:
- 图像预处理 (调整大小、归一化、转换为 Tensor)
- ONNX 模型推理
- 后处理 (解析输出、NMS 去重)
性能优化:
- 原生预处理 - 使用
NativeImagePreprocessor提升 5-10 倍速度 - 预热机制 - 首次推理前预热,减少冷启动延迟
- 并行推理 - 利用多线程加速
推理流程:
byte[] → 解码图像 → 调整尺寸(640x640) → 归一化 → Tensor
↓
ONNX 推理
↓
解析输出 → NMS 去重 → DetectionBox[]
职责:
- 检测设备性能 (CPU 核心数、可用内存)
- 自动选择最优模型
- 创建 ONNX 会话选项 (CPU/GPU 配置)
智能选择逻辑:
设备性能等级 → 推荐模型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
High (8核+4GB) → YOLOv8s (精度优先)
Medium (4核+2GB) → YOLOv8n (平衡)
Low (<4核) → YOLOv5n (速度优先)支持的加速器:
- Android: NNAPI (Neural Networks API)
- iOS: CoreML (iOS 12+)
- 通用: CPU 多线程优化
职责:
- 检测设备硬件配置
- 评估设备性能等级
- 推荐最优配置策略
性能等级分类:
public enum DevicePerformanceLevel
{
Low, // < 4核心 或 < 2GB 内存
Medium, // 4-7核心 且 2-4GB 内存
High // ≥ 8核心 且 > 4GB 内存
}智能优化策略:
var perfLevel = DevicePerformanceDetector.GetPerformanceLevel();
switch (perfLevel)
{
case DevicePerformanceLevel.Low:
// 启用 ROI 检测,降低分辨率
_ncnnYoloService.SetRoiDetection(true, 0.6f);
detectionInterval = 100ms; // 10 FPS
break;
case DevicePerformanceLevel.Medium:
detectionInterval = 67ms; // 15 FPS
break;
case DevicePerformanceLevel.High:
// 全画面检测 + Vulkan 加速
_ncnnYoloService.SetRoiDetection(false, 1.0f);
detectionInterval = 33ms; // 30 FPS
break;
}职责:
- 实时监控推理耗时
- 动态调整推理频率
- 检测设备过热
自适应策略:
if (推理耗时 > 1000ms)
降低频率 (例: 2 FPS → 0.5 FPS)
else if (推理耗时 < 500ms && 之前已降频)
恢复频率 (逐步提升)性能统计:
var stats = _optimizer.GetPerformanceStats();
// 输出: "平均: 450ms (2.2 FPS) | 范围: 380-520ms"功能模式:
| 模式 | 触发方式 | 检测频率 | 适用场景 |
|---|---|---|---|
| 拍照检测 | 点击"拍照"按钮 | 单次 | 高精度静态检测 |
| 实时检测 | 点击"开启实时识别" | 1-3 FPS | 动态场景监控 |
核心流程:
拍照检测:
用户点击 → 捕获帧 → YOLO 检测 → 显示结果 + 检测框
实时检测流程 (异步流水线):
启动实时检测 → 创建 AsyncDetectionPipeline → 启动定时器 (33-100ms):
循环:
定时器触发 → 捕获当前帧 → 推送到流水线通道
↓
后台线程异步消费:
取出帧 → NCNN/ONNX 推理 → 发出结果事件
↓
UI 线程更新叠加层 + 显示结果
性能监控:
// 实时性能统计
var stats = _performanceOptimizer.GetPerformanceStats();
StatusLabel.Text = $"平均: {stats.AverageMs}ms ({stats.AverageFps} FPS)";
// 流水线统计
var pipelineStats = _detectionPipeline.GetStatistics();
Debug.WriteLine($"生产: {pipelineStats.FramesProduced}, 处理: {pipelineStats.FramesProcessed}, 跳过: {pipelineStats.FramesSkipped}");UI 组件:
cameraView: Camera.MAUI 相机预览_overlayView: 实时检测叠加层 (透明绘图层)_captureOverlayView: 拍照结果叠加层StatusLabel: 状态文本 (FPS、对象列表)
- Vulkan GPU 加速: 推理耗时降至 55-120ms
- JNI 直接调用: 零序列化开销,性能提升 60%
- 高效预处理: Android Bitmap API,预处理 30ms (原 50-80ms)
- 轻量级库: 仅 2MB (ONNX Runtime 15MB)
#if ANDROID
// Android 原生 Bitmap 解码(两段式:先获取尺寸 → 计算采样率 → 解码)
var boundsOpts = new BitmapFactory.Options { InJustDecodeBounds = true };
BitmapFactory.DecodeByteArray(imageData, 0, imageData.Length, boundsOpts);
int sampleSize = Math.Max(1, Math.Min(srcW / 640, srcH / 640));
var decodeOpts = new BitmapFactory.Options { InSampleSize = sampleSize };
var bitmap = BitmapFactory.DecodeByteArray(imageData, 0, imageData.Length, decodeOpts);
// 直接提取 RGB 字节
byte[] rgbData = ExtractRgbBytes(bitmap);
#endif性能对比:
- ImageSharp: 50-80ms
- Android Bitmap API: 30ms ✅ 提升 2.5 倍
- 生产者-消费者模式: 捕获与推理并发执行
- 有界通道: 防止内存溢出 (容量: 5 帧)
- 智能跳帧: Channel.DropOldest 策略
- 零阻塞 UI: 所有推理在后台线程
// 低端设备自动启用 ROI
if (performanceLevel == DevicePerformanceLevel.Low)
{
// 只检测画面中心 60% 区域
_ncnnYoloService.SetRoiDetection(true, 0.6f);
}效果:
- 计算量减少: 40% ⬇️
- 内存占用减少: 35% ⬇️
- 推理速度提升: 1.7 倍 ⬆️
- 模型预热 - 消除首次推理延迟
- 会话复用 - 避免重复加载模型
- CPU 多线程 - 利用设备全部核心
- GPU 加速 - Android NNAPI / iOS CoreML
- 自适应帧率: 低端 10 FPS / 中端 15 FPS / 高端 30 FPS
- 异步流水线: 捕获与推理完全解耦
- 性能监控: 实时 FPS 统计与动态调频
- 流式处理 - 避免大量中间对象
- 及时释放 - using 语句管理资源
- 弱引用缓存 - 降低内存占用
测试设备: 华为 Nova 13 (12GB RAM, 8 核 CPU)
| 推理引擎 | 预处理 | 推理 | 后处理 | 总耗时 | FPS | 内存占用 |
|---|---|---|---|---|---|---|
| ONNX Runtime (CPU) | 50-80ms | 350-450ms | 10-20ms | 420-550ms | 1.8-2.4 | 150MB |
| ONNX Runtime (NNAPI) | 45ms | 280-350ms | 15ms | 340-410ms | 2.4-2.9 | 180MB |
| NCNN (CPU) | 30ms | 180-220ms | 10ms | 220-260ms | 3.8-4.5 | 80MB |
| NCNN (Vulkan) ⭐ | 30ms | 85-120ms | 10ms | 125-160ms | 6.3-8.0 | 90MB |
性能提升总结:
- 🚀 推理速度: 提升 3.3 倍 (550ms → 160ms)
- 📉 内存占用: 减少 40% (150MB → 90MB)
- ⚡ 实时检测: 从 2 FPS → 8 FPS
| 设备等级 | 模型 | 检测间隔 | 实际 FPS | 推理引擎 |
|---|---|---|---|---|
| 低端 (4核) | YOLOv5n | 100ms | 10 FPS | NCNN CPU |
| 中端 (6核) | YOLOv8n | 67ms | 15 FPS | NCNN CPU |
| 高端 (8核+) | YOLOv11n | 33ms | 30 FPS | NCNN Vulkan |
优化建议:
- ✅ 低端设备: 启用 ROI 检测 (性能提升 40%)
- ✅ 中端设备: 使用 NCNN CPU 模式
- ✅ 高端设备: 启用 Vulkan GPU 加速
支持版本: Android 7.0+ (API 24+)
权限配置 (AndroidManifest.xml):
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />加速器: NNAPI (Neural Networks API)
已测试设备:
- ✅ 华为 Nova 13 (Android 14) - NCNN Vulkan
- ✅ 小米 12 (Android 13) - NCNN Vulkan
- ✅ 三星 Galaxy S21 (Android 12) - NCNN CPU
支持版本: iOS 15.0+
权限配置 (Info.plist):
<key>NSCameraUsageDescription</key>
<string>需要使用相机进行目标检测</string>加速器: CoreML (iOS 12+)
已测试设备:
- ✅ iPhone 13 Pro (iOS 17)
- ✅ iPhone 12 (iOS 16)
支持版本: macOS 11.0+
特性:
- 原生 macOS 应用体验
- 触控板 / 鼠标支持
- 多窗口管理
支持版本: Windows 10 (Build 17763+)
限制:
⚠️ Camera.MAUI 暂不支持 Windows- 仅支持文件选择检测 (非实时相机)
- 从 PyTorch 导出 NCNN 模型:
from ultralytics import YOLO
# 加载模型
model = YOLO('yolo11n.pt')
# 导出为 NCNN 格式
model.export(format='ncnn', imgsz=640)
# 生成文件:
# - model.ncnn.param # 模型结构
# - model.ncnn.bin # 模型权重- 放置模型文件:
MauiYoloApp/
├── yolo11n_ncnn_model/
│ ├── model.ncnn.param
│ └── model.ncnn.bin
- 更新 .csproj 配置:
<ItemGroup>
<MauiAsset Include="yolo11n_ncnn_model\model.ncnn.param">
<LogicalName>model.ncnn.param</LogicalName>
</MauiAsset>
<MauiAsset Include="yolo11n_ncnn_model\model.ncnn.bin">
<LogicalName>model.ncnn.bin</LogicalName>
</MauiAsset>
</ItemGroup>- 下载 ONNX 模型文件
- 放置到
Resources/Raw/ - 在
ModelSelector.cs中注册:
{
ModelType.YOLOv8m,
new ModelInfo
{
Type = ModelType.YOLOv8m,
FileName = "yolov8m.onnx",
InputSize = 640,
Description = "YOLOv8 Medium - 高精度",
MinProcessorCount = 6,
MinMemoryMB = 3000
}
}NCNN 模型转换 (推荐):
from ultralytics import YOLO
# 加载模型
model = YOLO('yolo11n.pt')
# 导出为 NCNN (Android/iOS 优化)
model.export(format='ncnn', imgsz=640)ONNX 模型转换 (Windows 备用):
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n.pt')
# 导出为 ONNX (指定 Opset 版本)
model.export(format='onnx', opset=17)修改 CameraDetectionPage.xaml.cs:
// 系统自动根据设备性能选择:
var devicePerf = DevicePerformanceDetector.GetPerformanceLevel();
int interval = devicePerf switch
{
DevicePerformanceLevel.Low => 100, // 10 FPS
DevicePerformanceLevel.Medium => 67, // 15 FPS
DevicePerformanceLevel.High => 33, // 30 FPS
_ => 67
};
_realtimeTimer = new System.Timers.Timer(interval);手动调整 (高级):
// 超高帧率(高端设备 + NCNN Vulkan)
_realtimeTimer = new System.Timers.Timer(25); // 40 FPS
// 节能模式(低端设备)
_realtimeTimer = new System.Timers.Timer(200); // 5 FPS修改 CameraDetectionPage.xaml.cs:
// 当前: 0.6 (60%)
var results = await _yoloService.DetectAsync(imageData, 0.6f);
// 高精度: 0.8 (减少误检)
var results = await _yoloService.DetectAsync(imageData, 0.8f);
// 高召回: 0.4 (检测更多对象)
var results = await _yoloService.DetectAsync(imageData, 0.4f);NCNN (Android/iOS):
// 初始化时指定 Vulkan GPU 加速
await _ncnnYoloService.InitializeAsync(paramPath, binPath, useGpu: true); // 启用 Vulkan
await _ncnnYoloService.InitializeAsync(paramPath, binPath, useGpu: false); // 仅 CPUONNX Runtime (Windows):
// 初始化时指定
await _yoloService.InitializeAsync(modelPath, useGpu: true); // 启用 GPU
await _yoloService.InitializeAsync(modelPath, useGpu: false); // 仅 CPU错误: NCNN模型加载失败: Failed to load param file
原因: 模型文件未正确复制到应用目录
解决方案:
// 检查文件是否存在
var paramPath = Path.Combine(FileSystem.AppDataDirectory, "model.ncnn.param");
var binPath = Path.Combine(FileSystem.AppDataDirectory, "model.ncnn.bin");
if (!File.Exists(paramPath) || !File.Exists(binPath))
{
// 复制资源文件
await CopyResourceToFileAsync("model.ncnn.param", paramPath);
await CopyResourceToFileAsync("model.ncnn.bin", binPath);
}
private async Task CopyResourceToFileAsync(string resourceName, string targetPath)
{
using var stream = await FileSystem.OpenAppPackageFileAsync(resourceName);
using var fileStream = File.Create(targetPath);
await stream.CopyToAsync(fileStream);
}症状: 单次检测耗时 > 500ms
排查步骤:
- 检查是否启用 NCNN:
if (!_ncnnYoloService.IsReady())
{
Debug.WriteLine("⚠️ NCNN 服务未初始化,正在使用 ONNX Runtime");
}- 检查 Vulkan 是否启用:
// 查看初始化日志
Debug.WriteLine($"[NCNN] GPU 加速: {useGpu}");- 尝试启用 ROI 检测:
_ncnnYoloService.SetRoiDetection(true, 0.6f);- 降低检测频率:
// 从 30 FPS 降低到 10 FPS
detectionInterval = 100; // ms错误: DllNotFoundException: Unable to load DLL 'ncnn_wrapper'
解决方案: 检查 .csproj 配置
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0-android'">
<AndroidNativeLibrary Include="Platforms\Android\libs\arm64-v8a\libncnn_wrapper.so">
<Abi>arm64-v8a</Abi>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="Platforms\Android\libs\armeabi-v7a\libncnn_wrapper.so">
<Abi>armeabi-v7a</Abi>
</AndroidNativeLibrary>
</ItemGroup>错误: 未检测到可用相机设备
解决方案:
// 增加等待时间
int retryCount = 0;
while ((cameraView.Cameras == null || cameraView.Cameras.Count == 0) && retryCount < 10)
{
await Task.Delay(500); // 从 200ms 增加到 500ms
retryCount++;
}错误: 相机黑屏或闪退
解决方案:
在 Info.plist 添加:
<key>NSCameraUsageDescription</key>
<string>此应用需要使用相机进行实时目标检测</string>原因: 坐标归一化问题
检查:
- YOLO 输出坐标为 归一化值 (0.0-1.0)
- 需乘以图像宽高转换为像素坐标
- 确保
DetectionOverlayView尺寸与图像一致
- ✅ 基础 YOLO 检测功能
- ✅ 实时相机检测 (15-30 FPS)
- ✅ NCNN 原生集成 (Android/iOS)
- ✅ 异步推理流水线
- ✅ 智能 ROI 检测
- ✅ 设备性能自适应
- ✅ Vulkan GPU 加速
- ✅ YOLOv11n 模型支持
- 🔲 INT8 量化模型支持 (速度再提升 30%)
- 🔲 检测结果导出 (JSON/CSV)
- 🔲 多语言支持 (i18n)
- 🔲 深色模式
- 🔲 模型热更新 (无需重启)
- 🔲 视频文件检测
- 🔲 检测历史记录
- 🔲 云端模型同步
- 🔲 对象跟踪 (DeepSORT)
- 🔲 姿态检测 (YOLOv11-Pose)
- 🔲 分割模型支持 (YOLOv11-Seg)
- 📝 NCNN_README.md - NCNN 集成总览
- 🚀 NCNN_快速开始.md - 10分钟快速集成指南
- 📖 NCNN_集成指南.md - 完整集成指南
- 📁 NCNN_项目结构说明.md - 目录结构和文件说明
- ⚙️ NCNN_项目配置更新.md - .csproj 配置详解
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- Tencent NCNN 团队 - 提供优秀的移动端推理框架
- Ultralytics YOLOv11 - YOLO 模型
- Microsoft ONNX Runtime - 备用推理引擎
- Camera.MAUI - 跨平台相机组件
- SixLabors.ImageSharp - 图像处理库
- 作者: [Hennychen]
- 邮箱: [511308538@qq.com]
- GitHub: https://github.com/hennychen
如果这个项目对您有帮助,请给一个 ⭐ Star!
🚀 性能突破: NCNN Vulkan 加速 | 3倍推理速度 | 30 FPS 实时检测
Made with ❤️ using .NET MAUI + NCNN
