|
|
|
このページの内容
AIBO カラー画像 (YUV) | 強度情報 | カラー分割画像 |
RGB変換画像 | (Y channel from YUV) | 肌理と明るさを無視 |
スナップショット撮影スクリプトが定義されると、サンプル画像を集める準備が整います。
スナップショット撮影スクリプト
[補足] 通常、画像はAIBOからRaw Cam viewerへ半分の解像度にJPEG圧縮されて送られます。そしてエラーや欠落画素は許容されるので、通信にはUDPが使用されます。 しかし、上記スクリプトを実行すると、最大解像度かつ圧縮なしで送信し、かつ、画素の欠落しないTCP通信を使用するために、関係する全ての設定を変更します。
- AIBOとコントローラ画面を起動します。
- コントローラ画面で "Add" ボタンを押して新しいスクリプトを追加します。
- ダイアログボックスで、スクリプトのTitle 右欄を Take Snapshots に変更します。
- Commands 右欄の内容を消去し、次の5行をコピーし貼り付けます。
!set vision.rawcam_interval=1000 !set vision.rawcam_transport=tcp !set vision.rawcam_y_skip=1 !set vision.rawcam_uv_skip=1 !set vision.rawcam_compression=none- [OK] をクリックすればスクリプトが出来上がります。そのスクリプトの名前がコントローラ画面のScript欄に表示されます。
ここでは、2つの物体(ピンクボールと青色物体)のサンプル画像を撮影する方法を示します。 撮影
- Raw Cam viewer が開いている場合、そのウィンドウを閉じます。
- スクリプトを動かすために "Take Snapshots" をダブルクリックします。
- [Raw Cam] をクリックし、Raw Cam viewer を開きます。
- 表示モードをRGBからYUVに変更するために、Raw Cam windowのYUVボタンをクリックします。すると、色の表示が変化します。
- AIBOのカメラ(鼻先)を撮影したい物体の方向へ向けます。撮影したい物体の背景は黒地にするのが良いでしょう。
- Freeze Frame ボタンをクリックします。ボタンの名前が "Save Image Sequence" から "Save Image" に変化するはずです。これは重要です。画像を停止(Freeze)させなければ、連続した画像がどんどんファイルに保存されてしまいます。
- Save Image ボタンをクリックします。
- 次のようにして保存します。
場所: マイドキュメント → usXX → easytrain
ファイル名は次のようにします。
blue.png (青色物体の場合)
red.png (ピンクボールの場合)
ファイル名は英数字を使用し、拡張子".png" を付けて下さい。- Unfreeze ボタンをクリックしてください。AIBOまたは物体を動かすと画面が変化するはずです。
- 今度は違う物体を撮影します(例えば、先に青色物体を撮影していれば、今度はピンクボールを撮影します)。
手順6に戻り、再び Freeze Frame ボタンをクリックした後、 Save Image ボタンをクリックし画像を保存します。複数の画像を撮影する場合は同じことを繰り返します。- 撮影が終了したら、保存した画像ファイルをWindowsで確認します。
確認するには、Windowsで次のフォルダを開いてください。
マイドキュメント → usXX → easytrain
easytrainフォルダで、保存画像(blue.pngやred.png)を開いて確認します。
確認できたら、コントローラ画面とAIBOをシャットダウンします。
|
簡易訓練ツールを動かす
- 簡易訓練ツールを動かすには、Cygwinを開いて簡易訓練ツールのプログラム EasyTrain があるディレクトリに移動します。
us0X@xxxxx ~ $ cd easytrain- 画像ファイル名がblue.pngの場合、次のようにして EasyTraining を起動します。
us0X@xxxxx ~easytrain $ java EasyTrain -isYUV blue.png- Control windowの上部の空欄に新しく定義したい色の名前(例えば blue)を打ち込みます。
- Color Spectrum windowで、 マウスをクリックしドラッグしながら、定義したい色の範囲を囲みます。範囲を定義した結果、Segmented View windowに表示されます。
- Color Spectrum windowで、Shiftキーを押しながらマウスをドラッグすると、範囲を追加できます。範囲を間違えたら、Control windowのundoボタンをクリックしてください。すべての範囲を取り消すには、clearボタンを押してください。
- 以上を繰り返して、必要な色をすべて定義してください。
- すべての色の定義が終了したら、Saveボタンを押して「しきい値ファイル」を次の場所に保存してください。
場所: マイドキュメント → usXX → easytrain
ファイル名は英数で拡張子は不要です。例えば、青物体ならばファイル名を blue にすると、自動的に blue.tm, blue.col, blue.saveの3ファイルが保存されます。 それぞれのファイルの役割は次の通りです。
- .tmファイル ・・・ それぞれの画素の色を定義するファイル。
- .colファイル ・・・ それぞれの色の名前、Seg Cam viewerで使用されるRGB値を定義するファイル。
- .saveファイル ・・・ Color Spectrumで定めた多角形の領域について説明するファイル。
- Control windowのXボタンを押して終了してください。
さらに同じ色で学習したい画像が他にもある場合(例えば、blue.pngの他にblue2.pngがある場合)は次の通り。
- 再び EasyTrain を起動して、その画像ファイルを読み込みます。
us0X@xxxxx ~easytrain $ java EasyTrain -isYUV blue2.png- Control windowが開いたら、Loadボタンを押して、さっき保存した「カラーファイル」(例:blue.col)を読み込みます。
- そして、上と同じように色や色範囲を追加して「カラーファイル」を上書き保存してください。
- この作業を同じ色で学習したい画像の数だけ繰り返します。
- 色の範囲を広げすぎると、他の色まで間違って認識する確率が高くなります。
- 青が終わったら、ピンクについても同じ作業を行います。ただし、色の名前は red にしてください。 そして、保存するファイル名も red にしてください。
- 学習時と使用時で照明(明るさ)が異なると、使用時にうまく認識できないことがあります。
しきい値ファイルとカラーファイルを統合する
- 色番号を変更します。
色番号というのは、.colファイルに記されている色の番号です。
さきほど、訓練ツールで青と赤を別々に設定したので、両方とも色番号は 1 に設定されました。
確認するには、blue.col と red.col を秀丸で開いてみれば分かります。
行の先頭を見ると両方とも 1 に設定されていますね。
ちなみに、unclassifiedは「どこにも分類されない色」のことで 0番です。
青と赤が同じ番号 1 だと都合が悪いので、赤の番号を 2 に変更しましょう。
このため、次のように実行してください。
上の例では、ファイルred.colにおける赤の色番号を1から2に変更し、red2.colに保存してます。
usXX@xxxxx ~easytrain $ java MoveIndex 1 2 red red2
使い方 java MoveIndex 元番号 新番号 元ファイル名 新ファイル名- しきい値ファイルを統合します。 青が1番、赤が2番、何もない色が0番になりました。
次に、blue.tm と red2.tm を統合して、mygame.tm に保存します。
そのために、次のように実行してください。
使い方 java ThresholdMerge 色1.tm 色2.tm 新ファイル名.tm (注意)新ファイル名の部分は英数8文字以内
usXX@xxxxx ~easytrain $ java ThresholdMerge blue.tm red2.tm mygame.tm- カラーファイル(.col)を統合します。
手順2では .tm ファイルを統合しましたが、.col ファイルも統合する必要があります。
しかし、.col ファイルを統合するjavaプログラムがないので秀丸で手作業で統合してください。
秀丸で、blue.col と red2.col を開きます。
そして、秀丸で新しいファイルを新規作成してください(ファイル→新規作成)。
blue.colの1行目と2行目を新規ファイルの1行目と2行目にコピーして貼り付けてください。
red2.colの2行目を新規ファイルの3行目にコピーして貼り付けてください。
つまり、新規ファイルの内容は次のようになるでしょう。blue と red の左側の ( )内の3個の数字は上の例と違うかもしれませんが、これは学習条件によって違うためです。
0 (128 128 128) "unclassified" 8 1.00 1 (3 189 231) "blue" 8 0.75 2 (251 99 167) "red" 8 0.75 [EOF]
この新規ファイルを次のように保存してください。 保存場所: マイドキュメント → usXX → easytrain
ファイル名: mygame.col (注意)mygameの部分は、手順2の .tmファイルと一致させてください。- 作成した mygame.tm と mygame.col が正しいか確認しましょう。
青色の画像ファイル(blue.png)を確認するには次のように実行します。
うまく青色を区別できているでしょうか? できていなければ方法が間違っています。
usXX@xxxxx ~easytrain $ java VisionSegment -isYUV mygame.tm mygame.col blue.png
次にピンク(赤)色の画像ファイル(red.png)を確認するには次のように実行します。
使い方 java VisionSegment -isYUV *****.tm *****.col 画像ファイル名.png
usXX@xxxxx ~easytrain $ java VisionSegment -isYUV mygame.tm mygame.col red.png
しきい値ファイルとカラーファイルのインストール手順
- しきい値ファイルの名前を mygame.tm、カラーファイルの名前を mygame.col と仮定します。
mygame.tm と mygame.col ファイルを次の場所へコピーしてください。
マイドキュメント → usXX → project → ms → config- AIBOに新しいファイルを使うことを教えるために、tekkotsu.cfg ファイルを編集します。
tekkotsu.cfg ファイルは次の場所にあります。
マイドキュメント → usXX → project → ms → config → tekkotsu.cfgtekkotsu.cfg を秀丸で開き、"thresh=config/○○○○.tm" と書いてある行を探して下さい。
先頭に # のある行はコメント行ですから、AIBOは無視します。
下記のように、すでに thresh= が書かれた行の先頭に # をつけてください。
そして、すぐ下の行に新たに thresh=config/mygame.tm を追加します
(mygame.tmは自分がつけたファイル名と一致させて下さい)。(補足)ERS-210とERS-7がありますが、AIBOの機種によって設定します。<ERS-7> #thresh=config/7red.tm #thresh=config/ball.tm #thresh=config/oldttt.tm thresh=config/mygame.tm </ERS-7>
ゼミでは全てERS-7です。- さらに、tekkotsu.cfg ファイルで、下方の行へ移動して下さい。
そして、下記のようにカラーを定義するファイルの部分を修正してください。
(mygame.colは自分がつけたファイル名と一致させて下さい)。#colors=config/default.col #colors=config/oldttt.col colors=config/mygame.col- tekkotsu.cfg ファイルをメモリースティックにコピーします。
メモリースティックをPCに接続してください。
そして、projectディレクトリへ移動して "make update" を実行してください。
このプログラムを次の通り保存してください。
#ifndef INCLUDED_BlueAndPink_h_ #define INCLUDED_BlueAndPink_h_ #include "Behaviors/BehaviorBase.h" #include "Events/EventRouter.h" #include "Events/VisionObjectEvent.h" // VisonObjectEventを処理するためのヘッダファイル #include "Shared/ProjectInterface.h" // visPinkBallSIDを定義しているヘッダファイル class BlueAndPink : public BehaviorBase { public: BlueAndPink() : BehaviorBase("BlueAndPink") {} virtual void DoStart() { BehaviorBase::DoStart(); std::cout << getName() << " is starting up." << std::endl; erouter->addListener(this,EventBase::buttonEGID); // ボタンイベントのリスナー erouter->addListener(this,EventBase::visObjEGID, // ピンクボールのリスナー ProjectInterface::visPinkBallSID); erouter->addListener(this,EventBase::visObjEGID, // ブルーオブジェクトのリスナー ProjectInterface::visBlueBallSID); } virtual void DoStop() { std::cout << getName() << " is shutting down." << std::endl; BehaviorBase::DoStop(); } virtual void processEvent(const EventBase &event) { // generator IDに応じてスイッチする switch ( event.getGeneratorID() ) { // generator IDがvisObjEGIDの場合 case EventBase::visObjEGID: { // eventをvisevにキャスト変換 const VisionObjectEvent &visev = *reinterpret_cast<const VisionObjectEvent*>(&event); // ピンクボールを見つけた場合 if ( visev.getSourceID() == ProjectInterface::visPinkBallSID ) { // ピンクボールを見たよ、と表示する std::cout << "AIBO saw a pink ball at ( " << // ボールのX座標、Y座標を表示する visev.getCenterX() << " , " << visev.getCenterY() << " )" << std::endl; } // 青い物体を見つけた場合 else if ( visev.getSourceID() == ProjectInterface::visBlueBallSID ) { // 青い物体を見たよ、と表示する std::cout << "AIBO saw a blue object at ( " << // ボールのX座標、Y座標を表示する visev.getCenterX() << " , " << visev.getCenterY() << " )" << std::endl; } break; }; default: std::cout << "Unexpected event: " << event.getDescription() << std::endl; } } }; #endif
ファイルを保存したら、次の手順を実行してください。
保存する場所 マイドキュメント → usXX → project フォルダ ファイル名 BlueAndPink.h ファイルの種類 C言語ヘッダーファイル(*.h)
実行したら・・・
シャッタースピードをスローにすると画像は明るくなりますが、画像がぼやけます。!set vision.gain=low
または
!set vision.gain=mid
または
!set vision.gain=high
発展:!set vision.shutter_speed=slow
または
!set vision.shutter_speed=mid
または
!set vision.shutter_speed=fast
|
|
|