Pixel2とPixel2 XLのポートレートモードに使われている技術(2/3)

  • 2018.11.10
  • AI
Pixel2とPixel2 XLのポートレートモードに使われている技術(2/3)

1.Pixel2とPixel2 XLのポートレートモードに使われている技術(2/3)まとめ

・Pixel2のポートレートモードは4つのステップを踏む事により実現されている
・HDR+の連続撮影により鮮明な写真を撮影し、前景と背景を機械学習を使って分離
・シーン内の奥行情報をステレオアルゴリズムで取得し、最終的に一枚の写真として合成

2.Pixel 2がポートレートモードを実現するためにやっている事

以下、ai.googleblog.comより「Portrait mode on the Pixel 2 and Pixel 2 XL smartphones」の意訳です。元記事は2017年10月17日、Marc LevoyさんとYael Pritchさんによる投稿です。一年前なのでまだPixel3は発売されていない、Pixel2が最新機種であった頃です。前編はこちら後編はこちら

Pixel 2がいったいどうやってポートレートモードを実現しているのか、以下でステップごとに詳細を見ていきましょう。

ステップ1:HDR +で画像を生成する
ポートレートモードは、初めに鮮明な写真を撮影する事から始まります。このため、Googleの計算機写真技術であるHDR +を使用して、撮影した写真の品質を改善します。HDR+は最新のNexus / Pixel携帯端末に搭載されています。明るすぎる写真や暗すぎる写真にならないように、写真を連続で撮影し、複数の写真から写りが良い部分を持ち寄って一枚の写真を合成し、シャドウのノイズを低減し、コントラストを上手に最適化するのです。
その結果、暗い照明でもダイナミックレンジが高く、ノイズが少なく、細部が鮮明な写真を撮影する事ができます。ノイズを低減するために連続撮影したフレームを整列させ、平均化するという考えは、何十年もの昔から天体写真のような被写体の動きが少ない場面で使われてきました。Googleの実装は、スマートホンのカメラで連続撮影して行うため、少し実現方法が異なっています。撮影者が動いている場合やシーン内の物体が移動した場合に、ゴースト(被写体が二重にぶれた画像)を生成しないように工夫をしています。HDR +を使用して撮影されたダイナミックレンジの高い風景写真の例を以下に示します。


HDR +を無効(左)および有効にした(右)ピクセル2を用いた写真。アーケードの天井の詳細がわかるように暗い部分を保持しながらHDR +が右側の上空と中庭が白く吹き飛ばされるのを防いでいる事に注目してください。写真:Marc Levoy

 

ステップ2:機械学習を使って前景と背景を分別する
HDR +画像から出発して、次に、どの画素が前景(典型的には人)に属し、どの画素が背景に属するかを決定します。これは、映画業界のクロマキー(グリーンスクリーン)とは異なり、背景が緑色(または青色、または他の色)であるとは仮定できないため、難しい問題です。私達は代わりに、機械学習を使用します。

特に、私たちは、TensorFlowを使って書かれたニューラルネットワークを訓練して、画像を見て、どの画素が人でありどの画素が人でないのかを推定させます。私達はこのニューラルネットワークにスキップ接続を持つ畳み込みニューラルネットワーク(CNN)を使っています。「畳み込み」とは、風呂敷を畳むようにネットワーク内部で画像を少しずつ集約していく事を意味しています。拡げた風呂敷全体を見なくても、半分に畳み込んだ風呂敷を見れば、それが何の風呂敷かわかるように人工知能を学習させす。更に半分に畳み込んで、更に半分に畳み込んでと繰り返す事によって余分な情報をフィルターしていき、風呂敷を風呂敷と足らしめている特徴を抽出するのです。

「スキップ接続」とは、ネットワークの初期層からの情報を後半層に直接渡す事です。ネットワークの初期層は細かいパーツ(色や先端部分)を認識し、層が進むにつれて各層は前の層が認識したパーツを組み合わせてより大きなパーツを認識します。後半層は、高レベルなパーツ(顔や身体の部分など)を認識しますが、何層もの伝言ゲームの結果、初期層が認識した情報は失われてしまうので、直接初期層からの情報を後半層に伝えるのです。

スキップ接続は、「写真内に人物が含まれているかどうか?」を判断するだけでなく、「人物を表現している画素はどれか?」を正確に特定する必要がある場合に特に重要です。

私たちのCNNは、およそ100万人の人々(そして人々が被っている帽子、サングラス、手に持っているアイスクリームコーンなど)の写真を用いて訓練されました。マスクは、TensorFlow Mobileを使用してスマートフォン上で実行されます。以下がマスクの例です。


左はHDR +で生成された写真、右はニューラルネットワークが作ったマスク部分です。マスクされた白い部分は、人工知能が前景(人物)と推定した部分で、黒い部分は背景と推定した部分です。写真:Sam Kweskin

この切り抜きはどうですか?悪くないですよね。

私たちのニューラルネットワークは、女性の髪の毛とティーカップが前景の一部であると正しく認識し、それらの写りを鮮明に保つことができます。このマスクに基づいて写真をぼかすと、次の画像が生成されます。


マスクを使用して合成された合成深度画像

この結果に気づくべきことがいくつかあります。まず、背景にさまざまな深度のオブジェクトが含まれていても、ぼかしの量は均一です。第二に、もし、一眼レフカメラであったならば、お皿の上のお菓子(およびお皿自体も)はカメラに近すぎるのでぼやけていた事でしょう。私たちのニューラルネットワークは、お菓子が彼女の一部ではないことを認識しています。(マスク画像ではお菓子の部分が黒になっている事に注目してください)しかし、彼女より手前にある物体は背景部分と見なされていないようです。

実は、私達は手前にある物体を検出し、比較的シャープに保つ処理を組み込んでいます。残念ながら、この解決策は常に正しいとは限りません。今回の写真では、手前の画素ももっとぼかす必要があります。

ステップ3.デュアルピクセルからデプスマップまで
この状況を改善するためには、風景内の各ポイントの深度を知る事が必要です。深度を計算するために、ステレオアルゴリズムを使用することができます。

Pixel 2にはデュアルカメラはありませんが、デュアルピクセルオートフォーカス(DPAF)と呼ばれることもあるPhase-Detect Auto-Focus(PDAF)技術が実装されています。長ったらしい単語ですが、そのアイデアはかなりシンプルです。スマートフォンの背面カメラの(小さな)レンズを更に2つに分割することを想像してください。レンズの左側から見た世界と右側から見た世界はわずかに異なります。これらの2つの視点は1mm以下(レンズのおおよその直径)しか離れていませんが、ステレオ手法で奥行きを計算するのには十分です。


ピクセル2の背面カメラでは、写真の右側をレンズの左側から見て、写真の左側をレンズの右側から見ています。Markus Kohlpaintnerによる図。

図に示すように、PDAF、単一のスナップショット内にレンズの左右から見た視点を入れ込む事ができます。もし、スマートフォンを縦向きにしている場合は、レンズの上下半分です。下記画像はレンズの上から撮った写真としたから撮った写真の例です。モノクロなのは、私達がステレオアルゴリズムで利用しているベイヤーカラーフィルターセンサーは緑色の画素のみを使用するからです。2つの画像が区別できますか?たぶん右側のアニメーションGIFが違いを発見するのに役に立ちます。よく見てください。違いは本当にわずかです!


Pixel 2のレンズの上半分と下半分を使ったテスト写真。一番右側のアニメーションgifでは、背景が上下に動いていても、カメラは女性にフォーカスしているので、女性はほとんど静止していることに気づくでしょう。一番右の写真には写っていませんが、彼女より前面にある物体は、背景が上がれば下に移動します(逆もまた同様です)。

PDAFテクノロジーは、一眼レフカメラを含む多くのカメラで実装されており、ビデオのフォーカスを素早く合わせるためなどに使われています。私達のアプリケーションでは、PDAFを深度マップを計算するために使用しています。具体的には、ステレオアルゴリズムと似たジャンプシステムパノラマスティッチャー(ジャンプアセンブラーと呼ばれます)への入力として、右半分と左半分(もしくは上半分と下半分)の画像を使います。このアルゴリズムはまず、低解像度の深度マップを生成し、次にこの低解像度版の奥行マップを高解像度用に補完します。これは以前Googleがレンズぼかし機能で使用していた手法と似ています。

もう1つの詳細:Pixel 2カメラで撮影された左側面図と右側面図は非常に接近しているため、画像のノイズが多かったり、暗い場所では奥行き情報が不正確になってしまいます。このノイズを低減し、深度情報の精度を向上させるために、左サイド画像と右サイド画像を連続撮影し、ステレオアルゴリズムを適用する前に一つの画像に調整し平均します。もちろん、このアルゴリズムはHDR +が行っている事と同様にゴーストの発生などに注意する必要があります。以下の左図は、前述のステレオアルゴリズムを使って生成された深度マップです。


左:前述の上半分のレンズおよび下半分のレンズからステレオ手法を用いて計算された深度マップ。より明るいということはカメラに近いことを意味します。
右:オリジナルの各ピクセルにどれくらいのぼかしを適用するかの視覚化。
黒は、まったくぼかしをしないことを意味し、赤は、合焦面(この場合は女性の顔)より後ろである事を意味し、赤が明るくなるほどぼやけの量は増します。青は、合焦面の前である事、この場合はお菓子とお皿です。

 

ステップ4.全てまとめて最終イメージをレンダリング
最後のステップは、ステップ2で計算したセグメンテーションマスクとステップ3で計算した深度マップを組み合わせて、ステップ1のHDR +ピクチャの各ピクセルをどれだけぼかすかを決定することです。深度とマスクを組み合わせる具体的なアルゴリズムにはチョッピリ秘密ですが、概要は私たちは人間が写っている部分(マスクの白い部分)を鮮明にし、背景(マスクの黒い部分)をぼかしたいです。ぼかす量は対象がどれだけ合焦面から離れているかであり、距離は深度マップから求める事ができます。前述の赤色の画像は、各ピクセルをどれだけぼかすかを視覚化したものです。

実際にぼかしを適用することは、概念的には最も簡単な部分です。各ピクセルは、同色だがサイズが異なる半透明の円に置き換えられます。これらすべての円を深度順に合成すると、前述の平均化のようになり、実機を使った光学的なぼかしに近似します。

ソフトウェアを使用してポートレートモードを実現することの利点の1つは、高額なレンズを持ち歩かずとも完全な円盤状のボケを作成し得るということです。興味深いことに、ソフトウェアでは、現実世界のレンズの形状に固執する特別な理由はありません。私たちは、ボケの形状を私たちが望むどんな形にもすることができました!
以下に、私たちが作成した最終的なポートレートモード出力があります。ステップ2で作られた画像と比較すると、一眼レフカメラで撮影したかのようにお菓子の部分がわずかにぼやけていることがわかります。


私たちのHDR +画像、セグメンテーションマスク、および深度マップを組み合わせて生成された最終的なポートレートモード画像

(Pixel2とPixel2 XLのポートレートモードに使われている技術まとめ(1/3)からの続きです)
(Pixel2とPixel2 XLのポートレートモードに使われている技術まとめ(3/3)に続きます)

3.Pixel2とPixel2 XLのポートレートモードに使われている技術(2/3)

1)ai.googleblog.com
Portrait mode on the Pixel 2 and Pixel 2 XL smartphones