Pixel 2の特徴の1つがカメラだといいます。Pixel2には、正面と背面にカメラがあり、その仕様は、(表01)のようなものです。まあ、最近のスマートフォンのカメラなら、きれいに写って当たり前、写真のいい悪いは、個人的な好みにもよるので、ここでは置いといて、技術的な話をすることにしましょう。

■表01
背面 正面
解像度 12.2メガピクセル 4032×3024 8メガピクセル 3264×2448
焦点 自動 固定
自動焦点機構 レーザーと位相差 -
手ぶれ補正 光学+電子式 なし
レンズF値 f/1.8 f/2.4

まず、Pixel 2には、専用のイメージ処理デバイスが搭載されています。これは、HDR(High Dynamic Range)撮影の処理などを行うカスタムデバイスで、「Pixel Visual Core」(以下PVCと略す)と呼ばれています。このPVCは、8つの画像処理ユニット(IPU。Image Processing Unit)やメモリ、Coretex-A53プロセッサコアなどを搭載していて、メインのSoC側とはPCI Expressで接続しているようです。またMIPI(Mobile Industry Processor Interface)を搭載しているので、おそらく、画像センサーは、PVCに接続していると考えられ、オートフォーカスなどの制御もPVC側で行われていると推測できます。また、Googleによれば、PVCは、機械学習にも利用できTensorFlowのハードウェアアクセラレーションにも利用できるようです。

  • Pixel 2に内蔵されているPixel Visual Core。右上がARMコアとなるCortex-A53、その下がDRAM(LPDDR4メモリ)、下がPCI Express。左側上がカメラモジュールとのインタフェースとなるMIPI、下がイメージ処理ユニット (Googleのサイトから引用)

SnapDragonなどのスマートフォン向けのSoCには、標準でカメラのコントローラーが内蔵されていて、画像センサーを接続するだけで利用できるようになるのにこうしたカスタムデバイスが必要になるのは、メーカーが独自の処理を行わせたいからです。

イメージ処理ユニットには、512個のALU(Arithmetic and Logic Unit。算術論理演算ユニット)が搭載されています。こまかいスペックが出ていないのでどのような演算なのかはわかりませんが、おそらくは、積和演算(かけ算した結果を足し算していく演算)などを高速で実行するようなものではないかと思われます。

HDRでは、明るさの違う複数の画像を短時間に連続して撮影し、これを明るさで区切った領域ごとに適切に合成していくことで、画像全体のダイナミックレンジが拡大したように見せます。そのためには、画像のピクセルすべてを処理する必要があります。

こうした処理は、ソフトウェアで行うことも不可能ではありませんが、カメラが高解像度化していくに従い、作業量が増え、処理時間が長くなってしまいます。それだけならいいのですが、最大の問題は、それによって電力を消費しバッテリ動作時間が短くなってしまうことです。

PVCのような特定目的の専用ハードウェアを使うことで、負荷の高い計算処理を高速に、低消費電力で行うことが可能になります。一般にソフトウェアを動作させるためのCPUは、集積度が高く、プログラムの1ステップを行うのに大規模な回路が動作するため、大量の電力を使用します。これに対して、専用ハードウェアでは、演算に必要な回路のみが動作し、一般に同じ処理を行うのであれば、CPUコアより、専用ハードウェアのほうが回路規模が小さくなるからです。PVCを使うことで、プロセッサコアより5倍高速で処理できるのに消費電力は1/10未満になるといいます。

ポートレートモード

Pixel 2のカメラには「ポートレートモード」があります。これは、スナップ写真などを撮るときに、人物にピントを合わせ背景部分をぼかす写真を撮るためのものです。通常のカメラでは、レンズの被写界深度を使って背景をぼかしますが、Pixel 2のカメラは、これを電子的な処理で行います。画像の手前の人物部分と背景を部分を区別し、背景部分にぼかし処理を行います。そのためには、「人物と思われる部分の抜き出し」と「撮影されたものの距離推定」を行う必要があります。前者は、人物と背景を分離し、後者の情報を使ってぼかしを制御します。というのは、人物より後ろにある部分ではぼかしを大きく、人物の手前ではぼかしを小さくしなければ、テレビニュースなどでみかけるぼかし映像のような不自然な写真になってしまうからです。

  • Pixel 2のカメラアプリ。画面左上のハンバーガーアイコンでメニューが開き、ポートレートモードに切り替えることができる。切り替えるとズーム状態になる

Pixel 2では、手前にある人物のようなものと背景を機械学習技術(正確にはCNN。Convolutional Nural Network)で区別し、そこから人物の輪郭を表すマスク画像を作ります。具体的にはTensorFlowを使い、百万の画像から人物の輪郭を学習させ、その学習データを使いモバイル版のTensorFlowで推論を行わせます。おそらくGoogle Photoにアップロードされた多数のスナップ写真が学習データとなっていると思われ、ここには世界中からあつまる大量の画像があることから、比較的精度は高いと考えられます。Pixel 2に内蔵されているTensorFLowは、PVCの機能を使って高速に推論を行うことができます。

距離データの取得には、画像センサー内の位相差オートフォーカス用の画素を使います。位相差オートフォーカス用の画素は、Pixel 2の場合、緑の画素の一部が右半分、左半分からの光のみを受け取るようになっています。通常は、この左右からの光のズレがなくなるようにレンズの焦点を制御しますが、左右、片方の光だけ受光する画素から情報を集めて、2枚の画像を作ると、1回の撮影でステレオ撮影と同じ視差のある画像を得ることができます。ステレオ画像で撮影された2枚の画像は、近くにあるものはズレが小さく、遠くにあるほどズレが大きくなります。つまり、そのズレから対象の距離を推定することが可能です。

このようにしてPixel 2のカメラは、画像から人物切り抜き用のマスクデータ(セグメンテーションマスク)と各画素の距離情報(デプスマップ)を得ることができ、この2つの情報を使って、人物以外のところに距離に応じたぼかしをかけているのです。

  • ポートレートモードで撮影するとオリジナルとぼかし処理を行った2つのJPEGファイルが記録される。2枚目の写真、手前と奥でぼかしの程度が違っている

ただし、フロントカメラは、固定焦点であるため、デプスマップを作るができません。このため、CNNによる人物画像の切り抜きだけを行い、それ以外の部分には、一様にぼかしをかけるようです。なので、フロントカメラでポートレートモードを使う場合には、人物よりも手前にものが来ないようにするといい結果が得られるようです。

また、リアカメラでポートレートモードにして人物以外を撮影しようとすると、CNNは人物像をみつけられずにセグメンテーションマスクが作られません。しかし、デプスマップがあるため、Pixel 2のカメラはもっとも手前にあるものとその後にあるものを区別し、背景に相当する部分にぼかしをかけます。これにより擬似的なマクロ撮影が可能になるようですが、Pixel 2のリアカメラの最短撮影距離は10センチで、カメラレンズのサイズから1メートル未満のものしか検出ができないようです。

なお、Pixel2のポートレートモードなどは、Android 8.0では、独自機能としてAPIとしては公開されていないため、利用できるのは、標準のカメラアプリのみです。ただし、Android 8.1からは、機械学習用のAPIやPVCの利用が可能になり、SNSアプリのカメラ機能などでポートレートモードが利用できるようになる予定だといいます。すでにPixel 2には、Android 8.1のプレビューが出ているのですが、Pixel 2の評価がまだ終わっていないのでプレビュー版はまだ入れていません。この点については、一通りPixel 2の評価が終わったあと、別途レポートしたいと思います。