一、项目核心释义
这是一套完全自包含的纯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的实现差异,上层模型代码无需修改即可切换硬件后端。
后端初始化核心逻辑:
// 初始化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调用示例
...intmain(){// 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");return0;}If you need the complete source code, please add the WeChat number (c17865354792)
内部实现逻辑
- 模型加载:解析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 源码编译步骤
# 基础CPU版本编译 cmake.-B build cmake--build build--config Release启用Vulkan GPU加速
需要先安装Vulkan SDK,再执行编译:
cmake.-B build-D VISP_VULKAN=ON cmake--build build--config Release编译完成后,可执行文件生成在bin目录下。
5.3 命令行工具使用
提示式图像分割
# 输入图像+提示框坐标,输出分割掩码./bin/cv_infer-m MobileSAM-F16.gguf-i input.jpg-p420120650430-o mask.png # 生成叠加原图的合成效果图./bin/cv_infer-m MobileSAM-F16.gguf-i input.jpg-p420120650430--composite output.png二分类前景分割
./bin/cv_infer birefnet-m BiRefNet-lite-F16.gguf-i input.jpg-o mask.png--composite comp.png单目深度估计
./bin/cv_infer depth-anything-m Depth-Anything-V2-Small-F16.gguf-i input.jpg-o depth.png图像修复
./bin/cv_infer migan-m MIGAN-512-places2-F16.gguf-i image.png-m mask.png-o output.png图像超分辨率
./bin/cv_infer esrgan-m ESRGAN-4x-foolhardy_Remacri-F16.gguf-i input.png-o output.png5.4 模型转换
原生PyTorch模型需要转换为GGUF格式才能使用:
# 安装uv工具 pip install uv # 执行转换脚本,arch参数对应模型类型 uv run scripts/convert.py<arch>MyModel.pth转换后会生成GGUF格式的模型文件,同时会做张量重排和预计算优化,推理效率更高。
5.5 测试与验证
编译时启用测试套件:
cmake.-B build-DVISP_TESTS=ON cmake--build build--config Release # 运行C++单元测试 cd build ctest-C ReleasePython绑定测试:
# 安装开发依赖 uv sync--dev # 运行Python测试 uv run pytest5.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 自定义视觉算法快速落地
企业有自研的视觉模型,需要快速落地到端侧或者生产环境,可以基于这套引擎快速实现,复用底层的张量计算、硬件加速、图像处理能力,无需从零搭建推理引擎,大幅缩短开发周期。
七、总结
这套纯C++计算机视觉推理引擎,把大模型领域的轻量化思路延伸到了计算机视觉领域,用GGUF统一模型格式、ggml做计算底座、模块化设计模型,解决了传统CV部署依赖重、体积大、端侧难落地的痛点。
它的定位不是替代PyTorch这类训练研究框架,而是专注于部署侧的轻量化和易用性,让计算机视觉AI也能像大语言模型一样,轻量、快速、方便地部署在各种端侧和嵌入式设备上,是端侧视觉推理非常有价值的技术路线。