stMind

about Arsenal, Arsene Wenger, Tech, Computer vision and Machine learning

Tensorflow Object Detection APIのCPU処理時間 on MacBook Pro

計測環境

  • MacBook Pro Late 2013モデル
    • CPU: 2.8GHz Corei7
    • Mem: 8GB 1600MHz DDR3
  • デフォルトで指定されているssd_mobilenet_v1_coco_2017_11_17

計測はTensorflowのtimelineを使用。

def run_inference_for_single_image(image, graph):
  with graph.as_default():
    with tf.Session() as sess:
      # timeline
      options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
      run_metadata = tf.RunMetadata()

      # 他の処理...

      # Run inference
      output_dict = sess.run(tensor_dict,
                             feed_dict={image_tensor: np.expand_dims(image, 0)}, options=options, run_metadata=run_metadata)

      # 他の処理...

      # Save timeline
      fetched_timeline = timeline.Timeline(run_metadata.step_stats)
      chrome_trace = fetched_timeline.generate_chrome_trace_format()
      with open('timeline.json', 'w') as f:
        f.write(chrome_trace)

  return output_dict     

計測結果

chrome://tracingで確認。読み取れる情報は

  • 全体で130ms程度
  • 最も時間がかかっているのは、TensorArrayScatterV3

Tensorflow Object Detection API、CPUでも十分速い。

f:id:satojkovic:20180930221255p:plain

Deep Learning for Videos

sites.google.com

Deep Learningを動画に適用というのはこれから増えてくると思うし、問題を分類した上記ブログを借りて頭を整理しておくとよいなと思った。少し古いが参照論文リストもあるので、目を通すと良さそう。

  1. Video Classification

    • Image Classificationと同じ問題で、入力が動画となっただけ
    • 最もシンプルなアプローチは、動画の各フレームに対してCNNなどで分類スコアを計算し、最後にフレーム全体のスコアに統合
      • ただし、このアプローチでは時系列の情報は失われてしまう
    • LSTMなどを用いて明示的に時系列な情報を用いる方式も提案されてきている
  2. Activity Recognition

    • Video Classificationの問題であるが、動画の中の、特に人の行動を認識する問題
    • Deep Learningを用いた手法がホットな領域
    • 手動設計の特徴を用いていた時代のDense Trajectoriesを改良した方式もある
  3. Action Localization

    • 動画の中でActionを検出する問題(Actionをしている開始フレームから終了フレームまで)

MSCOCO keypoint challengeのWinner solution

blog.mapillary.com

MSCOCO joint recognition challengeで、6つのタスクのうち4つでbest scoreだったのは、Megviiという顔認識技術の企業。人物の関節位置を推定するKeypoint challengeでは、Megviiは2017年でもTopだったようです。

CVPRにも採択されていた論文について、主要な部分だけメモします。

http://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_Cascaded_Pyramid_Network_CVPR_2018_paper.pdf

Cascade Pyramid Network

Megviiの手法はTop-down型のアプローチ(人物検出をして、人物矩形毎に関節推定)で、関節が見えているけれども推定が難しいhard visible partsと、occlusionで見えていないinvisible partsを推定するCascade Pyramid Network(CPN)というアーキテクチャを提案しています。

GlobalNetとRefineNet

f:id:satojkovic:20180916110732p:plain

f:id:satojkovic:20180916121159p:plain

論文の図1がCPNの全体概要図。Hard keypointについては、周辺の情報(コンテキスト)を考慮することで、推定できるようにしようというのがアイデアのよう。

そのための一つ目のステージがGlobalNetで、ResNetをベースにしたネットワークで、conv2からconv5までのfeature mapに3x3のフィルタを適用して、keypoint毎のheatmapを生成するのが基本動作。論文の図2の左にあるのが、生成されたheatmapの例。さらに、Feature Pyramid Networkと同じように、位置精度を高く、かつ周辺情報を利用できるように、深い層のmapをupsamplingしてelement wiseに足し合わせたmapを生成している。図2を見ると、left eyeの方は正解位置の緑点の近くに高いスコアが出ている様子が見えますが、left hipは深い層では正解位置の周辺にスコアが出てますが、位置精度の高い推定は出来てないことがわかります。

そこで、二つ目のステージのRefineNetを用いる。ここでは、GlobalNetで生成された異なる層のfeature mapについて、層毎に異なる回数のbottle neckを適用して冗長なfeature mapを削減していって、全部のmapを結合するようにします(upsamplingしたあとで)。

学習では、GlobalNetはN個のkeypointそれぞれについてL2ロスに基づくパラメータ更新をしますが、RefineNetではその中でロスが大きいM個に絞ってパラメータ更新を実施するようにしています(online hard kyepoint mining)。MS COCOの場合だとN=17で、Mは8のときが最も精度が良い結果となったようです。

Results

http://presentations.cocodataset.org/COCO17-Keypoints-Overview.pdf

2017年の結果です。Top5の差は3%以内ということで近いスコアですが、Megvii社の手法が一位です。

RegressionベースとHeatmapベースではどちらが良い?

モバイル向けのSingle person 2D ポーズ推定のレポジトリのIssueなのですが、興味深い内容だったので紹介します。

github.com

CNNが前提だと思いますが、Keypoint localizationを行う方法として、

  • DeepPoseなど、関節位置を回帰するRegression
  • OpenPoseなど、関節毎のHeatmapを生成し、L2ロスを計算する
  • Mask R−CNNなど、関節毎のHeatmapを生成し、関節位置だけ1となるone hot maskとのcross entropy lossを計算する

のうち、どれが良いのか?という問いかけでした。

作者いわく、このレポジトリでは、まず推定速度だけを考慮してRegressionで実装したようですが、RegressionよりもHeatmapベースの方がmAPとしては良いのではないかなぁ、検証したわけではないけど、という回答をしてます。

質問者も、ここ最近の論文を見ていると、Heatmapベースの方が良さそうというのは同意しつつ、Heatmapベースの中だったら、L2ロスの場合とcross entropy lossだとどちらが良いのかなぁ、と言いつつスレッドが終了していました。

ICCV2015で発表された論文(下記リンクはスライド)でも、Coordinate net(Regression)とHeatmap net(L2ロス)として比較していますが、Heatmapの方が明らかにAccuracyが高く、学習データを増やした場合でもRegressionの方は向上があまり見られないのに対して、Heatmapの方は大幅に改善する結果となっていますね。

http://lear.inrialpes.fr/workshop/allegro2015/slides/zisserman01.pdf

Heatmapの方が優れている点として、学習結果の可視化により解釈が容易になることと、信頼度をモデル化して各ピクセルが保持していて、学習を進めると間違った推定のピクセルが徐々に抑制されていく、ということが論文で述べられていて、結果からみても納得な感じです。

HeatmapのL2ロスとcross entropy lossはどちらがいいか?については、Issueのスレッドの最後で、3つの方式を比較した論文のリンクがはられていました。次は、この論文を読んでみようと思います。

https://arxiv.org/pdf/1711.08229.pdf

MoveMirrorで使われているPose Estimation Algorithm

ポーズをとると似た姿勢を探してくれるブラウザベースのアプリ。面白いなぁ。あと、ブラウザだけでできるのも良いなぁ。

姿勢の推定に使われているのは、Googleの研究チームが発表した論文が基になってます。 さくっと読んでみた内容メモです。

[1701.01779] Towards Accurate Multi-person Pose Estimation in the Wild

medium.com

どのようなアルゴリズム

いわゆるTop-down方式の姿勢推定。Top-down方式は、最初に人の矩形を検出しておき、その中から関節を検出する。それに対してBottom-up方式があり、こちらは画像全体から関節を検出し、検出された関節同士を関連度マップなどに基づいて対応付けしていく方式。OpenPoseはBottom-up方式。

処理の全体像

f:id:satojkovic:20180721193552p:plain

Top-down方式なのでStage1で人の検出、Stage2で関節の検出、となるのだけど、もう少し詳しく記述すると次のような処理を行う。

  1. Stage1では、ResNet101 + atrous convolutionのFaster RCNNで人の矩形を検出。矩形を検出したら、Stage2の矩形アスペクト比に合うように幅もしくは高さを伸ばし、かつランダムに矩形枠を広げた後、353h x 257wにリサイズ。
  2. Stage2もResNet101を使って、heatmaps(K joints)とoffset maps(xとyの2ch * K joints)を生成。最後に、heatmapsとoffset mapsを統合して、より正確なjointを表現するmapsを出力。

Stage2で使うResNet101 + atrous convolution with stride 8は、最終層を1x1 convで3 x K個のFeature mapsを出力するように置き換え(Kは関節数で、ここではK=17)、最後にbilinear upsamplingで入力と同じサイズにリサイズされる。

heatmapとoffset heatmapによる関節のdetection and localization

Stage2の関節推定で、HeatmapとOffset mapを使うのが、この論文の新しいアイデア

Heatmapは、関節位置から一定範囲内のピクセルが1、それ以外が0となるmap。もう一つのOffset mapは、関節位置から一定範囲内のピクセルについて、関節位置に対するオフセットを保持するmap。

学習においては、ResNetの出力する3xKのfeature mapsについて、heatmapの出力mapにsigmoidを適用し、関節毎に各ピクセルのlogistic lossの総和をとったものと、XとYのoffsetの出力feature mapに対して、ground truthとの差を計算したHuber lossとの重み付き和が全体のロスとなる。(論文の式(3)を参照)

f:id:satojkovic:20180724220343p:plain

真ん中の図が、左肘のheatmapで赤が1の領域を表している。一番右の図が、対応するoffset mapで、L2ノルムをgrayscaleで表しているので中心に行くほど値が小さくなっていて、外側の方が値が大きくなっていることがわかる。赤い矢印は、offsetベクトルを示している。

このように二つにわけて学習しているのは、Faster RCNNなどの物体検出の枠組みから着想を得たとのこと。キーポイントを推定する一つの方法は、DeepPoseのようなRegressionのネットワークを使う方法があるが、矩形に複数人物がいた場合には、一人分の関節数しか出力できない問題がある。また、関節毎のactivation mapを出力するネットワークを使う方法があるが、関節位置の正確さが出力のmapサイズに依存する。そこで、ピクセル単位で関節の近傍か否か(関節か)の分類と、関節位置をリファインするオフセット値の回帰に分けて、全身の関節位置推定という難しい問題を学習しやすくしている。

Heatmapとoffset mapから関節位置の決定

heatmapとoffset mapが得られたら、関節位置をどのように計算するのか?

heatmapの各点に対して、

  1. offset mapの値を使って、オフセット値を加えた位置を計算
  2. 関節毎にその位置で重みを累積

下の図は、すべての関節を一枚の画像で表した状態。オフセットによって、より関節候補位置がsureになっている様子がわかる。

f:id:satojkovic:20180729200008p:plain

activation mapで最もスコアの高い位置を、各関節位置として求めることができる。

結果

このようなheatmapとoffsetを使った関節位置推定の精度はどうなのか?

COCO Keypointのtest-devとtest-standard setsで2016年のCOCO keypoints challengeのwinnerを超える結果となった。

VNect : 1枚のRGB画像からリアルタイムに3D pose estimation

www.youtube.com

SIGGRAPH2017で発表された、単眼RGB画像から3D poseをリアルタイムに推定するVNectのプレゼン動画。音声が若干残念ですが、20分程度で概要を把握できましたので、さらっとまとめ。

3D poseとは

Local 3D PoseとGlobal 3D Poseの二種類がある。Local 3D Poseは、root jointに対する相対的な座標(x, y, z)で表された関節位置及び姿勢。root jointはpelvis(腰位置)。一方、Global 3D Poseは、root jointのカメラからの距離dを考慮したカメラ空間での関節位置及び姿勢。よってこの論文では、1枚のRGB画像からLocal 3D Poseを推定し、さらにそこからGlobal 3D Poseを推定する方法となる。

イデアその1:heatmapベースの3D関節位置推定

単純に関節位置を推定すると考えると、DeepPoseのように画像から(x, y)を回帰するモデルを学習するという手法があるが、推定位置ずれの問題が起こりやすい。これに対して、各ピクセルが関節らしさの値を持つHeatmapを回帰するモデルを学習する手法があり、推定位置ずれの問題を解決している。ということで、Heatmapベースの回帰モデルを3次元に拡張し、3D pose estimationを実現しようというのがVNectのアイデア

2D HeatmapsとLocation maps

f:id:satojkovic:20180714140037p:plain

どのようにして2Dから3DへのLiftを実現するのか、のからくりが2D HeatmapsとLocation maps。

ResNet50をベースにしたFCNNが出力するのは、2D heatmapsとLocation mapsの4つのmapsで、Location mapsというのは、root jointからの相対的な距離を表したもの。X, Y, Zそれぞれ-80cm(濃い青)から+80cm(黄色)までの範囲で、例えば1番目の関節で見ると、X1のmapの左半分は体の左半身の領域でありroot jointに対して負と推定、Y1ではmapの上半分がroot jointに対して負の方向(高い位置)と推定、Z1では周辺がroot jointよりも少しだけ前に出ているので正の方向と推定されていることがわかる。

こんな風にしてroot jointからの相対的な距離を表すLocation Mapを推定することによって、2D Heatmapにより推定された2D関節位置を、Location map上で対応する位置の相対距離で表された3D関節位置に変換できる。

では、学習のための正解データはどう作るのか。2D Heatmapは2D pose estimationの方で行われており、比較的簡単。関節位置が付与されたデータセットがあるので、関節を中心にGaussianをかけて関節毎の2D Heatmapを作成することができる。Location mapsの方は、既存の3D poseデータは存在するが、全て室内に限られていて、様々なシーンで使いたいという目的に対しては不十分。そこで、14台のカメラを設置したマーカーレスモーションキャプチャースタジオを作って、その中でデータを取得。様々な人が任意の姿勢をとり、かつ背景(グリーンバック)をマスクすることで、背景を様々に入れ替えたりしてデータのオーグメンテーションも行った。この新しいデータセットMPI-INF-3DHPは、下記にて公開されている!

VNect: Real-time 3D Human Pose Estimation with a Single RGB Camera, SIGGRAPH 2017

Note: 標準的な体型の人のデータを集めており、160cmから170cmくらいの人が一番良くFitする模様。

イデアその2:スケルトンのFittingによるGlobal 3D pose推定

フレーム単位でのLocal 3D Pose推定では時系列的に推定が不安定になってしまう可能性があり、かつGlobal 3D Poseを求めるために、関節角度θとカメラからの距離dをパラメータとして持つ時系列的に一貫性のあるスケルトンモデルをフィッティングする。

f:id:satojkovic:20180714152238p:plain

IK(Inverse kinematics)はモデルとLocal 3D Poseの差の項、Projは射影後のモデルと2D Poseとの差の項、smoothはモデルの関節角度のacceleration項、depthはモデルのdepthのvelocity項、最後はjoint angleの時系列フィルタリングの項。

ピンホールカメラモデルを想定し、カメラキャリブレーションが未知の場合は、垂直画角は54度と想定する、と論文に記載があった。

動画だけではわからなかったこと

  • なぜ、この処理がリアルタイムで実現できるのか
    • 今のGPUを使うと44fpsまで出るみたいだが、旧世代のGPUでも33fpsは出ているらしい
    • Bounding boxの検出は、2フレーム目以降は関節位置をもとに簡易的に算出できるということだったが、それだけではないはず

アーセンベンゲル監督のラストホームゲーム関連グッズ

ベンゲル監督の最後のエミレーツ、バーンリー戦で配られたグッズをebayで手に入れることができました。総額は、全部で2万円強。

送料が高かった(約3000円)のが痛かったけど、ベンゲル監督信者としては、これくらいなら十分出せますね!

今も、ebayではいくつか出品されていますし、現地に行けなくて悔しい思いをした人がいれば、見てみるといいかと思います。(merci arseneなどで検索)

  • Merci Arsene Tシャツ

  • キーリング

  • 22 GUN SALUT

これはマッチデープログラムではないのかな?22年間のベンゲル監督のスタッツが載ってました。

  • チームシート(メンバー表)

これはまあ、セットで購入したのでおまけみたいなもんですね(笑)

  • 20周年の記念キーリングとバッジ

これは20周年のときの限定。裏にはちゃんとシリアル番号が振ってあります。