AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Kaggleに挑戦-4

Kaggleに挑戦-4

課題:6DVNetを目標に、Faster R-CNNを理解し、動かすこと。

 Faster R-CNNは、今年の10月10日に、KaggleのSeverstal:Steel Defect Detectioに挑戦しているときに、GitHubからjupyter notebook形式のFaster R-CNNをダウンロードして実行しようとして、結局、そのままになっている。

その時の課題は、Anaconda環境に新しいパッケージをインストールするときに、pipとcondaを混ぜて、Anaconda環境が壊れたことで、その改善のために、conda環境の勉強をしているところで終わっている。pipでインストールした(したかった)のは、画像処理に必須のパッケージだったように思う。

この問題は、解決していない。今回も同様の問題に遭遇しそうだ。どこかで解決しておかないと、止まったままになる。

さて、Keras-Faster RCNNというのを見つけて、README.mdを読んでいたら、最後の方に、Python2を使うようにとの注意書きがあった。ソフトのバージョンアップにプログラム開発者がついていけないと、プログラムが使われなくなり、もったいない。こういうのこそ、基本ソフトのバージョンアップをする際に考慮していただきたいと思う。この場合だと、互換性のないPython3にバージョンアップすると同時に、アプリケーションプログラムを、Python3対応に自動的に書き換えるツールも開発していただきたいと思う。アプリケーションソフトを開発する方々はたぶん、便利なパーツをたくさん開発してきており、基本ソフトが互換性のないレベルにバージョンアップされたからといって、おいそれとは、新しいバージョンに乗り換えられないのではないかと思う。

Faster R-CNNをGitGubで探していると、成果を示すために、画像に長方形の枠と物体の名称が表示された結果がアップされていて、そのプログラムで何ができるのかが一目でわかる。しかし、見慣れてくると、さあ、これを理解して使えるようになろう、という気力が湧いてこない。長方形を習得してから、直方体に進むのが良いのだろうけど。ということで、またまた、方向転換だ。

*課題変更:長方形より直方体の方が面白そうだ。

課題:3D Object Pose Predictionのプログラムを探して動かしてみる。

付帯条件:Keras、jupyter notebook

早速、候補がみつかった。GitHub experiencor/image-to-3d-bbox

論文:3D Bounding Box Estimation Using Deep Learning and Geometry, A. Mousavian, D. Anguelov and J. Flynn., aeXive:1612.00496v2 [cs.CV] 10 Apr 2017

f:id:AI_ML_DL:20191213224023p:plain

f:id:AI_ML_DL:20191213224123p:plain

*なんか面白そう。これまで追いかけてきた画像認識(位置と分類)の流れとは少し違っているようで、独自のアルゴリズムでプログラムを作成しているのだろうか。

連名著者のうちの2名の方の所属はZoox,Incとなっており、ぐぐってみると、自動運転システムに関係する会社のようだ。google scholarでzooxを検索すると、特許がたくさん出てくる。車に限らず、ロボティクス全般かな。上掲論文に関係している特許からの図面を次に示す。

f:id:AI_ML_DL:20191214093204p:plain

f:id:AI_ML_DL:20191214093742p:plain

さて、論文の内容を見てみよう。

最初に述べられているのは、ロボットが現実世界の物体と相互作用するとき、および行動を決めるときに必要な情報としての、物体の6つの自由度による姿勢表現を画像から得ることの重要性である。

(ヒトが立体認識できるのは、2眼あるからだが、遠方の物体は、直接的に立体認識することは困難であり、学習によって、立体認識している。この学習を、どうやって実現するかがポイントなのだが・・・、どうやればいいのか。写真に写っている物体ごとに、6DoFの姿勢情報を与えて、DNNに学ばせる、ということなんだろうけど、・・・。)

pose(R,T) ∊ SE(3), T = [tx, ty, tz], R(θ,Φ,α), R ∊ S(3)とか、いろいろ記号が出てきて困ったな。なんかとっつきにくいな。ぐぐってみると、次の資料がみつかった。

[招待講演] 姿勢推定と回転行列 玉木徹(Pose Estimation and Rotation Matrices
Toru TAMAKI)信学技報 IEICE Technical Report : SIP2009-48, SIS2009-23(2009-09)

本稿では、コンピュータビジョンにおける姿勢推定問題と、それに関連する回転行列の推定について述べる。姿勢推定の問題として採り上げる1 つ目は、対応が与えられた点集合X; Y のマッチング問題である。この問題はX; Y のマッチングを与える剛体変換(特に回転行列)の推定が必要になる。2 つ目は、回帰に基づく姿勢推定問題である。この問題は、画像x が与えられたときに、姿勢パラメータp を与える関数f を求めるものである。3 自由度回転の姿勢パラメータとして回転行列を用いることで、回転行列の推定が必要になる。

f:id:AI_ML_DL:20191214160836p:plain


本稿で採り上げる2 番目の姿勢推定問題は、回帰に基づく姿勢推定手法である。画像中に映る物体の位置や姿勢を求めることは、ロボットハンドによる物体把持やナビゲーション、シーンの理解、人間の物体認識能力の解明など、さまざまな分野に応用が可能な重要な技術である。近年は局所特徴量やシーンコンテキストを利用した物体認識が主流になっているが、画像をそのまま特徴量として利用する(つまり物体の「見え」)姿勢推定の手法の研究も多い。このような見えに基づく手法(view-based, appearance-based) の多くは、画像と姿勢パラメータを回帰のような手法で関係づけている。ある画像を表すベクトルをx、それに対応する姿勢ベクトルをp とすると、学習画像を基にp = f(x) なる関数f を求めれば、未知の画像に対してもその姿勢を推定することができる。本稿では、回帰に基づく姿勢推定問題を説明し、先に述べるマッチング問題のテクニックをどのように利用するのかを解説する。

*以上は、上記講演資料からの転載である。

この資料は、2009年に発表されている。ちょっと驚いたな。著者は、ディープラーニングが注目される前から、画像処理、情報処理の専門家であり、最近では、医療用画像処理・診断の分野で活躍され、賞もとられているようである。教えを乞いたいものだ。

まずは、この講演資料に教えを乞うことにしよう。

ここでも、quaternionsが出てくるが、その使用には否定的である。関係する部分をコピーしておく。

3. 3 姿勢パラメータ表現
姿勢パラメータは、1 自由度回転の場合にはpi =(sin i; cos i)T を用いることが多いと述べたが、3 自由度回転の場合はどうするべきだろうか。回転行列の自由度は3 であ
り、その表現方法にはオイラー角(固定角、roll-pitch-yaw)、回転軸・角度(exp map)、四元数(quaternions)など[60]、様々なものがある。しかし3 自由度回転の姿勢パラメータとして、どのようなものを用いればよいかということは、あまり知られていない。1 自由度の場合に不適切な姿勢パラメータというものを考えてみれば、類推することができる。例えばpi = θi という姿勢パラメータは、0◦= 360◦ で不連続である。しかし画像ベクトルも0◦ 付近で同様に不連続であるとは限らないため、関数fを連続関数で表現している限りpi = f(xi) を成立させることは困難である。また、pi = 2θi とすると、画像と姿勢パラメータが1 対2 に対応してしまう。これをpi = f(xi) で表現することも不可能である。したがって、3 自由度の場合も姿勢パラメータが連続で、かつ画像と1 対1 に対応する必要がある[61], [62]。この条件を満たすのは9 個の要素を持つ回転行列のみである(注6)。オイラー角や四元数などは、両方の条件を満たさないため、回帰に基づく姿勢推定手法に用いるのは適当ではない[63]。そこで、3 自由度回転の姿勢推定のためのパラメータには、回転行列R = (rij) ∊ SO(3) の9 個の要素を並べたベクトルp = (r11; : : : ; r33)T ∊ R9 を用いるべきであろう。このパラメータ表現を用いるもう一つの利点は、未知の画像に対してRの推定値が得られるだけでなく、同時にR2;R3; : : : の推定値も得ることができる[64] ことである。Rn のパラメータを別々に学習しておくことで、推定値は容易に得ることができ、かつ推定精度を向上させることができる。

注)数式等は正確にコピーできていないので、原文参照方

*3D Bounding Box Estimation Using Deep Learning and Geometryに戻ろう。

 次の図は、直線道路を同じ方向に走っている車は、自車からの距離が変わると、左側の図に示されているように車の方向が変化しているように見えるけれども、自車からの距離が変わっても、進行方向は自車と同じで変化しないはず、すなわち、車の方向はグローバルには変化せず、ローカルには(自車から見れば)変化するということを、計算に入れなければならないということを示している、のかな。なるほどな。

f:id:AI_ML_DL:20191214203016p:plain

*このへんで、プログラムコードを見てみよう。

Kerasで書かれているので、CNNの部分を見てほっとした。F. Cholletさんの本で勉強させてもらい、Kaggleの眼底写真のコンペに参加していた時に、さんざんこねくり回していたものだ。CNN層は5つのブロックに分けていて、Conv2D層は全部で13層、マックスプーリング層は各ブロックの最後についているので全部で5層、そのあとにFlattenがきて、dimension層とorientation層とconfidence層の3つのDens層に接続し分岐させている。Figure 5に示されているブロックダイアグラムとの対応が一目でわかるように、コーディングされている。

*次は、論文片手に、プログラムコードの解読に取り組もう。

見かけの分量は、ネットワークの部分を1.0とすると、前処理の部分が、3.0、トレーニングの部分が0.8、ビデオ出力の部分が1.2くらいの行数になっている。

難易度は、やってみないとわからないが、ネットワークを1とすると、前処理が10、トレーニングが2、ビデオ出力が5、くらいの感じかな。

今は、プログラムを動くようにすることではなく、コーディングされている内容を理解し、自分でも、同等のコードが書けるようになることを、目標とする。 

つづく

 

f:id:AI_ML_DL:20191213210233p:plain

style 046

f:id:AI_ML_DL:20191213210324p:plain

DeepDream