クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

UWSCで学習用画像の前処理を自動化してみます

pythonでやる言うたくせにという声が聞こえます

世の中は 夢かうつつか うつつとも 夢とも知らず ありてなければ。かえるのクーの助手の「井戸中 聖」(いとなか あきら)でございます。

このページはUWSCで画像前処理してみます。

今回は説明は略して、やったことだけ記載します。

f:id:AssistantOfKoo:20210522013405p:plain

こっそり野良RPAやってみられたい方は参考になるかもです。

(統制のとれた組織/社会では野良ロボットをかくまうことは大罪のようなので、「くび」をかけてチャレンジください)RPAはあくまでおしごと系の技術だと思っています。自分のパソコンでやる分にはまった問題ないです。ただ、個人用途で機械学習の前処理、後処理以外にはあまり使いどころが思い浮かびません。

UWSCでの記録・再生・手順編集

UWSCに関する情報は書籍をはじめ、たいへん多数ありますので、興味のある方は検索してみてください。(前のページにも書きましたが、もうUWSCが更新されることはありません。とても残念です。)

やることは、前回記載した、学習用の画像編集です。

手順設計

(1)やることをあらかじめ明確にします。

(例)「Target」フォルダにある所定の画像を読み込み、右側に元画像、左側に編集画像となるように編集し、「Train」フォルダに格納します。

画像の編集は「

・画像サイズ1024x1024の画像を読み込み

・全画像サイズを2048x1024として

・左右に同じ画像を複写し

・左側の画像を1024x1024→1280x1280に拡大し、

・左側の画像を中心を相対(-128, -128)移動し

・右廻りに10度回転させ、

・全画像を512x256のサイズとし

・jpgで出力する」とします。

EXCELで指定する方式にします

(2)入出力ファイル名や大切なもしくは、変更する可能性のあるパラメータは EXCELに記載します。(連番ならUWSCのスクリプトで生成してもいいと思います)

f:id:np2LKoo:20210522010813p:plain   f:id:np2LKoo:20210522010903p:plain

この例では作業指示EXCELとして共通部[Common]とファイル名部[Data]にシートをわけています。

こんな情報をひたすらコピペしてパラメータ入力していくわけす。

RPA用に適したプラグインなどの導入

(3)GIMP(今回の自動化対象ソフト)を起動して、不足しているプラグインなどがあれば追加します。

f:id:AssistantOfKoo:20210521202837p:plain

今回は座標指定などのスクリプトを導入します。

先輩、説明をよろしくお願いします。

移動スクリプト

で説明されているスクリプトをGIMPに導入します。(GIMPはこれ系のものを入れないと数値指定の移動ができません)

スクリプト 導入は以下を参照ください。

移動スクリプトを導入しました。

f:id:np2LKoo:20210521220852p:plain

これはお手軽です。

f:id:np2LKoo:20210521230612p:plain

数値で移動が指定できるようになります。

UWSCの準備

(4)UWSCを起動します。

f:id:AssistantOfKoo:20210521202620p:plain

記録モードの設定

(5)UWSCの設定(右端ボタン)で記録方法を「低レベル記録の余分な時間、マウス移動は記録しない」を選択します。

f:id:AssistantOfKoo:20210521203016p:plain 

操作の記録(操作リハーサルがとてもたいへん)

(6)UWSCを記録モードにして、画像の読み込み~編集~保存までの一連の操作を記録します。(記録しながらリハーサルして、無駄な操作の記録をしないように、操作を洗練します)メモを取りながら操作するのがコツです。オペレーションのマクロ記録なので、間違えると最初からやり直しです!(あとから編集もできますが、スクリプトを編集するほうが手間です)

また、メニュー操作以外はマウスクリックは極力使わないようにします。

GIMPでフィールド選択が必要な場合がありますが、そのあとでもCtrl+A してフィールド全選択してExcelから複写した情報をCtrl+V する。などの操作をします。入力フィールド選択ではTABで移動可能な場合は極力そちらを使うなどの必要です。

そのほかはEXCELの情報複写で改行コードなどの制御コードを巻き込むことがあるので、その削除、整形が必須となります。

TIPSはたくさんあるのですが、このあたりはいろんなページを参照ください。

なお、TIPSさえよく理解して「定石」を組み合わせて使えるようになれば、UWSCはちょっとしたRPAソフト(だいたい数十万オーダで超絶高い)には絶対負けません。

f:id:AssistantOfKoo:20210521203347p:plain

冗長性の入り込めない正確なオペレーションの記録と再現は基本中の基本です。(わたくしのUWSC道は10年以上です:期間だけですが。ちなみに、わたくしの中ではUWSCは「素晴らしく実用度が高いソフトなのにそれほど知名度がない」ランキングNo.1です。)

オペレーション例操作メモ:これがスクリプトではありません。単なるシナリオメモです)

f:id:np2LKoo:20210521225603j:plain

↑こんなのをたくさんつくってpix2pixの学習対象とします。

最初の状態
EXCEL起動 Commonシート選択
GIMP起動 空の状態


Excel選択
Ctrl+[HOME]    #A1セルに移動
Ctrl+C    #入力セル内容複写
GIMP選択
/ファイル/場所を開く/    #「場所を開く」ダイアログ起動
入力欄クリック    #初期値は常に空
Ctrl+V    #入力フォルダ情報を貼り付け
[BackSpace]     #0Aコード削除(入力欄により、これを無視するものとしないものあり
EXCEL選択
Ctrl+[PageDown]    #[Data]シート選択
[Home]    #行の先頭セルへポジション
↓    #次のデータへ移る 対象入力ファイル名へポジション
Ctrl+C    #入力ファイル名を複写
GIMPの「場所を開く」ダイアログ選択
場所の入力(URI):フィールドクリック  #前回操作の入力フォルダが表示されている
Ctrl+A    #入力エリア全選択
→    #末尾にカレットを移動
Ctrl+V    #入力ファイル名を貼り付け
BackSpace    #0Aコード削除
[開く]    #画像が読み込まれる
/画像/キャンバスサイズの変更/    #「キャンパスサイズの変更」ダイアログ起動
EXCEL選択
Ctrl+[PageUP]    #[Common]シート選択
↓    #X 作業全体情報へポジション
Ctrl+C  #X 作業全体を複写
GIMPの「キャンバスサイズの変更」ダイアログ選択
キャンパスサイズ 幅(W): 項目クリック    
Ctrl+A    #幅項目情報を全選択
Ctrl+V    #X 作業全体を貼り付け
EXCEL選択
↓    #Y 作業全体へポジション
Ctrl+C    #Y 作業全体を複写
GIMPの「キャンバスサイズの変更」Window選択
キャンパスサイズ 高さ(E): 項目クリック
Ctrl+A    #高さ項目を全選択
Ctrl+V    #Y 作業全体を貼り付け
[リサイズ]    #キャンパスサイズが指定の大きさに変更される
レイヤ選択
/ツール/選択ツール/矩形選択/    #R でもよい
Ctrl+A    #領域を全選択
Ctrl+C    #領域を複写

Ctrl+V    #貼り付けでフローティングに置かれる
フローティングレイヤ上で右クリック/新しいレイヤーの生成/    #フローティングが実レイヤになる

張り付けられたレイヤを選択
Ctrl+A    #該当レイヤを全選択
/レイヤー/レイヤー移動(Shiro版)/    #「Script-Fu:レイヤ移動」ダイアログが起動する
EXCEL選択
↓    #複写移動 X方向へポジション
[F2]shift+←←←←    #セル編集モードにしてセルに記載された情報を選択(これ系の操作は複写先が0A情報を許容しない場合に使用する)←は想定最大の桁数分入れる
Ctrl+C    #セル内の情報を0Aなしで複写する
[Esc]    #セル編集モードを終了する(これを忘れると誤動作する)
GIMPの「Script-Fu:レイヤー移動(Shiro版)」ダイアログ選択
X(横座標): 項目クリック
Ctrl+A    #X項目の情報を全選択する
Ctrl+V    #複写移動 X方向を張り付ける
EXCEL選択
↓     #複写移動 Y方向へポジション
[F2]shift+←←←←    #セル編集モードにして情報選択
Ctrl+C    #セル内情報を0Aなしで複写する
[Esc]    #セル編集モードを終了する
GIMPの「Script-Fu:レイヤー移動(Shiro版)」ダイアログ選択
Y(縦座標): 項目クリック
Ctrl+A    #Y項目の情報を全選択する
Ctrl+V    #複写移動Y方向を張り付ける
[OK]    #移動する ここまでで同じ画像が左右に2レイヤーでできる
右側レイヤ選択
Ctrl+A    #レイヤ全選択
Shift+S    #「拡大/縮小」小窓起動
EXCEL選択
↓    #X 拡大へポジション
Ctrl+C    #X 拡大複写
GIMPの「拡大/縮小」小窓選択
幅(W): 項目クリック
Ctrl+A    #幅情報全選択
Ctrl+V    #X 拡大貼り付け
EXCEL選択
↓    #Y 拡大へポジション
Ctrl+C    #Y 拡大複写
GIMPの「拡大/縮小」小窓選択
高さ(E): 項目クリック
Ctrl+A    #高さ情報全選択
Ctrl+V    #Y 拡大貼り付け
[OK]    #拡大が実行されフローティングに乗る

/レイヤー/レイヤー移動(Shiro版)/    #「Script-Fu:レイヤ移動」ダイアログ起動
EXCEL選択
↓    #X 中心補正へポジション
[F2]   #通常コピー(0A含む)が不可の項目の場合はセル編集モードで複写する
Shift+←←←←    #セル内の項目を全選択
Ctrl+C    #セル内情報を複写(0A含まず)
[Esc]    #セル編集モードを終了
GIMPの「Script-Fu:レイヤー移動(Shiro版)」ダイアログ選択
X(横座標): クリック
Ctrl+A    #X 情報全選択
Ctrl+V    #X 中心補正貼り付け

EXCEL選択
↓    #Y 中心補正へポジション    
[F2]    #セル編集モード
Shift+←←←←    #セル内項目を全選択
Ctrl+C    #セル内情報を複写(0A含まず)
[Esc]    #セル編集モードを終了
GIMPの「Script-Fu:レイヤー移動(Shiro版)」ダイアログ選択
Y(縦座標): クリック
Ctrl+A    #Y 情報全選択
Ctrl+V    #Y 中心補正貼り付け
[OK]    #移動される
Shift+R    #「回転」小窓起動
EXCEL選択
↓    #回転角度へポジション
[F2]    #セル編集モード
Shift+←←    #セル情報の全選択
Ctrl+C    #回転角度 セル情報の複写
[Esc]    #セル編集モードの終了
GIMPの「回転」小窓選択
角度(A): 項目クリック
Ctrl+A    #角度項目全選択
Ctrl+V    #回転角度を貼り付け
[回転]    #回転され、フローティングに乗る
フローティングレイヤ選択/右ボタン/新しいレイヤの生成/    #フローティングレイヤを新規レイヤーにする
一番上のレイヤ選択/右ボタン/下のレイヤと統合/
統合されたレイヤ選択//右ボタン/下のレイヤと統合/
/ツール/選択ツール/矩形選択/    #もしくはR
Ctrl+A    #レイヤを全選択 (この時点でレイヤは1つだけに統合)
Shift+S    #「拡大・縮小」小窓起動
EXCEL選択
↓    #X 縮小へポジション
Ctrl+C    #X 縮小を複写
GIMPの「拡大・縮小」小窓選択
幅(W): 項目クリック
Ctrl+A    #幅を全選択
Ctrl+V    #X 縮小を貼り付け
EXCEL選択
↓    #Y 縮小へポジション
Ctrl+C    #Y 縮小を複写
GIMPの「拡大・縮小」小窓選択
高さ(E): 項目クリック
Ctrl+A    #高さ項目を全選択
Ctrl+V    #Y 縮小を貼り付け

[拡大・縮小]    #拡大・縮小が行われフローティングに乗る

フローティングレイヤ/右クリック/レイヤの固定    #フローティング状態から固定状態に移る
/画像/キャンパスサイズの変更/    #「キャンパスサイズの変更」ダイアログ起動
EXCEL選択
↓    #キャンパスサイズXへポジション
Ctrl+C   #キャンパスサイズX複写
GIMPの「キャンパスサイズの変更」ダイアログ選択
キャンパスサイズ 幅(W): 項目クリック
Ctrl+A    #幅を全選択
Ctrl+V    #キャンパスサイズXを複写
EXCEL選択
↓    #キャンパスサイズYへポジション
Ctrl+C    #キャンパスサイズY複写
GIMPの「キャンパスサイズの変更」ダイアログ選択
キャンパスサイズ 高さ(E): 項目クリック
Ctrl+A    #高さを全選択
Ctrl+V    #キャンパスサイズYを貼り付け 
[リサイズ]    #指定通りにキャンパスがリサイズされる
/ファイル/名前を付けてExport/    #「画像をエクスポート」ダイアログ起動
EXCEL選択
↓    #Outputフォルダにポジション
Ctrl+C    #Outputフォルダを複写
GIMPの「画像をエクスポート」ダイアログ選択
名前(N): クリック
Ctrl+A    #名前を全選択
Ctrl+V    #Outputフォルダを貼り付け
[BackSpace]    #0Aコードを削除
EXCEL選択
Ctrl+[PageDown]    #[Data]シートを選択
→    #出力ファイル名にポジション
Ctrl+C    #出力ファイル名を複写
GIMPの「画像をエクスポート」ダイアログ選択
名前(N): クリック 
Ctrl+A    #名前を全選択
→    #カレットを右端にポジションする
Ctrl+V    #出力ファイル名を貼り付け
[エクスポート]
[エクスポート]    #これで出力フォルダへ前処理変換した画像ファイルが保存される
/ファイル/すべて閉じる/    #次の処理のために作業中の状態をクリアする
[保存しない]

 まぁ、分岐のないプログラムです。

やることの割にめんどくさそうな感じは伝わると思います。全く冗長性のないオペレーションにするために無駄に手順が「とても多く」なります。他に介在されやすい、マウス操作は極力少なくしております。

操作記録の終了

(7)操作がおわれば[停止]ボタンを押します。

f:id:AssistantOfKoo:20210521203528p:plain

操作記録の保存と再生

(8)記録したら、再生で同じように操作できるか確認します。再生前に必ず一旦保存しましょう。このとき必ず準備したファイルなどは「最初の状況と同じ状況」にします(出力ファイルを消去するなど)

f:id:AssistantOfKoo:20210521203757p:plain

スクリプトの編集

(9)必要に応じて記録されたスクリプトを編集します。(タイミングの調整など)

なお、タイミング調整で「不用意に」sleepを多用するのは「アンチパターン」です。

大量の処理をする場合大きなネックになりますし、PCの負荷や処理速度に依存するような場合は結局オペレーションが失敗します。(諸々わかったうえでsleepをいれることはもちろんあります)

一度でうまくいくなんて絶対ありえません。十数回のオペレーションを覚悟しましょう。(コツがつかめれば簡単です)

慎重にやった場合はキー入力の時間が必要以上に長く記録されていますので、元のファイルの退避をした上で時間を調整します。(UWSCについたマニュアルを参照)

・特にKBD(VK_CTRL,DOWN,ミリ秒)は何度もキャプチャリングされる傾向があるので、不要なものを消します。(わたくしは最初と最後を残して途中を消しています)

・1回あたり0.1秒多くかかるだけで、1万回やると1000秒も違いがでます。

・あまり時間を追い込みすぎると操作ば失敗(タイミングがあわない)する確率があがります。

繰り返し処理の実装

(10)UWSCの文法で正常に動作するスクリプトをLoopさせるように編集します。また、ファイル名などをEXCELに記載された情報を利用するようにします。(変数でもよいですが、より汎用性の高いEXCELでの記載でやってみます。

リセットポイントの調整

(11)繰り返しでEXCELの所定の部分を順次読み取るようにセル位置リセット箇所を調整します。

終了は確実に

(12)EXCELに記載された終了マークを読み取れば、処理を終了するようにします。

ひたすらテスト

(13)10個くらいの繰り返しでうまくいくように調整します。

ひたすらテスト

(14)1000個くらいの繰り返しでうまくいくように調整します。

ただひたすらテスト

(15)1万件以上の繰り返しでうまくいくように調整します。

実施!

(16)クリックしてほおっておけば、100万件の画像の処理がいつかは完了します。(1昼夜~2~3日、はたまた1週間?)

でもそんなにやるなら、プログラム組みますよね?でも、特定のアプリの操作を介在させたい場合は、RPA的な手法も有効たと思います。

何度も使うならすこしたいへんでも工夫しましょう

(17)できれば途中で失敗中断したときに所定の場所から再開できるしくみを考えます。

 うまくいっているようでもだいたいの場合、どこか途中で失敗・中断します。

ここまでできれば、(6)の記録と作成済の枠組み/しくみの繋ぎ変えでだいたいの処理は自動化できます。

f:id:np2LKoo:20210523000322g:plain
ある意味プログラム以上にしんどいです。。。(面白味はないけど役に立つ)

f:id:np2LKoo:20210523003652p:plainいままで2時間以上かかっていたつまらない仕事が、5分モトネタを準備し、10分ほおっておくだけで終ります。これだけをやった場合、1人1日あたり7時間の削減効果です。え?明日から来なくてよいですか、そうですか。

 操作ハンドリングが悪すぎれば、GIMP側でも補助スクリプトを書いたほうがよいかもしれません。思いのほかGIMPのLISPスクリプトは描きやすそうです。