しえログ

qiita との使い分けに悩んでる

ECCV2016 の Deep Automatic Portrait Matting 読んだメモ

タイトル

Deep Automatic Portrait Matting

著者

Xiaoyong Shen, Xin Tao, Hongyun Gao, Chao Zhou, Jiaya Jia

概要

肖像画的な写真に対する高精細なマスク画像を、ユーザインタラクションなしに自動で生成する CNN-based な仕組みを提案。
例えば髪の毛の毛先までしっかりとアルファブレンドできるようなセグメンテーションマスクを生成できる。
人が自分で前景・背景を指定するやり方はプロじゃない人には難しいし、プロでも難しい。
これを自動で解決するのが image matting と呼ばれる手法であり、入力画像 { I } を背景 { B } と前景 { F } に分解するものである。
提案手法(ネットワーク)は

  • 新しい要素(前景・背景・不明領域のラベルスコアと shape mask )を含んだ、前景・背景・不明領域に分割する FCN
  • 前後方型の image matting レイヤ

を利用してこの問題へ対処する。

利用技術・前提知識・用語

  • portrait image
  • image matting
    • 画像から前景のアルファ値を抽出する処理
  • ill-posed
    • 不良設定問題
  • trimap
    • ここでは前景、背景、処理対象のそれぞれの領域を表している
  • FCN
    • Fully Convolutional Network
    • 論文: Fully convolutional networks for semantic segmentation
  • CRFasRNN

英単語

  • tractable
    • 取り扱いやすい
  • discrepant
    • 矛盾した、不一致の
  • trivial
    • ささいな
  • aforementioned
    • 前述の
  • albeit
    • かたく
  • thus
    • 従って
    • このようにすることで 
  • perturbing
    • 動揺させる
    • 乱す

手法

システム全体の入力・出力は以下。

入力: 肖像画{ I }

出力: アルファマット { \mathcal{A} }

Trimap Labeling

幾つか新しい要素を混ぜ込んだ FCN を使って前景・背景・不明な領域に分割する。

入力画像のピクセルが前景・背景・不明のどれに属するのかを予測し、 trimap labeling を行う。これをピクセル分類問題として FCN-8s をベースにして解き、入力画像のピクセルに対して以下の3つの値と、 { shape\:mask } というもう一つのチャンネルを出力する。

{ F^s, B^s, U^s }: 前景・背景・不明のそれぞれのスコア

{ shape\:mask }: アルファマットを合理的に初期化するためのチャンネル。学習データである portrait-matte ペア { \{P^i, M^i\} } に対して、平均をとることで生成する。数式は省略。

{ P^i }: 顔器官の特徴点(ランドマーク?)

{ M^i }: ラベル付けされたアルファマット

Image Matting Layer

FCN-8s の結果で得られた { F^s, B^s, U^s } を元に { F, B } の probability map (確率分布って訳しておk?)を以下の softmax 式で求める。

{ F=\displaystyle \frac{\exp(F^s)}{\exp(F^s)+\exp(B^s)+\exp(U^s)} }

そうすると { \boldsymbol{\rm{F}}=\mbox{diag}(F), \boldsymbol{\rm{B}}=\mbox{diag}(B) } として次式によりアルファマットを求める事ができる。

{ \min\lambda \mathcal{A}^T \boldsymbol{\rm{B}} \mathcal{A}+\lambda(\mathcal{A}−\boldsymbol{1})^T \boldsymbol{\rm{F}} (\mathcal{A}−\boldsymbol{1})+\mathcal{A}^T\mathcal{LA} }

{ \mathcal{L} }: 入力画像 { I } におけるラプラシアン行列

{ \lambda }: データ項とラプラシアン行列とのバランスを取るための係数

そして、この解法に従って、{ \mathcal{A} } は次式のような関数の出力で表現される。

{ f(F,B;\lambda)=\lambda(\lambda \boldsymbol{\rm{B}}+\lambda \boldsymbol{\rm{F}}+\mathcal{L})^{-1}F }

あとは論文内の誤差逆伝搬式で { \lambda } を調整する。先行研究ではこれは人力で行われてた。

Loss Function

Ground Truth と予測された { \mathcal{A} } との間の損失関数は以下の通り。

{ L(\mathcal{A},\mathcal{A}^{gt})=\displaystyle \sum_i w(\mathcal{A}_i^{gt}) \|\mathcal{A}_i - \mathcal{A}_i^{gt}\| }

{ w(\mathcal{A}_i^{gt})=-\log (p(A=\mathcal{A}_i^{gt})) }

alpha matte は殆どの要素が0,1のスパースな行列になるため、単純にL1,L2ノルムを取るとバイアスがかかってしまうため上記のような重みを用いた式になった。

実験と結果

教師となる Ground Truth { \mathcal{A}^{gt} } は closed-form matting と KNN matting で作成してみてよかった方を採用した。クオリティが低いものに関してはフォトショでも修正した。

これによって2000もの画像における徹底的な高精度アルファマットを作成し、学習用データセットとした(クロスバリデーションも行った)。

精度評価には勾配と連結性の指標( matte perceptual error *1)を利用。

提案手法は前景・背景・不明領域の推測能力だけでなく、matting layer による trimap の調整においても効果を発揮した。

所感

  • 恥ずかしながら image matting というを初めて聞いた。
  • デモとかで Shape Mask 作るところまでをやってみたい。
    • 特に FCN とか CRF as RNN とかでの image matting は自分でも早めに試してみたいな。
  • 高精細なアルファマットの教師データ作成、なかなか骨折れそうだ
  • 応用例の広さは言わずもがなだと思うので試してみたい。

次読みたい論文

Image Matting

  • A Perceptually Motivated Online Benchmark for Image Matting

*1:A Perceptually Motivated Online Benchmark for Image Matting

最高のペペロンチーノを求めて

セマンティックセグメンテーションを image matting 問題として解決する手法に関する以下の論文を今週で読み終えられなかったのがちょっと悔しい・・・。

xiaoyongshen.me

やってる事自体は↑のプロジェクトサイトにあるプレゼン資料でなんとなくわかるけど、細かい計算式とその証明がまだ追えきれていないのでまた明日から読み続けよう。 グラフカットの資料も最後まで読み進められてないし、1つ1つ確実に終わらせていきたいけど、サーベイと勉強を繰り返しているとそうもいかないのがもどかしい。

昨日は以前チームが一緒だったデザイナーさんの結婚式。 式場の裏口を入り口と勘違いしてしまい、式前の写真撮影中の新郎新婦に出くわすというかなりバツの悪いことをしてしまい申し訳ありませんでした。 言い訳をさせてもらうと、最寄りの駅から最短ルートで行った場合は絶対にあの裏口に行き着くような道筋だったし、特に裏口感のある佇まいでもなかったので、あそこから入ろうとした輩はこれまでにもいたんじゃないかと思うんすよ。 披露宴でふるまっていただいた料理が中華料理で印象深かった。味もさることながら量自体も多くてココロもカラダ(腹)も満たされました。しっかりとお祝い出来たか不安だけど、お呼びいただきありがとうございました。

昨日から天気が一転して今日はとてもthe春な日だった。いつもジョギングしてる緑道で花見している方々も大勢見かけたし、つい散歩したくなるような陽気だったので俺も思わずあまり行けてないお店に大好物のペペロンチーノを食べに。あの三宿ラ・ボエムはいつも変わらぬちょうどいい味のプレーンなペペロンを出してくれるのがありがたい。正直1人で入るのがためらわれる店ではあるけれど、あのペペロンのためならどんな目で見られてもいいとすら思える。潰れる心配はしてないけど、この先もずっとペペロンをあの味で提供してほしいお店なんだよな。

ハーレム

先週金曜の夜は先輩の家にお邪魔してふるさと納税でもらったらしい肉ですき焼きを頂きに。柔らかくいい味をしていたため、なくなるのがクソ早かった。ごちそうさまでした。 その後皆で朝まで Amazon Prime に上がってるバチェラー・ジャパン鑑賞会。25人の女性が1人のセレブ男をめぐって争奪戦するという、自分一人では絶対に見ないであろうとんでもない内容の番組。毎回の終わりにどんどん女性が脱落していく流れなので、今回落とされるのは誰かってのがすごく気になるのである。 こういう恋愛系のテレビ番組は今まで全然見たことなかったけど、この番組はハーレム出来上がってていろんな意味で笑いどころが多いし、出演してる方々が次どう動くかとか気になりすぎてヤバい。あの面白さはうまく説明できないので皆さんも見ましょう。

今日は存在を知ってから早3年、ずっと行こう行こうと思ってたものの全然行けてなかった三宿FUNGO に初めて行ってきた。16時という昼飯というのには遅すぎる時間帯での入店だったからか、あまり客はいなかった。まぁこの寒さと雨だしな。肝心の料理は聞いてた通りの肉厚ハンバーガーで食いごたえ抜群。また行きたいけどウェブサイト見る限りだとどうやらデリバリーも一定価格帯からやってるらしくて休日にでも自宅に頼んでみよう。

はてブ見てたら近所の店紹介的な記事が上がってた。色々めぐりたいけど、基本的に土日の昼か夜しか行くチャンスないこと考えるとガッツリ食べ歩くつもりじゃないとなかなか難しいよな。

suumo.jp

やっと暖かくなってきたと思ったらこの寒さである。久々にぶ厚いコートを着て外出した土日だったな・・・。 背中と肩がまた凝ってきているのでそろそろ整体に行こう・・・。

読んだ書籍とか買った書籍とか

先週末は久しぶりの3連休だった気がする。先輩たちとの飲みに髪切りにと色々できた休日だったけど、それでもやりたいことが多すぎて全然手がつけられていない。

とはいえ昨日にはなったけどもここ2ヶ月ほどちまちまと読み進めていた「プログラミングのための確率統計」の1部をようやっと読み終えた。早く2部に入りたくてウズウズしながら読み進めていたものの、シミュレーションコード書きながらだったためか、それなりに時間はかかってしまったし、結局理解の足りてないところはまだ結構ある気がしている。2部は実用的な話が続くということなので、読み進めつつ理解が定着してない箇所を炙り出せればいいなという楽観的な魂胆でいる。

書籍といえば

あたりをここ1ヶ月以内に購入していたけど、もちろんあんま読めてはいない。 夜はなんだかんだ独りでバー行っちゃうこともあるので、そこで読書できればいいんだろうけどつい酒とスマホに集中してしまうし酔ってる状態で難解な文章理解できる気もしない。

そういえば会社の方が寄稿していたデータサイエンス系のムック本がそろそろ出るらしい。 相変わらず積ん読ばかりだけど、今年は分野的にどんなワードを頻度高く目にするかを見極めるのも初学者として心得ているので、あまり気にせず色々買うことにしている。

データサイエンティスト養成読本 登竜門編 (Software Design plus)

データサイエンティスト養成読本 登竜門編 (Software Design plus)

くじのポートフォリオを Python でシミュレーション

書籍「プログラミングのための確率統計」のP.111の「コラム:ポートフォリオ」を Python でシミュレーションしてみたのでその結果。

くじの詳細と賭け方

確率 0.7 で A が出て、確率 0.3 で B が出るくじを想定する。A、B どちらに賭けても当たったら掛け金が 2 倍になって返ってくる。 もし指定の期間中、毎日全財産をこのくじの A に割合 p で、B に残りの割合で賭け続けるとした場合、 p はどんな値にしておくのが望ましいか。

シミュレーションコード

Python3 で記述。

第1コマンドライン引数で確率 p を、第2コマンドライン引数で期間日数を指定。試行回数はとりあえずで 100 回。元手は10000円とした。

財産が何倍になったかの試行結果を matplotlib でヒストグラムに表示し、さらに横軸のスケールは書籍に合わせて常用対数をとった。

金融とかそこらへんのワードわからないので変数名とかは色々妥当じゃないかも・・・。

ポートフォリオのシミューレション

結果

p = 0.7

$ python3 main.py 0.7 100
[  4.   4.   7.  18.   0.  30.  10.  18.   7.   2.]
[-1.  -0.2  0.6  1.4  2.2  3.   3.8  4.6  5.4  6.2  7. ]

f:id:cielan:20170320184745p:plain

p = 0.8

$ python3 main.py 0.8 100
[  2.   1.   9.  13.  21.  21.  25.   1.   6.   1.]
[ -6.   -4.4  -2.8  -1.2   0.4   2.    3.6   5.2   6.8   8.4  10. ]

f:id:cielan:20170320184830p:plain

p = 0.9

$ python3 main.py 0.9 100
[  3.   7.  12.  14.  14.  17.  15.  12.   5.   1.]
[-13.  -11.1  -9.2  -7.3  -5.4  -3.5  -1.6   0.3   2.2   4.1   6. ]

f:id:cielan:20170320184850p:plain

p = 0.99

$ python3 main.py 0.99 100
[  7.   8.  15.   6.  19.  19.   5.  15.   4.   2.]
[-47.  -43.6 -40.2 -36.8 -33.4 -30.  -26.6 -23.2 -19.8 -16.4 -13. ]

f:id:cielan:20170320184902p:plain

所感

儲かる方ばかりにウェイトを寄せずに適度に分散して投資しよう。

プログラミングのための確率統計

プログラミングのための確率統計

大規模画像データセット オレオレまとめ

公開されている静止画像データセットなるものをちょっと調べたのでメモ。 今のところはこんなのがあるよ的な自分用メモ程度にまとめておくけど、このままだと全然使えるはず無いので後から徐々に編集・追記はしていくつもり・・・。

お酒の量は程々に

土曜日は前のチームの先輩のお家に皆でお邪魔して飲み会。 所属は皆見事に散り散りになったけど、こういう繋がりを持てるチームであったことには素直に感謝したい。 色々あって昨年末に自分から抜けるという選択をとったけど、メンバーには恵まれたチームだったとホントに思う。 帰宅が朝3時半ぐらいだった気がするけど、疲労感をあまり感じなかったのも良い会合だったからなんだろうな。

そういえば結構な量の酒を飲んだ割には記憶も飛んでないし2日酔いにもならなかった。 日によって体調も変わるわけだしそりゃまぁ酔い過ぎる日もあれば全然酔わない日もあるよね、って話ではあるんだろうけど酒飲み続けて10年経った今でもその分水嶺がわからない。 飲んだ量とその後の体調を細かくメモする習慣があれば最高のデータ分析テーマとなるんだろうけど、ザンネンながら飲み過ぎた日のデータ欠損が容易に想像できるので実行しても意味があまりなさそうな気がする。 でもまぁそう思っておくだけである程度は2日酔いを防げるかもしれないし、3日坊主にならない程度に飲んだ酒をツイートしておくのも悪くないかもと思っている。 とりあえず今まさに飲んでる日本酒はノーカンである。

今期のアニメも終盤に差し掛かっているのがチラホラ見受けられるようになった。いつもこの時期は終わるアニメを想うととても物悲しくなるのだけれど、とりあえずオルフェンズの最後が気になりすぎるのではよ最終週来いと思うし、4月も面白そうなのが結構あるので楽しみにしている。