簡體   English   中英

Python PILLOW 庫使用 CPU 進行圖像處理,可以在 GPU 上完成嗎?

[英]Python PILLOW library uses CPU for Image Processing, can it be done on GPU?

我為自己制作了一個小型 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 它與枕頭兼容,但許多內部循環已被替換為手寫矢量代碼。 您通常可以預期圖像大小調整步驟有 6 到 10 倍的加速

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 的 ram 和 6k x 4k JPG 圖像,因此很容易填充內存。 你可能需要稍微調整一下。 vipsthumbnail只需要幾 mb 的內存,因此您可以安全地一次運行多個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM