不止轻量,高性能图像处理库ppl.cv来袭

OpenPPL OpenPPL     2022-11-28     619

关键词:

x86,aarch64 和 CUDA 三个平台,并计划加入对 RISC-V 平台的支持,未来也将根据社区反馈支持更多的架构后端。

  • ppl.cv x86 架构为广泛支持各种机器,大多数算子会采用 sse 指令集进行优化,少数算子会在sse 指令集性能仍不理想时采用 AVX 指令集甚至 FMA 指令集进行优化,可以覆盖绝大多数应用场景。

  • ppl.cv aarch64 架构为 ARM Server而生,我们积极拥抱 ARM 全面向 64 位转换。当然,ppl.cv在移动端aarch64上的性能也不容小觑哦。

  • ppl.cv CUDA 支持计算能力 3.5 以上英伟达 GPU,包括Kepler/Maxwell/Pascal/Volta/Turing/Ampere 等架构的芯片,CUDA 支持英伟达发布的所有版本,建议使用 CUDA 7.0 以上较新版本。

  •  

    ppl.cv 的优势

    一、功能与接口对齐 OpenCV

    OpenCV 是计算机视觉领域里,诸多图像处理库中算子实现算法数学原理严谨、用户广泛的典范,ppl.cv 在功能和接口上对齐 OpenCV。

    ppl.cv 各平台的各算子均实现 OpenCV 中同接口函数的全部或部分功能,而且两者结果除平台硬件差异导致的精度差异外皆对齐。接口参数中,大部分采用与 OpenCV 接口一致的形参。涉及存储的地方,ppl.cv 与常规算法一样采用标准的存储,即存储指针,外加数组高、宽、每行数据占用大小等参数表征二维数组,未如 cv::Mat 进行封装。

    ppl.cv 以此降低用户的学习成本,提高 ppl.cv 的使用效率。


    二、函数耦合度低

    考虑到 OpenCV 的庞大深度学习应用需求和移植 OpenCV 算子的复杂度,ppl.cv 设计时便规划降低算子之间的耦合度,降低算子对其他定义的依赖。

    除了对部分各平台共享类型定义的依赖,大部分算子没有或只有较少依赖,以便于移植和个性化定制。ppl.cv 用户既可以完整地使用 ppl.cv 库,也可以只采用某个硬件平台对应的 ppl.cv 库,还可以按需裁剪只采用某个硬件平台对应 ppl.cv 库的一个或若干算子,非常适合做个性化定制,避免被 cv 库的体量束缚应用开发。


    三、极致性能

    最后也是最重要的一点,OpenPPL 的一贯要求就是追求极致性能,ppl.cv 在各个架构下绝大部分都比 OpenCV 要快。

    ppl.cv 针对特定硬件平台,从存储访问和计算两方面做了深度优化。通过理论分析和实验测试发现大部分算子为 memory bound 类型的函数,少量算子为 compute bound 类型的函数。

    对于存储访问,ppl.cv 通过采用满足的较小数据结构、减少存储分配和释放、地址对齐和 cache 友好的存储访问方式提升存储访问性能。对于计算,ppl.cv 通过定点量化、压缩运算和在满足精度的前提下采用 float 运算替换 double 运算等优化手段。

    与 OpenCV 相应实现相比,获得了较好的加速比。

    ppl.cv,又快又轻

    一、x86 benchmark

    我们取了几个经典算子在一些经典分辨率的图像尺寸下与 OpenCV 的性能数据对比,图像一般都是以 uint8 的数据类型存储,所以我们 benchmark 选择 uint8 类型的数据展示,当然 ppl.cv 对 float 类型的图像也做了深度优化。Benchmark 均采用 intel Xeon 10980 处理器单核单线程测试。

    △ 颜色空间转换中的 NV12 图像转为 BGR 图像的算子

    △ 图像处理形态学类型中膨胀算子经典的 3x3kernel 的性能数据对比

     

    二、CUDA benchmark

    OpenCV 中部分算子有 x86/CUDA 两种实现,部分只有 x86 实现,ppl.cv.cuda 以OpenCV x86/CUDA 已有实现中最快的版本作为性能测试对比对象。

    对于某一个算子,性能测试根据输入参数类型和取值设计具有较广覆盖面的参数组合进行测试,计算与 OpenCV 实现相对的加速比并排序,参考统计学中的盒图概念,以最小加速比、中位数加速比和最大加速比作为函数性能对比指标展示 ppl.cv.cuda 的性能。

    ppl.cv.cuda 共开源 174 APIs。其中,156 APIs 取得 1~59 倍不等的加速比,14 APIs 仅最小加速比小于 1,4 APIs 最小和中位数加速比小于 1,其中 norm/integral 算子因为算法串行特性慢于 OpenCV x86(但快于 OpenCV CUDA 实现)。

    下图为以 BitwiseAnd() 为例,ppl::cv::cuda::BitwiseAnd() 与 cv::cuda::bitwise_and() 不同参数组合下的性能对比(Time 列数值为算子平均执行时间):

     

    三、aarch64 benchmark

    ppl.cv aarch64 架构初期开源了部分与 OpenMMLab 模型前处理所必需的算子,后续我们会继续开源更多的 cv 算子,达到接口和 x86,CUDA 等架构完全对齐。benchmark 均采用鲲鹏 920 处理器单核单线程测试。

    △ 颜色空间转换中的彩色图像转为灰度图像的算子

    △ 图像处理形态学类型中腐蚀算子经典的 3x3kernel 的性能数据对比


    ⭐️ 欢迎 star 

    [开源]gnet:一个轻量级且高性能的golang网络库(代码片段)

    ...r一下暗中观察哦。简介gnet是一个基于Event-Loop事件驱动的高性能和轻量级网络库。这个库直接使用epoll和kqueue系统调用而非标准Golang网络包:net来构建网络应用,它的工作原理类似于两个开源的网络库:libuv和libevent。这个项目 查看详情

    轻量级 C++ 图像库 [关闭]

    】轻量级C++图像库[关闭]【英文标题】:light-weightC++imagelibrary[closed]【发布时间】:2012-08-0217:35:20【问题描述】:我一直在寻找用于C++的简单、小巧但健壮且快速(不全面!)的图像库(如果没有可用的C++版本,C就足够了)。我... 查看详情

    限时领奖消息队列mns训练营重磅来袭,边学习充电,边领充电宝~

    简介:阿里云云原生阿里云消息队列MNS定位是RocketMQ轻量版,提供轻量模型、轻量HTTPRESTful协议,运维轻量、计费轻量,具备易集成等特点。阿里云云原生阿里云消息队列MNS定位是RocketMQ轻量版,提供轻量模型... 查看详情

    限时领奖消息队列mns训练营重磅来袭,边学习充电,边领充电宝~

    简介:阿里云云原生阿里云消息队列MNS定位是RocketMQ轻量版,提供轻量模型、轻量HTTPRESTful协议,运维轻量、计费轻量,具备易集成等特点。阿里云云原生阿里云消息队列MNS定位是RocketMQ轻量版,提供轻量模型... 查看详情

    嵌入式应用的超轻量级高性能的c/c++日志库

    ...。资料下载EasyLogger是一款超轻量级(ROM<1.6K,RAM<0.3K)、高性能的C/C++日志库,非常适合对资源敏感的软件项目,例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C/C++日志库,EasyLo... 查看详情

    英特尔十代酷睿硬核来袭!惠普战66三代轻薄笔记本首发评测

    ...战66三代毫无疑问是一款办公利器。  一向主打轻薄、高性能、高颜值的惠普战66系列,早已成为年轻商务精英们的宠儿,所以相较于外观设计,我更关注此次升级到十代酷睿处理器后,其性能的提升究竟有多强?以及惠普战66... 查看详情

    轻量的处理时间和日期的day.js库-使用案例(代码片段)

    安装npminstalldayjs--saveimportdayjsfrom'dayjs'//或者CommonJS//vardayjs=require('dayjs');dayjs().format();CDN:<scriptsrc="https://unpkg.com/dayjs"></script>< 查看详情

    基于事件驱动的高性能开源网络库libevent介绍及安装

    参考技术Alibevent是一个轻量级的基于事件驱动的高性能的开源网络库,并且支持多个平台,对多个平台的I/O复用技术进行了封装,当我们编译库的代码时,编译的脚本将会根据OS支持的处理事件机制,来编译相应的代码,从而在l... 查看详情

    8月赛道新秀强势来袭,维乐prevailtt1a57粉墨登场~

    ...xff0c;更有让人印象深刻的绝佳性能。  这款全新的短鼻轻量坐垫也同样选用了悬架弓避震技术,外加超轻量并减震力一流的碳底壳设计让骑行过程平滑顺畅。一开始的坐感并不是非常的柔软,但是骑行了一段时间之后&# 查看详情

    Cassandra 中的轻量级事务性能

    】Cassandra中的轻量级事务性能【英文标题】:Light-weight-transactionPerformanceinCassandra【发布时间】:2021-10-1713:54:23【问题描述】:根据cassandra文档,LWT性能很差。在以下场景中;场景一;从cassandra读取(线程1)如果上述步骤未返回... 查看详情

    libevent学习过程

    ...个基本认识。Libevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动(event-driven),高性能;轻量级,专注于网络。  什么是事件通知库,事件驱动是什么?经典软件设计模型-事件驱动... 查看详情

    云起赋新|亚马逊云科技高性能计算创新论坛精彩来袭!

    高性能计算(HPC)和云计算曾是两个“平行世界”,各自演绎着精彩,却鲜有交集。传统上,HPC主要应用于大规模计算,如天气预报、石油勘探、药物研发等。这些任务通常借助超级计算机或计算集群运行... 查看详情

    基于thrift的跨语言高可用高性能轻量级的rpc框架

    功能介绍跨语言通信方便的使Java、Python、C++三种程序可以相互通信负载均衡和容灾处理方便的实现任务的分布式处理支持服务的水平扩展,自动发现新的服务节点能够兼容各种异常情况,如节点的异常down机可视化管理通过服务... 查看详情

    synchronized锁性能优化偏向锁轻量级锁升级多线程中篇

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了这也是为什么官方建议使用synchronized的原因... 查看详情

    libevent和基于libevent的网络编程

    ...vent介绍和安装介绍libevent是一个轻量级的基于事件驱动的高性能的开源网络库,并且支持多个平台,对多个平台的I/O复用技术进行了封装,当我们编译库的代码时,编译的脚本将会根据OS支持的处理事件机制,来编译相应的代码... 查看详情

    快速跨平台 C/C++ 图像处理库

    】快速跨平台C/C++图像处理库【英文标题】:FastCross-PlatformC/C++ImageProcessingLibraries【发布时间】:2010-10-2205:37:44【问题描述】:有哪些用于图像处理(调整大小和查找颜色/色调直方图)的跨平台和高性能图像库。不需要gui。这是... 查看详情

    数启扬帆,智聚人才|腾讯云数据库&csdn工程师能力轻量认证发布会重磅来袭!...

    作为三大基础软件之一,数据库技术发展已达半个世纪之久。 曾经,传统数据库市场由甲骨文、IBM和微软等国外巨头主导,而如今,伴随着数据量持续爆增和云计算时代的来临,云与分布式成为数据库领域的... 查看详情

    tom企业邮箱21年回馈四重礼,聚惠不止5折!

    商务人士的福音来啦~初夏悄然来袭,火热的不仅是天气,还有即将来袭的TOM企业邮箱21周年感恩活动,价格一降到底,品质服务更优。收获千元神秘大礼,更有大健康、乐扶贫的爱心馈赠!当身在城市的我们过着富裕的小康生活... 查看详情