2017-01-24 5 views
1

小さなPython 3.xアプリケーションを作成して、ある特定のパーセンテージでフォルダのすべてのイメージのサイズを変更しました。Python PILLOWライブラリは画像処理にCPUを使用しますが、GPU上で実行できますか?

このアプリケーションは、CPUと同じ数のスレッドで行われた作業を分割するので、マルチスレッドCPUをサポートします。

私のRAMメモリは40%の空きがあり、HDDの使用率は実行時に3%ですが、すべてのCPUコアは100%に近いため、ボトルネックはCPUです。

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() 
+0

私は、別のスレッドからtkinter関数を呼び出すのはいいえではないと思っていたでしょう。私はまた、グローバルインタプリタロックは、複数のスレッドから取得したいと思っているあらゆる利点を邪魔するかもしれないことを示唆しています。私は枕がGPUをサポートしているとは思わないが、多分numpy/scipy [作業](http://stackoverflow.com/questions/6086621/how-to-reduce-an-image-size-in-image-processing-scipy- numpy-python)。 –

+0

理論的には私の4コアCPUが200%改善されているはずですが、複数のスレッドを使用すると50%の改善が得られました。しかし、1つのスレッドでは、CPUコアが1つしか動作していませんでしたが、現在は4つすべてが100%に近づいています。意見をいただき、ありがとうございます。 –

答えて

-1

ただ、アイデア、あなたはあなたのコードの一部についてcythonまたはnumbaを使用することがあります。

関連する問題