講演者:谷田川 達也(早稲田大学)
題 目:半透明物体に対するインバース・レンダリング
日 時:2016年4月25日(月) 18:00-
場 所:早稲田大学西早稲田キャンパス63号館 数学応用数理会議室(102号室)
○司会 では、時間になりましたので始めさせてもらいます。きょうは、第14回目の数理人セミナーになります。早稲田の谷田川さんにお願いしました。鶴田さん経由でお願いしていただきましたので、最初にご紹介をお願いしたいと思います。
オープニング
○鶴田 鶴田です。谷田川さんとは、確か修士の1年のころにCG関係の学生が主体で行うゼミ合宿みたいなものがあって、そこで最初に会いました。分野が近いということもあって、その後もいろいろ研究会や応用数理学会でも会ったりしていて、年齢でいうと同じ年なので仲良くやって、どこ行こう、どう就職しようみたいな話をしていました。何だかんだ言って気づいたら早稲田にいたというような感じで。
今回もちょうどほかの誰か紹介してということで、じゃ、早稲田にいるそうだしちょうどいいかなと思って紹介させていただきました。話の内容がコンピューターグラフィックス関係だと思うんですけど、その中でもより計算を高速に解くための話が多分。
○谷田川 内容は見てのお楽しみということで。
○鶴田 そういう話があるかなと思っております。
○司会 どうもありがとうございました。では、よろしくお願いします。
○谷田川 ご紹介ありがとうございます。昨年まで東大でポスドクをしてたんですけど、今年から運よく学振のポスドクになることができて早稲田に移ってきました。よろしくお願いいたします。
講演
今日の話なんですけど、「半透明物体に対するインバース・レンダリング」とタイトルをつけました。僕はもともと画像編集の研究していまして、この後にちょっと話をするんですが、画像の編集って、画像から得られるデータだけを使って編集するんじゃ、ちょっとできることに限界があって、あんまり面白くないんです。
じゃ、画像の性能を最大まで引き出してあげようよということで、画像からその画像に映っているものが持っている物理的な性質を何か推定してあげれば、その物理的な性質を使ってより面白い編集ができるんじゃないかというモチベーションが湧いてきました。それで、昨年こういう研究をしていましたという感じで、きょうはお話をさせていただきたいと思います。
今紹介していただいたんですけど、もう一度簡単に自己紹介をします。名前は谷田川達也(やたがわたつや)なんですけど、皆さんよく、タニタガワさんとかって言われるんです。メールを書くときに多分タニ・タ・ガワって頑張って一文字ずつとか、谷を打ってから田川とか、頑張って皆さん多分変換してるのかなと思うんですけど、谷田川って実は変換できるんです。多分、変換のキーワードの中にJRの駅は全部入っていて、福島県に谷田川駅っていうすごこい小さい駅があって、行ったことないんですけど変換できますというネタを毎回やってます。というわけで、よろしくお願いします。
私は、学部生の時は京都大学で化学をやってました。その時にやっていたのは分光計、中でもMRIの大もとの基礎技術にあたる分光みたいな物の研究室に行きました。その当時から、画像っておもしろいなっていうふうに思い始めていて、大学生のときに結構コンピュータに興味を持っていたので、大学院からそういうところに移りました。それで、昨年の3月に博士を取りましたて、今年から学振のポスドクで早稲田に移ってきたという感じです。
きょうの本題に入る前に、ちょっとこれまでの研究も少しご紹介しようということで、ちょっとスライドを用意してきました。これまでやってた研究というのは、完全に画像とか動画の普通の編集です。なので画像に与えられている画素の色とか画素がどこにあるとか、ユーザーがどういうことをしたいとかっていうのを、頑張って与えられた情報から推定して何か編集をするというようなことをしていました。
ここでは色を変えるっていうのを一つ例として挙げていて、例えばこれは動画なんですけど、動画だったらこの黄色いタンポポの片方だけを赤に編集するにはどうしたらいいだろうとかっていうのを考えたりとか、あとはこれはどっちかというと高速化の研究なんですけど、この真ん中のチューリップだけを分けて編集するときに、これをもっと早くやるには、裏でどういう計算をしたらいいかみたいな研究をしていました。
この編集っていうのはどういうふうにやるかっていうと、すごく仕組みは単純です。ユーザーは編集したいところを白で、したくないところを黒でなぞります。画像っていうのは赤、緑、青、つまりRGBの3色を一つの画素が持っていて、それぞれに対してどこの位置にある画素かっていう情報があるので、一つの画素が持っている一番単純な情報っていうのは、色の情報3つと位置の情報2つです。なのでこの5次元のベクトル、色空間は違う場合があるんですが、5次元のベクトルを何らかの関数に掛けてあげて特徴を抽出してあげるということをします。この特徴が白く塗られた画素から全部の画素がどのぐらい遠いかどのぐらい近いかというのを計算してあげて、近いところをこういうふうに編集してあげましょうということをしています。なので大事なのはこの入力をした画素が持っている特徴とほかの画素の特徴がどのぐらい離れているかっていうのをうまくはかる特徴をどうやって抽出すればいいかっていうのが研究の主題になります。僕はどっちかっていうと、編集の幅とか速度みたいなものをどっちかというと研究対象にしていたので、抽出の話はちょっとしか出てこないですけど、こういうことをしていました。
1つ目の研究は、動画の研究です。動画の研究は、僕は博士になりたてのときに、行列が低ランクで近似できるという、皆さんにはすごく当たり前のことだと思うんですけど、その技術がすごい面白いと思って、これを使って何か研究がしたいと思ったところから始まりました。技術ベース研究を始めてしまったので、最後で結構行き詰まったんですが、こういうことをしてました。これでしているのは、1枚目のフレームを編集したら、1枚目のフレームに対して線形の演算子を適用して、2枚目のフレームも計算結果が出てくるというような線形の演算子を求めているます。求まったら、その線形の演算子をいっぱい掛けていけば全部一枚ずつ編集できませんかっていうアイデアで、これは結構単純でおもしろいかなと思ってやりました。
中身は、詳細を簡単に説明すると、これ動画なんですけど、1枚目に対してユーザーがこう編集したいです。オウムの体を黄色にしたいですとか、背景は少し明るくしてくださいというような入力をいれます。そうしたら1枚目は普通の今までの画像を編集する方法があるので、それを使って編集してあげます。そうすると体が黄色くなって背景が少し明るくなるっていう感じになります。そうしたら、これは数学的帰納法みたいな感じで、t番目のフレームが当たるときに、t+1番目のフレームが編集できたら、それからどんどん順送りに編集できますよね。なのでtからt+1をどうやって求めるかっていう話なんですが、tとt+1っていう2枚のフレームが与えられたときに、ここで何らかの計算をしてあげて、線形の演算子を求めてあげます。これを編集値が求まっている前のフレームに対して何か掛け算をしてあげると、次のフレームの編集が求められるって言う感じのフレームワークも持っています。なのでこいつを求めてあげればいいんですけど、これを前の研究では編集量の伝搬行列というふうに呼んでました。英語だとEdit Propagation MatrixでEPMとも呼んだりしていました。
これは、式はお見せするのも恥ずかしいぐらいめちゃめちゃ単純で、2つの項からなってます。これは前の方法で画像の編集をやっている方法で、こっちがこの動画に拡張した方法で、大したことはあんまりしてないんですが、何をやってるかというと、このgっていうのがユーザーの入力で、eっていうのが最終的に求めたいものです。ここに2乗の誤差をとっている。このZijというのがiとjのどのぐらい近いかっていうものなのでここでやっていることは、ユーザーの入力に対して近い画素に対しては同じような編集を割り当ててくださいというのが1つ目です。
2つ目は何かというと、これは両方ともeになっているので、同じ画像の中でもし特徴が近いものがあったら最終的な結果も同じように編集してくださいという項です。最終的に、この問題を解くと画像が編集できます。これを拡張しているのが僕がやっていた方法で、1フレーム目というのは、ある前のフレームtと次のフレームt+1がどのぐらい似ているかっていうのを見ていて、後ろの項はt+1の新しく編集するフレームの中で画素同士がどのくらい似ているかっていうのを見ています。ほぼ式は同じです。これを解いてあげるというか、これは解析的に解けるので、解析時に解いてあげるとこういうものが出てきて、Mというものが求めてあげることができます。なのでこのMを求めてどんどん掛けていけば編集ができるということになってます。
一応、式の解釈の違いみたいなものを言っておくと、画像の場合の方法はSoft Constraintといって、ユーザーが入力したところが最終結果に変わってもいいんです。なんですけど、これをそのまま動画に応用するととても気持ち悪くて、それは何でかっていうと、t番目のフレームが仮に編集されていたとして、t+1番目のフレームを編集しましょうっていったら、t+1番目のフレームを編集したらt番目のフレームの編集結果は変わるってことなんですね。なのでこれはとても気持ち悪い。なので前のフレームを固定して後ろのフレームだけを編集するという簡単な拡張をしてあげるとこういう動画の編集がうまくいくようになるという感じになっています。
これが従来法との比較で、これが僕らの方法でこれが一番きれいということを言いたいんですけど、他の方法は、左側が赤かったのがだんだん右側に移っちゃうんですね。動画の追っていくのをうまく追跡できないんですけど、さっきのすごい簡単な拡張をするだけで、この右側の動いている物体を追跡できるようになるという、変化が現れるようになります。
次がこれですね。これは何をやっているかというと、今、スマートフォンて結構高性能なのであんまりうれしくはないんですけど、昔のガラケーとかで動画を撮ると、明るいところと暗いところを交互に撮ったときに色が少しずれちゃったりするっていうことが起こっちゃっていて、それをきれいに直してあげようっていうようなものです。なので右側は少し色がずれるんですけど、左側はそれを直しているっていうものです。
2つ目は画像の編集で、これは何をやっていたかというと、画像を早く編集したいんです。というのは、画像の編集って、手の込んだことをやろうとすると時間がかかってしまうので早く編集したい。なので早く編集するためにどうするかというと、意味のある画素を入力の画素の中から選んでおいて、その選んでおいた画素を編集したものを最終的に補間をしてきれいにするってことを最終的な編集結果を得るっていうことをしてます。
ここに出ている4枚の画像は何をあらわしているかっていうと、一番右は普通に先ほどと同じ入力で、こちらの2番目の画像というのが編集に使うための裏で計算されている画素です。この画素を最初に編集して、それを補間したものが3番目の編集量マップというものです。この編集量マップというものをもともとの入力に適用してあげると編集に結果が得られるというようなものです。ここでの肝は、この圧縮に用いる画素群て画素をどうやって選ぶかっていうものです。当然なんですけど、圧縮をするために画素を選んであげるっていうアイデアは全くのオリジナルというわけではないです。基本的に処理を速くしようというふうになった場合には、直接画素を操作するのではなくて、サンプリングしておいた画素を編集してあげて、それを補間して最終的な出力結果を得るというようなことをするっていうのが一般的な高速化の方法です。問題はこのサンプルの画素をどうやって決めるかということになります。これはちょっといろいろ話があるんですけど、ちょっとそこらへんは省力して、何をやったかということだけを説明します。
何をやったかというと、画像が近似するための一番簡単なのを使おうと。他の分野ではちょっとわからないんですけど、CGの分野だとRBF補間というのをみんな狂ったように使っているんですね。なのでRBF補間でいこうと。RBF補間て何かっていうと、この画素の色がIjでこれを何らかの関数で重みをつけて補間しているんですね。このCというのがサンプリングしている画素で、このサンプリングしている画素の色Ijっていうものに何らかの重みをつけて、重みつき平均をしているのが近似で得られる画素ということになっていて、この関係が画素と同じ関係が編集量に対しても成り立つっていうような仮定において、このajっていう計数を最適化をして求めてあげるっていうことをしています。
このっていうのは、固定の関数で何か画素のIが与えられたら一意に決まるようなガウス関数を使っています。ここの重みだけを何か決めてあげて、この関係が成り立つような重みを求めてあげるっていうことをしています。なんですけど、先ほど申し上げたように、画素をどう選ぶかっていうのが大事で、重みだけではなく、重みとサンプルする画素の数を両方決めなきゃいけないんですね。
なので重みと画素を両方同時に決めるために、何をしているかっていうと、一番最初に画素をランダムサンプリングまずします。これがどのぐらい正しそうなのっていうのを評価して、あんまり近似がよくないところから画素からサンプリングして足します。そうするとこういう感じで画素が増えます。この増えた画像で画素を近似して、スパース正則化の問題を解くと、どの画素があんまり重要じゃないかっていうのがわかるので重要じゃない画素を削ります。この増やして減らしてっていうのをやっていくと、だんだん増減がなくなって、最終的にいいところに収束するっていうようなアイディアです。
ランダムサンプリングから減少させる処理っていうのは、スパース正則化のこういう問題を解いていて、式の内容はとりあえずいいんですが、係数に対してL1ノルムがかかっていて、この問題を解くと0になる係数っていうのが何個か出てきます。これは係数の大きさだと思っていただくといいんですが、係数の番と10番というのが0になるので、6と10を削って新しい画素にします。一方、増加させる処理っていうのは何をしているかっていうと、単純に得られている係数で補間をしてあげて、画素のエラーが大きいところから、エラーに応じてランダムにサンプリングしているってことをしています。これは今、しきい値ガンマっていうのを設けて、画素を削っています。
これをやると、初期解は、これはランダムサンプリングなんですけど、ランダムに100個取った画像でこれが近似した画像なんです。これはランダムなのであんまりきれいじゃないんですが、繰り返しを5回ぐらいして1,800画素ぐらいとってくるとこんな感じになるという感じです。これだけを見ると、ランダムにたくさん1,800ぐらいとればそれなりにいい結果が得られるんじゃないかっていうふうに思われると思うんですけど、ちょっとそのあたりの性質については後ほどお見せしたいと思います。
これは、普通の画像の編集の結果で、このぐらいはもともとの方法でもこのぐらいのクオリティは出るので、これに対しては別にどうってことはないんです。
性能等をちょっと比較してみると、6個を比較してみると、上のほうのこのLevinさんのやつとLischinskiさんのやつはちょっとクオリティがよくないです。これもそうですね、あんまりクオリティがよくない。というのは、もともと僕がベースにしている方法というのは、物を識別するっていう能力が弱くて、なので識別をしようとすると境界がボケてしまったりとか多くとり過ぎてしまったりとか、これは少なくとり過ぎてしまったりとか、そういう現象が起こってしまうということがあって、クオリティがあんまりよくない。このクオリティがそこそこ似ているやつはじゃどうかっていうと計算時間が結構違っていて、これは50秒かかってこれは40秒かかってるんですけど、さっきの近似をしてあげると0.2秒で終わります。0.2秒なのでリアルタイムではないんですけど、一応、それなりにインタラクティブには動かせるっていうことになります。ちなみにこの画像は、サイズが大事ですよね。HDなんで720×1080のサイズです。そんなにめちゃめちゃ大きくはないんですけど、めちゃめちゃ小さくもないっていうぐらいの画像です。
○質問者 これは精度を同じにして計算時間を比較しているんですか。あるいは、精度みたいなものを何か設定して、精度が同じになるまでの時間をはかっているんですか。
○谷田川 精度というよりはこの入力が与えられたときに、この結果が出るまでの単純な時間ていう感じなんですけど、お答えになってますか。
○質問者 目標としてる画像っていうのがもう決まってるんですか。
○谷田川 この最終的な白黒の画像ですか。それはとてもいい質問でして、これを入力したときにどれを編集したいのか。つまり、どういうマスクが得られるべきなのかっていうのは、実は正解がないんです。なので例えば変な話、ここは赤いチューリップに黒い線がかかっているので、この2つはある意味白くしないでくださいって思ってるかもしれないです、ユーザーは。なんですけど、こっちの何も印がついていないものに関しては、白になるべきなのか黒になるべきなのかっていうのは、実は正解がないんです。なのでここで当たり前のようにこの2つが選ばれるのが正解みたいに言っちゃってるんですけど、実はそこは実は議論の余地があって、これがほぼ正解でもちろんいいとは思うんですけれども、ここに関してはどうなるべきかっていうのは、その目的によりけりなところがあります。なのでそういう意味で言うとゴールは1つのチューリップではなくて、ここでは勝手にこの2つのチューリップが選ばれるべきっていうふうな仮定を置いてしまっています。これでお答えになっていますか。
○質問者 はい。
[slindenumber no=21]
○谷田川 先ほどの画素の部分ですね、この手法の結構僕が気に入っているところは何かっていうと、さっきの画素をふやしたり減らしたりする仮定の中で、重要な箇所にたくさんサンプルを取るようになるっていう部分です。この画像を見ていただくと、ここの空の色があんまり変化しないところは、あんまり情報がなさそうじゃないですか。なんですけど、このタワーの真ん中の部分は、結構色が変わったりとか、赤の部分があったり青の部分があったりで結構情報が多そうなんで、特に何かこっちからこれはこういう物体だよって与えてるわけではないんですけど、画素がその感覚に応じてサンプルされるんですね。このっていうパラメーターはこのベースのその未知数を決めるようなパラメーターになっていて、sが大きくなるとその未知数が疎になっていくんですけど、これはとりあえずパラメーターで大事なのは空の部分は素でタワーの中身は密になるっていうような感じのものが出てくるっていうのが結構おもしろいところかな思っています。
という感じで一応研究をしてきたんですが、ここまでやっていてふと思ったんですね。そもそも最適な画素と画素の距離、つまり画素が持つ特徴の違いって何だろうって思い始めたんですね。なのでどうやったら最適な距離が決まるのかなということを考え始めたんです。
もともとの方法はじゃどういう距離を使っているかというと、一番ポピュラーな方法はここの入力のこういう画像が与えられたときに、これをとりあえずRGBの空間にプロットすると、こういう感じになるんですね。この点の集合を、ちょっとここで多様体って言葉を使うのはちょっと怖いんですが、多様体だというふうにみなせるっていうふうに考えて、グラフみたいなものを近くの画素同士の間に作ってあげて、それが多様体だというふうにみなして、そのグラフの上の距離をある意味その特徴の間の距離として使おうみたいなことをするのが一番一般的な方法になってます。
[slindenumber no=24]
なんですけど、これはあくまで色のとか位置の距離のちょっとした拡張でしかないなと、あんまり面白くないなと思いまして、ちょっと関係者の話を紹介します。鶴田くんがいらっしゃった研究室の同級生で遠藤くんという人がいて、その人が今年発表する研究で、ディープラーニングを使ってさっきの距離を決めようっていう研究があります。この方法は何をやっているかっていうと、ディープラーニングを使って色と位置の情報から決まる特徴を学習してあげようっていうことをしてます。この方法では1画素じゃなくて、9×9のパッチをとってくるんですけど、Visual featureといっている色の情報を計算します。この情報をディープ・ラーニングでやるんですが、これがそのネットワーク図です。この図は割と僕は見慣れてるんであんまり結構すんなりいっちゃうんですけど。これ、多分初見だとわかりづらいと思います。いろいろ操作をしてあげるとこれが9×9のパッチが256次元のベクトルになります。こっちの画素の位置に関係する方は、結構単純でここのパッチの中心位置の座標XとYというのがあると思うんですけど、そのXとYに対して256×2の行列を掛けて256次元に拡張するということをしてます。次元が大きくなるので本当にこれでいいのか、ちょっと分かりかねるんですが、こういうことをしています。
この256次元の色のベクトルと位置のベクトルが得られるので、それを何らかの方法でマージしてあげて、それがユーザーの入力しているストロークと似てるかどうかという、こういうニューラルネットを学習してあげると、新しいというか、この場合は元の画像なんですけど、元が与えられたときにどういう特徴を使うべきかというのがニューラルネットから出力されてくるというようなことをしています。というような研究で、結構おもしろい試みかなというふうには思いますが、これもある意味、色と位置の情報の拡張というとちょっと言い過ぎかもしれないですけど、を一応ベースにした考えかなと思っています。
最近すごく思っていることがあって、2045年ぐらいにシンギュラリティが来るらしいので、ちょっとコンピューターをやっている身としては、シンギュラリティにちょっとでも近づくような研究をしないといけないんじゃないかと思っています。まだ、そんな大層なことは言える身分ではないんですが、やりたいなと思っていて、じゃ何ができたらそこに近づくかって思ったときに、やっぱり画像から材質はちょっと微妙なんですけど、その映ってる人の感情であるとか、例えばその画像の雰囲気であるとかそういうものが見つかったらすごくおもしろいなと思います。
第一段階として何でその材質のパラメーターをやろうと思ったかというと、結局その例えば温かい雰囲気とか冷たい雰囲気とかっていうのは、多分天気であったり温度であったり光の当たり方であったり、結構物理量の組み合わせであらわせるんじゃないかなというのが何となく頭の中にあって、じゃ、物理量をとれるだけとり切ったら、何かその組み合わせですごく高次元になっちゃうかもしれないけど、感情みたいなものをあらわせたらうれしいなという淡い期待もあって、じゃ、とれそうな物理量をとってみようというのが今回の研究の始まりになっています。
ここまでが画像の話で、次のスライドからがらって雰囲気が変わって三次元の話になります。
じゃCGで言う物理的な性質、材質の性質って何っていうのが次のスライドになります。CGでは、一般的に何かこういうきれいな、これはコンピューターが計算してつくった絵なんですけど、こういうきれいな絵をつくろうってなったときには何をするかというと、光がある場所から光の光線を飛ばして、その光の光線がカメラに至るまでにどういうパスを通るのかというのをシミュレーションして、光がどう見えるのかというのを計算します。
じゃ、そのときに必要なものは何かというと、もちろんこのシーンを構成しているものの形とか光がどこにあるかとか、光の強さとかっていうのはもちろん必要なんですけど、一番表現が難しいものとしては、光がこの物に当たったときにどっちの方向にどれぐらいの強さで跳ね返るかというのがシーンを構成する上ではとても大事です。その光が当たった位置で直接跳ね返ってどこかに行くっていう、これを単純に反射っていうふうに言っているんですが、これを記述する関数というのはBRDF関数っていうんですが、ちょっとこれは後ほど説明します。
それよりも大事なものとして、表面化散乱という性質があって、例えば人間の肌とかフルーツとか食べ物とか大体の物はそうなんですけど、大体の物は光が表面に当たったらそこで反射するのではなくて、光が中に入って、中で何回か拡散が起こって外に出てくるというような挙動を示します。なのでちょっとここの普通の反射よりは複雑で、この表面化散乱というのを扱ってあげないと、こういうリアルな質感というは表すことが難しくて、こいつを何らかの方法で実物体から測るというのはかなり需要があります。ちなみに、一応比較なんですが、さっきの表面化散乱というのを使うのと使わないので、石膏像なんですけど、石膏像の見た目がどう変化するかというのの写真がこれです。石膏って言っちゃうと微妙かもしれないですね。右も左もまあまあいいクオリティなので結構微妙かもしれないですが、一応、こっちが表面化散乱があって、少し透き通った石っぽい感じが出てるかなと思います。なので論文の著者からすると、こっちのほうがいいということを実は言いたい図だと思います。
○質問者 これ、入力はもうその像を入れていて、それをある一方方向から光を当てて、それをだからシミュレートした結果ということですね。
○谷田川 はい、おっしゃる通りです。これは石膏像の3次元形状があって、光の位置があって光の強さがあって、あとは石膏像に光が当たったときにどう変化するかという振る舞いだけを変更してあげたものです。
○質問者 何か右のほうがどっちかというとぼやっとしたふうに見えるんですけど、そういうのはあんまり気にする点じゃないんですか。
○谷田川 それもすごくいい質問でして、実はその物がどうやったらリアルに見えるかというのは結構研究がされています、例えばこれとこれはどっちもそれなりにリアルなんですが、こっちのほうがいいという要素があるとしたら何かというと、少し透き通ってる感じがするというのはもちろんそうなんですが、表面が少しつるっとしている感じがすると思うんですね。表面が光沢があるほうが人間の目には透明感があるように見えるらしいです。あとは、ここの輪郭の部分の光り方が多分結構違うと思うんですが、輪郭の部分の外側がきらっと光っている効果が出ると人間は透明感があるように見えるという知見もあります。これは結構真面目にシミュレーションをしてるんですが、そういうちょっとつるっとさせるとか、輪郭付近を少し光らせてあげるというふうにするだけでも、人間は結構リアルだというふうに感じるらしいです。これは物理に一応基づいてるんですが、そういう知見は一応あります。
○質問者 散乱のパラメーターみたいなものは実験的に求まっているものですか。
○谷田川 そうですね。このJensenさんの論文は、この石膏像のパラメーターをどうやってはかるかという研究でして、これは測ったパラメーターを使ってます。
さっきの話に戻って、BRDFってさっき光が当たったときにその場で跳ね返るのを表す関数というふうに申し上げたんですけどBRDFっていうのは、Bidirectional Reflectance Distribution Functionの略です。名前は正直どうでもいいんですが、これは何をあらわしているかというと、ある方向から入射して光の強さと出て行く光の強さの比みたいなものを表しています。実はちょっと単位が違うんですが、ちょっとこの話の中では単純に光の強さというふうに呼ばせていただきます。なので入射と出射の光の強さの比みたいなものになってます。
これはパラメーターが方向しかないので、それなりにモデルとしては単純なんですが、先ほどの透明感を考慮したモデルになるとちょっと複雑になります。これはBSSRDFというモデルで、Bidirectional Scattering-Surface Reflectance Distribution Functionというちょっと長い名前なんですが、これはパラメーターが4個あるんですね。4個といっても次元がついているんで、実際には4個じゃないんですけど。というのが表面上の位置なので表面が2次元、表面をあらわすのに2次元しか必要ないので2次元で、方向が3次元。2次元が2つで、3次元が2つなので、全部で10個のパラメーターからなる関数になってます。この10個のパラメーターからなる関数を決めるという問題を解かないとさっきの石膏像がどういう光の反射を示すかというのは決まらないという感じになります。これも基本的にはある場所に入ってくる光の強さとある場所から出ていく光の強さの比というふうになっています。
僕はこのBSSRDFを推定したいんですけど、これを推定する前に実際にシーンがあったときに、どうやって絵をつくるのかという話を先にしたいと思います。そのときに使うのが、このちょっと若干仰々しい式を使います。レンダリング方程式っていう式で、そんなに難しくはないです。ここのLというのは、ある場所にに対して方向から入ってくる光で、光源から直接どこかに当たる光と、どこかに当たって跳ね返って入ってくる光の2種類が混ざっているものだと思ってください。この集まってきた光に対して、このBSSRDFを掛けるとこの光がほかのどの位置からどの方向に抜けていくのかというのがわかります。なのでそれを、光からやってもいいですし、カメラからやるほうが実は主流なんですけど、光からどういうふうに光が伝搬していくのかというのを後ろからシミュレーションしてあげると、最終的な結果が求まるという感じになってます。これは、積分になっているのは、ある場所に入ってくる光というのはいろいろな方向といろいろな位置からくるのでそれを積分しているっていう感じになります。
これを推定の問題に落とし込むためにじゃ何をするかというと、まず一番最初、間接の光は考えないで直接の光だけを考えるとここが単にという、入力のこの直接光だけに置きかえます。だから、これは直接光から光源から直接照らされた光の明るさになって、1回反射、直接考えないで1回反射だけの場合は、このというのがここに代入されて、これが一回反射した光になります。じゃ、2回反射はどうかというと、これをここに入れてというふうにやっていけば、2回、3回、4回というふうなものが出てくるという感じになります。
それで、最終的な答えはどういうふうに表されるのかというと、一般化したのがさっきのというのが与えられたらというこの式を解けば求められます。積分というのは線形の演算子ですので、こういうことができると思います。
最終的な結果というのは、このを0から無限大まで足し上げたものになるので、最終的に得られるのはこの式になります。このっていうののdeterminantが1より小さいので、変換してあげるとこの式になるはずです。
というので、この式がとりあえず得られます。じゃ、得られている画像からこのパラメーターを決めるという問題はどういう問題になるのかというと、っていう演算子がどういうふうに決まるのかというのを求めるという問題になります。与えられているのは何かというとはわかっています。もわかっています。この両辺の誤差を最小化するみたいな問題を解くときは、1枚では未知数が多すぎて厳しいので何枚も画像を撮影します。ここではN枚とっています。N枚とっている画素の誤差の足し合わせみたいなのが最小になるようなを決めるというのが一般的なインバース・レンダリングの問題になります。なんですけど、こののパラメーターというのは、通常普通は結構パラメーターが多くて、BSSRDFで半透明なものを扱おうとすると、特に問題を解くのが難しくて、みんな結構試行錯誤をしているという感じになります。
半透明を扱ったものにはどういうものがあるのというのをちょっとご説明しようと思うんですが、一つは位相関数という関数があって、これを推定することによってさっきのっていうものを決めてあげようというものです。位相関数というのは何かというと、例えばここに置いてある牛乳みたいなものの中に光が入ってきたというときに、ある1点で光が拡散されたらどっちの方向にどのぐらいの確率で進むのかというのをあらわしている関数が位相関数です。これを求めるというのは基本的には先ほどと同じ問題になって、形状が既知の入れ物に牛乳を注いで、光の位置もわかっている状態で写真をバシャバシャと何枚か撮ってあげると、さっきの式の両辺を最小化する問題を解くことでこの位相関数というのを求めることができます。
この方法のメリットは何かというと、基本的にはこの位相関数というのは牛乳に対して何か、ウーロン茶に対して何か決まるというふうに、物に対して1対1で決まるので、例えばこれをじゃウーロン茶が今コップに入っているけど、別の形の容器に入れましょうということも簡単にできます。一方で、この手法の欠点は1個何かっていうと、複数の物が混じっているものには使えないんです。なので牛乳みたいな物はオーケーですけど、カフェオレとかが完全に混ざっていない場合はだめで、普通のコンビニとかで売っている上が牛乳っぽくて下がコーヒーっぽいみたいな物に対してはちょっと使えないっていうことになります。
そういうものも扱うための方法として、これももちろんデメリットがあるんですが、BSSRDF自体を求めてあげようよということを考えます。これは、基本的にある形が決まっているものに対しての方法です。じゃ、コップの中にカフェオレが入っていたら、あるところに光を当ててあげます。そうしたら、その光が周りからどういうふうに出てくるのかというのを周りから写真を撮って、どこからどのぐらいの強さで出ているというのを測定します。そうしたら、当てる光の位置を変えて、また写真をたくさん撮るということをひたすら繰り返す。そうすると、これは推定というよりは単に計測しているって感じに近くて、なので光を当てては撮る、光を当てては撮るということをすれば、さっきのどこの位置から入った光がどの位置にどのぐらいの強さに抜けるかというが全部求まるので、ある意味これは推定ではなくて測定になります。
一応、測定がこれでできます。これは、その光の入出量と考えているだけなので基本、どんな物に対しても使えるんですが、まず測定に大変な時間がかかるというのがまずネック。あと一つは、BSSRDFは形に対して張りついているモデルなので、コップに入っているカフェオレを別の形の入れ物に移せるかというと、それはできないということになってしまうのが一応デメリットではあります。
ちょっと前置きが長くなってしまったんですが、いろいろな方法があって、次のスライドをお見せするんですが、絵はかなりのクオリティが出るようになっているんですが、かなり問題がありまして、僕も何かアニメーションでもつくろうかなと思ってカフェオレの色を測ろうと思ったら、そんな簡単にはいかないです。一番新しくて精度が出る方法、2013年の方法なんですが、これをやるためにはまずカメラの位置を決めて、そのカメラパラメーターというカメラがどっちの方向にどのぐらいの画角でどのぐらいの焦点距離でとかっていろんなパラメーターをまず決めといてあげる必要がある。あとは、光の当て方もこういう蛍光灯みたいなものを当てるというわけじゃなくて、線がすごく細くてなおかつ波長が単波長になっているような光の合成みたいなものを当てるという、大変な苦労が必要です。
それを用意するための機材は、比較的って書いてあるんですが、高価です。これはちょっとカタログで調べてみたんですが、ここの線が刺さっているだけのマシンがこれが多分50万円ぐらいします。これは何をやっているかというと、光を分光して赤と短波長の赤、青、緑に分けるという機械なんですけど、これを全部組み合わせたら多分100万円じゃきかないくらいお金がかかってしまう。さらに、計算にもすごく時間がかかって、これの方法はAmazonのEC2っていうサーバーを10台借りて6時間なので延べの時間は60時間もかかる。これだけセッティングをしてきれいなものを撮っても60時間もかかる。正直もうやってられないです。なので何かもっと簡単に撮れたらいいなと思うわけです。
これが先ほどの物の絵で、見てわかるとおりものすごいリアルだしものすごいきれいなんですけど、本当にCGに使うのにこのクオリティ必要かって言われると、結構微妙かなという気はしていて、多少ずれていてもそれなりにきれいな物が見えればいいんじゃないかというふうに思えるわけです。実際、人間の目って、かなり厳密でそれなりに少しパラメーターがずれているとそれを見分けられるんだよっていうふうな知見もあれば、少し周りが光ったりとかつるっとしただけで、リアルに感じちゃうんだよというような二つの知見があって、結構そこらへんも難しいところだったりします。でも、いずれにしてももうちょっと簡単な方法できれいな絵がつくれたら嬉しいなと思うわけです。
最終的にはカフェオレを撮りたいんですけど、カフェオレに行く前に、じゃ1個のやつだったら簡単な方法があるのかというのを御紹介します。ここでやってるのが、入力の画像がこれはマスカットなんですけど、物体全部がマスカット、これは全部オレンジ色の石けん、全部紫色のロウソクで同じ物で構成されているものです。同じものの場合には、基本的に減衰の仕方というのは距離の関数に置きかえることができて、ある位置から入射した光っていうのは、距離に応じてどんどん小さくなっていくというような関数になっています。それで、この減衰の関数というのを赤、青、緑の各成分で、実際には波長ごとに求めてあげる必要があるんですけど、求めてあげればいいというふうに問題を簡略化することができます。なのでこの方法はそれを利用してこういう入力画像からこの減衰の関数というのを求めてあげてこういう絵をつくっています。
それでは、これを1個のものじゃなくてカフェオレに応用すると、ちょっとこれはカフェオレじゃないんですけど、カフェオレに応用するとどうなるかというと、一応の場合には光が通るパスの中で通っている光が当たる物というのは同じなので1種類の減衰関数を決めればいいんですが、こういうまだら模様の場合にはそうはいかないです。というのは、ある入射の点とある出射の点を、実際には直線じゃないんですけど、仮に直線で結んだとして、間がどういうバリエーションになっているのかというのはまずわからないし、多分、どこを結ぶかによって距離が同じでも形が多分違うじゃないですか。なのでこれはとても難しい問題です。ここで一応二つ挙げているんですけど、今言ったのはモデルを記述する未知数の数が多いというので、任意の点のペアに対してさっきの減衰の関数を求めなきゃいけないので、まず未知数がめちゃめちゃ多い。あとは、難しさは、これは画像を1枚だけ入力した場合なんですけど、この青の色って人間が見たらこれは石けんが青くて、この石けんが白くてこの色になっているんでしょうと当然わかるんですけど、見方によっては、例えばここの青い部分がくぼんでいてとか、青い光が当たっていてとか、いろいろな見方が多分できると思うんですね。なので画像1枚だけからだと、それは影なのか表面の色なのか、中の色なのか光の色なのかというのはこれは判別できない。なのでそこにまた一つ難しさがあるということになります。当然、この難しいままでは解けないので、じゃ、僕の方法では何か簡略化の仕方を考えて、ここから何かきれいなパラメーターを求めてあげようとしています。
まずどういうことをやっているかという流れを説明します。入力の画像というのは基本は1枚でして、この入力の画像と物がどこにあるのかというマスクの画像があります。めちゃめちゃゆっくりなんで多分大丈夫だと思います。これ2枚が入力です。でもこのマスクは人間がつくらないといけないんですけど、物がどこにあるかというのはこれはフォトショップとかで簡単につくれるので。最初に形を求めるのに色にまだらがあると形がきれいに求まらない場合があるので、先にこの色の成分というのを分離して、ここを形に依存する成分だけに分けるということをしますが、正直あまりきれいに分かれてはいないんですが分けてます。これはクラスタリングの処理で、これは何をしているかというと、先ほど未知数が多くなり過ぎるっていうお話をしたので、じゃ未知数が多くなり過ぎるんだったら、その似てるところは固めておいて、その塊ごとにパラメーターを求めてあげようよということをしてます。なのでこれは固める処理です。こっちは形が求まらないと、そのさっきの反証のパラメーターが求まらないので、形とどっちの方向から光が当たっているのかというのをかなりラフに推定します。そうしたら、さっきのシミュレーションを解いてあげると、見た目がどういうふうになるかというのが計算できるので、その予想される見た目と入力の画像の誤差が最小になるような問題を解いてあげて、各点がどういう光の拡散のさせる性質を持っているのかというのを計算してあげます。
提案法のポイントとしては先ほど申し上げたんですけど、未知数の数がいずれにしても多すぎるので未知数の数を減らすために二つ工夫をしています。1つ目の工夫は、ある頂点から入った光が別の頂点から抜けるという関係を全部のペアに対して規律しないといけないというふうに言ったんですが、これを少し緩和して、1個の頂点に与えられている関数が何かあって、これは独立に決まるものとして、その独立に決まるもの2つを入射のところと出射のところで選んできて、それを掛け算してルートをとったものがその間をつなぐ光のパスのある意味依存度みたいなものをあらわすようにしてあげようというようなアイデアを使っています。これは既存の研究なんですけれども。なのでここでは2つの頂点間の関係ではなくて、1個の物に対してどういう性質があるのかという関数が割り当られています。それでも、まだ数がちょっと多いので、さらにクラスタリングをして、似たようなものをまとめて、そのまとまりごとにこの関数というのを求めて最後に滑らかにするということをして最終的な結果を得るということをしています。
ここからちょっと若干、式はつらくなってくるんですけど、いつでも出発はこのレンダリング方程式というやつで、基本はこの右辺と左辺の差が最小になるという問題を解くんです。最終的な結果こういう二次の問題になってこれは重みのwに対して微分ができるので、これを解けば普通の線形で問題を解けば結果が出てくるというような簡単に解ける形に持っていきたいです。これは願望であり実際にこれになるんですけど、じゃあ、どうするかというと、まず一番最初はこのレンダリング方程式というのを最初に簡単にするのは何かというと、このBSSRDFのSっていうやつを簡単にします。このSというのは、通常この半透明の物に対して光が当たるとどういうふうに見えるのかっていうのは、CGの分野で3種類に分けるというのが一般的です。
一つ目はかき氷のシロップみたいなものが与えられたときに後ろから光が当たってきたら青色の光に多分見えると思うんですけど、それは光が透明な青い物に当たって、その透明な青い物が赤と緑の光を吸収するんですね。赤と緑の光を吸収して青い光だけが抜けてくるので青い光が見えるという効果です。それをreduced intensityっていうんですけど、その効果です。
二つ目は煙みたいなものを考えがえてもらうといいと思います。高校の物理とかでチンダル現象ってやりましたよね。レーザーを当てるとそこが直線状に白く見えるっていうのが、やったと思うんですけど、それはどういう効果かというと、レーザーを煙に対して当てたら煙の粒子に対して1回拡散というか、方向の変化が起こって目に入ってくるという効果があって、これをsingle scatteringといいます。
これと同じように2回も3回もあるんですけど、2回以上は全部まとめて多重というふうに扱って、0回拡散が起こるreduced intensityの項と1回拡散が起こる項と2回以上拡散が起こる項という3つの効果に分けるのが一般的です。人間の肌とか牛乳とかっていう多くの物はあんまりreduced intensityとsingle scatteringの影響がなくて、なので多重のものだけを扱えればいいという近似の仕方があります。今回はこの知見を使って式を単純化しています。
ここで出てくる多重散乱に対するBSSRDFの近似式がこれで、このというのはフレネル透過の成分で、光が表面に当たったときにどっちの方向にどのぐらいの強さで光が透過するかというのをあらわす強さの変化の式です。このっていうのが入った後、抜けるまでに光がどのぐらい減衰するかという距離の関数になっていて、この3つの組み合わせでBSSRDFを近似することができる。入射点と出射点でのフレネル透過の影響というのは前もって求めることができるので、実際に求めなきゃいけないのは、この真ん中の距離による減衰関数だけになります。これを代入してあげたのが、パッと理解するのは大変だと思うんですが、この式に多分なっているはずです。がここにてがきて、がここにあるという式になってます。
これをもうちょっと簡略化するために、これはちょっと物理的な話なんですが、ここの部分を今括弧でくくりました。これは何をあらわしているかというと、ある点に対して光がいろんな方向から飛んでくると言ったときに、ここに集まってくる光の強さの合計みたいなものをirradianceとか放射照度っていうんですけど、放射照度を求めるということをしています。これもさっきの多重散乱というのが支配的なものに対しては、これを方向を考えずにここの光の強さのエネルギーだけ考えればいいという理論があって、ある意味での近似をすることができます。これは前計算することができるので、こういう式の置きかえをして、こういう形に置きかえることができます。そうすると、大分すっきりしてきて今こいつとこのEというのは計算できるので、こいつだけ求めればいいという感じになってます。
○質問者 今の放射照度の話の部分は全体で何かが求まればいいというのは良いのですが、それは物理的にはどういう意味なんですか。
○谷田川 例えば、こういうお茶みたいなものって光の方向がとても大事で、お茶は結構透明に近いので、多分単一散乱、1回で拡散する効果が結構強いんですけど、光がどっちの方向から入ってきて、透過が起こったときにどっちの方向に行くかっていうのがすごく大事なんですね。なんですけど、透明じゃないものっていうのは、どっちの方向から入っても抜けてくるときには関係ない。何でかっていうと何回も拡散が起こって、どっちのほうから入ってきたかというのはもうわからなくなっちゃうので、なので方向を無視してもいい。結果として、入射してくるところの方向を無視してもいい。
○質問者 それは結局何を得ているんですか。出てくる量ですか。
○谷田川 ここは入射です。
○質問者 ああ、入射か。
○谷田川 ここは光から物に当たってくるときに、あるところに当たっている光の強さです。光の強さってここで言っているのは、ここは放射照度っていう光の強さで、光の強さをあらわす単位というのは幾つかあるので、単に強さと言ってしまうのは実は語弊があるんですけど、ここは単位時間、単位面積当たりにどのぐらい光のエネルギーが通過するかっていう方向が関係ない成分になっています。
○質問者 なるほど。それは材質によって事前に計算できるっていうことなんですね。
○谷田川 はい。材質に加えて、物の形とライトの位置が分かっていれば前もって計算できます。
○質問者 なるほどわかりました。
○谷田川 これを計算することができるので、こういう式にとりあえず置きかえることができます。
ここで、ここから実際の最適化の話になってくるんですが、コンピューターが扱えるのは連続ではなくて、アナログコンピューターが実は昔あったらしいんですけど、デジタルだけなのでデジタルで扱えるようにするために離散化をしてあげます。実際に今得られている見た目っていうのは画素ごとの見た目になるので画素ごとに対してこの今得られている式を離散化してあげるということをします。このAというの何かというと物体の表面全体に対する積分になっています。なので実際に物が見えているとしたらその物に対する表面というのは、表に見えている部分と裏側に見えない部分と両方あると思うんですね。もちろん、トーラスみたいなものをこのドーナツの横側から見た場合には、表、裏、表、裏みたいな4個あると思うんですけど、そういうのはとりあえず考えないで、表と裏しかないみたいな単純な形状をここでは仮定しています。そうすると、ここのAに対する積分というのは、表側の積分と裏側の積分になります。なので表と裏を足してあとはこの積分する単位をこの画素ごとの表、画素に対応する物体表面の面積に置きかえてあげて単に足し算をしています。
ここでがこういう式に変わってるんですけど、これは何かというと画像があったときに、カメラに向かう方向の軸をZ軸だというふうにとって式を簡略化しています。そうするとこの式になって、これを簡略化するために、簡略化っていうか、これはもう単純に記号をはしょってるだけなんですけど、Qっていうパラメーターを新しく導入してこういう式に書き直すと大体すっきりします。
このままだと、が連続関数で求まらないので、これを基底関数の和で近似します。ここで使っている基底関数というのは、いろいろなものが試されてはいるんですけど、一番単純な区間定数のボックス型の関数を単に並べて近似するということをしているだけで、このBというのはある区間でだけ値を1という値をとるような関数になっています。そうすると、求めなきゃいけない未知数というのはこの頭についている重み係数だけになるので、1個のに対するコストというのは、この基底の数の分だけのオーダーになります。なんですけど、非均質の物の場合にはこのとの全部のペアに対して考えなきゃいけないので、ピクセルの数の二乗のオーダーがかかってきて、求めなきゃいけない未知数っていうのがとても多くなってしまいます。これはしたくないのでこれを各頂点ごとのものに分離してあげようっていうことをしています。
ここでのアイデアはじゃ何かというと牛乳のように拡散媒質が1種類の場合には、光の減衰というのは実はこの式であらわされます。そのっていうのが減衰の強さをあらわすパラメーターで、こういう式であらわされるんですが、2つの物が合わさったときというのは、とが当確率で合わさって2分の1になっているというふうに考えると式をこういうふうに変換していくことができて、1個目の物質に対する減衰の関数と2個目の物質の対する減衰の関数の相乗平均みたいなものをとった形になります。なのでこれはかなり大体な仮定ではあるんですが、ある頂点に対してこの半透明物質の減衰の性質をあらわすようなものを割り当てて、こう思いっ切って近似してやろうというのが、この方法のアイデアです。
そうすると、頂点ごとにこの関数を求めればいいだけになるので、基底関数の数×ピクセルの数というふうに求めなきゃいけない未知数の数を減らすことができます。
ちょっと、次のスライドは大分目がチカチカするのですが、これをさっきの基底関数で、じゃ、さっきの2個ある片方を基底関数で近似しようといって近似して、さっきの式に割り当てるとここがさっきRだったのが、こう変わりますみたいな感じです。なのでこいつとこいつの差を最小にすればいいんですけど、そもそも今未知のパラメーターはで平方根は入ってるし、ここは和だしもうちょっとわけがわからないので、これはあまり扱えるかどうかというのを逆にお聞きしたいんですけど、多分、あんまりうまくは使えないので、これをもうちょっと扱いやすい形に変えたいというのがあります。
ここでこの話をするのはちょっと恥ずかしいんですが、ここでじゃ相加相乗平均という高校1年生ぐらいで習う超簡単な式を使って簡略化しようと考えました。じゃあ、平方根をこの和に置きかえよう、そうすれば線形になるから解けるんじゃないかということを考えました。でも当然考えるだけではだめで、これを単に使えばいいって話では当然ないです。なので何でこれを使ってもいいのかって話をします。
さっきのPっていう関数は減衰の関数になります。なので基本的な形はこういう減衰の関数の形になるんですが、ある近い2つの点をとってきたときっていうのは、そもそもこの減衰関数の形がとても似ています。なので近くにある2点で関数Pを考えるとどっちも値が近い。なのでルートを相加相乗平均の関係を使えば和に置きかえてもいいんですよね。一方、離れているものはどうかというと、離れている場合には、これ減衰関数なので十分距離が離れると影響はほぼ0に収束しています。なので両方とも距離が離れていれば0になります。ということは、この場合も、ある2点のPというのが、両方とも0で同じになる。なので相加・相乗平均の関係を使ってこういうふうに置き直してもいいというふうになって、実際中間的な距離は当然近似はうまくいかないわけですけど、こういう一応理屈で近似をすることができます。
これを実際に代入してあげると、これでも大分複雑ですが、でもこれはに対して全部線形の式になってかなり扱いやすくなります。
実際にここまでの計算量をちょっと見積もってみると、これで実際さっき線形の式になっていたので線形の問題で解けます。なんですけど、さっきの重み係数というのはどのぐらいの多さがあるかというと、基底関数の数×ピクセルの数なんです。基底関数は通常30~50ぐらい取りますし、画素というのは大体1万から2万ぐらいはあるので、ということ未知数は最大で100万ぐらいです。なのでちょっとこれは疎行列問題だったらまだしも密行列ではちょっと厳しいですよね。なのでこれをもうちょっと簡略化します。
じゃどうするのというと、クラスタリングで、今このというのはマスクされている画像、さっき白かった画像なんですが、そのマスクされている画像を互いに交わらない部分に分割します。そうすると、式を4個書くの大変だったので1個しか出てきてないですが、これを簡略化することができて、そうすると未知数が各クラスターに対して基底関数の数分の未知数に変換することができます。クラスターが大体今100個ぐらいとってます。100個とか200個とかとっているので、もともと1万あったものが100分の1になってます。なのでさっき100万て言ってたので、未知数は1万個ぐらいになりました。50個とって200個、100個ぐらいとる。大体、5000とか1万とかそのぐらいのオーダーの未知数の数に減りました。なのでそれを求めます。
実際には、さっきの問題だけを解けばいいんですけど、何分ちょっとこの問題というのは、何となく想像できるかなと思うんですけど、ものすごく低ランクであんまりきれいに解けないので正則化項をつけてます。正則化項をつけて何とか解こうという工夫をしています。この正則化項は何をしているかというと、今クラスタリングしているんですけど、クラスタとクラスタの見た目が近かったら、そこに割り当てられるその減衰の関数も近くなってほしいよねみたいな平滑化項をつけています。
さっきから同じようなことしかやってないですけど、まだ厳しいんです。まだ厳しくて、実際これ、さっきの1万個未知数がありますって言ったんですが、ランクってどのぐらいだと思いますか。大体3000ぐらいはあってもいいかなとか思うかもしれないんですけど、まあ一番最悪のものだと、僕が見た感じだと17くらいしかないやつがありました。1万のうち17です。なのでめちゃくちゃローランクなんです。なのでこれもそう簡単には解けない。なのでちょっと条件数を減らす工夫をしようと。じゃ何をするかというと、Aっていう係数行列の列を見たときにノルムが小さかったらここはもう0ということしにしようというのでどんどんその行列を小さく、実際には列しか入れないですけど、列を小さくしていって何とかして問題を扱いやすくしています。この場合には実際には全体に対する、ランクは変わらないですけど、大もとの全体が変わってだんだん小さくなっていくっていう感じですね。
でも、さらに厳しいので、これは別に多分一般的だと思うんですけど、前処理行列を掛けて何とかうまく解けるようにしようという工夫をして、で、やっと解きます。
解いてあげるんですけど、先ほどランクが17になるっていうお話をしたんですが、ランクが17だと当然ながらあんまり性質のいいものが出てこないんです。なので性質を担保するために最後にフィッティングというものをしています。このフィッティングは何かというと、さっきの減衰関数というのは、まず滑らかではあってほしいと思うんですけど、滑らかでまず負にはなりません。というのは光が入ってマイナスになることはないので負にはならなくて、あとは光や距離に応じて増えてることはないです。中に光るものがない限りふえることはないですから、単調減少で非負っていう性質があって、あと、この連続性を担保しているのは単に連続であるほうが、連続でないものを扱うのは難しいので連続にしてるってほうが大きいんですが、連続であるっていうふうにしています。
これを担保する最適化問題はどういうふうに書けるかっていうと、こういう式で書けて、これは何かっていうとフィッティングした後かな。このフィッティングした後がこの*ってやつで、フィッティングする前が*ついてないやつで、ここはもともとのものとフィッティングした後のものが近くなってほしいっていう項で、ここはC2連続の2回微分の二乗のC2連続の項で、後は非負であるっていう制約と単調減少という制約をつけて、この制約つきの最適化問題、実際にこれは離散ですけど、離散的な問題を解いてあげるとやっと最終的な結果が出てくるという感じになっています。ここまでいろいろ簡略化、簡略化、簡略化で最後にはフィッティングもして、いろいろやり過ぎな感じはあるんですが、一応これで解けます。
これはどうやって解いてるかっていうと、最初の線形問題はQMRという線形ソルバーをPythonで実装したものを使っています。さっきの制約つきの問題は、僕はどうやって解いてるかっていうのはあんまり明るくはないんですが、これもPythonで実装された制約つき二次計画問題をライブラリを使って解いています。Pythonていうのはコンピュータ言語のことです。
大分、未知数を減らしたので結構計算は早くて、この30、100って中央に書いてあるのが標準的なパラメーターで大体うまくいくんですけど、これで。それで大体7秒ぐらいの計算で最終的な結果を出すことができます。これで大体大枠はおしまいです。
ここから結果です。結果こんな感じになります。これが入力の画像で、この1、2、3、この1が持っている拡散の強さというのをプロットしたのが1、2、3。ここを見ていただくと白い部分は大体、青、緑、赤が同じぐらいの割合で減衰していく。真ん中は中間ぐらいの色でちょっと青が強いかな。こっちの3番目は、青が緑と赤よりは強いという感じになっています。これは、黄色とオレンジなので黄色は緑と赤の大体組み合わせなのでこれは緑と赤がちょっと強い。ここは、オレンジが赤に近いので緑が少し減ってみたいな感じで一応見た目を反映したものが出てきます。これは割とうまくいっている。
次は、あんまりうまく、下はそこそこうまくいってるんですけど、上は、これは結構まだらになっているので、あんまりきれいなものが実はでなくて、ちょっと形が変になってるんですが、一応、こういうものが出てきます。本来は多分こういうステップにはならないはずで、光は入っていきなり減衰するのでこういうふうに光の強さが保たれるってことは基本はないんですが、こういう形のものになります。
これは、まあまあうまくいっているやつで、これはチェスボードで、下が石です。こういうきれいな減衰が出るという感じになります。
この形の良し悪しというのは、正直、僕の研究の中ではどうでもよくて、最終的にこの結果がきれいかどうかという単純な判断をしていただきたいんですが、これは多分見ていただいて、どうでしょう。まあまあきれいだと思います。もちろん文句をつけようと思えば幾らでも文句はつけられるんですが、単に見た目だけで言えばそれなりにはきれいかなと思います。当然、研究なので単にきれいでしょって言っただけでは叩かれるのでちょっとそれは後で評価をしています。
ここで動画を。これは静止画だと結構ごまかされると思うんですよね。なのでちょっと動画でお見せします。さっきと同じ動画なんですが、結果ですね。これが石けんでこれが飴ですね。これが動きます。光がこう回るんですけど、こんな感じです。ちょっと表面がつるっとし過ぎかなという感じもありますけど、結構それなりにリアルなんじゃないかなと思います。これが石けんかと言う方はいるかもしれないですね。これがろうです。ちょっと色合いがあんまりきれいじゃないですけど、これも実は表面のつるっとしているぐあいというのは、推定することができなくて、表面の成分は別に与えているので、つるっとしてるのはちょっと実はこっちでコントロールしてるんですけど、ちょっとつるっとしている感じがするかもしれないですが。
これはさっきの石とこっち側も石です。こんな感じの見た目になります。こっちはチェスボードでこっちが石。もとの画像がちょっと見づらいですね。という感じになってます。動画で見ても結構リアルなんじゃないかなと思います。もちろん、リアルかどうかというのは結構判断が難しいので、単にリアルっていうだけじゃ意味がないんですが。結構きれいだとは思います。
ここから若干あと2枚は少し遊びで、これは何やってるかというと、せっかく材質をはかったので実際の画像に埋め込んだらどうなるかというのをやっていて、これ瓶があるのを、瓶をキャンディーでつくったらどうなるかというのをちょっとやってみたんですが、これは結構見た目が微妙でちょっと論文には、最初載せてたんですけど載せるのはやめてしまいました。載せるのやめたっていうのは別に隠したわけではなくて、これがうまくいっていないように多分見えると思うんですけど、うまくいっていない理由は単純で、これの形をこの画像から推定できないからなんです。なのでこれがきれいに推定できれば、これもそれなりにきれいに見えるんですが、ここから形を正確に再現するっていうのは実は難しくて、それができないがためにうまくいってないように見えるということになってます。なので隠してるわけではないですね。一応ですが。
画像の見た目の編集っていうのが僕が最初にやりたかったゴールがこれなんですけど、編集する時にこの画像だけが与えられると、これをこれに編集するって問題は実は結構難しいです。それは何でかっていうと、まず光が強く当たってるこういうハイライトみたいなものを扱うのはまず難しい。これは白飛びしちゃってるのでなんとかなるんですけど、あとは同じ色の部分でも影がついている部分と影がついていない部分があって、これを単に編集するっていうのは、多分相当難しいはずです。ただし、もちろんPhotoshopとかを使うとこれをこれにする、単純に変えるってことができて、その色の成分を置きかえるってことができるので、単純に置きかえることはもちろんできるんですけど、これを細かくコントロールするっていうことはできないです。細かくコントロールすることはできないんですが、推定に使った元の画像は今手元にあります。なので元の画像をうまく、これはここだったら細かくコントロールすることができるので、細かくコントロールして編集してあげたものを入力にして推定してももちろんいいですし、推定しなくてもこの比をさっきの減衰関数に掛けるだけでこういう結果の絵がリーズナブルに出すことができます。ということも一応できます。
ここから評価実験をちょっとしていて、当然見た目がいいっていうだけでは、ちょっとなかなか研究としては難しいところがあるので、ちょっと評価実験をしています。これもちょっといろいろ突っ込みどころはあるんですが、推定に使っている入力画像はこのインプットと書いているものが推定に使った画像です。この推定した結果を使ってレンダリングといって絵をつくっている結果がこれなんですけど、これは光の当て方をちょっと工夫していて、光を右側から強く当てています。このRefっていう画像はこれは入力ではなくて、単に同じような光の当て方で物がどう見えるのかというのを写真に撮ったものです。このRefとレンダリングの結果がそれなりに見た目が光の透け方が近いからそれなりに光の位置が変わってもうまくいってるということを主張したいです。ここでは若干判断を預ける形にしてしまっているのですが、これを以前お見せしたときに、何でこれを四角のボックスにしたないのかというご指摘を受けました。それをしていない理由は何でかっていうと、ここからこのボックスの形、このあめの形をやっぱり推定することはできないんです。なのでちょっと今回はこれの形を使うっていうことではなくて、違うものにしたっていう感じになってます。ただし、一応形がわかっている物であれば、そういう実験ができるので、ちょっとそういうこともしてみました。
さっきの入力に使っていたこの画像っていうのは、全部表面がフラットになってます。なので形がわかってます。なので形がわかっているものに対して何か再現をかけたらどのぐらいの再現度が出るだろうかという実験は一応しています。ここを見ていただくと、これが再現した画像でこれがもとの画像で、どうですかね、それなりに、まあ、微妙ですね。近いのもあれば近くないのもあるという感じだと思います。下のが誤差をあらわしていて青が誤差が小さくて赤に行くほど誤差が大きいという絵になっています。小さいのもあれば大きいのもあるという感じだと思います。一応この論文の主張としては、見た目はそれなりにきれいになりますといっているので、見た目の近さをはかる指標でSSIMという指標があって、このSSIMは1が最大値なんですけど、これが0.95で1に近い値をとっているので、見た目はとりあえず再現できますという主張はできました。
最後は当然、さっきもランクが低いっていう話をしましたし、フィッティングもしているし、やってることは結構言ってしまえばめちゃくちゃです。なので当然物理的に正しいものを得るということはできません。物理的に正しいものを得られないというのは、じゃどういうところがうまく得られないのかというと、まず一つは、光を物に当てたときにその光がどのぐらいの広さでぼやっと広がるか。実際にこれは拡散の強さになるんですが、その拡散の強さっていうのを求めることは難しいです。
まず、1つ目の難しさは何かっていうと、入力の画像から物のサイズをはかることはできないんです。なので光を当てたときに何ミリ進んだらどれだけ光が落ちるかっていう、実際の物理的な長さに対する光の落ち具合っていうのを推定することができません。なので実際の物がどのぐらいのスケールなのかというのはユーザーが与えなければいけないというふうになってます。それは画像から推定できないです。なので光の当たり方を当然推定はできないというのが一つあるので、物理的にはかったものとの、これは赤のところに光を当てたときにどのぐらいぼやっとなるかというのをあらわしてるんですが、実際の物理的にはかったものの光の広がりと推定したものの光の広がりは全く違うものになってしまいます。これを見ていただくと、この物理的にはかったものは、これは広がりが大きくて、広がり小さい、小さいだと思うんですが、こっちを見ていただくと広がりはどれも同じぐらいじゃないですかね。
スケールがわからないのはともかくとして、光の広がりの大小ってい相対的な違いもじゃ推定できないのかっていうと、まさにその通りで推定できません。何で推定できないのかっていうと、この今入力しているっていうのは前面から光が当たっていると思うんですね。なので前面から光が当たっているというとこは、前から全体に対して光が当たっていると思うんですね。なのでこれはどこから当たった光がどこに抜けるかっていう情報はこの中にもないわけです。なのでそれを分解するっていうことはそもそもできなくて、なので光の広がり具合っていうのはある意味、これは別のパラメーターではなくて手法的に決まってしまうものなんですけど、一意に決まってしまってなかなかそうすることはできない。
じゃあ、もともと単一の手法はどうなっているのというと、単一の手法、これを思い出していただいて、これをよく見てほしいんですが、これちょっと光の当たり方が少し変わってませんか。これ一方向から光を強く当てると、こっちの部分からこっちの部分の距離をとることができて、光が当たったところからその抜けるまでにどのぐらい光が減衰するかっていう、その相対的な光の差みたいなものをとることが一方向から光を当てればできるんです。じゃ、何でそれをしないのかっていう突っ込みをいただいたことがあるんですが、何でそれをしないのかっていうと、これ見ていただくとわかるように、一方向から光を当てると、ここの暗い部分が光が当たってなくて暗いのか、それとも物体の色が黒いのかっていうのが判断できなんですね。単一じゃないので。なので結局これを入れてしまうと、ここが黒い物質だといういうに判断されてこういう結果が出てきてしまうというのが、これが手法的な限界になってます。
なのでここまでの議論をまとめると、この方法が割とうまく働くのは、前面がそれなりにフラットになっていて、そのフラットなものに対して手前側から光が当たっているものに限るということになります。ですので、例えば、違う方向から光が当たっていたりとか、あとは表面に凹凸がついていて、全体に光が当たっていればいいんですけど影が落ちちゃってたりすると、ちょっと測定というか推定が難しいっていうことになってます。
○質問者 形状はわかってるんだからいいんですよね。
○谷田川 はい、形状がわかっていれば大丈夫です。そうですね、形状がわかっている場合ももちろんその見た目しか再現はできないんです。なので最終的な見た目を再現することはできるんですけど、例えば光の当たり方が変わったりしたときにどうなるかというところまでは実は再現できないです。というのが、今回の手法の限界という感じです。
これが最後なんですけど、一応、この単一の画像からさっきの非均質な2つ以上のものが混ざっているものに対して、そのBSSRDFみたいなのを推定するという研究は、ちょっと問題が難し過ぎるので誰もやってなかったっていうだけだと思うんですけど、一応初めてです。入力画像を用意するのは、別にインターネットから画像を落としてきたっていいし、実際に計算は7秒しかかからないし、たくさん物を試すのにはうってつけな方法だと思います。ただ、もちろ早く簡単に使えるかわりに、物理的には正しくないので、よしこれだって決めたからそのときには時間をかけてはかっていただくしかないという感じになってます。
一応、ここまでやって、今後の課題、書いてあることと違うことを言っちゃうんですけど、一応これでそれなりのものがとれたので、それなりのものを使って何か違う応用を考えてみたりとか、後はこれをーもう少し物理的に正しいように拡張するとかっていうのもおもしろいかなと思っていたりっていうのが、ちょっと最近考えていることだったりします。以上になります。
質疑
○司会 どうもありがとうございました。
○谷田川 ありがとうございました。
○司会 では会場から質問等あればお願いします。
○質問者 最適化問題のところの数式をもう1回見せてもらっていいですか。
○谷田川 どこら辺でしょうか。
○質問者 その後、ランクが低いからって話をしたのかな。これって、低ランク近似しちゃえばいいっていうものではないんですか。Aの特異値分解とかしちゃって解いてるわけではないんですか。
○谷田川 特異値分解して擬似逆行列みたいなものをbに掛ければいいんじゃないかっていうことですよね。それはしてはいないんですが、すみません、何でしていないかって言われると実は解はないです。結構、これに似た方法があって、それをそのまま使ってしまっているところみたいなところがあって、一個一個の手法を変えたらどうか、例えば、これを解くのにQMRっていう方法を使ってるんですけど、他のソルバーを使ったらどう結果が変化するかっていうのはあんまり徹底的には、調べていないです。
○質問者 をつくっているから条件数が悪くなって、前処理とか必要だしローランクなのが大変になっているという話ですよね。
○谷田川 はい。転置とランクって関係ないですよね。
○質問者 ごめんなさい。次のページのこれを解いてるんですか。
○谷田川 はい、これを解いてます。
○質問者 この線形方程式が解きにくいからランクが上がるようにしましょうっていう話。
○谷田川 これはもう列を除いた後ですね。前処理行列を掛けるのは。
○質問者 それを除かないとこれが解けないから除いてるって話ですか。
○谷田川 順序の問題ですか、順序は多分列を除くのが先のほうがいいと思います。
○質問者 これをやってる目的っていうのは。
○谷田川 どっちですか。こっちですか。
○質問者 こっち(前処理行列を使うことについて)です。これの目的は次のページの解法を使う、この線形方程式を解きたいがためにってい感じなんですか。
○谷田川 これをもうちょっといい感じに解きたい。いい感じってどういう感じなんだって話なんですけど。
○質問者 今、これはAは横長ですか。
○谷田川 Aはどっちろう、縦長だと思います。
○質問者 Aが縦長ですか。
○谷田川 そうだと思います。
○質問者 さっきのAとはじゃ、違うタイプですか。これは横長ですよね。
○谷田川 あ、ちょっとおかしいですね。もし縦長だとしたらこの速さでは解けないはずなのでちょっとこれおかしいですね。多分横長です。
○質問者 式が間違ってるだけでアルゴリズムは合ってるのかな。
○谷田川 はい。
○質問者 ランクが落ちるから、そこの0列を引いときたいっていうのは、わざわざ必要ですか?
○質問者 ランクは関係ないんじゃないですか。
○質問者 横長なので。結構削っても、確率的な問題ですけどね。どう削っても大丈夫な。
○質問者 削るのはランクが小さいから、0を削っとく。よくわかんないな。
○谷田川 すみません。ここら辺はあんまり中身を理解せずに、こうすると効率よく解けるというふうに書いてあるものを単に利用しただけなので。
○質問者 どれぐらいの精度で必要だったりするんですか。結構、もう荒っぽいんですか。
○谷田川 どこの話ですか。
○質問者 赤いところの方程式を解く精度っていうのは、すごい荒っぽいんですか。
○谷田川 かなり荒っぽいです、正直。
○質問者さっきの計算時間を出してるのは、計算機は普通のCPUで計算した結果ですか?
○谷田川 これですか。このCPUは、電気屋さんに売っているものよりかは多少は性能はいいですけど、スパコンとかではないです。
○質問者 GPUとかでもなくて?
○谷田川 はい、普通にCPUです。並列計算はしてます。
○質問者 してるんですか?
○谷田川 並列計算してるっていうのは、このソルバーの中でもう並列計算をしちゃってるので。でも、4コア8スレッドとかなので。
○質問者 QMRなので、してても行列の積を計算するぐらいしか並列化してない。
○谷田川 でも僕が逆にお聞きしたいのは、わざわざ線形にしてるのは、非線形のものは効率よく解くっていう方法がそもそもあるのかっていうところでちょっと悩んでしまって、非線形のまま解くことはできるんですかね。このルートとかが入っていても。
○質問者 非線形というのはやっぱり積分の方程式の特徴である。
○谷田川 これをこうわざわざしてるのは、線形にすれば簡単に解けるし、今回の場合は結構線形にするっていうのがぴったりきたので、線形にとりあえずこれはできたんですけど、このルートの形を解くということはできるんですかね。これを解く方法は。が未知数でルートの中に和の積が入ってるっていう。
○質問者 引き算のノルムの最小化みたいなのでいいんですか。
○谷田川 こっちはわかっていて、これが未知数で、この両辺の差の二乗を最小化。もちろん二乗じゃなくても差が最小化されればもちろんいいんですけど。
○質問者 細かく式を追ってみないとわからないですね、これ。
○谷田川 これをぱっと見たときに、とても微分を求める気にはまずならなかったんですね。なので微分を求めなくても最小化する非線形の方法っていうのは幾つかあると思うので、使うとしたらそうかなと思ったんですけど、それにしても扱う未知数の数が1万とかってなるので結構厳しいのかなと思って線形化するっていう方向で今回は考えたんですけど。
○司会 方法には根拠がありそうだったので、ある意味で適切なものを採用されていると思うんですけど、多分そういう意味では数値計算屋さんの目はまだ通ってないのかもしれないから、もしかして何かやりようがあるのかもしれない。よくできるかどうか、何かできるかというと、むしろそれが本当に違う人が見てみたら、違うやり方があってというのが、もし両方できたらちょっとそれはおもしろいことですね。
○谷田川 そうですね。でもこの分野は結構まだ未開拓で、というのはちょっとそれも断言はまだできない段階だとは思うんですけど、1枚の画像から得られる情報って実際にこの半透明のもののパラメーターを決めるにはもう圧倒的に不足していて、じゃ本当に1枚の画像から解けるかどうかっていうのはまだ未解決問題なので、そこは結構やりようで工夫ができるのであればまだまだやることはこの分野にはあるかなとは思います。
○司会 いいですね。ここまで数理寄りというか、すごいアプリケーションの話から理屈をつけられているっていうのは、僕の立場にするとこの辺はすごい興味がある。何かいろいろおもしろいことができたらいいかなと思います。
○谷田川 結構、多分、これは結構めちゃくちゃなことはしてると思うので、そこらへんご意見いただければ。
○司会 そうですね。
○質問者 CGの人っていうのは、割と見た目よければっていうところが結構大きいですね。
○谷田川 この場だと思うのですごいぶっちゃけてもいいと思うんですけど、この最終的なこのフィッティングがあるじゃないですか。このフィッティングとこの結果があると思うんですけど、これフィッティングしないと物によっては原型がないみたいなものもあるんですよ。なのでそういう意味で言うとフィッティングが実は今はすごく重要で、特にこういう複雑なものの場合には、これってこのステップ関数みたいになっちゃってるのは何でかっていうと、これの見た目がこういうふうな2つの山みたいなものになっちゃって、これ単調減少になるようにhard constraintをつけて解いてるのでこういうふうになるんですね。なのでそういう意味で言うと、フィッティングをしないとこういう複雑なものに対しては全然だめです。ただし形は全然だめなんですけどレンダリングすると見た目再現はできるっていうところにジレンマがあって、もちろん最小化問題を解いてるので見た目が近くなるんですよ。なのでそこはなかなかもう少し改善したいなと思っているところであったりします。
○司会 そうですね。こちら側から言っちゃっていいのかわからないけど、計算屋からすると見た目がいいっていうところをもっと少し解析っていうか、もう少し教えてもらって、こっち側のやり方とかが何かもう少し効率的であったり、もっと何か改良できる場所があったりすると何かお互いのいいところ取りってわけじゃないけど、合わさっていいものができるかもしれないっていうのがおもしろいところかなとは思いますけどね。
いずれにせよ、幾つかまだ議論できる箇所があるかもしれないので、ちょっときょうは時間が大分きちゃったので、もしこの後時間がある人はまたそこでいろいろできればいいかなと思います。じゃ、もう一度拍手で終わりたいと思います。どうもありがとうございました。
○谷田川 どうもありがとうございました。
プロフィール
2015年3月東京大学大学院総合文化研究科広域科学専攻博士課程終了。博士(学術)。2016年4月より日本学術振興会特別研究員(PD)として早稲田大学大学院先進理工学部応用物理学専攻にて三次元コンピュータ・グラフィックスと二次元の画像編集を組み合わせた映像編集法の研究に従事。ホームページ: https://tatsy.github.io/