使用GPU加速图片处理的多种方案解析
图片处理是最常见的任务之一。如果是熟悉计算机视觉方向的肯定对OpenCV+Numpy的方案不陌生:用OpenCV读取图片,用Numpy的矩阵操作快速完成处理。由于OpenCV支持所有格式的图片,而Numpy对于其内置的算法都实现了CPU端的并行化,因此这一套流程可以很方便又快速地实现图片处理。
然而,当且仅当你的处理算法可以用Numpy的操作实现时,才能够得到满意的加速效果。如果你的算法需要遍历矩阵,效率就会大大折扣。我之前写了一篇如何使用NVidia的Falcor框架来实现快速的图片处理的文章,感兴趣的可以了解一下。但是这个方案要求大家熟悉shader的编写,对于不太了解图形学的人来说可能稍微有些吃力。在这篇文章里我会分析一些简单的替代方案。
Numba
Numba是一个很简单的提高矩阵遍历速度的工具。只需要在你定义的函数前加上@numba.jit(),其就会自动对函数中的循环进行加速。使用的例子如下:
import numba as nb
import numpy as np
@nb.jit()
def nb_cpy(a):result = np.zeros(a.shape, np.float32)for i in range(len(a)):result[i] = a[i]return result
但是直接这样使用其只会使用CPU来加速遍历,实际测试中效率的提升并不是很显著。如果希望使用GPU来进行加速,就会相对麻烦一些(需要一些CUDA知识),超过了本篇的讨论范围,具体可以参考一些相关文章。
Taichi
相比于Numba,还有一个更方便的工具:Taichi。Taichi是一个高效的图形学库,其提供了Python前端以方便使用。并且也提供了类似Numba的自动将循环并行化的功能。不同于Numba的是,其可以选择计算后端(CPU、CUDA或者是渲染API的Compute Shader),因此理论上用户可以在不进行显示的GPU编程的情况下实现高效的图片并行处理。
由于Taichi并不支持所有的图片类型(比如exr格式),因此可以使用OpenCV来读取图片,然后使用from_numpy接口把numpy array转成taichi field,并且用to_numpy接口把taichi field转成numpy array。以下是使用案例:
x = ti.field(ti.f32, 4)
x_np = np.array([1, 7, 3, 5])
x.from_numpy(x_np)x_np = x.to_numpy()
Taichi的使用官方给了以下例子:
import taichi as titi.init(arch=ti.gpu)n = 320
pixels = ti.field(dtype=float, shape=(n * 2, n))@ti.func
def complex_sqr(z):return ti.Vector([z[0]**2 - z[1]**2, z[1] * z[0] * 2])@ti.kernel
def paint(t: float):for i, j in pixels: # Parallized over all pixelsc = ti.Vector([-0.8, ti.cos(t) * 0.2])z = ti.Vector([i / n - 1, j / n - 0.5]) * 2iterations = 0while z.norm() < 20 and iterations < 50:z = complex_sqr(z) + citerations += 1pixels[i, j] = 1 - iterations * 0.02gui = ti.GUI("Julia Set", res=(n * 2, n))for i in range(1000000):paint(i * 0.03)gui.set_image(pixels)gui.show()
只需要在需要并行计算的函数前加上@ti.kernel装饰,其中的循环就会自动并行处理,不需要手写cuda kernel。
例子
下面用一个例子来对比一下这些方案。这里用[Yang et al 2011][1]的Image-space bidirectional scene reprojection算法为例子。这是一个用于实时渲染的帧插值算法,其通过两帧画面插值出中间帧。这里对比三种实现方式:简单的Python实现、Numba加速和Taichi加速;实验在720p分辨率下进行,CPU为12核心的3900X,GPU为RTX3090。
方法 | Python | Numba | Taichi |
时间(s) | 1500 | 1260 | 0.5 |
(实际实验中发现直接给函数加上@nb.jit()装饰之后出现了大量warning,似乎是编译过程中的类型不匹配之类的问题,具体等之后有时间再检查一下)
可以发现使用了GPU加速的Taichi相比于其他两种方法速度上有了超过1000倍的提升。因此如果算法中包含大量的循环,使用Taichi不失为一个好选择。
(虽然实际实现中还是遇到了不少坑,对比之下用Falcor可能是更加简单的方案吧。。)
总结
当然上述的这些方案都只适用于需要写循环遍历矩阵的算法。如果你的算法能够用OpenCV或Numpy的操作直接实现时,直接用这些成熟的工具才是最合适的。而且可能还要考虑一下学习成本,根据具体的项目需求选择合适的方法。
参考文献
[1] YANG L., TSE Y.-C., SANDER P. V., LAWRENCE J., NEHAB D., HOPPE H., WILKINS C. L.: Image-based bidirectional scene reprojection. ACM Transactions on Graphics (Proc. SIGGRAPH Asia 2011) 30, 6 (2011).
使用GPU加速图片处理的多种方案解析相关推荐
- PS 开启GPU加速图片处理
还认为你的电脑的速度效果比不上苹果吗?还在嫌电脑渲染速度慢吗?试一下,电脑开启GPU硬件加速吧!只要有独显轻松加速(毕竟苹果笔记本要配独显电脑的价格基本上在15000以上,而且显卡的性能还不怎么好) ...
- c++中文件的读处理多种方案解析
C++中读文件的方法 1. 读文件准备工作 2. 读取文件的3种方法举例说明 1.getline()全局函数 2. 流输入方式ifs<\ 1. 读文件准备工作 1.前提,首先读文件需要引入头文件 ...
- 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型
GPU 已经成为支撑 AI 应用的一种关键计算加速设备,GPU 的多处理器架构非常适合用来加快深度神经网络应用中的大量矩阵运算过程.大量实测数据表明,跟通用处理器相比,GPU 在运行深度神经网络时具有 ...
- 如何使用nVidia Falcor渲染框架进行GPU加速的图片处理
图片处理在很多领域中都有很大的需求,比如计算机视觉等.比较简单且常用的方法是用openCV读取图片,然后用numpy进行图片处理.然而,只有当处理算法能够完全用numpy中提供的矩阵操作实现时,才能够 ...
- Cifar-10 卷积神经网络 的python实现(绘图,自动下载,模型存取,图片显示,GPU加速)
目录 Cifar-10及模型文件下载: 如果嫌自动下载太慢 :cifar-10下载 已多次训练的模型文件 73%(放置在.py同目录下)(第一种模型) 过拟合程度较低的模型文件70%(放置在.py ...
- 探讨TensorRT加速AI模型的简易方案 — 以图像超分为例
AI模型近年来被广泛应用于图像.视频处理,并在超分.降噪.插帧等应用中展现了良好的效果.但由于图像AI模型的计算量大,即便部署在GPU上,有时仍达不到理想的运行速度.为此,NVIDIA推出了Tenso ...
- ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能
1. 简要回顾 首先简单复述一下FFmpeg中对深度学习的支持情况,如上图所示,FFmpeg在libavfilter中支持基于深度学习的filter,目前已经支持sr, derain和dnn_proc ...
- 深度神经网络移动终端GPU加速实践
深度神经网络移动终端GPU加速实践 前言 AI无疑是近几年的超级风口,"All in AI"等押宝AI的口号层出不穷,AI的风头一时无两.实现AI有很多种途径方法,这其中深度学习神 ...
- 利用gpu加速神经网络算法,外接gpu 训练神经网络
神经网络做图像分类一定要用到gpu吗? GPU最大的价值一直是"accelerating"(加速),GPU不是取代CPU,而是利用GPU的并行计算架构,来将并行计算的负载放到GPU ...
最新文章
- 操作系统---Systemd
- MyBatis 中的九种设计模式
- python输出日期的模版_python按日期区间生成markdown日记模板
- 【C++】error C2512: 'Adder' : no appropriate default constructor available
- 【C++】语法小知识
- 学校电用计算机控制的,高等学校适用教材:计算机控制技术
- js贪心算法---背包问题
- weex 在 iOS 上如何实现常见的网络缓存
- 8备份sqlserver_关于SQL server 巡检的要点你都知道吗?
- TensorFlow 2.0开发者预览版放出!上手尝鲜可以开始了
- Emacs + ecb使用(Emacs必须24.3以上版本)
- python 数据库框架peewee_Python:轻量级 ORM 框架 peewee 用法详解之——增删改查
- Google cloud 存储 Storage
- 外贸企业财务软件的选用
- 博弈论个人的一点小总结
- StringJoiner拼接字符串(使用以及源码解析)
- 解决移动端上用overflow-y:scorll样式生硬的问题
- 中山大学新华学院计算机,中山大学新华学院信息科学学院电子信息科学与技术、计算机科学与技术、软件...
- 【单片机开发】智能小车工程(寻迹)
- 单链DNA核酸适配体修饰二氧化硅微球/SiO2/Fe3O4磁性微球的制备与研究
热门文章
- hgame 2022 PWN 部分题目 Writeup
- JVM老生代增长过快问题排查
- 土木搬砖工图形学学习之路——射线与包围盒的相交测试
- node卸载淘宝镜像
- matlab 零极点分布图,用matlab设计一个程序,直接输入一组零极点,就可以得到零极点图。这应- 一起装修网...
- value iteration和Q-learning算法
- 当前人类社会面临的人工智能安全问题有哪些?
- java8 新特性精心整理(全)——新 Date/Time API
- Flutter Text 行高相关
- 华为鸿蒙系统朋友圈扩大,华为发力全屋智能新赛道,能弥补手机下滑留下的空缺吗?...