|
|
|
このページの内容
![]() |
![]() |
![]() |
| 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
Using other color spaces: The Color Spectrum window normally
displays data in HSB (Hue, Saturation, and Brightness) space, but you
can use other color spaces if you prefer. The available choices are:
YUV, HSB, rg, xy, and Lab. For a little more information about these spaces,
see the help file (click on the Help button in the Control window); for a lot
more info, see the FAQ by Charles Poynton below.
At right are the pixels from the sample images we used before, but
redisplayed in YUV space.
You can do color segmentation in any color space, but EasyTrain cannot
translate the polygons you draw in one color space into another space.
So if you define some color classes and then switch to a different
color space, the program displays a warning that the previous color
selection information will be lost.
|
|
|