沼津高専 電子制御工学科
MIRSMG3D 数字認識プログラムに関するデータ
MIRSMG3D-IMGP-0103
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.15 杉山 初版


目次






1.はじめに

本ドキュメントは数字認識プログラムに関するデータ、及びプログラム実行時に予想される問題の対処方法について述べる。


2.数字認識プログラムに関するデータ

この項目では以下の5つのデータを公開する。
これらのデータはMG3競技の決定及び、プログラム改良の参考になると思われる。

  1. プログラムの負荷の目安
  2. 処理時間の目安
  3. 距離と回転角度に対する認識可能範囲
  4. 数字の大きさと認識可能な距離
  5. 距離とピクセル数


  1.  プログラムの負荷の目安をTable 1にまとめる。
     このデータはプログラムの実行時に「top」というコマンドを用いて数字認識プロセスのCPU使用率、メモリ使用率を表したものである。あくまでプログラム本体のみの負荷であることに注意すること。

    Table 1
    画像解像度
    [pixel]
    CPU使用率
    [%]
    メモリ使用率
    [%]
    160×120 13 1.4
    320×240 65 1.8
    640×480 90 3.5


  2.  プログラムの処理時間の目安をTable 2にまとめる。
     このデータは数字認識1ループにかかる処理時間を関数gettimeofday( )を用いて、バックグラウンドによる影響も含めて測定したものである。尚、走行系など他のプログラムは動かしていない環境で測定した。
     このデータはあくまで目安であり、背景や、パラメータにより変化すると思われる。

    Table 2
    画像解像度
    [pixel]
    処理時間
    [sec]
    160×120 0.8
    320×240 2.0
    640×480 8.0


  3.  ターゲットの認識可能な回転角度と距離の関係をFig.1に示す。尚、ここでの回転軸は文字の高さ方向に取った。このときのデータをFig.1 (a),(b)に示す。


    (a) 反時計回りに対するデータ

    (b) 時計回りに対するデータ

    Fig.1 数字の距離と回転角度に対する認識可能範囲



  4.  文字の大きさと認識可能な距離の関係をFig.2に示す。尚、文字の縦横比は固定されている。


    Fig.2 文字の大きさと認識可能な最大距離



  5.  ピクセル数と距離の逆数の関係をFig.3に示す。


    Fig.3 ピクセル数と距離の逆数


 元となるデータやデータ収集の方法の詳細、もう少し詳しい解説は
num_data.zipとしてまとめた。また、ここでは記載していない解像度と認識可能な距離のデータもzipファイルには含まれている。プログラム上、解像度を自由に変更することはまだできていないが、解像度を変更してプログラムを軽くしたいなどといったときの参考になるのではないかと思われる。


3.基本的なパラメータと処理結果

 ここでは、色の閾値の変更、紙に対する文字の色を設定するFONT_COLORの変更、エッジ検出のパラメータを変更、可変閾値法のパラメータを変更したときのそれぞれの結果を示す。

  1.  色の閾値の変更

     色の閾値のパラメータはimg/num_threshold_value.hでTARGET_TH1_MIN〜TARGET_TH3_MAXとして定義されている。
     ここでは黒い紙を検出する際に用いる色の閾値をRGBの値で0以上50以下から0以上100以下というように設定を甘くしてみた。
     色の閾値を変更した結果をFig.4に示す。
     閾値を甘くした場合、ターゲットの後ろの影も黒と認識してしまったと思われる。さらに影の部分と明るい部分との境目が比較的滑らかに変化しているため黒い平面と予想してしまい、ラベリングの結果ターゲットと関係のないところまで検出されていることがわかる。
     このように閾値を甘くしすぎると誤認識する確立が増えるだけでなく、処理にかかる時間も長くなるためなるべく厳しくとったほうがよいかもしれない。

    (a) 入力画像 (b) 閾値=50 (c) 閾値=100
    Fig.4 色の閾値による違い


  2.  FONT_COLORの変更

     FONT_COLORはimg/num_threshold_value.hで定義されている。
     FONT_COLORは紙に対して文字が明るい場合"white"、暗い場合"black"と定義すべきものである。しかしここではもしも設定が逆になっていた場合どのような結果が出力されるか調査する。
     結果をFig.5にまとめる。正しい設定を行ったほうが(a)、間違った設定を行ったものが(b)である。
     (b)において、「6」の内部が白く塗りつぶされた形になった。もちろんこれでは正しい認識はできない。ラベリング処理までうまくいっているがターゲットが認識されないといった場合はこの設定を確認してみるのも手である。
     また、(b)中に1本だけ黒い線が入っていているのが気になった方もいるかもしれないが、これはアルゴリズム上たまたま発生したものであると考えられる。

    (a) 正しい設定 (b) 間違った設定
    Fig.5 FONT_COLORによる違い


  3.  エッジ検出時のパラメータの変更
     エッジ検出のパラメータはimg/num_detect.cで定義されており、オペレータのサイズを決定するEDGE_OPERATOR_SIZEと2値化の際の閾値を設定するTH_EDGEとがある。
     特にEDGE_OPERATOR_SIZEはOpenCVの関数であるcvLaplaceの第3引数(aperture_size)に相当する。 今回は閾値を一定とした状態でオペレータのサイズの変更について調査を行った。今回、オペレータのサイズは3, 5, 7とした。
     結果をFig.6に示す。
     オペレータのサイズを大きくすると黒いピクセルの割合が増えていることがわかる。エッジ検出はあるピクセルの値が周囲の値との差を見ているため、範囲が広くなればなるほど値の差が大きくなる可能性があり、これもそれが原因ではないかと考えられる。
     今回の場合は「5」程度が妥当であると考えられるが、検出する物体が小さい場合には「3」ぐらいが適しているとも考えられ、ターゲットの色の変化が極端に小さい場合には「7」として平面の検出をより厳しくすることもできると思われる。

    (a) 入力画像
    (b) オペレータサイズ 3 (c) オペレータサイズ 5 (d) オペレータサイズ 7
    Fig.6 オペレータサイズによる違い


  4.  可変閾値法のパラメータの変更

     可変閾値法のパラメータとしてヒステリシスの幅がimg/num_detect.cにTH_WIDTHとして定義してあるが今回はそれを変更した場合の処理結果の違いについて述べる。本来、このパラメータは文字と紙とのコントラストが小さい場合にはこれを小さくとり、逆の場合は大きくとることが理想的である。
     実際にTH_WIDTH (以下 w) として5、20、100それぞれの場合について実行した結果Fig.7が得られた。今回試したターゲットは紙の色が黒、文字色は白である。
     まずw = 5の場合であるが、このときヒステリシスの幅があまりに小さすぎるために平面のわずかな凹凸にも反応してしまい、数字の周りの紙である部分も文字色として処理され、白くなってしまっていることがわかる。
     次にw = 100の場合であるが今度はヒステリシスの幅が大きすぎるために文字の始まりや終わりの色の境目の検出が困難になってしまい、文字や文字の内部がうまく処理できていないことがわかる。
     このようなことに注意してこの値を決定しないと認識に大きな影響を与えるので注意するようにしたい。

    (a) w = 5 (b) w = 20 (c) w = 100
    Fig.7 可変閾値法のパラメータによる違い



4.予想される問題とその対処法

Q. ターゲットが認識されない

A. ターゲットが認識されない原因として以下のことが考えられる。

  1. ターゲットの色の閾値の設定

  2. FONT_COLORの設定

  3. 画像の解像度の設定

  4. エッジ処理のパラメータ

  5. 可変閾値処理のパラメータ

よくある原因は1と2である。

対処法:
  1. ファイルとして保存された入力画像をgimp等のスポイトツールを使用し、HSVやRGBの値を確認し、それに応じてthreshold_value.hの内容を更新する。このときHの値だけは1/2倍することを忘れないようにする。

  2. threshold_value.hに定義されているFONT_COLORを、文字が背景に対して明るい場合は"white"に、暗い場合は"black"に設定する。
  3. 画像のサイズとしてnum_detect.cに定義されているIMAGE_WIDTHとIMAGE_HEIGHTの値がそれぞれ320と240に設定されているか確認する。
  4. エッジ処理のパラメータとしてnum_detect.cに定義されているEDGE_OPERATOR_SIZEとTH_EDGEがあるが、これらが5と70前後になっていることを確認する。この値は背景の状況によって変更する必要がある場合も考えられる。
  5. 可変閾値処理のパラメータとしてnum_detect.cに定義されているTH_WIDTHがあるが、この値が20程度となっているか確認する。

 このほかにも、グレースケール変換したときに紙の色と文字の色とが似た明るさになることや、ターゲットが回転しているために認識できない、またターゲットの一部が手などで隠れてしまっていることが考えられる。


Q. ウィンドウが表示されない

A. 原因として以下のことが考えられる

  1. #define __USE_CV_WINDOW__がコメントアウトされている。

  2. main関数でウィンドウの作成を行っていない。

対策法:
  1. use_window.hで宣言されている#define__USE_CV_WINDOW__のコメントアウトを解除して、コンパイルしなおす。念のためmake cleanを実行してからコンパイルする。
  2. 作成したmain関数にshow_window.hがインクルードされていること及び、cvNamedWindow関数で指定した名前のウィンドウを作成する文がm_num_detect.cの記述に沿って書かれているか調べる。記述の方法が違った場合は書き直し、コンパイルする。特にifdef文の打ち間違えには注意する。


Q. 画面に何も表示されない

A. ウィンドウの名前が間違っている可能性がある

対策法:
 show_window.hで定義されている名前のとおりにウィンドウが作成されているかを確認する。違っていたら書き直してコンパイルしなおす。念のためmake cleanは行う。


Q. 画像の乱れがひどくて認識できない

A. カメラからのキャプチャ時にuvccaptureを使っていない可能性がある

対策法:
 num_detect.cの最初で定義されている__NUMR_CV_IO__という文がコメントアウトする。これが完了したらコンパイルしなおし、実行する。
 基本はこれで解決されるが、これでもなお解決されない場合はカメラをいったんMG3からはずして、接続しなおすと解決される場合がある。


Q. 表示されている画像が更新されない

A. スーパーユーザーモードで実行する

対策法:
 プログラム開始時のコマンドを
  sudo ./実行ファイル名
 として実行する。


Q. 自分でプログラムを組んだがいやに動作が重い

A. プログラムが複雑、またはメモリリークを起こしている

対策法:
 テンプレートマッチングなどの処理は比較的プログラムが複雑なため処理が重くなったりする。
 プログラムの終了が時間の経過とともに重くなるといった症状はメモリリークが考えられる。確認の方法としては別の端末を開き、「top」とタイプする。このときにはまだプログラムを動かしておく。そこで実行ファイルのメモリ使用率の時間経過をチェックする。時間とともにメモリが増えている場合はメモリリークを起こしている。プログラム中でむやみに画像を作成していないか、作成後メモリの開放を忘れていないかをチェックする。


関連文書