画像認識の高速化と精度を高める方法

画像認識は多少処理に時間がかかってしまいます。複数の画像を認識させる場合はそれだけ時間がかかってしまうので思いのほか時間がかかってしまうかもしれません。

処理に時間がかかりすぎてしまっては使い物にならないので画像認識を高速化させるテクニックを活用しましょう。

 

範囲を限定して画像認識を高速化する

画像認識させる範囲を限定すれば処理が高速化します。

例えば対象とすべきウィンドウの範囲外は誤認の原因にもなりますし、余計な処理に時間を取られてしまうことにもなります。 必要なウィンドウの領域だけ指定して画像認識させることで処理が高速化できます。

実際の範囲指定の仕方は次のようになります。

画面の左上方面のみ認識させる場合のサンプル(解像度1920*1080の場合)

CHKIMG("sample.bmp", 1, 0, 0, 960, 540)

このサンプルの0, 0, 960, 540の部分が範囲指定の部分です。

最初の0は範囲の左上のX座標です。

次の0は範囲の左上のY座標です。

960の部分は範囲の右下のX座標です。

540の部分は範囲の右下のY座標です。

 

位置情報に関係するシステム変数

G_SCREEN_W 画面の幅が代入されています。

G_SCREEN_H 画面の高さが代入されています。

G_MOUSE_X マウスカーソルのX座標が代入されています。

G_MOUSE_Y マウスカーソルのY座標が代入されています。

 

マウスカーソルの下にあるウィンドウの座標を求めるサンプル

ID = GETID(GET_FROMPOINT_WIN) // マウスカーソル下のウィンドウ
IFB ID >= 0
 x1 = STATUS(ID, ST_X) // X座標を取得
 y1 = STATUS(ID, ST_Y) // Y座標を取得
 x2 = STATUS(ID, ST_WIDTH) - x1 // 幅を取得し右下X座標を求める
 y2 = STATUS(ID, ST_HEIGHT) - y1 // 幅を取得し右下Y座標を求める
 MSGBOX("ウィンドウの左上X座標 = " + x1 + "<#CR>ウィンドウの左上Y座標 = " + y1 + "<#CR>ウィンドウの右下X座標 = " + x2 + "<#CR>ウィンドウの右下Y座標 = " + y2)
ELSE
 MSGBOX("ウィンドウ認識に失敗しました。")
ENDIF

このサンプルを実行させるとUWSCのウィンドウの位置を認識してしまいます。任意のキー入力があったらこの処理をするようにしましょう。

こうして得られた座標情報で画像認識の範囲を制限することで処理を高速化できます。

 

画像認識の範囲をウィンドウのサイズにするサンプル

ID = GETID(GET_FROMPOINT_WIN) // マウスカーソル下のウィンドウ
IFB ID >= 0
 x1 = STATUS(ID, ST_X) // X座標を取得
 y1 = STATUS(ID, ST_Y) // Y座標を取得
 x2 = STATUS(ID, ST_WIDTH) - x1 // 幅を取得し右下X座標を求める
 y2 = STATUS(ID, ST_HEIGHT) - y1 // 幅を取得し右下Y座標を求める
ELSE // 取得に失敗した場合は全画面を画像認識の範囲にする
 x1 = 0 // X座標を設定
 y1 = 0 // Y座標を設定
 x2 = G_SCREEN_W // 幅を取得し右下X座標を設定
 y2 = G_SCREEN_H // 幅を取得し右下Y座標を設定
ENDIF
CHKIMG("sample.bmp", 1, x1, y1, x2, y2)

実際に使う場合は他の方法でウィンドウのIDを取得したほうが確実です。

ウィンドウの位置が変化しないという前提なら、最初に一度画像認識させる範囲を取得させることで後の処理で範囲を限定し高速化させることができます。

 

画像認識の範囲を限定した場合、どれくらい処理が高速化するのか

CHKIMG関数は特に設定しなければデスクトップ全体を画像認識の検出範囲にします。

デスクトップ全体を画像認識の検出範囲にしてしまうとどれくらい時間がかかるのか、そして検出範囲を限定した場合、どれくらい高速化できるのか試してみました。

普通に画像認識させても処理が一瞬で終わってしまうので1000回ほど処理を繰り返しています。

結果は秒数単位なので1秒の誤差が発生する可能性も高いです。

使用したスクリプトは次のものです。

 

画像認識の検出範囲をデスクトップ全体にした場合

start = GETTIME()
FOR i = 1 TO 1000
 CHKIMG("sample1.bmp", 1)
NEXT
stop = GETTIME()
PRINT stop - start + "秒"

 

画像認識の検出範囲をデスクトップの左上方面にした場合

start = GETTIME()
FOR i = 1 TO 1000
 CHKIMG("sample1.bmp", 1, 0, 0, G_SCREEN_W / 2, G_SCREEN_H / 2)
NEXT
stop = GETTIME()
PRINT stop - start + "秒"

 

デスクトップ全体を対象にした場合は19秒かかりました。

デスクトップの左上方面のみに対象を限定したら10秒かかりました。

画像認識の検出範囲を限定することで処理が高速化されました。

 

デスクトップコンポジションを無効にする

画像認識を高速化させる方法はスクリプトの工夫以外にも存在します。

デスクトップの描画システムであるデスクトップコンポジションを無効化することで画像認識の処理が高速化するかもしれません。

ここではUWSCを起動すると同時にデスクトップコンポジションを無効化する方法を取り上げます。

UWSCのインストールされているフォルダを開きましょう。

UWSC.exeファイルを右クリックしメニューを表示させ、プロパティを選択します。

タブから互換性を選ぶとデスクトップコンポジションを無効にするという項目があります。

チェックを入れてOKを押しましょう。これでUWSCを起動させるとデスクトップコンポジションが無効化されます。

UWSCを終了させればデスクトップコンポジションの無効化も解除されます。

デスクトップコンポジションの無効化画面

 

 

デスクトップコンポジションの無効化で高速化できるのか検証結果

適当なファイルで画像認識させて処理速度を比較してみました。

普通に画像認識させても処理が一瞬で終わってしまうので1000回ほど処理を繰り返しています。

結果は秒数単位なので1秒の誤差が発生する可能性も高いです。

使用したスクリプトは次のものです。

start = GETTIME()
FOR i = 1 TO 1000
 CHKIMG("sample1.bmp", 1)
NEXT
stop = GETTIME()
PRINT stop - start + "秒"

 

デスクトップコンポジションを有効にした場合、処理が完了するまで53秒でした。

デスクトップコンポジションを無効にした場合、処理が完了するまで19秒でした。

おまけで視覚テーマについても試してみましたが、視覚テーマを無効にしても高速化に影響しませんでした。

以上の結果から、デスクトップコンポジションを無効にすることで大幅な高速化が可能といえます。