メニュー

技術ブログ

Denso IT Lab.社員による技術情報の紹介

Denso IT Laboratory researcher's blog sites

数式

RSS

ページトップへ

Deep Learning 勉強会 Chapter 12

研究の方ではなかなか触る機会が無いのですが,知識だけは入れておきたいということで最近は社外の人達が主催しているDeep Learning勉強会に参加させてもらっています.

こちらでは輪講資料として以下のサイトで公開されている書籍のドラフト版を使用しています.

https://www.deeplearningbook.org/

なかなか知識不足という事もあって,細かい部分は分からなかったりするのですけど,12章は自然言語処理の話も含まれていることから私の担当となりました.広い内容をカバーしていることもあって私としても非常に勉強になりました.

勉強会の中では Chen and Goodman の資料は 1998 ではないかと書いたのですが,1999の物もありました.ということで,資料の方でのリファレンスの指摘は私の間違いです.

http://www2.denizyuret.com/ref/goodman/chen-goodman-99.pdf

使用した資料は以下で公開しております.十分に理解しているわけではないので,間違い等ありましたら教えて頂けると助かります.


PDF化してスライドシェアにアップしたところ,背景が非常に見づらくなってしまっているので,読む場合はダウンロードすることをお勧めします.

このエントリーをはてなブックマークに追加

Go-ICP グローバル最適なICP -Globally optimal ICP(2015 PAMI)-の解説

先日社内の勉強会で,グローバル最適なIterative Closest Point(ICP)アルゴリズム”Go-ICP”について紹介しました.

ICPは有名なところではKinect Fusionなど,3次元点群のレジストレーションに広く用いられています.基本的には,最近傍点の対応付けと姿勢(並進と回転)の推定を順次繰り返していくことで,点群間の2乗誤差を最小にするような姿勢を見つけようとアルゴリズムです.

ICPは原理上,点群間の姿勢がある程度離れると局所解に陥ってしまい正しくレジストレーションできないという課題があります.

そこで,局所性を改善したアルゴリズム(SoftAssign など)や,ローカルな特徴(Spin Imageや4PCSなど)を用いて大域的にレジストレーションする手法など多様なアルゴリズムが提案されていますが,グローバル”最適”な点群のレジストレーションアルゴリズムはあまり提案されていませんでした.

2013 ICCV,2015 PAMIの論文でグローバル最適なICPアルゴリズムGo-ICPが発表されました.詳しくはスライドで解説していますが,Branch and Bound(分枝限定)とVoxel ICPの組み合わせで効率的にSE(3)の6自由度パラメータ空間から最適な解を探します.

著者のページにソースコードが公開されていますので簡単に試すことができます.公開されているソースはテキストファイルから点群データを読み込んで姿勢をテキストファイルで書き出す仕様になっていますが,外部ライブラリの依存がなく簡単にMatlabのmex関数を作成できますので,いろいろ点群を変えて試したい場合はmex化がオススメです.


 

このエントリーをはてなブックマークに追加

Halide, Darkroom – 画像処理並列化のためのソフトウェア

社内勉強会のネタです.
HalideとDarkroomという画像処理を並列化するためのソフトウェアの研究についてのちょっとしたサーベイ発表のスライドを公開します.

Halide

Halideについては,サンプルコードも書いてみました.
とある画像処理を,下のメソッドチェーンで記述するだけで,「画像全体を8行毎に切って,それをマルチスレッドで処理し,8行毎の処理は内部的に4ピクセル毎にベクタライズして処理する」という並列化処理に置き換えられてしまいます.
ゴイスー.

temp.split(y, y, yi, 8).parallel(y).vectorize(x, 4);

例えば,25×25のサイズフィルタを畳み込むぼかし処理を上記の並列化で高速化した場合,画像サイズが768×1024のケースで,15倍くらい高速化することができました.
また,HalideはC++にインラインでそのまま書けるのでポータビリティも最高です.
大元のリポジトリに行くとiOS向けのサンプルコードとかもあるので,様々な環境でちょっとした画像処理を簡単に高速化できるのがさらにすごいところだと思います.

Halideのセットアップとチュートリアルコードのビルド(Mac)

プレゼンではビルド方法等について話さなかったので,ここでちょっと紹介します.
Macの場合は,llvmのバイナリをダウンロードして,Halideのソースコードの内部に設置し,環境変数をセットするだけで簡単に試すことができました.
実際,llvmはビルドしてもいいのかもしれませんが,私は面倒なのでしませんでした.

> git clone https://github.com/halide/Halide.git
> cd Halide
> curl -L -O http://llvm.org/releases/3.7.0/clang+llvm-3.7.0-x86_64-apple-darwin.tar.xz
> tar zxf clang+llvm-3.7.0-x86_64-apple-darwin.tar.xz
> export LLVM_CONFIG=(your path)/Halide/llvm/bin/llvm-config 
> export CLANG=(your path)/Halide/llvm/bin/clang
> make

チュートリアルのサンプルコードは,以下のようにしてビルド&実行できます.
(リンカのパスがなんかおかしい気がするんだけど・・・・まぁいいか・・・)

> make tutorial_lesson_02_input_image
> ln -s ./tutorial/images ./images
> ./bin/tutorial_lesson_02_input_image

私もHalideのソースコードを書いてみました.
繰り返しになりますが,そのままC++のコードとしてかけるのがすごい・・・.
そして,スケジュールのメソッドチェーンを書くだけで,処理スピードが10倍とかになるので,かなり実応用にも有効かと考えます.
Halideの講演のビデオが非常にわかりやすいのでオススメです.


このエントリーをはてなブックマークに追加