美味しい焼き鳥屋さん

初心者による技術系のメモ

InstaMAT Pipelineを使って自動画像生成ツールを作る

前回の記事
t0rry.hatenablog.com

この記事で作成したもの

Seed値をランダムに設定し、毎回ランダムな画像を作成します。
IMPファイル、出力先をD&D及びプロジェクト名を入力するだけで処理が終了するCUIツールのテストケースです。
(入力したファイルを加工する処理は次回の記事で紹介予定です)

今回作成したものを解説していきます。

youtu.be

出力される画像(サンプル)



注意

batファイルを用いたバッチ処理を行っています。
取り扱いが初めてなので至らぬ点があります。注意ください

仕組み

InstaMAT Studio


まずは、InstaMAT内で画像を生成する機構を作成します。
外部からSeed値を指定し、毎回異なる画像を出力したいため独自のSeed値「InstanceSeed」をUInt32型で定義しています。
InstanseSeedパラメータは「模様」に関連するノードである「Fabric Patern Generator」、「色」に関連するノードである「HSL」に接続しています。
また、色情報はFloat型のためUintからFloatの変換処理を簡単に行っています。
インプット値であるInstanceSeedの値が極端に増加することによる色の視覚上の不具合を回避するために「Clamp UInt」で値の上限値を制限しています。

また、入力値である「InstanceSeed」は「Seed」と名付けることは行っていません。
外部から参照するパラメータ名「Seed」はユーザーが作成したパラメータより優先してInstaMAT Studio側の全体環境のSeed値が参照されてしまうためです。

出力はカラーイメージを設定します。名称はこだわりがないため、「Output」のままにしています。


プロジェクト名を命名します。
「noise」に設定しました。

プロジェクトを保存します。
パッケージの配置場所は次項で説明します。

これにてInstaMAT Studio側の設定は完了です。

フォルダ階層

前項で作成したプロジェクトを「graphic.IMP」として保存します。
CUI側でD&Dしてファイル参照するので名前は何でもいいです。

次項以降で説明をするbatファイル、画像出力用のフォルダ、bachのモジュール格納するフォルダの階層になっています。
(batchが正しい名称でしたね汗)

InstaMAT Studio Pipelineと同一のディレクトリにファイル群が存在しないことが肝です。

バッチファイルを作る(概要)

自動生成ツールのコードをゴリゴリ書く前に記述内容を考えていきます。

ちなみにInstaMAT PipelineでLibrary Graphを実行するときのサンプルコードは以下のとおりです。

InstaMATPipeline -mode Execute "IMPファイル" -graph "グラフ名" 1024 1024 Normalized8 "出力先"

起動の度に「IMPファイルの場所」、「グラフ名」、「出力先」含めた全てのコードを修正するのは非常に手間なので対話型のバッチファイルを作ることが目的です。

処理の順番は以下のとおりです。

  1. バッチファイルの起動 -A
  2. InstaMAT Pipelineの実行(参照)
  3. ユーザーが実行するIMPファイルを指定 -A
  4. ユーザーが出力する先のフォルダを指定 -A
  5. 処理を行うことの確認 -A
  6. 実行するグラフ名を指定 -B
  7. 実行する回数の指定(forループ) -B
  8. 実行 -B

これらを以下の機能を分けてバッチファイルを作成しました。
ファイル参照をする機構
→A

機能実行
→B

バッチファイルを作る(コード編)

実行内容を大まかに理解したところで、実際のコードを見ていきます。

@echo off

echo InstaMAT Pipelineの確認
InstaMATPipeline

rem ################### ユーザーに入力してもらう。 ###################
echo "IMPファイルをD&Dしてください"
set /p input_from_user=

echo "出力先のフォルダをD&Dしてください"
set /p  output_folder=

rem ################### 分岐 ###################
set /p yn_check="処理を続ける(y/n)"
IF %yn_check%==y (
  echo 処理を開始します。
  call .\module\image_out.bat %input_from_user% %output_folder%
) ELSE (
  echo 処理を行わず終了します)
pause

一番冒頭に「InstaMATPipeline」の実行をしていますが、無くても動きます。
見てわかるとおり、 /pを渡すことで変数をユーザーが入力できるようになります。
自動的に処理が進んでしまうことを防ぐために(y/n)を間に入れています。

処理を進める場合は別モジュールで定義したIMPファイルを実行するバッチファイルを呼び出しています。

echo グラフ名を設定します
set /p graph_name=

rem ################### pipelineのパス ###################
set pp=C:\Program Files\InstaMAT Studio
Cd %pp%

rem ################### 処理を実行 ###################
echo 繰り返し回数を入力
set /p count1=


rem ############# 繰り返し処理(開始) ###################
setlocal enabledelayedexpansion
for /l %%i in (1,1,%count1%) do (
	set rand1=
	set /a rand1=!random!*1500/32768
	InstaMATPipeline -mode Execute %1 -graph %graph_name% 1024 1024 Normalized8 "%2\!rand1!.png" -parameter InstanceSeed !rand1!
	echo !rand1!
)
endlocal
rem ############# 繰り返し処理(終了) ###################


IMPの中に保存されているプロジェクトを参照することを目的にプロジェクト名を入力します。
InstaMAT Pipelineは「C:\Program Files\InstaMAT Studio\InstaMATPipeline.exe」を参照する必要があるため、カレントディレクトリを移動する必要があります。
pipeline path 略してpp変数にファイルパスを直接入力しています。

前の記事との差別化も兼ねてループ処理を実行します。
ユーザー側でループ回数を設定できるようにしています。

ループ処理内で「InstanceSeed」に代入する値をランダム生成しています。
プロジェクト側で設定したInstanceSeedの上限値(Clamp UInt)と同様に最大値1500の乱数を定義しています。

定義した乱数やユーザーがCUI上で設定した各種ファイルパスなどを用いてメインの処理部分の実行を行っています。

課題など

InstaMAT Pipelineで繰り返し処理をする場合、都度InstaMAT Pipelineを再起動しているため、動作が若干もっさりします。
今回は入力値を乱数に割り当て、「自動的に画像を生成するツール」を作ってみましたが次回はメッシュデータを入力したら「自動でUV展開をした上にルールに則ったテクスチャペイントをし、PBRテクスチャを書き出す」機構を自動化してみようかと思っています。