人工知能とか犬とか

人工知能と犬に興味があります。しょぼしょぼ更新してゆきます。

2019年12月21日:OpenPoseの論文を読む 他2本

最近読んだ論文の中から印象に残ったものについて、一言コメントを書いてみます。

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation

言わずと知れた姿勢推定モデルのOpenPoseですが、論文はちゃんと読んだことがなかったので、ちょっと読んでみっか、と思って読んでみました。きっかけは、『つくりながら学ぶ! PyTorchによる発展ディープラーニング』を読みながら、自分で再実装してみる、という作業をしているときに、どうもOpenPose周りの記述に誤りがあるらしいという情報をキャッチしたためです。そのへんの修正点は、githubのissueに上がっています。

つくりながら学ぶ! PyTorchによる発展ディープラーニング

つくりながら学ぶ! PyTorchによる発展ディープラーニング

OpenPoseの概要

論文の話に入る前に、OpenPoseの概要を示しておきます。

OpenPoseは、深層学習による、人間のキーポイント(関節など)を推定する、というモデルです。人間のキーポイント検出には大きく2通りのやり方があって、トップダウン方式とボトムアップ方式があります。前者は、人間がココにいるよ、という検出を行った後に、個々の人間の領域に対してキーポイントを求めていく、というやり方です。後者は、最初にココが左ひじっぽいよ、といったキーポイントを先に求めて、それらのキーポイントを集めて人間の骨格グラフにまとめる、というやり方です。OpenPoseは後者の方式をとっています。

f:id:wanchan-daisuki:20191221123612p:plain
OpenPoseのプロセス

ボトムアップ方式が問題になるのは、画像中に複数人写っている場合に、検出されたキーポイントをどう接続すれば良いのかがわからない、という点です。例えば上の一番左の画像(a)では2人の人物が写っていますが、理想的なキーポイント検出モデルができたとしても、左肘が2点、左肩が2点検出されてしまいます(b)。すると、これらの接続の方法は2通りあるため、どのような基準でキーポイント同士を接続するのかが問題となるというわけです。

OpenPoseでは、論文タイトルにもある Part Affinity Fields(PAFs)をつかってこの問題を解決します。PAFsは、上の図(c)のような結果を出力します。直感的には、「こっちの方に接続すべきポイントが有るよ」という情報を表すマップのようなものです。この情報をうまく使って、キーポイント同士をどう繋げば良いのかを決める、というのが本手法の最重要ポイントです。

コメント

で、OpenPoseの論文を読んでみようか、と思って調べてみたら、そもそもOpenPoseの論文には、2016年版2018年版とがあるという事実に気づきました。基本的なアイディアは同一ですが、ネットワークの構造が変わっていて、2018年版はより高速・高精度になっているようです。なお、『つくりながら学ぶ〜』では、2016年版が使われています。

f:id:wanchan-daisuki:20191221121253p:plain
2016年版。PAFsとキーポイントが一緒に繰り返し洗練されていく構造。

f:id:wanchan-daisuki:20191221121142p:plain
2018年版。PAFsを予測してからキーポイントを予測するという構造に変化している。

と、いうわけで、2018年版の論文を読んでみました。 物体検出系の論文でも思うことですが、こういう構造出力を行うアルゴリズムって、ニューラルネットワークの部分ではなく、前処理・後処理がめんどくさいな、という感想を持ちました。ネットワーク部分は30分もあれば実装できそうだけど、targetの作成や後処理はもっとかかるだろうな、という印象です。ここらへんの前処理や最適化アルゴリズムなども、サクッと実装できるだけの力を身に着けたいところです。

キーポイント出力のNMS

キーポイントの検出部分については出力されたヒートマップに対して、non maximum suppression(NMS)したよ、と書かれているのですが、具体的にどんな処理すんのよ? と疑問に思いました。PyTorchによる非公式の実装を見てみると、ヒートマップを1ピクセルずらした画像を用意して重ね合わせ、もとのヒートマップでの値が一番大きければLocal Maximumとみなせるので、それを出力するというとても簡単な処理がなされています。

PAFsの2部グラフ問題

また、どのPAFsを採用するのか、というグラフ構築の問題に対しては、以下の2つの処理を頑張って実装する必要があります。

  • エッジ候補に関して、PAFスコアを計算する。具体的にはエッジの候補の線上にあるピクセルをサンプルし、その点のPAFsの2次元ベクトルが、エッジとどれくらい同じ方向を向いているかをスコア化する、という処理を行います。
  • エッジ候補の中から一番確からしい構造になる組み合わせを選択する。完全に全エッジの組み合わせで問題を解くのはNP完全らしいので、1つのエッジに絞って、2部グラフとして考え、ハンガリアンアルゴリズムを使って2割当問題を解くそうです。

余談

人間の姿勢推定、つまりキーポイント推定は、torchvisionにすでに学習済みのものが実装済みです。こちらは、Mask R-CNNベースのものなので、OpenPoseのボトムアップ方式とは異なり、トップダウンの方式です。

pytorch.org

DewarpNet: Single-Image Document Unwarping With Stacked 3D and 2D Regression Networks

歪んだ書類をきっちり補正する、という研究です。OCRの精度も上がるよ、とのこと。

概要

本論文では、歪んだ書類を補正する、Dewarpという問題に取り組んでいます。

f:id:wanchan-daisuki:20191221134834p:plain
DewarpNetの出力

大きくは、DewarpNetと呼ばれるメインのネットワークと、Refinement NetworkというDewarpNetの結果をきれいに補正するネットワークの2つから成っています。

DewarpNet

DewarpNetの中には2つのサブネットワークがあります。それぞれ書類の面の3次元的な位置を推定するU-Net風のShape Networkと、その出力結果をもとに、補正済みの画像を入力画像のどこからサンプルしてくるのかを求めるTexture Mapping Networkです。

f:id:wanchan-daisuki:20191221142454p:plain
DewarpNetのプロセス

Refinement Network

DewarpNetだけだと、入力画像からサンプルしてきた画素を並べただけの画像が出力されるので、書類の歪みによって生じた陰などがOCRのときに問題になったりします。 というわけで、DewarpNetによって得られる結果を補正するRefinement Networkというのを提案しています。

まず、入力画像から法線ベクトル画像\hat{N}を推定するNEがあります。これ、上のShape Netとかなり親しい問題を解いているので、マルチタスク学習するといい感じになるのではと思いますが、この論文では別々のネットワークでやっています。NEもU-Net風の構造です。

DewarpNetのテクスチャマッピング\hat{B}をもとに、補正済み入力画像と補正済み法線ベクトル画像を作成します。この2枚の画像を用いて、書類の明るさ画像\hat{S}を推論します。明るさがわかれば補正済み入力画像の値から引いて上げると、更にきれいになった画像\hat{A}が得られる、というわけです。

f:id:wanchan-daisuki:20191221143611p:plain
Refinement Networkのプロセス

コメント

この論文が印象に残ったのは、データセットを自分たちで頑張って作っているという点です。上に上げた2つのネットワークの至るところで損失が計算されていることからもわかるように、これらの中間処理結果には明確なTargetがあります。例えば、Shape Networkは、\mathbb{R}^{3 \times H \times W}を出力しますが、これは書類の面に関する3次元的な位置を表します。これ、どうやってデータセット作るの? という感じですが、なかなか頑張っています。

f:id:wanchan-daisuki:20191221144144p:plain
データセットの構築

まず、左端の写真に何やら土台とその上に乗っかっている歪んだ書類が見えます。この土台は、8x8の64本のピンからなる制御装置です。これで上に乗っかっている書類を動かしながら、いろいろな角度からの歪んだ書類を上から撮影しています。 上についているカメラは深度カメラであるReal Senseです。Real Senseで撮影したデータから深度マップとRGB画像、Point Cloudが得られるわけですが、ここからいろいろな平滑化や補正の処理を行って、3次元的なMesh画像を推定しています。更に、せっかく得られたMesh画像なんだから、いろいろな書類のTextureや照明条件で合成データ作ろう、こともやっています。

自分は3次元のデータ処理はほとんどやったことがないのですが、なかなか手間がかかるけど合理的なことをやっているなあと、感心した次第です。

データセットは下記リポジトリで公開されてますが、現在はメンテナンス中のようです。機会があれば触ってみたいと思います。 github.com

データセットの作り方以外で面白いな、と思ったポイントは、Texture Mapping Networkで、CoordConvを使っていることです。CoordConvは非常に単純な手法で、2Dの畳み込み層の一種なのですが、単に入力された特徴量マップに、縦横の座標を表す2チャネルを結合してから畳み込みを行うというもので、これだけの単純な仕組みでいろいろなタスクで精度が向上するよ、というものだったと記憶しています。Texture Mapping Networkは、座標情報を推論するネットワークなので、なるほど、こういう場面だと確かに有効そうだな、と思いました。

Balanced Datasets Are Not Enough: Estimating and Mitigating Gender Bias in Deep Image Representations

画像認識データセットは、ラベルをバランスさせるだけじゃ不十分だよ、という研究です。ICCV2019に採択された、AllenNLPでおなじみの、Allen Institute for AIの論文です。

arxiv.org

概要

Qiitaに解説記事を書いたので、ごく簡単に済ませます。

qiita.com

データセットが(ラベルのような表面的に)持っているバイアスを定量化するDatasetLeakageと、モデルが持っているバイアスModelLeakageを定量化し、その差である、モデルによってもたらされたバイアスの増加分Bias amplificationと呼ばれる指標を提案しています。

この論文では、そのような指標を提案するのがメインで、ネットワークの提案には重きは置かれていません。Adversarial Debiasingという一連の手法があり、そのいくつかの例を実験で採用し、今回提案している指標で確かにバイアスが減っていると評価できるよね、という主張です。

f:id:wanchan-daisuki:20191221150732p:plain
Adversarial Debiasingの例

コメント

この分野の他の論文では、Dataset LeakageはDataset Bias、Model LeakageはRepresentation Biasと呼ばれています(間違っていたらごめんなさい)。正直、〜Biasという呼称よりも、〜Leakageという呼称の方が実態にあった呼び方のような気がするので、私も積極的に使っていきたいところです。

Representation Biasの問題は、Adversarial ExampleやDisentanglementなどの領域とも関係するチャレンジングな問題だと思っています。 Adversarial Debiasingに関しては、ちょっとした研究テーマを考えているので、来年早々にサーベイでもやってみようかなと思っています。

今回は以上です。