基于深度学习的黑白图像自动着色工具,使用 DDColor (Decoupled Diffusion Colorization) 模型实现灰度图像的智能化彩色还原。
效果展示


算法原理
DDColor 模型概述
DDColor 是一种基于扩散模型的图像着色算法,通过解耦扩散过程实现高质量的黑白图像着色。该模型在 Lab 颜色空间工作,主要流程如下:
核心处理流程
- 颜色空间转换
- 输入图像从 BGR 转换到 RGB 颜色空间
- RGB 转换到 Lab 颜色空间,提取 L 通道(亮度通道,范围 0-100)
- L 通道代表图像的灰度信息
- 模型输入预处理
- 将 L 通道缩放到模型输入尺寸(512×512)
- 构造三通道 Lab 图像:L 通道为缩放后的亮度,a 和 b 通道初始化为 0
- 通过 Lab→RGB 转换得到灰度 RGB 图像作为模型输入
- 归一化到 [0, 1] 范围,转换为 CHW 格式的浮点张量
- ONNX 推理
- 输入张量形状:[1, 3, 512, 512](批量大小=1,3通道,高=512,宽=512)
- 模型输出形状:[1, 2, 512, 512](批量大小=1,2通道为a和b,高=512,宽=512)
- 输出包含预测的 a 和 b 颜色通道
- 后处理
- 将输出的 a、b 通道重构为双通道 Mat 图像
- 使用双线性插值将 ab 通道放大到原始图像尺寸
- 合并原始 L 通道与预测的 ab 通道,得到完整的 Lab 图像
- Lab→RGB→BGR 转换,得到最终的彩色图像
- 像素值从 [0, 1] 缩放到 [0, 255],转换为 8UC3 格式
技术优势
- 高质量着色 :基于扩散模型,生成自然、真实的颜色
- 语义理解 :能够理解图像内容并分配合适的颜色
- 灵活部署 :支持 CPU 和 CUDA GPU 推理
- 高效推理 :使用 ONNX Runtime 加速,推理速度快
环境要求
开发环境
- 操作系统 :Windows 10/11 (x64)
- IDE :Visual Studio 2019 或更高版本
- .NET Framework :4.7.2
- C# 语言版本 :C# 6.0
依赖库
- OpenCvSharp :4.13.0(图像处理)
- ONNX Runtime :1.20.1(模型推理)
- CUDA (可选):12.x(GPU 加速)
- cuDNN (可选):9.x(GPU 加速)
硬件要求
- CPU 模式 :任意 x64 处理器,建议 4 核以上
- GPU 模式 :NVIDIA GPU(支持 CUDA 12.x),建议 4GB 以上显存
- 内存 :至少 4GB RAM
- 存储 :至少 500MB 可用空间
安装步骤
1. 克隆或下载项目
# 如果使用 Git git clonecd FIRC
或直接下载项目压缩包并解压。
2. 准备模型文件
将 DDColorONNX模型文件放置到 weights 文件夹:
weights/ └── ddcolor_paper_tiny.onnx
注意 :模型文件需要单独下载,请从官方渠道获取 ddcolor_paper_tiny.onnx 文件。
3. 检查依赖 DLL
确保 bin\x64\Release 文件夹包含以下必要文件:
- OpenCvSharp.dll 及相关 DLL
- Microsoft.ML.OnnxRuntime.dll
- CUDA 相关 DLL(如使用 GPU):cudart64_12.dll、cublas64_12.dll 等
- OpenCvSharpExtern.dll(位于 dll\x64 文件夹)
4. 使用Visual Studio打开项目
- 双击
FIRC.sln 文件,使用 Visual Studio 2019 打开项目 - 等待 NuGet 包恢复完成(如果使用 NuGet 管理依赖)
- 检查项目引用是否正常
5. 编译项目
- 在 Visual Studio 中,选择配置为
Release ,平台为 x64 - 点击菜单:
生成 → 生成解决方案 (或按 Ctrl+Shift+B ) - 确保编译无错误
运行步骤
方式一:Visual Studio 运行
- 在 Visual Studio 中按
F5 运行调试,或 Ctrl+F5 直接运行 - 程序启动后会显示主界面
方式二:直接运行可执行文件
- 进入
bin\x64\Release 文件夹 - 双击运行
FIRC.exe
使用流程
- 加载模型
- 勾选或取消勾选 “CUDA 加速” 复选框(根据硬件选择)
- 点击 “加载模型” 按钮
- 等待状态栏显示 “模型已加载 [CPU]” 或 “模型已加载 [CUDA]”
- 上传图片
- 点击 “上传图片” 按钮
- 选择要着色的灰度图像(支持 .bmp, .jpg, .jpeg, .tiff, .png 格式)
- 图像将显示在左侧 “原始图像” 区域
- 开始推理
- 点击 “开始推理” 按钮
- 等待推理完成
- 着色结果将显示在右侧 “着色结果” 区域
- 耗时信息显示在界面上方
- 保存结果
- 右键点击右侧结果图像,可以保存着色后的图像
注意事项
模型相关
- 模型文件 :确保
ddcolor_paper_tiny.onnx 文件存在于 weights 文件夹中 - 模型版本 :不同大小的模型(tiny/small/base)推理速度和效果不同
- 输入尺寸 :当前配置模型输入尺寸为 512×512,可在
DDColor.cs 中修改 ModelInputSize 常量
硬件相关
- CUDA 支持 :
- 需要 NVIDIA GPU 且安装了正确的 CUDA 12.x 驱动
- 首次使用 CUDA 可能较慢(初始化开销)
- 如果 CUDA 初始化失败,程序会自动回退到 CPU 模式
- 内存使用 :
- 大尺寸图像会占用更多内存
- 建议处理图像尺寸不超过 4000×4000 像素
使用建议
- 图像格式 :建议使用无损格式(PNG)以获得最佳效果
- 灰度图像 :模型对真正的灰度图像效果最佳
- 批量处理 :当前版本支持单张图像处理,批量处理需要修改代码
- 异常处理 :如果推理失败,请检查模型文件是否完整、依赖 DLL 是否齐全
常见问题
Q: 提示 “模型文件不存在”? A: 检查 weights 文件夹中是否有 ddcolor_paper_tiny.onnx 文件。
Q: CUDA 加速无法使用? A:
- 确认已安装 NVIDIA GPU 驱动
- 确认
bin\x64\Release 文件夹包含 CUDA 相关 DLL - 检查 CUDA 版本是否为 12.x
Q: 推理速度很慢? A:
- CPU 模式推理较慢属正常现象
- 建议使用 CUDA GPU 加速
- 可尝试使用更小的模型(如 ddcolor_paper_tiny)
Q: 编译时提示缺少引用? A: 检查项目引用中的 DLL 路径是否正确,确保所有依赖文件存在。
文件夹结构
FIRC/ │ ├── FIRC.sln # Visual Studio 解决方案文件 ├── FIRC.csproj # 项目配置文件 ├── FIRC.csproj.user # 用户项目配置 ├── App.config # 应用程序配置文件 ├── Program.cs # 程序入口点 │ ├── Form1.cs # 主窗体逻辑代码 ├── Form1.Designer.cs # 主窗体设计器代码 ├── Form1.resx # 主窗体资源文件 │ ├── DDColor.cs # DDColor 图像着色推理类(核心) │ ├── Properties/ # 项目属性文件夹 │ ├── AssemblyInfo.cs # 程序集信息 │ ├── Resources.Designer.cs # 资源设计器 │ ├── Resources.resx # 资源文件 │ ├── Settings.Designer.cs # 设置设计器 │ └── Settings.settings # 应用程序设置 │ ├── weights/ # 模型权重文件夹 │ └── ddcolor_paper_tiny.onnx # DDColor ONNX 模型文件 │ ├── images/ # 测试图像文件夹 │ ├── gray_faces/ # 灰度人脸测试图像 │ ├── whole_imgs/ # 完整图像测试集 │ ├── cropped_faces/ # 裁剪人脸图像 │ └── masked_faces/ # 掩码人脸图像 │ ├── bin/ # 编译输出文件夹 │ └── x64/ │ └── Release/ # 64位发布版本 │ ├── FIRC.exe # 主程序可执行文件 │ ├── FIRC.pdb # 程序调试数据库 │ ├── *.dll # 依赖库文件 │ ├── dll/x64/ # OpenCV 外部 DLL │ │ ├── OpenCvSharpExtern.dll │ │ └── opencv_videoio_ffmpeg4130_64.dll │ └── weights/ # 运行时模型文件夹(复制) │ └── ddcolor_paper_tiny.onnx
核心类说明
DDColor 类
位于 DDColor.cs ,是项目的核心推理类:
- LoadModel(modelPath, useCuda) :加载 ONNX 模型
- Colorize(inputImage) :执行图像着色推理
- IsModelLoaded :检查模型是否已加载
- Dispose() :释放资源
Form1 类
位于 Form1.cs ,是主窗体类:
- 负责用户界面交互
- 调用 DDColor 类进行推理
- 显示输入/输出图像和耗时统计
技术支持
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发送邮件至项目维护者
许可证
本项目仅供学习和研究使用。使用本项目时请遵守相关法律法规。
参考文献
- DDColor 原论文
- ONNX Runtime 文档
- OpenCvSharp 文档