fc2ブログ

ochiaiの備忘録

読んだ本や、パソコン関係の話などまとまり無く

第2回NIPS読み会・関西『Unsupervised Learning for Physical Interaction through Video Prediction』

nips読み会・関西で発表してきました。
スライド中の動画は動かないので、以下のサイトと並べて読んで下さい。
https://www.sites.google.com/site/robotprediction/


論文読んだ:Deep Predictive Coding Networks(Deep PredNet)

Deep Predictive Coding Network(Deep PredNet)とは


ニューラルネットの一種
開発元:CoxLab(http://www.coxlab.org/)
論文:Deep Predictive Coding Networks for Fideo Prediction and Unsupervised Learning

できること:


時系列予測。
論文中では動画を受け取り、次に来るフレームの画像を予測、生成している。

何がすごいか(ochiai主観):


○画像から直接次のフレームを予測している
○次のフレームの画像を生成できる
○大脳新皮質の構造に似ている(階層構造)
○高い階層に抽象的な特徴が自動生成される
○教師なし学習

Deep PredNetの構造


DeepPredNet_architecture.png
Deep PredNetの構造。右の図は一層分だけ拡大したもの。

DeepPredNet_formula.png
更新式

DeepPredNet_algorithm.png
状態更新のアルゴリズム。トップダウンの信号をすべて更新した後、ボトムアップの信号を更新する。

個々の構成要素はConvlutional NetやLSTMなど近年のDeepLeaningブームでおなじみになったものばかり。それらをうまく組み合わせて、予測と観測を調和させている。
Convoolutional LSTMだけ初耳だったので、調べてみた。

Convolutional LSTMとは


重み(W)と状態変数(小文字)との内積をConvolutionに変更したLSTM。また、状態変数はベクトルからテンソルに変わる。

LSTMの更新式
LSTM_formula.png

Convolutional LSTMの更新式
ConvLSTM_formula.png

ただし、*は畳み込み、oは要素ごとの積

参考文献:Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting

実験


論文中では、以下の画像に対してフレーム予測を行っている。

実験1:回転する顔の3Dモデルの映像


DeepPredNet_facePredict.png
奇数列が正解画像、偶数列が1フレーム前までの画像から予測、生成した画像。

画像生成の他に、リッジ回帰によって各層の発火頻度から回転方向などの値を推定できるか確認している。上位(深い)層の情報を使ったほうがより精度よく回転方向を推定出来た。このことから、上位層は回転方向などの抽象的な情報を表現していることが分かる。

画像の作成方法


FaceGenというソフトを使用して作成。このソフトは人の顔の3Dスキャンデータの主成分を抽出し、パラメータから顔の3Dデータを作れるようにしたもの。以下のリンクから無料版をダウンロードできる(無料版は額にLogoが入る)
FaceGen(http://facegen.com/modeller_demo.htm)

使用した画像


○白黒画像
○64x64pixcel
○ランダムな初期方向
○ランダムな方向に一定速度で回転

学習パラメータ


○loss:画像が入力されるレイヤーの誤差ニューロン(式(3)のE)の発火頻度を2~10フレームにわたって合計
○レイヤー数:5
○Convolutionのフィルターサイズはすべて3x3
○フィルター数は下層から順に(1、32、64、128、256)
○最適化アルゴリズム:adam
○ライブラリ:theano、Keras

実験2:車載カメラの映像


DeepPredNet_loadPredictStep.png
奇数列が正解画像、偶数列が1フレーム前までの画像から予測、生成した画像。一番下(赤線の下)はフレーム順をシャッフルしてDeep PredNetに見せたもの。

DeepPredNet_loadPredictLong.png
予測した次のフレームを入力として受け取り、複数フレームの予測を行った結果。


画像のソース


以下のデータセットを使用。このデータセットからデータをダウンロードし、解凍するとフレームごとに画像として分割された動画が手に入る。動画はすべて車載カメラからの映像。
KITTI dataset(http://www.cvlibs.net/datasets/kitti/raw_data.php)

使用した画像


128x160pixcelに切り取り(元は1392x512pixcel)

学習パラメータ


○レイヤー数:4
○Convolutionのフィルターサイズはすべて3x3
○フィルター数は下層から順に(3、48、96、192)
○他は恐らく実験1と同じ

感想


予測誤差の扱い方がこのモデルのコアとなるアイディアだと思う。通常のDeepLearninでは発火頻度そのものを上位のレイヤーに渡すが、このモデルでは予測誤差を上位層に渡している。下位層で予測しきれなかった部分を上位層が担当することで抽象的な情報(広い範囲と長い時間を見ないと分からない情報)を抽出しているのだと思う。

また、誤差の表現方法についても、プラス部分とマイナス部分に分割し、入力されたテンソルの2倍のサイズのテンソルを使って表現している。マイナスの部分は符号を反転させプラスにしている。
これは試行錯誤の結果なのか、発火頻度として解釈したときマイナスはありえないためかよくわからない。わざわざこうしているということは、精度に影響があるのではないかと思われる。


トリックアート

image_noground_shot.jpg



blenderでレンダリングした画像を変形し、立体錯視を起こす画像を生成するpythonスクリプトを作成しました。このページ末尾のpythonスクリプトをダウンロードしコマンドライン上で実行することで図の変換が可能です。

作成手順



  1. レンダリング画像を保存する

  2. 例:
    blender出力画像

  3. 以下4つのパラメータをメモする

  4. カメラ高さ、カメラ角度、焦点距離、センサー高さ
    設定値位置
    センサー高さは最初autoになっているのでVerticalに切り替えてからメモする。
    カメラ角度は垂直からの角度が必要なので、Y軸のrotationを0にしてX軸とZ軸で調節を行いX軸の回転の値をメモすると良い。

  5. スクリプトの実行

  6. このページ末尾のpythonスクリプトをダウンロードし、1で保存した画像と同じフォルダに入れ、以下のコマンドを実行する

    pythn optical_illusion.py 入力ファイル名 焦点距離 カメラ角度 カメラ高さ センサー高さ 出力ファイル名

    例の図に対して実行すると以下の画像が得られる。
    スクリプトによる変換後の画像

  7. 画像を印刷し上部の余白を切り取る

  8. image_noground_cut.jpg

  9. レンダリング条件と可能な限り近い角度と高さで撮影する

  10. image_noground_shot.jpg


変形(投影)の式とそのテスト




Script


Landscape in a Cube(LinC)



立方体内面に三次元空間を投影する方法を考案しました。
特にプログラミングなどは行っておらず、Blenderでレンダリングした画像を切り貼りすることで作成可能です。

動画中で使った立方体の展開図を公開します。展開図を印刷して組み立てることで、動画中で使っている立方体と同じものを作ることができます。


The City


Landscape in a Cube(LinC)ss

The_City.png

materials:
The City

Apollo 11


Landscape in a Cube(LinC)Apollo11


Apollo11.png

materials:
Apollo 11 Landing Site
Apollo Lunar Module
Realistic Planet Earth

MobileOrg復活!

 長らく、iTunesストアから消えていたMobileOrgが復活しました。(すでに、1ヶ月ほど前の話ですが)

 早速、使用を再開したので、その手順をメモ。以前から、Dropboxを使ってメモを同期させていましたが、今回のアップデートで設定を変える必要が出てきたので、そこを重点的に説明します。
 初めてMobileOrgの設定をやった時の説明は過去記事を参照。
 MobileOrgがDropbox対応


1. Dropbox上のMobileOrgフォルダを削除
以前のバージョンのMobileOrgを使っていた場合、Dropboxフォルダ直下にMobileOrgという名前のフォルダがが残っていると思います。現バージョンでは同期に使うフォルダの位置が変わるので、削除しておきます。

2. MobileOrgをiTunesストアからダウンロード
以前とは別のアプリとして登録されているので、iTunesストアでMobileOrgと検索して見つかったアプリをダウンロードします。

3. Dropboxの設定を英語に変える
 タスクトレイのDropboxアイコンをクリック→右上の歯車をクリック→設定→詳細設定→言語→English[English]を選択→Dropboxのデスクトップアプリが自動で再起動されるのを待つ。
(多分、日本語設定のままでもうまく設定すれば使えると思いますが、MobileOrgの同期に使うフォルダのパスに日本語が入るので、避けたほうが無難です)

4. Dropboxと同期
 iPhone上でMobileOrgを起動→Setting→Dropboxを選択→Log in to Dropbox→Dropboxの確認画面が出てくるので『許可』を押す。
 しばらく待っていると、Dropboxフォルダ内に/Apps/MobileOrgというフォルダが現れます。

5. emacsの設定変更
org-mobile-directoryに先ほど自動で生成されたフォルダを指定します。

(setq org-mobile-directory "~/Dropbox/Apps/MobileOrg/")


6. 同期
 Emacs上でM-x org-mobile-pushした後、MobileOrgアプリで同期。後の使い方は過去のバージョンと同じです。

使用環境


私の使用環境です。別の環境だと上記の通りやってうまくいかないかも。
OS:Windows7
Emacs:NTEmacs
orgmode:8.0.7
iphone:iPhone4S

使用感


 せっかく設定したけど、個人的には、outlinerと同期させて使ってた方が好みかも。
 org-modeをoutliner(iPhoneアプリ)と同期←個人的には最高の環境!


 長らくこっちでやって来たというのもありますし、outlinerならノードを指先で移動させたり、折りたたみや展開、ワンタッチでチェックを入れるなど、デスクトップに近い使い方が出来ます。
 いつか、時間を見つけて、エラー処理とか付け加えたバージョンを作りたいです。

HomeNext ≫