
Article
RAW現像MLはC1模倣からノイズ成分の学習へ進む

rawlearn では、RAW/DNGから参照現像に近い雰囲気のJPEGを作るローカルML現像パイプラインを試している。
ここまでの実験で、色味や階調についてはかなり方向が見えてきた。いまのところ、C1風の色とトーンに寄せる現像モデルとしては a085 系がいちばん実用に近い。
ただ、拡大して見るとまだ届いていない部分がある。ノイズ処理、色ノイズの抑え方、偽色の出方、そして布地や建物、髪、細い線のような texture の残し方だ。
最初は、ここもC1出力を教師にすればよいのではないかと考えていた。色味や階調でうまくいったのだから、ノイズ処理も同じように参照出力へ近づければよい、という発想だ。
でも、実際に試すと問題の形が少し違った。
C1出力を丸ごと教師にすると別の問題になる
C1を教師にした後段補正モデルを試すと、数値上は参照出力に近づく。これは一見よさそうに見える。
しかし、拡大して確認すると、布地、建物、髪、細線のような場所がなめらかになりすぎる傾向があった。ノイズは減っているように見えるが、同時に残したかった texture まで薄くなる。
これは、教師データが悪いというより、学習させている問題の切り方が悪かったのだと思う。
C1出力を丸ごと教師にすると、モデルは「ノイズだけを消す」わけではない。現像差、シャープネス差、局所コントラスト差、わずかな位置ズレまで、全部まとめて吸収しようとする。
その結果、ピクセル単位の一致は改善しても、写真として見たい細部が平均化される。
RAW現像MLで欲しいのは、参照画像に1ピクセルずつ近づくことだけではない。平坦部のざらつきや色ノイズは抑えたいが、texture のある場所は残したい。この2つを同じ損失でまとめて扱うと、モデルは安全側に倒れてなめらかにしすぎる。
PureRAW系の教師でも同じ罠がある
PureRAW系のノイズ処理結果を教師にする方向も試した。
ただ、こちらも単純に出力画像全体へ寄せるだけでは、ノイズと細部をきれいに分けにくかった。処理済み画像Aから処理済み画像Bへ変換する形にすると、モデルにとってはノイズ除去というより、画像変換の模倣になってしまう。
もちろん、参照として見る価値はある。どういう場所でノイズが減っているのか、どこで細部が残っているのかを観察する材料にはなる。
でも、その出力画像をそのまま正解として全面的に真似させると、また同じ問題に戻る。ノイズ、現像差、シャープネス差、局所コントラスト差が混ざったまま学習対象になるからだ。
ここでいったん考え方を切り替えることにした。
色味とノイズ処理を分ける
今回の大きな判断は、色味・階調の学習とノイズ処理の学習を分けることだ。
色味や階調については、C1現像済みデータを教師にする方針でよい。ここは参照現像の雰囲気に寄せたい部分なので、C1-style develop model として役割を明確にしておく。
一方で、ノイズ処理は「C1の見た目へ近づける」問題として扱わない。RAW/linear段階でノイズ成分だけを推定し、それを取り除く問題として再定義する。
考えている流れはこうだ。
RAW / linear
-> noise residual model
-> detail-preserving denoise
-> C1-style develop model
-> JPEG
先にRAW/linear段階でノイズ成分を扱い、そのあとで色味や階調のモデルへ渡す。
この形にすると、C1-style develop model は色とトーンの担当として残せる。ノイズ処理側は、C1の出力全体ではなく、平坦部のざらつき、色ノイズ、暗部の荒れ、texture 領域の高周波を見ながら別の基準で評価できる。
評価指標も変える
これまでの流れでは、参照出力への近さを見がちだった。数値上の近さも、パイプラインが動いているかを見るには便利だ。
ただ、今回の問題では、それだけでは足りない。
ノイズ処理の評価では、平坦部のノイズが下がっているか、色ノイズが減っているか、texture 領域の高周波が残っているかを見る必要がある。さらに、顔、髪、布地のような破綻しやすい対象で、不自然な溶け方をしていないかも確認しないといけない。
とはいえ、公開記事で人物写真や撮影状況が分かる比較画像を出すつもりはない。検証には必要でも、公開するなら匿名化できる布地、壁、植物、建物、静物、ペットなどに限定する。
このあたりは、技術的な評価と公開できる説明を分けて考える必要がある。
次フェーズは noise residual 推定
次に試す中心は、C1教師の画像変換モデルではなく、RAW/linear段階の noise residual 推定モデルになる。
やりたいのは、画像全体をなめらかにすることではない。消してよい成分と残すべき成分を分けることだ。
平坦部の粒状ノイズや色ノイズは抑える。一方で、布地、建物、髪、細線のような texture は残す。これを1つの後段変換モデルに丸投げすると、どうしても平均化されやすい。
だから、役割を分ける。
- C1-style develop model: 色味、階調、全体の雰囲気
- detail-preserving denoise model: ノイズ成分の推定と抑制
- texture/edge gate: 消してよい場所と残すべき場所の切り分け
RAW現像MLを始めたときは、C1風の色を再現できればかなり完成に近づくと思っていた。実際、色味と階調は大きな山だった。
でも、最後に効いてくるのはノイズと texture だった。
参照出力を丸ごと真似するだけでは、モデルは本当に解きたい問題とは違う問題を解いてしまう。次は、C1に近づけることではなく、ノイズ成分を見つけて、必要な細部を残すことに集中する。
rawlearnの次フェーズは、そこから始める。

