一、项目核心释义
这是一套完全自包含的纯C++计算机视觉机器学习推理库,底层基于ggml轻量级张量计算库构建,沿用了大语言模型推理的轻量化设计思路,专注于端侧、低资源场景下的CV模型部署与推理。
引擎支持图像分割、单目深度估计、图像修复、超分辨率等主流视觉任务,原生支持CPU和Vulkan GPU加速,跨Windows/Linux/macOS全平台。部署体积极致精简,CPU版本仅5MB左右,GPU版本也仅30MB左右,模型加载与初始化时间小于100ms,内存开销远低于主流框架。
核心设计特点:
- 零重型框架依赖:不需要PyTorch、ONNX Runtime、OpenCV等重型依赖,仅标准库+ggml即可运行
- 统一GGUF模型格式:所有视觉模型均转换为GGUF格式存储,解析快、体积小、支持量化
- 模块化可扩展:每个模型独立实现,可插拔,共享底层算子,新增模型成本低
- 跨平台可移植:一套代码覆盖桌面、端侧、嵌入式等多种部署场景
二、行业核心技术知识点
2.1 端侧计算机视觉的部署痛点
传统计算机视觉推理大多基于Python+PyTorch/ONNX的技术方案,在端侧、嵌入式、离线软件场景下存在三大硬伤:
- 依赖臃肿:需要完整的Python环境、深度学习框架、图像处理库,部署包动辄几百MB,嵌入式设备和轻量软件根本无法集成
- 冷启动缓慢:框架初始化、模型加载耗时长,启动延迟高,不适合实时响应、快速调用的场景
- 资源占用高:运行时内存占用大,很多边缘设备、嵌入式设备的算力和内存都无法承载
2.2 GGUF格式向视觉领域的延伸
GGUF原本是大语言模型的轻量化存储格式,结构简单、解析速度快、量化支持完善。这套引擎把GGUF的设计思路延伸到计算机视觉领域,将视觉模型的权重也统一转换为GGUF格式,共享底层张量计算库,让视觉模型也获得了和LLM同样的轻量化部署体验。
2.3 ggml张量库:轻量化计算底座
ggml是纯C实现的轻量级张量计算库,也是主流轻量化LLM推理引擎的核心底座。它的核心优势是:
- 纯C原生实现,零第三方依赖,可移植性极强
- 支持CPU、Vulkan、CUDA、Metal等多种硬件后端
- 内置多种量化方案,天生适配端侧低资源推理
- 体积极小,编译后仅几百KB,非常适合嵌入到各类产品中
2.4 模块化模型的工程价值
引擎采用模块化模型设计,每个视觉任务模型都是独立模块,共享底层的张量计算、图像处理、后端抽象能力。新增模型只需要实现网络结构和前后处理,不用重复造轮子,扩展成本极低,非常适合企业快速落地自定义视觉算法。
三、整体架构设计思路
3.1 四层分层架构
引擎采用分层解耦设计,从底到上分别是硬件后端层、张量计算层、模型实现层、应用接口层,每层职责清晰,可单独替换优化。

各层核心职责:
- 硬件后端层:屏蔽不同硬件的实现差异,向上提供统一的算子执行接口,目前支持CPU和Vulkan两种后端
- 张量计算层:基于ggml实现所有基础张量运算、内存管理、计算图调度,是所有模型的公共计算底座
- 模型实现层:各个视觉任务模型的具体实现,包括图像预处理、网络结构、结果后处理,全部复用底层算子
- 应用接口层:对外提供命令行工具、C++原生API、Python绑定,适配不同场景的集成需求
3.2 内置模型矩阵
所有模型遵循统一的接口规范,实现「加载-编码-计算-释放」的标准流程,支持即插即用。目前内置支持的视觉模型:
| 模型 | 核心任务 | 支持后端 |
|---|---|---|
| MobileSAM | 提示式图像分割 | CPU、Vulkan |
| BiRefNet | 二分类前景分割 | CPU、Vulkan |
| Depth-Anything V2 | 单目深度估计 | CPU、Vulkan |
| MI-GAN | 图像修复补全 | CPU、Vulkan |
| Real-ESRGAN | 图像超分辨率 | CPU、Vulkan |
同时内置SWIN、DINO、TinyViT等主流骨干网络,可快速基于这些骨干实现新的视觉任务模型。
3.3 完整推理工作流程

四、核心代码实现原理
4.1 底层:ggml张量计算底座
整个引擎的计算核心基于ggml张量库构建,和主流轻量化LLM推理引擎共享技术路线。卷积、归一化、激活、矩阵乘法等所有基础算子都由ggml统一提供,模型层只需要搭建计算图,不需要关心底层硬件实现。
这种设计的最大优势是:底层硬件优化(比如Vulkan加速、CPU SIMD优化)统一迭代一次,所有上层模型都能享受性能提升,不用每个模型单独做硬件适配。
4.2 后端抽象:一套代码多硬件运行
通过统一的后端抽象接口,屏蔽CPU和GPU的实现差异,上层模型代码无需修改即可切换硬件后端。
后端初始化核心逻辑:
cpp
// 初始化CPU后端
backend_device cpu = backend_init(backend_type::cpu);
// 初始化Vulkan GPU后端
backend_device gpu = backend_init(backend_type::vulkan);
模型加载时绑定对应后端,推理时自动调度到对应硬件执行,上层业务代码完全感知不到差异,方便根据部署场景灵活切换。
4.3 图像处理:原生实现零依赖
图像加载、缩放、通道转换、格式转换、保存全部原生实现,不依赖OpenCV等第三方图像处理库,进一步减少依赖项和部署体积。内置图像预处理的常用操作,比如归一化、张量排布转换、尺寸调整,完全满足视觉模型的输入需求。
4.4 模型实现:以提示式分割为例
以提示式图像分割模型为例,完整推理流程分为三步:模型加载、全图编码、提示计算,非常适合交互式场景。
完整C++ API调用示例
cpp
...
int main()
{
// 1. 初始化计算后端
backend_device cpu = backend_init(backend_type::cpu);
// 2. 加载GGUF格式的分割模型
sam_model sam = sam_load_model("MobileSAM-F16.gguf", cpu);
// 3. 加载输入图像
image_data input_image = image_load("input.jpg");
// 4. 全图编码:提取整张图像特征,缓存复用
sam_encode(sam, input_image);
// 5. 传入提示框坐标,计算分割掩码
box_2d prompt_box = {{420, 120}, {650, 320}};
image_data object_mask = sam_compute(sam, prompt_box);
// 6. 保存输出掩码
image_save(object_mask, "mask.png");
return 0;
}
内部实现逻辑
- 模型加载:解析GGUF模型文件,加载所有权重张量到后端内存,初始化计算图结构
- 图像编码:运行图像编码器骨干,提取整张图像的特征并缓存。同一张图多次提示只需要编码一次,大幅降低交互式场景的延迟
- 提示计算:将提示框坐标编码成提示特征,与图像特征融合,经过掩码解码器生成分割结果,后处理为最终的掩码图像
这种「一次编码、多次提示」的设计,非常适合交互式标注、图像编辑类场景,用户多次点击提示时,无需重复运行 heavy 的图像编码器,响应速度极快。
4.5 其他模型的实现模式
- 二分类分割:输入图像直接输出前景/背景二值掩码,用于抠图、背景分离等场景
- 深度估计:输入单张图像,输出对应深度图,用于三维重建、景深效果等场景
- 图像修复:输入原图和掩码,输出修复补全后的图像,用于老照片修复、物体移除等场景
- 图像超分:输入低分辨率图像,输出高分辨率图像,用于图像增强、高清修复等场景
所有模型都遵循统一的接口规范,使用方式一致,学习和迁移成本极低。
4.6 Python绑定
除了原生C++ API,还提供了Python语言绑定,可以在Python中直接调用,性能接近原生C++,同时保留Python的开发效率,适合快速原型验证和算法调试。
五、环境配置与运行测试全教程
5.1 环境要求
- 编译器:支持C++20标准的编译器(GCC、Clang、MSVC均可)
- 构建工具:CMake 3.16+
- 可选依赖:Vulkan SDK(启用GPU加速时需要)
- Python 3.x(运行模型转换脚本、使用Python绑定时需要)
5.2 源码编译步骤
cpp
# 基础CPU版本编译
cmake . -B build
cmake --build build --config Release
启用Vulkan GPU加速
需要先安装Vulkan SDK,再执行编译:
cpp
cmake . -B build -D VISP_VULKAN=ON
cmake --build build --config Release
编译完成后,可执行文件生成在bin目录下。
5.3 命令行工具使用
提示式图像分割
cpp
# 输入图像+提示框坐标,输出分割掩码
./bin/cv_infer -m MobileSAM-F16.gguf -i input.jpg -p 420 120 650 430 -o mask.png
# 生成叠加原图的合成效果图
./bin/cv_infer -m MobileSAM-F16.gguf -i input.jpg -p 420 120 650 430 --composite output.png
二分类前景分割
cpp
./bin/cv_infer birefnet -m BiRefNet-lite-F16.gguf -i input.jpg -o mask.png --composite comp.png
单目深度估计
cpp
./bin/cv_infer depth-anything -m Depth-Anything-V2-Small-F16.gguf -i input.jpg -o depth.png
图像修复
cpp
./bin/cv_infer migan -m MIGAN-512-places2-F16.gguf -i image.png -m mask.png -o output.png
图像超分辨率
cpp
./bin/cv_infer esrgan -m ESRGAN-4x-foolhardy_Remacri-F16.gguf -i input.png -o output.png
5.4 模型转换
原生PyTorch模型需要转换为GGUF格式才能使用:
cpp
# 安装uv工具
pip install uv
# 执行转换脚本,arch参数对应模型类型
uv run scripts/convert.py <arch> MyModel.pth
转换后会生成GGUF格式的模型文件,同时会做张量重排和预计算优化,推理效率更高。
5.5 测试与验证
编译时启用测试套件:
cpp
cmake . -B build -DVISP_TESTS=ON
cmake --build build --config Release
# 运行C++单元测试
cd build
ctest -C Release
Python绑定测试:
cpp
# 安装开发依赖
uv sync --dev
# 运行Python测试
uv run pytest
5.6 性能参考
测试环境:CPU为AMD Ryzen 5 5600X(6核),GPU为NVIDIA RTX 4070
MobileSAM 1024×1024分辨率
| 运行后端 | 计算精度 | 推理耗时 |
|---|---|---|
| CPU | f32 | 669ms |
| Vulkan GPU | f16 | 19ms |
BiRefNet-Lite 1024×1024分辨率
| 运行后端 | 计算精度 | 推理耗时 |
|---|---|---|
| CPU | f32 | 4505ms |
| Vulkan GPU | f16 | 85ms |
推理速度与PyTorch、ONNX Runtime处于同一量级,但启动速度、内存占用、部署体积优势显著。
六、落地用途与场景
6.1 端侧与嵌入式视觉
工业相机、智能家居、安防设备、车载终端这类嵌入式场景,算力和内存有限,无法承载重型框架。这套纯C++引擎可以直接编译进固件,轻量高效,离线运行无需网络,非常适合端侧实时视觉任务。
6.2 桌面软件内嵌
桌面图像工具、设计软件、离线修图类产品,可以直接内嵌这套推理引擎,不需要用户额外安装Python、CUDA等依赖,软件体积增加极小,即可提供AI视觉功能。
6.3 离线批量处理
批量图像分割、批量超分、批量深度估计这类离线任务,无需搭建Python环境,单个可执行文件即可批量处理,部署简单、资源占用低,适合服务器批量作业或者本地批量处理。
6.4 自定义视觉算法快速落地
企业有自研的视觉模型,需要快速落地到端侧或者生产环境,可以基于这套引擎快速实现,复用底层的张量计算、硬件加速、图像处理能力,无需从零搭建推理引擎,大幅缩短开发周期。
If you need the complete source code, please add the WeChat number (c17865354792)
七、总结
这套纯C++计算机视觉推理引擎,把大模型领域的轻量化思路延伸到了计算机视觉领域,用GGUF统一模型格式、ggml做计算底座、模块化设计模型,解决了传统CV部署依赖重、体积大、端侧难落地的痛点。
它的定位不是替代PyTorch这类训练研究框架,而是专注于部署侧的轻量化和易用性,让计算机视觉AI也能像大语言模型一样,轻量、快速、方便地部署在各种端侧和嵌入式设备上,是端侧视觉推理非常有价值的技术路线。
Welcome to follow WeChat official account【程序猿编码】