Cell Open CV
OpenCV on the Cellのインストールに関する質問をいただいたため、ちょっと試してみました。けっこうおもしろいです。
OpenCVとはインテルが開発・公開している画像処理のライブラリで、Linuxの他Windowsでも動作します。今回始めて知りましたが、画像の回転、エッジ検出などの処理を行う汎用ライブラリです。ドキュメントはここです。
OpenCV on the Cellは、オリジナルのOpenCVをCellに最適化したもので、SPEに処理を分散・並列処理することが可能となっています。
インストール
FixStarsさんのOpenCV on the Cellに従ってインストールします。
Sourcforge project pageから、以下のrpmをダウンロードします。
- opencv-cell-1.0.0-2.ppc.rpm
- opencv-cell-devel-1.0.0-2.ppc.rpm
- cvcell-0.1.0-2.ppc.rpm
- cvcell-demo-0.1.0-2.ppc.rpm
# rpm -ivh <rpmファイル名>でインストールすると、以下のディレクトリにファイルが展開されます。
/opt/cvcell/bin -- コンパイルされたサンプルプログラム
/usr/share/opencv-cell -- サンプルソースなど
.bash_profileを編集して、以下の環境変数を追加します。
CVCELL_SPENUM=6
LD_LIBRARY_PATH=/opt/cvcell/lib:$LD_LIBRARY_PATH
export CVCELL_SPENUM
export LD_LIBRARY_PATH
デモプログラムの実行
/opt/cvcell/binにある顔認識プログラムを動かしてみます。
$ ./facedetect.exe --cascade=haarcascade_frontalface_alt.xml lena.jpg
以下の結果が表示されれば成功です。
--cascade=haarcascade_frontalface_alt.xmlは、正面顔を学習させた識別器の指定です。haarcascade_xxのファイルは、/opt/cvcell/binもしくは /usr/share/opencv-cell/haarcascadesにインストールされます。
OpenCVを使用したプログラムの概要は、このWeb記事が参考になりました。
サンプルプログラムのコンパイル
/usr/share/opencv-cell/samples/cにある、facedetect.cをコンパイルしてみました。おそらく、デモプルグラムとして使用したfacedetect.exeのソースだと思います。そのままコンパイルすることもできるのですが、ヘッダファイルのインクルードでエラーが出るため、ソースを若干変更しました。修正版のソースはここです 。
コンパイルはSDK 3.1で行いました。標準のppu-gcc 4.1.1を使用した場合、リンク時にエラーが出てしまったため、プロトタイプとして配布されているppu-gcc 4.3を追加インストールして以下のようにコンパイル・リンクしました。
$ ppu-gcc43 -O3 -Wall -c -m32 -mabi=altivec -maltivec -o facedetect.o facedetect.c
$ ppu-gcc43 -m32 -o facedetect facedetect.o -lcv -lcxcore -lhighgui -lcvaux
修正版のソースでは、デフォルトでcascadeファイルとして/usr/share/opencv-cell/haarcascades/haarcascade_frontalface_alt.xmlを指定するようにしてあります。そのため、以下のように画像ファイルを指定することで顔認識ができます。
$ facedetect <image file>
PC LinuxにもOpenCVをインストールし、同一ソースをコンパイルして顔認識の速度を比較してみました。画像データーは、OpenCVに添付のlena.jpgです。結果は以下の通りです:
- PS3 : 100.058ms
- PC(C2Q 9450) : 233.94ms
PCはCore2 Quad (3GHz)ですが、OpenCVがマルチスレッドに非対応のため、1コアしか動作しません。一方Cell版OpenCVは自動的に6 SPEに処理分散するため、PCの半分以下で処理ができました。
顔認識の処理では、OpenCVのAPIである"cvHaarDetectObjects"関数をPPE側で呼び出してオブジェクト検出を起動していますが、自動的にSPEを起動してくれるためSPE毎のデーター分割を考える必要がなく、プログラム的には非常に楽ちんです。
プログラムの実行中に/spuを見ると、以下のように複数SPEが動作していることが分かります。
# ls /spu
spethread-4184-268519504 spethread-4184-268521104 spethread-4184-268522704
spethread-4184-268520304 spethread-4184-268521904 spethread-4184-268523504
オブジェクト検出処理を行う以下のコードのパラメーターをいじると認識率が変化します。
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30, 30) );
2008/11/24追記
PC LinuxでのOpenCVの並列化ですが、ひょっとしてOpenMPと組み合わせることでできないかと考え、試したのですが処理性能に変化はありませんでした。
Webで検索すると、OpenCVのビルドオプションに"--with-openmp"があるようですが、私はrpmパッケージでインストールしているため、ソースからのコンパイルまでは試していません。
2008/11/29追記
Webカメラ(Logicool Qcam S 7500)を接続したところ、無事カメラを認識してくれfacedetect.cのサンプルコードでカメラ画像の連続顔認識も動作しました。Fedora 9のカーネル2.6.27は再コンパイルなしでWebカメラを認識できましたが、カメラを使うアプリケーション(facedetect)はrootでないとキャプチャーデバイスをオープンできませんでした。この点は謎です。
処理性能に関しては、PS3では120〜122ms程度で1フレームを処理できます。PC(C2Q 9450)では250ms程度の処理時間がかかるため、PS3の方が高速に処理できていることが分かります。







最近のコメント