gpt4 book ai didi

Python PILLOW 库使用 CPU 进行图像处理,可以在 GPU 上完成吗?

转载 作者:行者123 更新时间:2023-12-04 22:28:47 26 4
gpt4 key购买 nike

我为自己制作了一个小型 Python 3.x 应用程序,它可以按特定的给定百分比调整文件夹中所有图像的大小。

该应用程序支持多核 CPU,因为它将在与 CPU 一样多的线程上完成的工作分开。

这里的瓶颈是 CPU,因为我的 RAM 内存保持 40% 空闲,运行时我的 HDD 使用率为 3%,但所有 CPU 内核都接近 100%。

有没有办法在 GPU 上处理图像?我认为它会大大提高性能,因为 GPU 有超过 4 个内核。

下面是一些关于如何完成处理的代码:

def worker1(file_list, percentage, thread_no):
"""thread class"""
global counter
save_dir = askdir_entry.get() + '/ResizeImage/'
for picture in file_list:
image = Image.open(picture, mode='r')
image_copy = image.copy()
(width, height) = image.size
filename = os.path.split(picture)[1]
image_copy.thumbnail((width * (int(percentage) / 100), height * (int(percentage) / 100)))
info_area.insert('end', '\n' + filename)
info_area.see(tkinter.END)
image_copy.save(save_dir + filename)
counter += 1
if counter % 3 == 0:
update_counter(1, thread_no)
update_counter(0, thread_no)


def resize():
global start_time
start_time = timeit.default_timer()
percentage = percentage_textbox.get()
if not percentage:
info_area.insert('end', 'Please write a percentage!')
return
askdir_entry.config(state='disabled')
percentage_textbox.config(state='disabled')
file_list = glob.glob(askdir_entry.get() + '/*.jp*g')
info_area.insert('end', 'Found ' + str(len(file_list)) + ' pictures.\n')
cpu = multiprocessing.cpu_count()
info_area.insert('end', 'Number of threads: ' + str(cpu))
info_area.insert('end', '\nResizing pictures..\n\n')
if not os.path.exists(askdir_entry.get() + '/ResizeImage'):
os.makedirs(askdir_entry.get() + '/ResizeImage')
counter_label.config(text='-')
for i in range(0, cpu):
file_list_chunk = file_list[int(i * len(file_list) / cpu):int((i + 1) * len(file_list) / cpu)]
threading.Thread(target=worker1, args=(file_list_chunk, percentage, i + 1)).start()

最佳答案

图像调整大小实际上不是非常占用 CPU 的。您会发现您的大部分时间都花在了图像解码和编码库上,而 GPU 几乎无济于事。

一个简单的方法是尝试将 PIL 换成 pillow-simd .它与枕头兼容,但许多内部循环已被替换为手写矢量代码。您通常可以期待 a 6x to 10x speedup for the image resizing step .

libjpeg 支持在加载时非常快速地收缩。作为图像解码的一部分,它可以进行 x2、x4 或 x8 缩小——对于大的缩小,您可以轻松获得 20 倍的加速。您需要研究如何在枕头中启用此功能。

您还可以考虑其他图像处理库。 libvips具有用于图像缩小的快速且低内存的命令行工具, vipsthumbnail .结合GNU parallel ,您可以轻松获得巨大的加速。

例如,我可以创建一个包含 1,000 张大型 JPG 图像的目录:

$ vipsheader ../nina.jpg 
../nina.jpg: 6048x4032 uchar, 3 bands, srgb, jpegload
$ for i in {1..1000}; do cp ../nina.jpg $i.jpg; done

然后像这样用 imagemagick 缩小:
$ time for i in {1..1000}; do convert $i.jpg -resize 128x128 tn_$i.jpg; done
real 6m43.627s
user 31m29.894s
sys 1m51.352s

或者使用 GNU parallelvipsthumbnail像这样:
$ time parallel vipsthumbnail -s 128 ::: *.jpg
real 0m11.940s
user 1m15.820s
sys 0m11.916s

大约快 33 倍。

您可以使用 convertparallel , 但每个 convert进程需要大约 400mb 的内存和 6k x 4k JPG 图像,所以很容易填满内存。你可能需要稍微调整一下。 vipsthumbnail只需要几 mb 的内存,因此您可以安全地一次运行多个实例。

关于Python PILLOW 库使用 CPU 进行图像处理,可以在 GPU 上完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41825593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com