見出し画像

ライカの撮って出しを学習するAI

ライカの撮って出しを学習するAIを作ってみたと言う話です。以前書いた撮って出しをRAW現像で再現するという記事の続編になります。


はじめに

ライカの撮って出しJPEGをAI技術を使ってRAW現像で再現するという話を以前にも書いていました。ライカの撮って出しの色が好きなので現像で再現するべく頑張ってみたという話です。撮って出しが好きなら現像せずにJPEGファイルを使えば良いじゃんと思われるかもしれませんが、露出で大きく失敗していたりオートホワイトバランスが暴れていたりした際には、RAWの方が救いやすいわけです。またシャープネスやノイズ除去についてもRAWの方が触りやすかったりするので、RAW現像で撮って出しを再現する利点はあると思っています。

今回の記事の内容は、基本的には前回書いたプロファイルの自動生成の話と同じですが、中で使っている技術を別のものに変えてみたので、また記事を書いてみることにしました。今回は、もう少し最近のAI技術を導入しています。特に大きな改善が見られたわけでもないのですが、前よりも階調が変に潰れるようなケースが減って使いやすくなったような気はしています。

AIの学習結果

技術的な話に興味がない方も多いと思うので、先に結果を載せます。今回のAIは段階的に学習していくものなので動画にすると面白いかなと思い作ってみたのですが、じわじわ色が変わっていくので学習が終わった後の切り替えながら確認するところまでいかないとわからないかもしれません…

まず1例目がこちらで、M (Typ 262)とSummilux 50mm f/1.4 2ndで撮影した写真です。

LightroomでAdobe標準を適用した素現像から始まって、AIが撮って出しに近くなるように少しずつ学習していっています。最終的にはかなり撮って出しに近い色になっていると思います。少し花の色が違っているところはありますけどね。

次に2例目、また花の写真です。先ほどと同じカメラ・レンズで撮っています。

こちらもかなり良いところまでは近付いているのではないでしょうか。AIが学習したものの方が少し彩度が低めで渋い感じになっています。元々M (Typ 262)の撮って出しが渋めの色を出す傾向にあるので、それがもう少し強調されているような印象です。

このような形で、優れたRAW現像技術を持っていない自分のような人間でも、AIに任せてしまえばある程度欲しい結果が得られるというわけですね。もちろんうまくいく場合ばかりではありませんし事前に色々と準備が必要なわけですが…

今回のAI技術について

ここからは技術的な話です。基本的な内容は前回の話と共通する部分が多いので、まずはそちらから読んでいただいた方がわかりやすいかもしれません。

今回も前回と同じく、Adobe標準の色を撮って出しの色に変換するLUTを学習します。前回は勾配ブースティングという技術を使っていましたが、今回は最近の深層学習 (Deep Learning) で用いられている技術を用いたAIを試してみました。

具体的には、以下の研究をベースにしました。香港理工大学とDJIの共同研究の成果になっていて、TPAMIと呼ばれるこの分野でトップの論文誌に掲載されたものになります。なお、以下のリンクでは購入しないと論文が読めませんが、こちらの著者版の論文であれば無料で読むことができます。

この研究では、写真に応じて適切なLUTを選択しながら適用することで、高品質な写真補正を実現したというものです。ただ今回自分がやりたいことに関係しているのはそこではなくて、データからLUTを学習しているという部分です。この研究成果の余計な部分は省き、必要な部分だけを持ってきて使わせてもらうことにします。論文中の図1でいうと、赤線で囲った部分だけを使っているような形です。

Fig. 1 from H. Zheng et al., "Learning Image-Adaptive 3D Lookup Tables for High Performance Photo Enhancement in Real-Time", TPAMI, Vol. 4, No. 4, 2022.

具体的には、損失関数の設計と、誤差逆伝搬法によりLUTの値を最適化するというアルゴリズムを使わせてもらいました。入力の写真にLUTを適用した結果と撮って出しの写真の間で損失関数を計算することで、LUTで撮って出しを再現できるように学習しています。以前の用いた技術と違って今回のやり方の良いところは、損失関数にLUTを滑らかにしたり単調増加にしたりする項が入っていることです。以前はLattice Regressionという別の手法を後処理に取り入れることで実現していましたが、今回は最初からそれを前提に学習が進んでいくので、より簡潔でわかりやすい手法になっています。

幸いなことに、著者により実装が公開されていますので、こちらをベースとして使わせてもらいました。公開された実装にバグがあったせいでデバッグに苦労しましたが、一から実装するのに比べればまあ楽だったと思います… もし需要があるようなら、自分が今回実装したコードも公開しようと思います。

AIの学習には、これまでM (Typ 262)で撮影してきた写真を9,814枚使いました。学習にかかった時間はM1のiMac 24インチで4~5時間くらいでした。デバッグや諸々の調整などの時間も含めるとこの20倍くらいは時間をかけた気もしますが(といっても多くの時間はPCが頑張ってるだけですが)、最終的に満足できるものができたので良かったです。

おわりに

ということで、ライカの撮って出しを学習するAIの話でした。一時期は購入したプリセットを使ってRAW現像していたこともあったのですが、結局ライカの撮って出しの方が好きだなとなって戻ってきてしまいました。やっぱりこの色が好きなんですよね。

以下の写真なんかは空のハイライトを飛ばしたくなくて結構アンダーに撮っていたので、後で持ち上げた時にJPEGだとシャドウが潰れてしまっていたのですが、RAWに今回のAIで学習したLUTを適用することで、激しい白飛び黒潰れを回避しつつ撮って出しの雰囲気を味わうことができました。それだけでも、今回の話をやって良かったなと思います。

追記:学習用のコードを以下に公開しました。
https://github.com/kamo262/Learning-3DLUT

いいなと思ったら応援しよう!