基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割

基于 DAViD 算法的前景分割效果展示


项目简介

本项目是一个基于 DAViD (Denoising Aggregation for Vision and Depth) 算法的图像前景分割工具,使用 ONNX 模型进行推理,支持 CPU 和 CUDA 加速。项目采用 C# WinForms 开发,提供友好的图形界面,可以实时显示原始图像和分割后的透明背景结果。

算法原理

DAViD 前景分割算法

DAViD 是一种先进的视觉前景分割算法,其核心原理如下:

  1. 输入处理:接收 RGB 三通道图像,缩放到模型固定输入尺寸(512×512)
  2. 特征提取:通过 ViT (Vision Transformer) 骨干网络提取多层次视觉特征
  3. 前景预测:输出单通道掩膜(Mask),每个像素值范围 [0, 1],表示该像素属于前景的概率
  4. 后处理
    • 将 512×512 的预测掩膜双线性插值回原始图像尺寸
    • 将浮点掩膜转换为 8 位 Alpha 通道(0-255)
    • 将 Alpha 通道与原始 BGR 图像合并,生成 BGRA 四通道透明背景图像

技术特点

  • 软掩膜输出:默认输出软掩膜(Soft Mask),保留边缘过渡的半透明效果
  • 二值化支持:可配置阈值进行二值化处理,适用于需要硬边界的场景
  • 高效推理:基于 ONNX Runtime,支持 CPU 和 CUDA GPU 加速

环境要求

开发环境

  • IDE:Visual Studio 2019 或更高版本
  • .NET Framework:4.7.2
  • C# 语言版本:5.0
  • 操作系统:Windows 10/11 (x64)

依赖库

依赖库 版本 用途
OpenCvSharp 4.13.0 图像处理(缩放、颜色转换、矩阵运算)
ONNX Runtime 1.20.1 ONNX 模型推理引擎
System.Drawing.Common - 图像格式转换

硬件要求

  • CPU 模式:任意 x64 处理器
  • CUDA 模式 (可选):
    • NVIDIA GPU(支持 CUDA 12.x)
    • 已安装 CUDA Toolkit 12.x
    • 已安装 cuDNN 9.x
    • 足够的显存(建议 ≥ 4GB)

安装步骤

1. 克隆或下载项目

bash 复制代码
# 从 Git 仓库firc-projects获取
git clone <repository-url>
cd FIRC

2. 准备 ONNX 模型

将 DAViD 前景分割 ONNX 模型文件放置在 weights 文件夹中:

复制代码
bin\x64\Release\weights\foreground-segmentation-model-vitb16_384.onnx

注意 :模型文件名必须与代码中的路径一致,或修改 Form1.cs 中的 modelPath 变量。

3. 安装 CUDA(可选,仅 GPU 加速需要)

如果使用 CUDA 加速,需要安装以下组件:

  1. NVIDIA 显卡驱动:最新版本
  2. CUDA Toolkit 12.x :从 NVIDIA 官网 下载
  3. cuDNN 9.x :从 NVIDIA cuDNN 下载

确保以下 DLL 文件存在于 bin\x64\Release\ 目录:

  • cudart64_12.dll
  • cublas64_12.dll
  • cublasLt64_12.dll
  • cudnn64_9.dll
  • 其他 cudnn_*.dll 文件

4. 编译项目

  1. 使用 Visual Studio 2019 打开 FIRC.sln
  2. 选择配置:Release | x64
  3. 生成解决方案:生成生成解决方案 (Ctrl+Shift+B)
  4. 编译成功后,可执行文件位于 bin\x64\Release\FIRC.exe

运行步骤

方式一:Visual Studio 运行

  1. 在 Visual Studio 中打开项目
  2. 设置启动项目为 FIRC
  3. F5 或点击 开始调试 运行

方式二:直接运行可执行文件

  1. 进入 bin\x64\Release\ 目录
  2. 双击 FIRC.exe 运行程序

使用流程

  1. 选择推理设备(可选):

    • 默认使用 CPU
    • 勾选 "CUDA 加速" 使用 GPU(需提前安装 CUDA)
  2. 加载模型

    • 点击 "加载模型" 按钮
    • 等待状态栏显示 "状态:模型已加载 [CPU]" 或 "[CUDA]"
  3. 上传图片

    • 点击 "上传图片" 按钮
    • 选择要处理的图像文件(支持 BMP、JPG、JPEG、TIFF、PNG)
  4. 开始推理

    • 点击 "开始推理" 按钮
    • 等待推理完成,右侧显示分割结果
    • 底部显示推理耗时
  5. 查看结果

    • 左侧显示原始图像
    • 右侧显示带透明背景的前景分割结果
    • 支持右键保存为 PNG 格式(保留透明通道)

注意事项

模型相关

  1. 模型路径:确保 ONNX 模型文件位于正确路径,默认路径为:

    复制代码
    bin\x64\Release\weights\foreground-segmentation-model-vitb16_384.onnx
  2. 模型输入尺寸:DAViD 模型固定输入为 512×512,程序会自动缩放图像

  3. 模型输出:模型输出单通道掩膜,形状为 [1, 1, 512, 512],值域 [0, 1]

CUDA 加速

  1. DLL 依赖:使用 CUDA 模式时,必须确保所有 CUDA/cuDNN DLL 文件存在于运行目录
  2. 版本匹配:CUDA、cuDNN 版本必须与 ONNX Runtime 编译版本匹配(CUDA 12.x, cuDNN 9.x)
  3. 显存不足:如果 GPU 显存不足,程序可能崩溃或回退到 CPU
  4. 首次运行:首次使用 CUDA 可能有初始化延迟

图像处理

  1. 支持格式:BMP、JPG、JPEG、TIFF、PNG
  2. 输出格式:建议保存为 PNG 格式以保留透明通道
  3. 内存管理:程序会自动释放 OpenCV Mat 对象,但处理超大图像时可能占用较多内存
  4. 性能优化:CPU 模式下,处理 1080p 图像约需 100-500ms(取决于 CPU 性能)

开发相关

  1. C# 版本:项目使用 C# 5.0 语法,不要使用 C# 6.0+ 特性(如属性初始化器、空值条件运算符等)
  2. 平台目标:必须使用 x64 平台编译,因为 ONNX Runtime 和 OpenCvSharp 的 native DLL 均为 64 位
  3. 资源释放 :所有 Mat 对象和 ONNX 推理对象都实现了 IDisposable,使用完毕后会自动释放

文件夹结构

复制代码
FIRC/
├── Properties/                      # 项目属性配置
│   ├── AssemblyInfo.cs              # 程序集信息
│   ├── Resources.Designer.cs        # 资源文件设计器
│   ├── Resources.resx               # 资源文件
│   ├── Settings.Designer.cs         # 设置文件设计器
│   └── Settings.settings            # 应用程序设置
├── bin/                             # 编译输出目录
│   └── x64/
│       └── Release/
│           ├── FIRC.exe             # 主程序
│           ├── FIRC.pdb             # 调试符号
│           ├── FIRC.exe.config      # 配置文件
│           ├── weights/             # 模型权重目录
│           │   └── foreground-segmentation-model-vitb16_384.onnx
│           ├── dll/
│           │   └── x64/             # Native DLL 目录
│           │       ├── OpenCvSharpExtern.dll
│           │       └── opencv_videoio_ffmpeg4130_64.dll
│           ├── Microsoft.ML.OnnxRuntime.dll
│           ├── onnxruntime.dll
│           ├── onnxruntime_providers_cuda.dll         # CUDA 支持
│           ├── onnxruntime_providers_tensorrt.dll     # TensorRT 支持
│           ├── OpenCvSharp.dll                        # OpenCV C# 绑定
│           ├── OpenCvSharp.Extensions.dll
│           ├── cudart64_12.dll                        # CUDA Runtime
│           ├── cublas64_12.dll                        # CUDA BLAS
│           ├── cudnn64_9.dll                          # cuDNN
│           └── ...(其他 CUDA/cuDNN DLL)
├── images/                          # 示例图像目录
│   ├── *.jpg                        # 历史照片示例
│   └── ...
├── ForegroundSegmentation.cs        # 前景分割推理类(核心)
├── Form1.cs                         # 主窗体逻辑
├── Form1.Designer.cs                # 主窗体设计器代码
├── Form1.resx                       # 主窗体资源文件
├── Program.cs                       # 程序入口
├── App.config                       # 应用程序配置
├── FIRC.sln                         # Visual Studio 解决方案
├── FIRC.csproj                      # 项目文件
├── FIRC.csproj.user                 # 用户项目设置
└── README.md                        # 项目说明文档

核心代码说明

ForegroundSegmentation.cs

推理封装类,提供以下功能:

  • LoadModel(string modelPath, bool useCuda):加载 ONNX 模型
  • Segment(Mat inputImage, float binarizationThreshold):执行前景分割
  • Dispose():释放资源

推理流程

复制代码
输入图像 (BGR)
    ↓
缩放到 512×512
    ↓
归一化到 [0, 1]
    ↓
转换为 CHW 格式
    ↓
ONNX 模型推理
    ↓
输出掩膜 [1, 1, 512, 512]
    ↓
双线性插值到原始尺寸
    ↓
生成 Alpha 通道 (0-255)
    ↓
合并为 BGRA 图像
    ↓
输出透明背景结果

常见问题

支持哪些显卡

不直接支持RTX50显卡,可以使用RTX40,30,20,1660系列显卡,也支持CPU运行

Q1: 提示 "模型文件不存在"

A : 检查 weights 文件夹中是否有 ONNX 模型文件,文件名是否正确。

Q2: 勾选 CUDA 后程序崩溃

A: 确保已安装 CUDA 12.x 和 cuDNN 9.x,且所有 DLL 文件在运行目录。

Q3: 推理速度很慢

A: CPU 模式下速度取决于处理器性能,可尝试勾选 CUDA 加速使用 GPU。

Q4: 分割边缘不够精细

A: 默认使用软掩膜保留过渡效果,如需硬边界可调整二值化阈值(当前代码固定为 0)。

相关推荐
郭wes代码2 小时前
大三Java课设:一行行敲出来的贪吃蛇,老师以为我是CV的
java·开发语言
John.Lewis2 小时前
C++进阶(12)附加学习:STL之空间配置器(了解)
开发语言·c++·笔记
baizhigangqw2 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹2 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
C#程序员一枚2 小时前
高可用(High Availability, HA)
数据库·c#
23471021272 小时前
4.16 学习笔记
开发语言·软件测试·python
014-code2 小时前
日志规范:怎么写才不算写废话
java·开发语言·设计模式·日志
Binarydog_Lee3 小时前
Rust 核心机制:所有权、借用与生命周期
开发语言·rust
XMYX-03 小时前
17 - Go 通道 Channel 底层原理 + 实战详解
开发语言·golang