現像の第一歩
最後はいよいよ、実際に RawTherapee で現像の機械学習をしてみます。 とはいえ、RawTherapeeは非常にたくさんのパラメータを持ち、簡単にできるとは思えません。 そこで、いろいろあるカテゴリーのうちどれか1つを対象に学習しようと思い立ちました。
試しに適当な写真を現像してみようとしたところ、妙にノイズが乗っている画像があることに気づきました。 どうやらRAW画像には必ずノイズが乗るものであり、カメラの撮って出し画像や多くの現像ソフトは当然のようにノイズ除去(Noise Reduction)の処理をしているようです。 ノイズのあるなしは見た目からも非常に判定しやすそうなので、とりあえずこの機能を試してみます。
まず、適当なパラメータを指定して現像してみます。 すると、pp3
という現像設定ファイルが出力されるので、このファイルをひな型に、パラメータをいろいろ変更しながら実際に現像をしてみます。 当然、テンプレートエンジンを使い、プログラムから自動で現像できるようにします。 設定ファイルの中からNoise Reductionに関係する部分を探し、その部分を変数が埋め込める書式にし、テンプレートファイルを作ります。 今回は、ひとまず4つの項目を変数化してみました。
思考法に革命が起こる
次に、プログラムによって自動でたくさん画像を現像していきます。 最初に、それぞれのパラメータを単純に 0.1刻みで0.00〜1.00の11段階 に分解し、11段階の4重ループ で現像しようとしました。おそらく、Webエンジニア脳だとまず最初に考える方法ではないでしょうか。 しかしこれは大失敗でした。
まず、0.00〜1.00の11段階は、 値が粗すぎる 上に、2次元平面で言うところの 格子状 にのみデータが存在することになり、どう表現していいかわかりませんが多様性がありません。 さらに、何よりも悪いことに 11の4乗 は既に十分大きな数であり、全パターンを現像するのに丸一日以上掛かってしまいました。 これ以上変数を増やしたり、刻みを細かくすると、すぐに破綻することは明らかです。 もちろん変数4つなど序の口ですらないので、本格的なパラメータ化は現実的ではないことになります。
この方針はすぐに中止され、より機械学習っぽい方法を探りました。 次は、毎回ランダムな数値ですべての変数を埋めて現像し、それを何千回繰り返す、という方法を考えました。 取りうる値には、 網羅性はないけど多様性はあります 。 この方法だと、変数がいくつ増えてもかかる時間は繰り返す回数だけに依存します。 おそらく、これが機械学習脳の考え方なのではないでしょうか。 なお、パラメータと生成された画像の関連性を保存するために、ファイル名にパラメータ含むようにしました。 この方法だと、パラメータ数が多くなった場合にファイル名が破綻する可能性があり、そこが多少心配です。
学習してみる
できあがった3000枚の画像をすべて手で分類します。 画像を一枚ずつ見て移動させるのは面倒なので、キーボード操作で高速に分類できるGUIアプリケーションを作りました。 3000枚の画像を分類した結果、良い画像が800枚 悪い画像が2200枚という結果になりました。 このうちランダムに100枚をvalidation用の画像にします。
このデータを学習していくのですが、今回は画像を学習するのではなくパラメータを学習するのでVGG16ではありません。 入力がたった5の単純な学習なので、MNISTのサンプルにあったモデルを元にしました。 全然意味がわかっていませんが、Dense(1024) → Dropout(0.2) → Dense(256) → Dropout(0.2) というモデルを作ったところ、学習データの精度89% テストデータの精度85%という高い精度を出しました。
とはいえ、この方法には準備段階から既に問題があるように見えます。 それは、完全にランダムにパラメータを作るので、パラメータが増えれば増えるほど、 成功例の学習データを用意することが難しくなることです。 パラメータ4個の段階で、既に30%の確率でしか成功例が作れません。 これが100パラメータなどになったら、3000枚のうち1枚しかまともな画像が出ない、などという状況になると考えられます。
まとめ
学習データを用意することの大変さを痛感することになりました。 おそらく、理想的なパラメータというのはある一定の範囲に収まるはずで、当然理想的な学習データというものには偏りがあるのだと思います。 例えば手書き文字は文字の形に偏っています。 おそらく完全なランダムなデータはつまりノイズなので、学習データには向かないんだろうなぁと思いました。
いったん許容する画像の基準を広くとり学習し、 さらにそれに受理されるパラメータだけでまた画像を数千枚作り、 少しずつ許容する画像を狭めていく、という方法で学習データに偏りをもたせていくといいのでしょうか。 めんどくさそうです。
Last updated