ppl.cv来自sensetime中不同团队的图像处理需求,并提供了一组常用图像算法的高性能实现,用于不同的深度学习应用程序。 它是一个轻量级的、可定制的图像处理框架。由于OpenCV等框架的实现量大且依赖性复杂,我们希望在开发和/或部署深度学习工具包时,提供一个灵活的框架,只需使用所需的算法即可满足各种图像处理应用程序。有了ppl.cv,开发人员可以添加一个新的平台来支持一种新的硬件和/或一个新图像处理算法的新实现来支持一个新应用程序。用户可以为他们指定的平台和算法选择图像处理实现,以生成一个小型紧凑的图像处理库进行部署。 它是一个用于深度学习的高性能图像处理库。我们已经在这个框架中填充了几个受支持的平台和大量精心选择的功能,以实现深度学习管道中的图像处理。由于基于视觉的深度学习带有大量图像,因此每个功能都在硬件方面进行了优化,以获得良好的加速效果。为了方便ppl.cv的使用,在函数文档中有一个简短的调用示例,一个用于检查与OpenCV中对应函数一致性的单元测试,以及一个用于比较与OpenCV的对应函数性能的基准,此外还有每个函数的实现。 我们的目标 ppl.cv中的函数与OpenCV中的函数对齐。在计算机视觉行业,OpenCV是最受欢迎的库,已被世界各地的专业人士使用多年,并且OpenCV中的实现符合算法中精确的数学原理,因此我们向它致敬。为了降低研究成本,ppl.cv中的每个函数都与OpenCV中的对应函数在功能及其接口方面保持一致。在OpenCV中,我们没有使用抽象的数据类型来表示图像,而是采用了几种描述2D像素阵列的低级别C数据类型的组合,这些数据类型包括数据指针、高度、宽度和行步长,以便于不同硬件及其相应的编程语言之间的兼容性。为了获得良好的精度,我们倾向于在算法中实现数学原理,并尽可能在ppl.cv中实现它们。考虑到浮点计算平台的硬件和软件差异,ppl.cv中绝大多数函数的输出与OpenCV中CPU函数的输出一致,后者严格遵循数学原理或用整数量化近似。 ppl.cv中的函数是自包含的。考虑到图像处理的巨大深度学习需求以及为应用程序部署移植OpenCV函数的复杂性,ppl.cv旨在为每个函数提供独立的实现和可定制的图像处理库。每个函数都有自己的声明、文档、实现以及独立或有限共享的单元测试和基准测试。我们通过消除函数之间的依赖性来解耦函数,并通过为每个平台维护最小的公共基础设施来减少对其他定义的依赖。开发人员和用户可以根据自己的意愿添加或删除平台/功能,因此ppl.cv对开发和部署非常友好。 ppl.cv中的函数追求极致性能。通过理论分析和实验测试,我们发现大多数函数的计算都是内存约束的,而少数函数的计算是计算约束的。对于每个特定的硬件平台,在内存访问和计算方面都进行了深度优化。对于内存访问,它通过采用满足要求的较小数据结构来提高性能,减少内存分配和释放、地址对齐、缓存友好型内存访问、矢量加载和存储等。对于计算,它使用指令并行、定点量化、压缩操作,以及在保持精度的同时用浮点运算代替双点运算。与OpenCV中的函数相比,ppl.cv中的每个函数都获得了更好的加速。 ppl.cv与ppl.nn协同工作。作为深度学习应用程序管道的一步,ppl.ccv与ppl.cn在图像接口方面达成了协议,它们可以有效地协同工作。 支持的平台 目前,ppl.cv支持主流桌面和移动CPU/GPU的几个流行平台,包括x86、CUDA、aarch64、risc-v、OpenCL。 支持的算法 目前,ppl.cv涵盖的图像处理算法包括算术运算、颜色空间转换、直方图、滤波、形态学、图像金字塔采样、图像缩放和变换等。未来,我们准备添加一些与图像解码和VSLAM(视觉同步定位和映射)相关的新算法。 如何快速构建 该项目由cmake脚本配置。提供了一个简单的构建脚本。 Linux$ git clone https://github.com/openppl-public/ppl.cv.git
$ cd ppl.cv
$ ./build.sh x86_64 # for linux-x86_64
$ ./build.sh aarch64 # for linux-aarch64
$ ./build.sh cuda # for linux-x86_64_cuda
$ ./build.sh riscv # for linux-riscv
|
说点什么...