画像処理

前のページ
目次
次のページ


このページの内容


概要

 Tekkotsuでは、あらかじめピンクボールを識別できるように設定してあります。
 一方、ピンクボール以外の色も識別できるようにするためには「カラー画像分割」を使用します。
 カラー画像分割は、物体を色で区別するという考えに基づきます。
 つまり、物体がはっきりと着色されていて、物体全体の色の合計だけが重要であると仮定しています。
 したがって、物体の細かな形状や表面の肌理(きめ)に関する色や明るさの情報を無視します。
 しかし、簡素になった画像は高速に処理することができるため、AIBOは1秒間に30フレームのカラー画像分割を実行することができます。
 下の3枚の写真は、AIBOの目に映る風景の例です。

AIBO カラー画像 (YUV) 強度情報 カラー分割画像
RGB変換画像 (Y channel from YUV) 肌理と明るさを無視

 左端(AIBOカラー画像)では、緑色のカーペットには肌理があり、部品の影もあることに注意してください。 これら肌理や影は右側のカラー分割画像では無視されます。カーペットとして認識される全ての画素は同じ緑色になります。 実際、この画像全体では5色しか存在しません。 すなわち、緑、青、オレンジ、ピンク、グレーです。 グレーは他のどの色にも分類されない「識別されなかった色」を示します。

 AIBOにおけるカラー画像分割の理論はカーネギーメロン大学の次の2人の論文に示されています(英語なので飛ばして結構です)。

 ここでTekkotsuのカラー画像分割の仕組みについて簡単に説明しておきます。
 基本的に、Tekkotsu利用者は「しきい値ファイル」と「カラーファイル」を作成します。 これらファイルは、色空間が一握りの色に、どう分割されるべきかを指定するファイルです。これらファイルの内容は物体や照明の条件に依存します。 例えば、あなたがピンク色と赤色の物体を区別したいことがあるでしょう。あるいは別の場合には、同じ物体が明るい照明のときにはピンク色に見えて、暗い照明のときには赤色に見えるかもしれないので、ピンク色と赤色を同じ色としてAIBOに識別させたいことがあるでしょう。通常、AIBOの場合はピンクと赤を同じ色として認識します。


サンプル画像の収集

 設定時と使用時の照明条件(明るさ、角度)が異なると、AIBOが色を認識できません。
 そこで、しきい値ファイルとカラーファイルを作成して、AIBOに色を学習させます。
 これらファイルを作成するためには、簡易訓練ツール(後述)を使用してサンプル画像を収集する必要があります。
 サンプル画像は、実際に使用するAIBOで、実際に使用する照明条件の下で撮影します。
 これら画像は、コントローラ画面のRaw Cam機能を使用して収集できます。
 しかし、最初に Raw Camの設定値を変更して、カメラ解像度を最大にしてデータを失わないようにしなければなりません。
 Raw Cam設置値を変更するには、コントローラ画面の "Send Input" ボックスで命令をタイプします。 しかし、これを繰り返すのは面倒なので、代わりに設定を自動的に行えるようにスクリプトをセットします(下記)。

スナップショット撮影スクリプト

  1. AIBOとコントローラ画面を起動します。

  2. コントローラ画面で "Add" ボタンを押して新しいスクリプトを追加します。

  3. ダイアログボックスで、スクリプトのTitle 右欄を Take Snapshots に変更します。

  4. 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
    

  5. [OK] をクリックすればスクリプトが出来上がります。そのスクリプトの名前がコントローラ画面のScript欄に表示されます。

 [補足] 通常、画像はAIBOからRaw Cam viewerへ半分の解像度にJPEG圧縮されて送られます。そしてエラーや欠落画素は許容されるので、通信にはUDPが使用されます。 しかし、上記スクリプトを実行すると、最大解像度かつ圧縮なしで送信し、かつ、画素の欠落しないTCP通信を使用するために、関係する全ての設定を変更します。

 スナップショット撮影スクリプトが定義されると、サンプル画像を集める準備が整います。
 AIBOに認識させたい全ての物体のサンプル画像が必要です。
 そして、AIBOを使用するときと同じ照明条件でサンプル画像を撮影します。

撮影

 ここでは、2つの物体(ピンクボールと青色物体)のサンプル画像を撮影する方法を示します。

  1. Raw Cam viewer が開いている場合、そのウィンドウを閉じます。

  2. スクリプトを動かすために "Take Snapshots" をダブルクリックします。

  3. [Raw Cam] をクリックし、Raw Cam viewer を開きます。

  4. 表示モードをRGBからYUVに変更するために、Raw Cam windowのYUVボタンをクリックします。すると、色の表示が変化します。

  5. AIBOのカメラ(鼻先)を撮影したい物体の方向へ向けます。撮影したい物体の背景は黒地にするのが良いでしょう。

  6. Freeze Frame ボタンをクリックします。ボタンの名前が "Save Image Sequence" から "Save Image" に変化するはずです。これは重要です。画像を停止(Freeze)させなければ、連続した画像がどんどんファイルに保存されてしまいます。

  7. Save Image ボタンをクリックします。

  8. 次のようにして保存します。
      場所: マイドキュメント → usXX → easytrain
      ファイル名は次のようにします。
         blue.png (青色物体の場合)
         red.png (ピンクボールの場合)
      ファイル名は英数字を使用し、拡張子".png" を付けて下さい。

  9. Unfreeze ボタンをクリックしてください。AIBOまたは物体を動かすと画面が変化するはずです。

  10. 今度は違う物体を撮影します(例えば、先に青色物体を撮影していれば、今度はピンクボールを撮影します)。
    手順6に戻り、再び Freeze Frame ボタンをクリックした後、 Save Image ボタンをクリックし画像を保存します。複数の画像を撮影する場合は同じことを繰り返します。

  11. 撮影が終了したら、保存した画像ファイルをWindowsで確認します。
    確認するには、Windowsで次のフォルダを開いてください。
       マイドキュメント → usXX → easytrain
    easytrainフォルダで、保存画像(blue.pngやred.png)を開いて確認します。
    確認できたら、コントローラ画面とAIBOをシャットダウンします。


簡易訓練ツール

 簡易訓練ツールというのは、AIBOに色を覚えさせるためのソフトウェアです。
 簡易訓練ツールは、4個のウィンドウを使用します(下図)。


 上記の例では、利用者が新しい色種別 "green" を定義し、Color Spectrum windowの該当部分を囲んでいる様子を表示しています。

簡易訓練ツールを動かす

  1. 簡易訓練ツールを動かすには、Cygwinを開いて簡易訓練ツールのプログラム EasyTrain があるディレクトリに移動します。
    us0X@xxxxx ~
    
    $ cd easytrain        
    
  2. 画像ファイル名がblue.pngの場合、次のようにして EasyTraining を起動します。

    us0X@xxxxx ~easytrain
    
    $ java EasyTrain -isYUV blue.png 

  3. Control windowの上部の空欄に新しく定義したい色の名前(例えば blue)を打ち込みます。

  4. Color Spectrum windowで、 マウスをクリックしドラッグしながら、定義したい色の範囲を囲みます。範囲を定義した結果、Segmented View windowに表示されます。

  5. Color Spectrum windowで、Shiftキーを押しながらマウスをドラッグすると、範囲を追加できます。範囲を間違えたら、Control windowのundoボタンをクリックしてください。すべての範囲を取り消すには、clearボタンを押してください。

  6. 以上を繰り返して、必要な色をすべて定義してください。

  7. すべての色の定義が終了したら、Saveボタンを押して「しきい値ファイル」を次の場所に保存してください。
      場所: マイドキュメント → usXX → easytrain
    ファイル名は英数で拡張子は不要です。例えば、青物体ならばファイル名を blue にすると、自動的に blue.tm, blue.col, blue.saveの3ファイルが保存されます。

    それぞれのファイルの役割は次の通りです。

    • .tmファイル ・・・ それぞれの画素の色を定義するファイル。
    • .colファイル ・・・ それぞれの色の名前、Seg Cam viewerで使用されるRGB値を定義するファイル。
    • .saveファイル ・・・ Color Spectrumで定めた多角形の領域について説明するファイル。

  8. Control windowのXボタンを押して終了してください。

    さらに同じ色で学習したい画像が他にもある場合(例えば、blue.pngの他にblue2.pngがある場合)は次の通り。

    1. 再び EasyTrain を起動して、その画像ファイルを読み込みます。

      us0X@xxxxx ~easytrain
      
      $ java EasyTrain -isYUV blue2.png 

    2. Control windowが開いたら、Loadボタンを押して、さっき保存した「カラーファイル」(例:blue.col)を読み込みます。
    3. そして、上と同じように色や色範囲を追加して「カラーファイル」を上書き保存してください。
    4. この作業を同じ色で学習したい画像の数だけ繰り返します。

  9. 色の範囲を広げすぎると、他の色まで間違って認識する確率が高くなります。

  10. 青が終わったら、ピンクについても同じ作業を行います。ただし、色の名前は red にしてください。 そして、保存するファイル名も red にしてください。

  11. 学習時と使用時で照明(明るさ)が異なると、使用時にうまく認識できないことがあります。


しきい値ファイルとカラーファイルの統合

上で作成してきた「しきい値ファイル」(.tm)と「カラーファイル」(.col)は blue と red の2種類です。
しかし、AIBOが読み込める しきい値ファイルは1個です。
このため、しきい値ファイルを1個に統合します。
統合するには以下の手順に従ってください。

しきい値ファイルとカラーファイルを統合する

  1. 色番号を変更します。
    色番号というのは、.colファイルに記されている色の番号です。
    さきほど、訓練ツールで青と赤を別々に設定したので、両方とも色番号は 1 に設定されました。
    確認するには、blue.col と red.col を秀丸で開いてみれば分かります。
    行の先頭を見ると両方とも 1 に設定されていますね。
    ちなみに、unclassifiedは「どこにも分類されない色」のことで 0番です。
    青と赤が同じ番号 1 だと都合が悪いので、赤の番号を 2 に変更しましょう。
    このため、次のように実行してください。
    usXX@xxxxx ~easytrain
    
    $ java MoveIndex 1 2 red red2   

    上の例では、ファイルred.colにおける赤の色番号を1から2に変更し、red2.colに保存してます。
    使い方 java MoveIndex 元番号 新番号 元ファイル名 新ファイル名

  2. しきい値ファイルを統合します。 青が1番、赤が2番、何もない色が0番になりました。
    次に、blue.tm と red2.tm を統合して、mygame.tm に保存します。
    そのために、次のように実行してください。
    usXX@xxxxx ~easytrain
    
    $ java ThresholdMerge blue.tm red2.tm mygame.tm 

    使い方 java ThresholdMerge 色1.tm 色2.tm 新ファイル名.tm

    (注意)新ファイル名の部分は英数8文字以内

  3. カラーファイル(.col)を統合します。
    手順2では .tm ファイルを統合しましたが、.col ファイルも統合する必要があります。
    しかし、.col ファイルを統合するjavaプログラムがないので秀丸で手作業で統合してください。
    秀丸で、blue.col と red2.col を開きます。
    そして、秀丸で新しいファイルを新規作成してください(ファイル→新規作成)。
    blue.colの1行目と2行目を新規ファイルの1行目と2行目にコピーして貼り付けてください。
    red2.colの2行目を新規ファイルの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]
    blue と red の左側の ( )内の3個の数字は上の例と違うかもしれませんが、これは学習条件によって違うためです。
    この新規ファイルを次のように保存してください。

     保存場所: マイドキュメント → usXX → easytrain
     ファイル名: mygame.col

    (注意)mygameの部分は、手順2の .tmファイルと一致させてください。

  4. 作成した mygame.tm と mygame.col が正しいか確認しましょう。

    青色の画像ファイル(blue.png)を確認するには次のように実行します。

    usXX@xxxxx ~easytrain
    
    $ java VisionSegment -isYUV mygame.tm mygame.col blue.png 

    うまく青色を区別できているでしょうか? できていなければ方法が間違っています。
    次にピンク(赤)色の画像ファイル(red.png)を確認するには次のように実行します。

    usXX@xxxxx ~easytrain
    
    $ java VisionSegment -isYUV mygame.tm mygame.col red.png 

    使い方 java VisionSegment -isYUV *****.tm *****.col 画像ファイル名.png


しきい値ファイルとカラーファイルのインストール

 しきい値ファイルとカラーファイルをAIBOで使用するために、これらファイルをメモリースティックにインストールします。

しきい値ファイルとカラーファイルのインストール手順

  1. しきい値ファイルの名前を mygame.tm、カラーファイルの名前を mygame.col と仮定します。
       mygame.tm と mygame.col ファイルを次の場所へコピーしてください。
         マイドキュメント → usXX → project → ms → config

  2. AIBOに新しいファイルを使うことを教えるために、tekkotsu.cfg ファイルを編集します。
       tekkotsu.cfg ファイルは次の場所にあります。
         マイドキュメント → usXX → project → ms → config → tekkotsu.cfg

       tekkotsu.cfg を秀丸で開き、"thresh=config/○○○○.tm" と書いてある行を探して下さい。
       先頭に # のある行はコメント行ですから、AIBOは無視します。
       下記のように、すでに thresh= が書かれた行の先頭に # をつけてください。
       そして、すぐ下の行に新たに thresh=config/mygame.tm を追加します
        (mygame.tmは自分がつけたファイル名と一致させて下さい)。

    <ERS-7>
    #thresh=config/7red.tm
    #thresh=config/ball.tm
    #thresh=config/oldttt.tm
    thresh=config/mygame.tm
    </ERS-7>
    
    (補足)ERS-210とERS-7がありますが、AIBOの機種によって設定します。
        ゼミでは全てERS-7です。

  3. さらに、tekkotsu.cfg ファイルで、下方の行へ移動して下さい。
       そして、下記のようにカラーを定義するファイルの部分を修正してください。
        (mygame.colは自分がつけたファイル名と一致させて下さい)。

    #colors=config/default.col
    #colors=config/oldttt.col
    colors=config/mygame.col
    
  4. tekkotsu.cfg ファイルをメモリースティックにコピーします。
    メモリースティックをPCに接続してください。
    そして、projectディレクトリへ移動して "make update" を実行してください。


しきい値ファイルとカラーファイルのテスト

 上記で作成した「しきい値ファイル」と「カラーファイル」をテストするために、メモリースティックをAIBOに挿入し、AIBOを起動して下さい。
 コントロール画面を開き、Seg Cam をクリックして、Seg Cam viewerウィンドウを開きます。
 そして、AIBOに認識させたい物体を見せてください。
 Seg Cam viewerウィンドウを見て、AIBOのカラー認識が望ましい状態になっているか確認して下さい。
 もし、思い通り色を認識できていなかったら、サンプル画像の収集からやり直すか、しきい値ファイルの作成をやり直して下さい。


青とピンクを識別するプログラム

 上記の設定により青とピンクが識別できるようになったら、これを利用したTekkotsuプログラムを作ってください(下記)。
 このプログラムは、
   青色を識別すると "AIBO saw a blue object ..."
   ピンクを識別すると "AIBO saw a pink ball ..."
 とTelnet画面に表示します。

#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)
 ファイルを保存したら、次の手順を実行してください。

 実行したら・・・
  Telnet画面を開いた状態で、AIBOに青やピンクの物体を見せてください。
  その時、Telnet画面に "AIBO saw a pink ball at ..." など表示されれば色を認識できています。
  at の後に続く数字は物体の座標値です。


カメラ設定の調節

 AIBOのカメラのゲインとシャッタースピードはソフトウェアで調節できます。
 コントロール画面で試した後(下記)、tekkotsu.cfg ファイルを編集すれば調節した設定を保存できます。
 通常の設定では、gain=high, shutter_speed=slow です。

 ゲインを高くすると画像は明るくなりますが、ノイズが増えます。
 コントロール画面でゲインを設定するには、"Send Input" 窓に次のように打ち込みます。

!set vision.gain=low
または
!set vision.gain=mid
または
!set vision.gain=high

 シャッタースピードをスローにすると画像は明るくなりますが、画像がぼやけます。
 コントロール画面でシャッタースピードを設定するには、"Send Input" 窓に次のように打ち込みます。

!set vision.shutter_speed=slow
または
!set vision.shutter_speed=mid
または
!set vision.shutter_speed=fast

発展:

  1. Raw Cam viewerを表示し、ゲインとシャッタースピードの設定をいろいろ変えて試してください。カメラ前の物体を動かして画像がぼやけるか確認してください。

  2. 何を設定したら、何が変化するか、確認できましたか?


以下は英語なので飛ばして構いません。


Advanced EasyTrain Features

Examining individual pixels: If you move the mouse around in the RGB Image you will see the cursor is a black cross-hairs symbol. If you move the mouse in the Segmented Image the cursor is a black arrow. At the same time, a little white box cursor will appear in whichever of these two windows the mouse is not presently in. This allows you to match any segmented pixel against the corresponding raw pixel. And another white box cursor can be seen in the Color Spectrum window, indicating where that pixel falls in color space.

Keyboard commands: Ctrl-Z is "undo". Ctrl-Shift-Z is "redo". Ctrl-A is "select all", and Ctrl-D is "clear selection". Window scaling: "+" to enlarge, "-" to shrink, "=" to return to normal size (equal to the image resolution.) The arrow keys move between images.

Other image formats: Although it's best to run EasyTrain on YUV images in PNG format, it is possible to use other formats. You can use JPEG images, although these are not preferred due to the possibility of compression artifacts changing the color values. Also, you can use RGB images instead of YUV, by substituting the -isRGB switch when EasyTrain is invoked. You cannot mix YUV and RGB images in the same run.

Selecting image regions: For difficult segmentation problems, it may be desirable to focus on just a subset of the pixels in your training image. You can do this by clicking and dragging in the RGB Image View window to select regions of interest. Once you do that, only pixels that fall within these regions will be displayed in the Color Spectrum window. (To view all pixels again, turn on the "all pixels" checkbox in the Control window.) You can define as many regions of interest as you like, for for each color within each image. The region information is stored in a .areas file associated with each image, e.g., for img001.png and threshold file "mygame", the .areas file would be called img001-mygame.areas.

On thing you'll notice about the ERS-7's camera is that there is noticeable chromatic aberration in the form of a bluish tinge visible in the corners of the image. This makes color segmentation harder than on earlier AIBO models.

Realtime mode: If you turn on the "Realtime" checkbox in the Control window, EasyTrain will continually resegment the image as you draw new polygons in the Color Spectrum window. This is computationally expensive, so you won't want to do it on a slow computer. But it can be useful if you are trying to correct a segmentation problem by making small additions or deletions to the polygon defining a color class.

 

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.


参考文献


前のページ
目次
次のページ