Denoising(ノイズ除去)

Denoising

images/denoiseBefore.png

ピクセルあたり96個のサンプル, ノイズ除去前

images/denoiseAfter.png

ノイズ除去後

モンテカルロアルゴリズムでは、サンプル数に対して収穫逓減の法則をとります。レンダリング画像のノイズ量を半分に除去するには、通常、サンプル数が4倍必要です。RenderManのバージョン20では、レンダリング画像のノイズ除去に関して、別の方法を提供する新しいツールが用意されています。このツールは、本来はWalt Disney Animation StudiosおよびDisney ResearchがBig Hero 6用に作成したもので、結果として、主要な映画製作においては、すでにテストが行なわれ、実証されています。

基本フィルタリング

Mayaの使用

images/denoiseMaya.png

RfMからノイズ除去ツールを使用する方法が、極めて簡単です。現在、Render Settings内のSamplingタブに、ドロップダウンリストが追加され、ここからFrameまたは Cross-frameフィルタリングを選択することができます。Frameを選択すると、RfMは、ノイズ除去が可能な画像の作成に必要な設定を自動的に適用します。これにより、後処理としてツールが実行され、特別に設定したEXR画像で統計フィルタリングによりノイズが削除されます。

Katanaの使用

ノイズ除去ユティリティを後処理として実行するには、数個のノードを設定する必要があります。

images/rfkDenoiseSetup.png

1) Prman Globals Settings(Prmanグローバル設定)

raytrace hiderのピクセルフィルターモードに対して重要度サンプリングを有効にします。これにより、レンダーでの斑点が除去されます。

images/rfkDenoisePixelFilterMode.png

2) PrmanDenoiseChannelDefine

PrmanDenoiseChannelDefineノードを作成します。このノードは、ノイズ除去ユティリティに必要な、特定のDisplayChannelをすべて作成するためのマクロです。

images/rfkDenoiseChannels.png

3) PrmanDenoiseRenderOutputDefine

PrmanDenoiseRenderOutputDefineノードを作成します。このノードは、AOVに結合したビューティーパスに対して、マルチチャンネルOpenEXRファイルをレンダリングするためのマクロです。

images/rfkDenoiseBeautyOutput.png
パイプラインがマルチチャンネルEXRをサポートしていない場合、$RMANTREE/bin/exrmergeを使用して、AOVをマルチチャンネルEXR内に結合することができます。その後、このマージしたマルチチャンネルEXRをノイズ除去ユティリティに使用します。尚、各AOVのタイプは"raw"に設定してください。この設定により、ノイズ除去ユティリティが探すEXRでのチャンネル名が維持されるためです。KatanaのRenderOutputDefineのマージにより結合したEXRは、ノイズ除去ユティリティとは動作しません。

4) RenderOutputDefine Scriptによるノイズ除去の実行

  • 単一フレーム

    RenderOutDefineを作成します。このノードを前のRenderOutputDefineノードに接続します。scriptタイプを選び、scriptInputではprimaryを選びます。scriptCommandは、以下のように設定します:

    $RMANTREE/bin/denoise $INPUT
    
images/rfkDenoiseFrameScript.png

デフォルトでは、<image>_filtered.exrが書き出されます。これは、-oを指定することで変更することができます。ノイズ除去ユティリティの他のオプションに関する詳細は、denoise -helpを実行してください。

NOTE: We can run the denoise utility for AOVs. See Layered フィルタリング for more information.

RIBから

注:AOVに対してノイズ除去ユティリティを実行することができます。詳細は、DisplayChannelを参照してください。

# Beauty...
DisplayChannel "color Ci"
DisplayChannel "float a"
DisplayChannel "color mse" "string source" "color Ci" "string statistics" "mse"

# Shading...
DisplayChannel "color albedo" "string source" "lpe:nothruput;noinfinitecheck;noclamp;unoccluded;overwrite;C(U2L)|O"
DisplayChannel "color diffuse" "string source" "color lpe:C(D[DS]*[LO])|O"
DisplayChannel "color diffuse_mse" "string source" "color lpe:C(D[DS]*[LO])|O" "string statistics" "mse"
DisplayChannel "color specular" "string source" "color lpe:CS[DS]*[LO]"
DisplayChannel "color specular_mse" "string source" "color lpe:CS[DS]*[LO]" "string statistics" "mse"

# Geometry...
DisplayChannel "float z" "string source" "float z" "string filter" "gaussian"
DisplayChannel "float z_var" "string source" "float z" "string filter" "gaussian" "string statistics" "variance"
DisplayChannel "normal normal" "string source" "normal Nn"
DisplayChannel "normal normal_var" "string source" "normal Nn" "string statistics" "variance"
DisplayChannel "vector forward" "string source" "vector motionFore"
DisplayChannel "vector backward" "string source" "vector motionBack"

Display "image.exr" "openexr" "Ci,a,mse,albedo,diffuse,diffuse_mse,specular,specular_mse,z,z_var,normal,normal_var,forward,backward" "int asrgba" 1
Hider "raytrace" "string pixelfiltermode" "importance" # ...

ノイズ除去ユティリティは、ここで指定された名前とまったく同じチャンネル名を持つ、マルチチャンネルOpenEXRを要求します。Light Pathエクスプレッション

により、ディフューズとスペキュラーのコンポーネントを分け、マテリアルに対して、ライトが当たっていないアルベドカラーを受け取ります。統計パラメータにより、リンク画像での変化やエラーを評価する画像をprmanが作成するようにリクエストします。前後のチャンネルは、厳密には、ここで必要ではありませんが、フィルタリング画像をモーションブラーと配列する場合は役に立ちます。

アルベドの場合、U8、またはuser lobe 8が、標準のPxr materialsからのアルベドに対するデフォルトのルーティングです。実際の数は、rendermn.iniファイルにより決まりますが、サイトがLPEローブをそれぞれに割り当てたカスタムシェーダを使用する場合、1から8までの数であれば変更することができます。
/prman/lpe/user2                Albedo

尚、Zおよびz.varで指定したフィルターは、使用するPixelFilterの選択と一致させてください。通常、RISでのZチャンネル出力は、デフォルトで、ピクセルフィルターではなく"min"フィルターを使用するようになっています。しかし、denoiserは、Zチャンネルが、他のチャンネルのようにフィルターがかかったピクセルであることを要求します。
ここでの最後の重要な設定は、raytrace hiderでピクセルフィルターの重要度サンプリングを有効にすることです。通常、1個のピクセルによるサンプルは、その隣接するピクセル内で共有され、サンプルの周囲のフィルター領域にあるすべてのピクセル内にブレンドされます。これは、IPRでフィードバックをすばやく取得する場合に役に立ち、画像の収束が少し速くなります。しかし、denoiserは、各ピクセルが他のすべてのピクセルから統計的に独立し、ピクセル間で共有するサンプルがないことを要求します。このオプションの有効化を忘れた場合、denoiserは、通常、フィルタリングの後、過剰に斑点のある画像を生成します。

これらのすべてのオプションを設定後、prmanにより生成された画像でdenoiserを実行することができます:
denoise image.exr

これにより、フィルタリングされた画像と一緒に、新しいファイル: image_filtered.exrが生成されます。複数の画像ファイルがある場合、それらをすべてコマンドラインに渡すことができます。denoiserは、順番に各ファイルをフィルタリングします。

Cross-Frame Filtering(クロスフレームフィルタリング)

アニメーションのシーケンスでは、denoiserをcross-frame filteringモードに設定することができます。このモードでは、各フレームのフィルタリングは、直前と直後にあるフレームからのピクセルも考慮します。

Mayaの使用

RfMでこのオプションを有効化するには、ノイズ除去のドロップダウンボックスから、Frameではなく、Cross-frame filteringを選択して、シーケンスをレンダリングするだけです。

Katanaの使用

設定は、単一フレームのフィルタリングとよく似ていますが、renderSettingsのscriptCommandで、前のフレーム、現行のフレーム、次のフレームと一緒に、--crossframe -v varianceを使用する点が異なります。

`$RMANTREE/bin/denoise  --crossframe -v variance
image.'+str(int(frame)-1)+'.exr image.'+str(int(frame))+'.exr image.'+str(int(frame)+1)+".exr"
images/rfkDenoiseCrossFrameScript.png

デフォルトでは、<image>_filtered.#.exrが書き出されます。これは、-oを指定することで変更することができます。ノイズ除去コマンドの他のオプションに関する詳細は、denoise -helpを参照してください。

注:AOVに対して、crossframeを使用して、ノイズ除去ユティリティを実行することができます。レイヤフィルタリングを参照してください。

RIBから

RIBからそのままレンダリングする場合、上記の基本レンダリングでの設定と同様に各フレームを設定します。最良の結果を得るために、今回は、前後のモーションベクトルが含まれていることを確認してください。その後、以下のようにノイズ除去ユティリティを実行します:

denoise --crossframe -v variance frame*.exr

denoiserは、各フレームを順番に処理して、一連の画像を書き出します。入力ファイルが、frame00.exrからframe99.exrの場合、出力は、frame_filtered00.exrからframe_filtered99.exrに入ります。

レンダーファームを使用していて、ノイズ除去の作業をノードにわたって分配したい場合、または、レンダリングとノイズ除去をインタリーブしたい場合、方法はやや複雑になりますが、以下を行なうこともできます。
prman frame01.rib
prman frame02.rib
prman frame03.rib
denoise --crossframe -v variance -L frame01.exr frame02.exr frame03.exr
prman frame04.rib
denoise --crossframe -v variance -F -L frame02.exr frame03.exr frame04.exr
prman frame05.rib
denoise --crossframe -v variance -F -L frame03.exr frame04.exr frame05.exr
...
prman frame98.rib
denoise --crossframe -v variance -F -L frame96.exr frame97.exr frame98.exr
prman frame99.rib
denoise --crossframe -v variance -F frame97.exr frame98.exr frame99.exr

-Fおよび-Lのオプションは、cross-frame filteringを使用する場合、denoiserが、指定された最初と最後の画像をそれぞれ使用するように要求しますが、それらの画像自体には実際、ノイズ除去を行なわないように要求します。従って、フレーム2, 3, 4を持つ-Fと-Lを使用すると、フレーム2と4を使用することになりますが、フレーム3のみをフィルタリングし、書き出します。ここでのノイズ除去の最初と最後の実行については、同時に2つのフレームをフィルタリングするように設定している場合は、例外です。どのような場合でも、この方法を実行すると、denoiserは、レンダリングの背後で、常に1つのフレームに対して働きます。

レイヤフィルタリング(AOV用)

いくつかのケースでは、特定のライトグループに対するディフューズ寄与のように、個々のパスのノイズを除去したい場合があります。ジオメトリチャンネルをパス毎の画像内に複製するのではなく、フレーム毎にいったん書き出した後、個々のパスの画像と結合させることができます。これを実行するためには、非常に厳密なネーミングの要件をいくつか満たす必要があります:

  1. (基本のノイズ除去で上記のように設定された)共通チャンネルをすべて含むマスター画像は、_variance.exr または.variance.exrで終わるファイル名を持つ必要があります。
  2. パスの画像には、他の名前を付けることができますが、以下のいずれか1つの名前を付けたカラーチャンネルを持つ必要があります。

    • diffuse
    • specular
    • directdiffuse
    • directspecular
    • indirectdiffuse
    • indirectspecular

    これらには、末尾に0から499までの数字をオプションで付けて、フレーム毎に別のパスを区別することができます。結合したスペキュラーとディフューズのコンポーネントを、emissionの名前を付けたチャンネルに一致させて配置することもできます(例: directdiffuse17 plus directspecular17 in directemission17)。この場合、denoiserは、フィルタリングをかけた総和も生成します。

尚、ファイル数とファイルの順序を一致させる必要があります。ノイズ除去ユティリティは、差異のない画像を差異のある画像数で除算して、いくつのセットがあるかを決定します。

例えば、以下のサンプルでは、diffuse_keyとspecular_keyのファイル数とファイルの順序は同じです。ノイズ除去ユティリティは、2つのセット: diffuseとspecularを確認します。
$RMANTREE/bin/denoise --crossframe --override filterLayersIndependently true --
   image_variance.{5,6,7}.exr diffuse_key.{5,6,7}.exr specular_key.{5,6,7}.exr

これが終われば、画像をdenoiserに指定することができます。最良の結果を得るために、追加オプションを使用して、レイヤを個々にフィルタリングすることもできます。例:

RIBから

単一フレーム

denoise --override filterLayersIndependently true -- master_variance.exr light0_dir.exr light1_indi.exr

クロスフレーム

denoise --crossframe --override filterLayersIndependently true --
          master_variance.1.exr master_variance.2.exr master_variance.3.exr
          light0_dir.1.exr light0_dir.2.exr light1_indi.1.exr light1_indi.2.exr

Katanaの使用

renderSettingsのscriptCommandにAOVを追加することに加えて、Rfkでの設定は、ビューティーパスのプロセスと同様です。このサンプルでは、diffuse_key.#.exrは、ライトグループ"key"に対するディフューズAOVです:

単一フレーム

$RMANTREE/bin/denoise --override filterLayersIndependently true -- $INPUT diffuse_key.#.exr

クロスフレーム

'$RMANTREE/bin/denoise  --crossframe --override filterLayersIndependently true --'
    +' image_variance.'+str(int(frame)-1)+'.exr'
    +' image_variance.'+str(int(frame))+'.exr'
    +' image_variance.'+str(int(frame)+1)+'.exr'
    +' diffuse_key.'+str(int(frame)-1)+'.exr'
    +' diffuse_key.'+str(int(frame))+'.exr'
    +' diffuse_key.'+str(int(frame)+1)+'.exr'