« Cell SDK 3.1のインストール | トップページ | Fedora 9でのサウンド設定 »

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
以下の結果が表示されれば成功です。

Screenshotresult_3

--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の方が高速に処理できていることが分かります。

« Cell SDK 3.1のインストール | トップページ | Fedora 9でのサウンド設定 »

Cellプログラミング」カテゴリの記事

コメント

新たに記事にしていただきましてありがとうございます。
参考にさせていただきます。
前回コメント時の状況はいろいろな方の協力によって脱したのですが、
今度はWEBカメラのインストールに苦戦しています。
http://cell.fixstars.com/opencv/index.php/Installing_the_Webcam
WEBカメラから顔認識をしたいのです。
説明ではkboot.confに緑の2行を追記するよう書かれていますが、
etc下にkboot.confがありません。
YDL6を使っているからでしょうか?
yaboot.confはあるのですが、
default=linuxと書かれた行がすでにあったりして
どこに追記すべきかわからず困っています。

kageさん
私はFedora 9を使っていますが、Fedora 9のkernelバージョンは2.6.27のため、追加のドライバインストールなしでwebカメラを認識できます。ただ、PS3では、rootでないとカメラを認識しませんでした。PC(intel)版のFedora 9では通常ユーザーでも認識します。この点は謎です。

YDL6はkernelバージョン2.6.23だと思いますが、kernelにUSB Videoドライバが組み込まれていないためカメラを認識できないのだと思います。fixstarsのurlに記載してある手順は、カーネルのソースコードをダウンロードしてコンパイルし直す方法ですが、以下に示すようなカーネルのパッチやmakeは実行できているでしょうか?

$ patch -d linux-2.6.23-20070817 -p1 < linux-2.6.23-20070817-v4l.diff → カーネルのパッチ
$ make → カールの再コンパイル

Linuxの場合ドライバの追加はカーネルの再コンパイルとなり面倒です。

kboot.confはFedora 7以降(おそらくYDL6も)では、yaboot.confに変わっています。再コンパイルしたカーネルで起動するためには、/boot/etc/yaboot.confを編集しますが、書式が変わっているため、yaboot.confの編集は以下を参考にしていただくとよいです。
http://cell.fixstars.com/ps3linux/index.php/Fedora_7のカーネルを再構築する
http://todotani.cocolog-nifty.com/blog/2007/07/ps3fedora_7_ker_9817.html

カーネルの再構築は結構難易度が高い作業かつ失敗するとシステムが起動不可になるリスクもあります。patch/make/再コンパイルといった作業が初めての場合、最新カールのFedora 9あたりをインストールしてしまうのが手っ取り早いかもしれません。

大変返信が遅れてしまいました。
教えていただいたとおりyaboot.confを編集したのですが、
なかなかうまくいかず、ほったらかしにしてしまいました。
ごめんなさい。

このたび、カーネル2.6.27のYDL6.1が出たので再挑戦しています。
/lib/modules/2.6.27-1.ydl61.4/buildで
make menuconfigし、
Video For Linuxは<M>にしたんですが、
そのあとがわかりません。
どこかでmakeとかmake modulesとかmake installしますよね?
また、WEBカメラの認識、起動にはなにか特別なコマンドなどあるのでしょうか?
カメラをつないで同じようにfacedetect.exeを実行するだけで、
WEBカメラからの顔認識をしてくれるのですか?
facedetectのソースにはそのような記述があるような気もしますが。。。

何度も申し訳ありません。

kageさん
YDL 6.1のkernelが2.6.27なら、ひょっとするとkernelの再構築なしにwebカメラを認識するかもしれません(Fedora 9のkernel 2.6.27は無修正でwebカメラを認識します)。WebカメラをUSBポートにつないだ際に、以下のようなログが出ていればカメラを認識しています。この場合、カーネルのmakeは不要です。

# tail /var/log/messages
Dec 23 00:45:38 ps3 kernel: usb 1-2.1: New USB device strings: Mfr=0, Product=0, SerialNumber=2
Dec 23 00:45:38 ps3 kernel: usb 1-2.1: SerialNumber: 09C73120
Dec 23 00:45:40 ps3 kernel: Linux video capture interface: v2.00
Dec 23 00:45:40 ps3 kernel: uvcvideo: Found UVC 1.00 device (046d:09a2)
Dec 23 00:45:40 ps3 kernel: input: UVC Camera (046d:09a2) as /devices/ps3_system/sb_05/usb1/1-2/1-2.1/1-2.1:1.0/input/input3
Dec 23 00:45:40 ps3 kernel: usbcore: registered new interface driver snd-usb-audio
Dec 23 00:45:40 ps3 kernel: usbcore: registered new interface driver uvcvideo
Dec 23 00:45:40 ps3 kernel: USB Video Class driver (v0.1.0)

カメラを認識していればあとはfacedetect.exe実行するだけです。
ただ、私の環境ではroot権限でfacedetectを実行しないとSPEがしませんでした(一般ユーザー権限で実行するとPPEでの実行となるようで処理速度が著しく下がる)。うまく動作しない場合は、一度rootでトライして下さい。

tailをしてもUSB関連のメッセージは出ませんでした。
カメラはQcum Orbit AFなのでUVCも問題ありませんし、
VideoForLinuxのモジュールのインストールさえできれば、
いけそうな気がするのですが。
どうやるのでしょうか。

余っていたHDDを使ってYDL6.1をインストールしてみました。確かに、YDLではWeb cameraを認識しませんね。同じkernel 2.6.27でもFedoraとconfigが異なるようです。以下の手順でkernelを再構築(再コンパイル)して下さい。

#手順を誤るとシステムが起動しなくなるリスクがあるため、
#重要なデーターはあらかじめバックアップした後で作業してください。

1)# yum groupinstall "Development Tools"
 (Cコンパイラ等のインストール。開発ツールをインストール済みの場合は不要)

2)# yum install kernel-source.ppc64
 (カーネルソースコードのインストール)

3)# cd /usr/src/linux-2.6.27-1.ydl61.4/
 (ソースコード格納ディレクトリに移動)

4)# cp /boot/config-2.6.27-1.ydl61.4 .config
 (kernelのconfig情報をコピー)

5)# make menuconfig
以下の操作でkernelのconfig情報にVideo for Linuxを追加
Video for Linux USB driverの設定も必要でした
・Device Drivers -> Multimedia devices -> Video For LinuxにMをセット
・Device Drivers -> Multimedia devices -> Video capture adapters
 -> V4L USB devicesを*に設定 -> ENTER
  -- V4L USB devicesの設定に入る-> 全てをM
  (*しか選択できない項目は*)に設定
・変更を保存して終了

6)# make
 # make modules
 # make modules_install
 # installkernel 2.6.27-1.ydl61.4custom vmlinux System.map
 (kernel, driverのコンパイルとインストール)

7)/boot/etc/yaboot.confを以下のように編集
# yaboot.conf generated by anaconda

boot=/dev/ps3da
init-message=Welcome to YDL!\nHit for boot options

partition=1
timeout=80
install=/usr/lib/yaboot/yaboot
delay=5
enablecdboot
enableofboot
enablenetboot
nonvram
mntpoint=/boot/yaboot
usemount

default=2.6.27-1.ydl61.4custom
image=/vmlinux-2.6.27-1.ydl61.4custom
label=2.6.27-1.ydl61.4custom
read-only
initrd=/initrd-2.6.27-1.ydl61.4custom.img
append="video=ps3fb:mode:3 rhgb quiet root=LABEL=/"

image=/vmlinux-2.6.27-1.ydl61.4
label=linux
read-only
initrd=/initrd-2.6.27-1.ydl61.4.img
append="video=ps3fb:mode:3 rhgb quiet root=LABEL=/"

8)#reboot(再起動)

9)万が一起動途中でハングする場合(kernel configに誤りがあるとハングします)、以下の手順で旧カーネルで起動し、設定をチェック
・電源ボタン長押しで一旦電源OFF
・再度電源ON
・kboot:のプロンプトが出た時点で、TABキーを押して、linuxと表示されたところでENTER
→TABキーで表示されるラベルは、yaboot.confの"label="の定義に対応しており、新旧のkernel imageを選択して起動することができます

YDLで出来ました!!!
わざわざ空きHDDまで使って確認して頂けるなんて。。。
こんなに手間のかかる設定だったのですね。
素直にFedoraを入れていれば済んだ話なのかも知れません。(笑)
本当にありがとうございました!! (また聞くかも)

うまくいってなによりです。
YDL6.1はps3vram(未使用のvramをswapファイルとして使用できる)が使えることや動作が軽いという評判なので、一度試したいと思っていたところでした。
確かにFedoraに比べるとメモリー消費量が少なく動作が軽い感じがしました。ですので、どこかでYDL6.1に移行しようかと思ったりしております。

またまたごめんなさい。
WindowsのVisualStudioで正常動作確認済みのOpenCVのソースをコンパイルしようとしたら、やはりヘッダ読み込みエラーやAPI関連でリファレンスできない?ようなエラーが起こりました。
同じようにgccの問題でしょうか?
ppu-gcc 4.3で挑戦してみようと思います。
ただ、コンパイルオプションに見慣れないものが多いですがなんですか?

kageさんのコードが分からないので何とも言えませんが、ヘッダーファイルの読み込みでエラーが発生している場合は恐らくヘッダーファイルのパスの問題です。

例えば、/usr/share/opencv-cell/samples/c/facedetect.cでは、
 #include "cv.h"
 #include "highgui.h"
と定義されていますが、そのままコンパイルすると以下のエラーになります。
$ ppu-gcc43 -O3 -Wall -c -m32 -o facedetect.o facedetect.c
facedetect.c:1:16: error: cv.h: No such file or directory
facedetect.c:2:21: error: highgui.h: No such file or directory

コンパイラがデフォルトのヘッダーファイル検索パスを参照するように、ソースを以下のように修正することで、上記のエラーを回避できます。
#include <opencv/cv.h>
#include <opencv/highgui.h>

#include "xxx.h"と#include <xxxx.h>の違いはCの基本ですので、不明な場合は調べて下さい、、、

リンク時のエラーですが、私の環境ではSDK3.1標準のppu-gccでは以下のエラーが発生しました。(x86用のクロス環境ではなぜか発生しないのですが)
$ ppu-gcc -m32 -o facedetect facedetect.o -lcv -lcxcore -lhighgui -lcvaux
/usr/lib/libstdc++.so.6: undefined reference to `_Unwind_GetIPInfo@GCC_4.2.0'
collect2: ld returned 1 exit status

上記のエラーは、ppu-gcc43で回避できました。

最後にコンパイルオプションですが、「mabi=altivec -maltivec」は無視して下さい。PPEのAltivec SIMD命令(Intel CPUのSSE相当)の生成を有効にするフラグですが、facedetect.cのコードですとAltivec(SIMD)の恩恵はありませんので割愛可能です。

ありがとうございます。できました!
mabi=altivec -maltivecは並列処理の関連だとわかっていたんですが、他のオプションがなんなのかなぁと思っていたんです。

コンパイルリンクはできたんですが
やはり意図したようには動いてくれません。
顔認識後の動画を作ろうとしています。
サンプルの場合、第3引数にAVI動画を指定することで、
動画から顔認識をするようになっていると思うのですが、
NULLポインタエラー in function cvLoadImageとなります。
http://www.masayashi.com/2007/10/25/421
AVIはコーデック変換してあるのですが。。。
todotaniさんは動画からやってみましたか?

Aviファイルを作って試してみたのですが、確かに以下のNULLポインターエラーになりました。
$ ./facedetect sample.avi
OpenCV ERROR: Null pointer (null filename)
  in function cvLoadImage, loadsave.cpp(380)

Linux上でWebcamera画像からaviファイルをうまく作れなかったので、私が使っているLogicool QCAMに添付のWindows用ソフトを使って一旦wmvファイルを作ってそれを非圧縮のaviに変換しました(したつもり)。

ポイントしていただいたリンクを見ると、OpenCVが認識できないvideoファイルのフォーマットになっていることが原因のようですので、変換がうまくできていない可能性が高いのですが、videoファイルフォーマットには詳しくないため、解決策は分かりませんでした。

お役に立てずすいません。

fixstarsさんに聞いてみました。
コーデックそのものの問題ではありません。
OpenCV(CVCell)がffmpegにリンクされていないことが問題でした。

rpmでインストールしたのものは、
ffmpeg とのリンクを行っておりませんので、
ffmpeg の機能を利用する動画の読み込みはできなくなっております。
ffmpeg とあわせて、ソースからビルドすれば可能だと思われますが、
最新の ffmpeg では構成が変わっているため、ffmpegの機能を有効にしてビルドできません。
昔のffmpegであればおそらくビルドできると思いますが、
どのバージョンでビルド可能かは確認できていない状態です。

だそうです。難しそうです。
過去のものを探し当てて、なおかつリンクしてビルドする必要があります。
todotaniさんは出来そうですか?(笑)

YDL6.1にeclipseを入れると起動時にlogファイルを見るように!
という内容のエラーを吐いて起動しないのですがご存知ですか?
YDL6では問題なくインストールできますけれど。。。

kageさん;

JAVA VMの問題かもしれません。最新版のEclipeに入れ替えた際に起動できず、JAVA VMをSun製入れ替えて解決したことがありました(結局、最新EclipseはCell用のプラグインが動作しないためボツになったのですが)。

SDK 3.1の場合は、IBM製のJAVA VMを使うようにとインストールマニュアルに記載があります。インストールの方法は、以下の記事を参考にして下さい。
http://todotani.cocolog-nifty.com/blog/2008/11/cell-sdk-31-9da.html

SunのVMよりIBM製の方が、yumが使える分インストールが楽だと思います。

この記事へのコメントは終了しました。

« Cell SDK 3.1のインストール | トップページ | Fedora 9でのサウンド設定 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ