画像処理は、CPUを酷使する悪名高い仕事です。
ですので、リアルタイムで画像処理をするのにPythonで試みるのは馬鹿げており、高速な言語でアルゴリズムを実装する必要があります。
Pythonは明らかにこのタスクに十分な速度がありません。そうですよね?
実際には、画像処理において、PyPy JITコンパイラはリアルタイムのビデオ処理を行うために十分な速さのコードを生み出すことが判明しました。
sobel.pyは、画像、Sobel operatorのエッジを強める古典的な方法を実装しています。それは、グラデーションの大きさの近似値です。
処理時間は画像と3x3カーネルの間の2つの畳み込み処理に費やしています。
この処理は、入力画像を出力画像へピクセルを越えてコピーするシングルループで構成されています。
あなたは適切ななデモをダウンロードしてあなた自身で試すことができます。
- pypy-image-demo.tar.bz2: このアーカイブはソースコードのみを含んでいます。これは既にインストールされているPyPyを必要とします。
- pypy-image-demo-full.tar.bz2: このアーカイブは、Linux32bitと64bitのソースコードとビルド済みのPyPyバイナリの両方が含まれています
$ pypy pypy-image-demo/sobel.py
$ pypy pypy-image-demo/magnify.py
デフォルトでは、2つのデモはサンプルのAVIファイルを使用します。
より多くの楽しみを得るために、例に従いMPlayerに適切なパラメータを渡すことで、ウェブカメラを使用することができます。
$ pypy demo/sobel.py tv://
デフォルトではmagnify.pyは近傍法を使用します。
オプション-bを追加することにより、バイリニア補間が代わりに使用され、より滑らかな結果が与えられます。
$ pypy demo/magnify.py -b
magnify.pyのアルゴリズムの実装はただ一つしかありません。
二つの異なった挿入メソッドは実装されます。クラスのサブクラス化に
画像を表現し、補間を埋め込むピクセルアクセスメソッドの内側でよく使われます。
PyPyは画素アクセス法をインライン化し、アルゴリズムの実装を特化できるので、良好なパフォーマンスをこの抽象化で達成することができます。
C++では、画素アクセス法のようなものは仮想的になり、実行時のオーバーヘッドを招くことなく同じ効果を得るためにテンプレートを使用する必要があります。
上記のビデオは、PyPyとCPythonが並んでsobel.pyを実行しているところです。
(PyPyはウェブカメラから入力を受け、CPythonはテストファイルから入力を受けます)
また、PyPyがCPythonよりどのくらい高速であるか実感したいならば、後でデモを走らせて下さい。これらは、上記tarballリンクの標準のtest.avi ビデオとPyPyプレビルドバイナリを使用した際のマシン((Ubuntu 64 bit, Intel i7 920, 4GB RAM))での平均したfps(frames per second)です。
sobel.pyの場合:
- PyPy: ~47.23 fps
- CPython: ~0.08 fps
- PyPy: ~26.92 fps
- CPython: ~1.78 fps
magnify.pyでは、それほど違いは明白ではなく高速化は"たった"15倍です。
このことはPyPyができる極端な例であることに注意しなければいけません。
とりわけ、期待してはいけません(まだ :-))
これがPyPyができることの極端な例であることに注意しなければなりません。 特に、あなたは予想できません(まだ(^o^))。 リアルタイムのときに任意のビデオ処理アルゴリズムを走らせるほど速いPyPy、デモだけがPyPyにはそこに到着する可能性があるとまだ立証しています。
PyPyに、リアルタイムで任意のビデオ処理アルゴリズムを実行するのに十分な速さを期待することはできません。しかしデモの結果は、PyPyが十分な速度を達成する可能性を秘めていることを証明しています。
(原文:Posted by Antonio Cuni)
0 件のコメント:
コメントを投稿