2012-01-10 13 views
3

Python + Python Image Libraryスクリプトには、imageとその上の位置の関数として数学的なインデックスを計算するprocessPixel(image、pos)という関数があります。このインデックスは、単純なforループを使用してピクセルごとに計算されます。マルチスレッドを使って画像をより速く処理する方法はありますか?

for x in range(image.size[0)): 
    for y in range(image.size[1)): 
     myIndex[x,y] = processPixel(image,[x,y]) 

これは時間がかかりすぎています。それをスピードアップする作業を分割するために、どのようにスレッド化を実装できますか?マルチスレッド化されたコードの速さはどれくらいでしょうか?特に、これはプロセッサコアの数で定義されていますか?

+0

また、 'processPixel'が「numpy-ified」になる可能性があります。この場合、あなたの現在の方法よりもはるかに高速化されています。 –

答えて

6

Global Interpreter Lockのためにスレッド化を使用してスピードアップすることはできません。 Pythonインタプリタの特定の内部状態は、そのロックによって保護されているため、その状態を変更する必要のある別のスレッドが同時に実行されることはありません。

multiprocessingを使用して実際のプロセスを生成することでスピードアップできます。各プロセスは独自のインタプリタで動作し、スレッドの制限を回避します。マルチプロセッシングでは、共有メモリを使用するか、各プロセスに独自のデータのコピー/パーティションを与えることができます。

タスクに応じて、1つの画像の処理を並列化するか、画像リストの処理を並列化することができます(後者はpoolを使用して簡単に行うことができます)。前者を使用する場合は、共有メモリとしてアクセスできるArrayにイメージを保存することもできますが、結果を書き込む場所の問題を解決する必要があります(共有メモリへの書き込みはパフォーマンスを低下させる可能性がありますひどく)。また、プロセス間の特定の種類の通信(キュー、パイプ、またはモジュール内の一部の関数の戻り値渡し)には、Pickleを使用してデータをシリアル化する必要があることにも注意してください。これにより、データに一定の制限が課せられます(特に小さなタスクが多い場合)。

、このような操作のパフォーマンスを向上させるための別の方法は、OpenMPを使用してsupport for parallelization独自のを持っている、Cythonでそれらを書いてみることです - でも、私はあることを使用したことがないので、私はそれがいかに多くの助けを知りません。

+0

イメージを処理している(または多くのコンピューティングパワーを必要とする操作を行っている)場合は、GPUも参照する必要があります。 Pythonは確かにそれをサポートしています。 – freakish

+0

@freakishが示唆しているように、この種の問題については、[GPUベース](http://stackoverflow.com/a/8821745/462302)のソリューションを使用する必要があります。あなたがGILとマルチプロセッシングに関して言ったのは正しいのですが、それでもイメージ処理には役に立たないでしょう。配列の処理に関しては効率的な配列処理のために設計されているので、NumPyの使用をお勧めします(http://stackoverflow.com/a/8821745/462302)。 – aculich

0

マルチプロセッシングでDoug Hellmans tutorialを見てください。 Björn氏が指摘しているように、並列処理にはさまざまな問題がありますが、これには多大な労力が必要です。

ヒント:multiprocessing.cpu_count()を使用して、利用可能なコアの数を確認できます。ここで

1

を使用すると、効率的な画像処理を行うための探求したいと思うのライブラリのリストです:

OpenCV - Pythonバインディングが含まれているリアルタイムコンピュータビジョンとイメージ操作のためのプログラミング関数のライブラリです。

PyOpenCLを使用すると、GPUやその他の大規模な並列計算デバイスにPythonからアクセスできます。

PyCUDAPyOpenCL

NumPy and SciPyの姉妹プロジェクトで効率的な画像と配列処理を行うための上記のパッケージと便利かもしれ科学技術計算を行うための基本的なパッケージです。

画像処理を行うために、マルチプロセッシングライブラリは、画像処理を効率的に処理するのに役立つものではないため、オペレーティングシステムスレッドを使用しないでください。何らかの理由で粗い並列処理が必要な場合は、python library for MPIを使用できますが、おそらくGPU-based librariesを使用します。

関連する問題