Python:使用 GPU 进行双三次插值

标签 python cuda scipy interpolation bicubic

<分区>

在 python 中,我使用 scipy.ndimage.zoom 对图像执行双三次插值,但发现上采样速度太慢。我想用其他一些支持 GPU 的 python 库替换它,但遗憾的是我找不到可用于 python 的库。

NVIDIA 提供了一个很好的 example这恰好在 C/C++ 中实现了双三次插值。他们是众所周知的等价物吗CUDA Python我们可以直接使用和替换的示例/库 scipy.ndimage.zoom?

我在网上做了一些搜索,但无法在 python 中找到使用 GPU 的双三次插值。因此,我认为可用的答案不多,这会导致自以为是的答案和垃圾邮件。

最佳答案

它不是 GPU(而是试图利用线程和 CPU 的向量单元),而是 pyvips比 scipy 快很多,你可以测试一下。

我做了一个基准:

import sys
import time

import scipy.ndimage
import pyvips

scale = 10
n_loops = 10

start = time.time()
test_image = scipy.ndimage.imread(sys.argv[1])
for i in range(0, n_loops):
    result = scipy.ndimage.interpolation.zoom(test_image, scale)
end = time.time()

print 'scipy took', end - start

start = time.time()
test_image = pyvips.Image.new_from_file(sys.argv[1])
for i in range(0, n_loops):
    result = test_image.resize(scale).write_to_memory()
end = time.time()

print 'pyvips took', end - start

# transform with both libraries to compare results

ndi = scipy.ndimage.imread(sys.argv[1])
result = scipy.ndimage.interpolation.zoom(ndi, scale)
scipy.misc.imsave('ndi.tif', result)

im = pyvips.Image.new_from_file(sys.argv[1], access='sequential')
result = im.resize(scale)
result.write_to_file('pyvips.tif')

两者都默认为双三次。 pyvips 是一个懒惰的库,所以你需要在最后额外的 write_to_memory() 来生成一个内存数组。

在这个运行 Ubuntu 17.10 的四核/八线程桌面上,带有所有库的打包版本和“lena”测试图像的 512x512 单声道版本,我看到:

$ python zoom.py ~/pics/lena.png 
scipy took 15.6309859753
pyvips took 1.36838102341

GPU upsizer 显然会更快,但也许 pyvips 就足够快了?

如果比较两个输出图像,您会发现 scipy 图像稍微向上移动了一点。您可以更清楚地看到非常小的输入图像发生了什么,例如,这个 3x3 像素图像:

3x3 pixel test image

当 scipy 和 pyvips 放大 20 倍时变成:

20x upsize with scipy and pyvips

这让我很困惑。此外,他们显然使用不同的内核,这也很奇怪。

关于Python:使用 GPU 进行双三次插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619835/

相关文章:

c++ - 训练一个非常大的神经网络

python - 2D 插值导致 OverflowError : Too many data points to interpolate

python - 检查两个 scipy.sparse.csr_matrix 是否相等

python - 根据索引和列合并/连接两个数据框

python - 以数组为索引的 Numpy 切片

ubuntu - OSError : libcublas. so.3: 无法打开共享对象文件: 没有那个文件或目录

c++ - 编译 CUDA 文件、C 文件和 Cuda 头文件

python - 有效地将稀疏 (csc) 矩阵列添加到形状正确的密集 numpy 数组中

python - 限制每个用户对每本书的单一评分 : Django ORM

python - Python 中的 Json 操作