GANによる医療画像の異常検知

f:id:yusuke_ujitoko:20170809215230p:plain

まず下準備として,正常な画像を訓練データとして使い,GANを学習させる. 学習後のGANの{G(z)} はlatent space representations {z} から正常な画像 {x} への写像を学習している.

そしてテスト画像 {x}に対する異常さを評価するために, {x = G(z)}とみて,{x} から {z}を探す. でも{G(z)} の逆写像は簡単にはできない.

そこで{G(z)} から {z}を探すために, {z_{1}}をランダムにサンプリングして,{G(z_{1})} を生成し,{x}との誤差が小さくなるよう {z}を学習させる. このときはもちろんGやDのパラメータは固定. 学習させて収束した後の誤差をテスト画像{x}の異常さの度合いとして評価する。

その他

誕生日のパラドックスを使ってGANの多様性を評価する研究とアイデアが似ている。

また、この論文では前半部のGの学習はできていて、Gが正常画像の分布を生成できる前提のもとで、後半の異常検知の話が進んでいるが、 そもそも論文で使っているDCGANだとあまり訓練データの多様な分布を生成できないのではと感じた。

この論文は会社の方に教えていただいたもの.
今のところ仕事として機械学習には関わったことがないが, 趣味として勉強している様子が遠回りで会社の方に伝わったようで最終的に繋がりが持てたのは嬉しい. と、ブログっぽいことを書いてみる。

シミュレータで生成した画像に現実感を付与する(SimGAN)

概要

学習のための画像がない場合や不足している場合,シミュレータ等を使い人工的に画像を生成することがある. しかしシミュレータで生成した画像(以下シミュレータ画像と呼称)は,現実の画像に現実感の観点で及ばない. そのためシミュレータ画像に過学習してしまうと,実際の画像に対して効果を発揮しないことがある.

だからと言ってシミュレータ画像の質をチマチマ向上させるのは大変. そこでラベルなしの現実画像を訓練画像として使い,GANの枠組みでシミュレータ画像を洗練させる. その際,シミュレータ画像に付随するannotationの情報は保持するように, 大きな改変にはペナルティをかける(self-regularization loss)など工夫を施す.

f:id:yusuke_ujitoko:20170808235033p:plain:w400

SimGAN

SimGANの目的は現実の画像 {y_{i}} を使って, シミュレータ画像を{x} を洗練させて現実感を付与する変換 {R_{\theta}(x)} を学習させること.

adversarial loss with self-regularization

その際の要件として,シミュレータ生成した際のannotation情報は保持させるというものがある.

例えば,視線推定のための画像データを拡張する場合には, シミュレータで画像生成する際に視線方向のannotationは与えておくが, そのannotationした情報は{R_{\theta}(x)} で変換した後も保持していないと,教師データとして視線推定に使えない.

そこで通常のGANのLossに加えて, self-regularization lossを加えることを提案. self-regularization lossは,ピクセルごとの変換前後のL1距離とする.

local adversarial loss

SimGANのdiscriminatorの学習の際, ある画像特徴量を過度に評価してしまうようになると,ゴミを生成することとなる.

画像を局所領域に分割したときの各領域ごとdiscriminatorに区別させた. 各局所領域においてもSimGANで変換した画像に現実感が付与されている状態では,現実の画像の局所領域と区別がつかないはず.

f:id:yusuke_ujitoko:20170809000248p:plain:w400

いくつかの特徴量による評価が組み合わさるので,ある1つの特徴量への依存が小さくなる.(ここは自信がない)

検証

視線推定タスク

視線推定の学習に使うデータセットは質が低い. そこでSimGANでannotation付きデータを大量生成して学習させたところ, sota達成

f:id:yusuke_ujitoko:20170809000354p:plain

データセットに対するuser studyも行った. 50個の現実のデータと50個のSimGANによる生成データをrandomに提示してどちらが本物か答えさせたら正答率は51.7%だった.

距離画像による手姿勢推定タスク

通常,現実の距離画像にはノイズが入っている. そのノイズがシミュレータ画像にはないので,変換してノイズを再現.

f:id:yusuke_ujitoko:20170809000649p:plain

Voxel heatmapで三次元姿勢推定

3次元関節推定問題に対して、

  • volumetric heatmapを回帰させる
  • 反復的なネットワークで段階的に精度を上げる

f:id:yusuke_ujitoko:20170806013741p:plain:w500

関連研究

  • CNNによる三次元姿勢推定でよく行われるアプローチは、
    三次元関節座標(x,y,z)を直接回帰問題として解くこと(Li et al.Tekin et al.
    • 難しい問題となる
    • Tompson et al.の論文Pfisterの論文にこのアプローチの欠点が記述されているようなので読みたい
    • 伝統的な2段階で三次元姿勢推定する手法にも劣る
      • こちらの手法ではCNNは2次元関節位置推定にのみ使われ、3次元姿勢は事後処理で別途推定される。

手法

Volumetric representation

volumetric representationを使う。 三次元空間を{w \times h \times d}のvoxelに分割し、 関節が各voxelに存在する確率を推定させる。 教師データは三次元正規分布で作り、教師データとのL2距離を誤差関数とする。

volumetric representationの利点は、各関節の座標を直接回帰させる問題を、voxel ごと関節が存在する信頼度の推定問題とできること。 こちらの方がネットワークとしては勾配情報を伝搬しやすく学習しやすい。 二次元姿勢推定でも全く同じ話があった。

ネットワークの構造としては、hourglass型を使う。

f:id:yusuke_ujitoko:20170806013802p:plain

Coarse-to-fine prediction

多段のstageを利用して反復的に精度を上げていく。 二次元姿勢推定で有効性が確認されている手法だが、 三次元の場合、例えば{64 \times 64 \times 64}のvoxelを16個の関節分推定する必要があるとすると、400万voxel分推定することになる。 次元の呪いを避けるため、coarse-to-fine predictionの枠組みを使う。 最初の方のstageではvoxelのz次元(距離方向)に対する解像度を低くし、 後ろの方のstageでは解像度を徐々に上げていく。

評価

従来の座標を回帰させる方法(Coordinate Regression)と比べて、voxelの確率を回帰させる提案手法の有効性が明らかとなった。

f:id:yusuke_ujitoko:20170806015201p:plain:w400

他の代表的手法と比べてもSOTAであった。

人体構造の制約を GANでimplicitに教示して姿勢推定するメモ

関連研究

  • 姿勢推定ではDCNN(Deep Convolutional Neural Nets)でheatmapを回帰する手法が一般的
    • しかし、以下の場合では現実ではあり得ない姿勢を出力してしまうことがある
      • 部位のocclusionが大きいとき(以下の画像参照)
      • 背景と部位の類似度が高いとき
    • これを避けるには人体の関節構造についての事前情報が必要。
    • でも人体の幾何的制約をDCNNに入れ込むのは難しい

f:id:yusuke_ujitoko:20170730090950p:plain

Adversarial PoseNet

姿勢推定した結果が「人体として尤もらしいか」をimplicitに学習させるために、GANの枠組みを利用。 通常GANではGeneratorとDiscriminatorが1組ずつだが,この研究ではDiscriminatorが2つある.

  • Generator
    • G: pose generator
      • pose keypointのheatmap(pose heatmap)の生成
      • occlusion heatmapの生成
  • Discriminator
    • P: pose discriminator
      • pose heatmapとocclusion heatmapから姿勢として尤もらしいかを判別する
    • C: confidence discriminator
      • 推定が正しいときにはpose heatmapの値が高い傾向にあることを考慮し,
        Gのpose heatmapの値が大きくなるようにすることが目的

GはG自身で学習可能だが、それだけだと結果は良くない。 PやCの誤差も使ってGを更新する。

PやCは真のheatmapとGの生成したheatmapを区別するように学習する. ただしそれだけではなく,例えばCはGがlow-confidentなheatmapを出力したら"fake"だと分類しやすいようになっている. GはCを欺くよう学習するので,high-confidentなheatmapを出力するようになる.

f:id:yusuke_ujitoko:20170730091150p:plain

以下でG,P,Cをそれぞれ確認する。

G: Multi-Task Generative Network

Gは画像{x}をもとに, pose heatmap {y}とocclusion heatmap {z}を推定する.

Convolutional pose machinesによると,受容野を大きくすることが部位推定に重要であるという. このGでも大きな受容野を利用。

また,顔や手を特定するような局所的な特徴と,体全体を理解するのに必要な全体情報の両方が必要. 各スケールでこれらの情報を捉えるため,encorder-decorderスタイルのアーキテクチャにおいてskip connectionを使用。 stacked hourglassと同様に,各ステージで教師データを与える.

f:id:yusuke_ujitoko:20170730092830p:plain

P: Pose Discriminator

PやCは真のheatmapとGの生成したheatmapを区別するように学習する.
ただそれだけでなく,PはGに対して,人体の関節構造に関する事前情報を与える役割を持つ.

Pの誤差関数は以下で表される.
f:id:yusuke_ujitoko:20170730135244p:plain:w500
この中に{p_{fake}}という項がある。
Gによって生成されたpose heatmapによって関節部位を推定し, その推定した関節位置と真の位置のl2誤差の大きさにより{p_{fake}}は決まる.

f:id:yusuke_ujitoko:20170730134012p:plain:w200

  • その他
    • 誤差関数の設計は従来のGANと同じ.
    • 従来のGANと異なり,encoder-decoderスタイル.

f:id:yusuke_ujitoko:20170730134201p:plain

C: Confidence Discriminator

Cも真のheatmapとGの生成したheatmapを区別するように学習するが, それだけでなくCは,high-confidence predictionをlow-confidence predictionから区別する.

Cの誤差関数は以下で表される. f:id:yusuke_ujitoko:20170730135637p:plain:w500

{c_{fake}}は,Gの生成したheatmapと真のheatmapの類似度で計算される.
f:id:yusuke_ujitoko:20170730133458p:plain:w250
例えばGがlow-confidenceなheatmapを出力したら,{c_{fake}} が 0に近くなる.
GはCを欺くよう学習するので,結果的にGはhigh-confidenceなheatmapを出力するようになる.

学習アルゴリズム

f:id:yusuke_ujitoko:20170730134246p:plain:w500

OpenPose論文メモ

概要

  • CNNの組合せで画像内の人物姿勢を検知を達成
  • NP-hard問題をrelaxationを設けて解く
  • top-downアプローチ(人を検知→検知した人それぞれの姿勢検知)ではなく,
    bottom-upアプローチ.実時間処理可能.

  • COCO 2016 keypoints challengeとMPII Multi Person benchmarkで好成績を出した

Intro

  • 画像に映る人物の姿勢推定の難しさ
    1. 人の数,スケール,位置が不定であること
    2. 人同士の接触,オクルージョンにより複数人の干渉
    3. 人数によって計算量が大きくなること

  • 従来手法は人の検知を行い,その後で個人の姿勢推定を行う
    このtop-downなアプローチには以下の欠点がある
    • 画像内の人の検知に失敗すると,姿勢推定はできない.
    • 人数に比例して計算が重くなる

提案手法

提案手法の処理のパイプラインは下の画像のようになっている f:id:yusuke_ujitoko:20170625214935p:plain

(a)入力画像を使って, 部位の位置エンコードする(b) Part Confidence Mapsと,
部位間の関連度エンコードする(c) Part Affinity Fieldsを作る.
そして(c)をもとに(d) Bipartite Matchingし,結果(e)を出力する.

(a)から(b)Part Confidence Mapsと(c)Part Affinity Fieldsを計算するアーキテクチャは, 下の画像のようになっている.

f:id:yusuke_ujitoko:20170625221707p:plain

(a)入力画像から,VGG-19を使ってfeature map F を生成し, そのFを2つのネットワークに入れて,(b)Part Confidence Mapsと(c)Part Affinity Fieldsを出力する. この単位をstageとする.

stageを繰り返していく. なおstageごとにlossを最小化するように学習する. ただし教師データはどのstageでも共通となっている. なぜstageごとに教師データを使って最適化するかというと, 勾配消失問題を避けるため.

(c) Part Affinity Fieldsの計算

(b) Part Confidence Mapsの他に,(c) Part Affinity Fieldsが必要な理由は, 何人いるかも分からない中でどのように部位を人に割り付ければよいかが,(b)だけだと不定だから.

部位間の関連度を知ることで,一人の人間の部位だとわかるはず. そこでpart affinityを使う. part affinityは二次元ベクトルで,ある部位から別の部位への方向を示すもの. 各部位は,接続している2つの部位へのaffinity fieldを持つ.

複数人のPart Affinity Fieldsを解く

これはNP hardとなるため,2つrelaxationを置いている. 1つ目は部位間のエッジが最小となるような条件を選ぶこと. 2つ目は部位間全体の問題を解くのではなく,隣接する部位間のみの問題に切り分けること.