ppl.cv是OpenPPL开发的一个高性能图像处理库,旨在为深度学习应用提供轻量级、可定制的图像处理框架。它源于商汤科技不同团队的图像处理需求,提供了一系列常用图像算法的高性能实现,这些算法广泛应用于各种深度学习应用的流程中。
与OpenCV等大型复杂的框架不同,ppl.cv提供了一个灵活的框架,可以满足深度学习应用开发和部署时只需要特定算法的需求。开发者可以轻松地为新的硬件平台添加支持,或为新的图像处理算法添加实现。用户可以根据特定的平台和算法需求,选择相应的图像处理实现,从而生成一个小巧紧凑的图像处理库用于部署。
作为一个专为深度学习设计的高性能图像处理库,ppl.cv已经集成了多个支持平台和大量精心挑选的函数,以满足深度学习流程中的图像处理需求。考虑到基于视觉的深度学习涉及大量图像处理,ppl.cv的每个函数都针对硬件进行了优化,以获得显著的性能提升。
ppl.cv中的函数在功能和接口上与OpenCV保持一致,以降低学习成本。与OpenCV使用抽象数据类型表示图像不同,ppl.cv采用了几个低级C数据类型的组合来描述2D像素数组,包括数据指针、高度、宽度和行步长,以便于在不同硬件和相应的编程语言之间实现兼容。
为了获得良好的精度,ppl.cv尽可能地实现了算法中的数学原理。考虑到不同平台在浮点计算方面的硬件和软件差异,ppl.cv中绝大多数函数的输出与OpenCV中严格遵循数学原理或通过整数量化近似的CPU函数保持一致。
考虑到深度学习对图像处理的巨大需求以及移植OpenCV函数用于应用部署的复杂性,ppl.cv旨在为每个函数提供自包含的实现和可定制的图像处理库。每个函数都有自己的声明、文档、实现以及独立或有限共享的单元测试和基准测试。
ppl.cv通过消除函数之间的依赖关系来解耦函数,并通过为每个平台维护最小的公共基础设施来减少对其他定义的依赖。开发者和用户可以根据自己的意愿添加或删除平台/功能,这使得ppl.cv在开发和部署方面都非常友好。
通过理论分析和实验测试,ppl.cv团队发现大多数函数的计算是内存受限的,而少数是计算受限的。针对每个特定的硬件平台,ppl.cv在内存访问和计算方面都进行了深度优化。
在内存访问方面,ppl.cv通过采用满足需求的更小的数据结构、减少内存分配和释放、地址对齐、缓存友好的内存访问、向量加载和存储等方式来提高性能。在计算方面,ppl.cv使用指令并行、定点量化、压缩操作,以及在保持精度的同时用浮点运算替换双精度运算等技术。与OpenCV相比,ppl.cv中的每个函数都实现了更好的加速效果。
目前,ppl.cv支持多个流行的桌面和移动CPU/GPU平台,包括:
这些平台涵盖了主流的计算架构,使得ppl.cv能够在各种硬件环境中发挥高性能。
ppl.cv目前涵盖的图像处理算法包括:
未来,ppl.cv团队计划添加一些与图像解码和VSLAM(视觉同时定位与地图构建)相关的新算法,进一步扩展其功能范围。
ppl.cv项目使用cmake脚本进行配置,并提供了简单的构建脚本。以下是在不同平台上快速构建ppl.cv的步 骤:
$ git clone https://github.com/openppl-public/ppl.cv.git $ cd ppl.cv $ ./build.sh x86_64 # 用于linux-x86_64 $ ./build.sh aarch64 # 用于linux-aarch64 $ ./build.sh cuda # 用于linux-x86_64_cuda $ ./build.sh riscv # 用于linux-riscv
以VS2015为例:
build.bat -G "Visual Studio 14 2015 Win64" -DPPLCV_USE_X86_64=ON
更详细的构建指南请参考相应平台的文档。