Visual SLAM関連のリンク集

2019年開催の各種カンファレンスのリンク集

論文や動画に対するリンク集です。

CVPR 2019 open access
CVPR 2019 Open Access Repository

ICML 2019 Accepted Papers
https://icml.cc/Conferences/2019/AcceptedPapersInitial

SIGGRAPH 2019 papers on the web
http://kesen.realtimerendering.com/sig2019.html

www.youtube.com

Git初心者が読むメモ

一人でコードの開発をするときにも、バージョン管理とバックアップも兼ねてのリモートリポジトリの利用は便利だなと思います。 そのために必要なコマンドのメモ集です。 最近はGitHubでもprivateリポジトリを無料で持てるので、一人開発もGitHubを使用しています。

git-scm.com

Gitの基本操作

  • git init/git clone: Gitリポジトリの作成/取得
  • git branch/ git checkout: ブランチによる作業場所の確保
  • git merge: 変更を取り込む
  • git push: ローカルリポジトリをリモートリポジトリに反映する

初めてのGit作業の手順

プロジェクト用にからのディレクトリを作成する

そのディレクトリで git init を実行する

git init

.git fileが作成されリポジトリのmaster が作られる.
すでにリモート上にリポジトリが存在するときにはgit cloneを使用して、リモートからローカルにcloneする.

git clone --recursive https://someuser@bitbucket.org/someuser/test.git

README.md fileを作成する

管理対象に追加(ステージングエリアに上げる).

git add <file/dir name>

or

git add .

ファイルをGitで管理しないようにする

.gitignore ファイルを作りそこにfileName/dirName書き込む

ファイルの状態の確認を行う(変更されたファイルの一覧)

git status

コミットするためにユーザー名とメールアドレスの設定が必要

git config --global user.email "abc@def.ghi"
git config --global user.name "Hoge hoge"

(--globalを付けるとそのPCでのすべての操作に関してこの内容を使う)

gitの設定の確認

git config --list

変更差分の確認

git diff

ステージングされた後のファイルに対しては
git diff --cached

コミットを行う

コメントをつけてcommitするには

git commit -m "first comment"

詳細な変更も記述してcommitを行うには

git commit -V

コミットの確認 (最後にコミットされているファイルと現在のファイルの比較され、差分が表示される)

1commitにつき1行だけのコンパクト表示

git log --oneline

変更箇所の詳細表示

git log -p xxxxxx

どのファイルがどれくらい変更されてるかの統計情報

git log --stat

コミットしたファイルをGitの管理から外し削除する

git rm finename
git rm -r directoryname

ファイルは削除せずにGitの管理から外すだけ

git rm --cached

(.gitignoreに書き込んでおく)

リモートリポジトリへ登録

gitHubにアクセスし、新規リポジトリを作成する
1. gitHubにアクセスし、新規リポジトリを作成する
2. 右上のタブから"New repository"を選択
3. Repository name を決める
4. private/publicの選択
5. create repositoryをクリックしてリポジトリを作成する

remote repositoryへの登録

git remote add origin https://github.com/hogehoge/hogename.git

ローカルでの開発内容を共有リポジトリに反映させる

git push -u origin master

-uオプションは次回から入力を省略するためのもの
git push -u origin master とすると、次回から git push だけで引数に指定した origin master で勝手に push してくれる
ユーザ名やパスワードを聞かれるので入力
origin は共有リポジトリのこと。レポジトリの場所(URL)の別名
master はブランチの名前
master は大事なブランチなので、個人利用では自由にpushしても大丈夫だがチームでの場合はmasterには通常pushしない
ブランチはGUIから確認可能(<>Codeタブのすぐ下に n branches と出ていて、クリックすると詳細が見れる)

以上で、初めてローカルリポジトリを作りそれをリモートのmasterブランチに反映させる方法が終了.

実際に作業は、共同作業ということを考えるとコード集約を妨げないように、自分専用のブランチを作って、そこで作業を行う.
  1. まずは現在のブランチを確認: git branch
  2. のついていものが現在のブランチ
  3. 新しブランチを作成する: git branch ブランチ名
  4. ブランチ切り替え: git checkout ブランチ名
  5. ブランチ先へのコミット(上で書いたmasterへの作業と同じ)
  6. 状態確認をする:
    • git status
    • git diff
    • git commit -m "hogehoge"
  7. リモートにPushする:
    git push origin ブランチ名
ブランチでの作業が終了して、ブランチをmasterにマージする
  1. マージ先(master)に移動: git checkout master
  2. 作成したブランチをマージ先にマージ:git merge ブランチ名
  3. ログ確認(変更内容がマージ先に反映されているか確認): git log
  4. リモートに反映: git push origin master
  5. マージが終了したので、作業用ブランチを削除: git branch -d ブランチ名
  6. ブランチの削除をリモートに反映: git push origin :ブランチ名
    (コロンを忘れないように)

ローカルリポジトリのmasterブランチにリモートリポジトリoriginのmasterブランチを取り込みたいとき

git checkout master #(ブランチをマスターに切り替え)
git fetch origin master #(リモートリポジトリからコピーする)

ファイルやディレクトリ名を変更したり、移動する

git mv <sourceFilename> <dstFilename>

ブランチ名変更

git branch -m <sourceBranchName> <dstBranchName>

ブランチ削除

git branch -d <BranchName>

ブランチの切り替え

git checkout <BranchName>

ブランチのマージ

git merge <BranchName>

ブランチの状況の確認には

git log --all --graph --pretty=oneline
既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit initしてファイルを追加したりすると何がおきるか
git push -u origin master

error: src refspec master does not match any.
error: failed to push some refs to 'https://github.com/hoge/hogehoge.git'
となりエラーが出る

既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit clone してから、ファイルを追加したりすると何がおきるか

add -> commit -> push で新たなファイルをリモートリポジトリのmasterに登録できた

[ここまでをまとめると]

Gitサーバー上でプロジェクトを作成.すると,内容が空のリポジトリができる(GUI 操作)
Gitサーバーからリポジトリを複製して,手元に作業ツリーを作成 (git clone).空の作業ツリーができる.
作業ツリーにソースコードを追加し,フォルダをGitに追加 (git add)
変更をコミットする (git commit)
コミットした変更をGitサーバに送り込む (git push)
他のメンバーもGit上のリポジトリを複製 (git clone) すると, ソースコード一式が既に入った作業ツリーが取得できる

過去の状態に戻す方法:

git branch devbranch2 comitID

Unityのシーンビューでの操作方法メモ

最近ユニティーを触り始めました.
キー操作に関するメモです.

対象のオブジェクトを視点の中心に持ってきたいとき

  • Hierarchyで対象オブジェクトをダブルクリックする
  • シーンビューでオブジェクトが選択された状態でfを押す

対象オブジェクトを中心にしてカメラを回転したいとき。オブジェクトを注視する視線方向は維持。

  • Alt + 左ボタンを押しながらマウスを動かす

対象オブジェクトに近づく or 遠ざかる

  • Alt + 右ボタンを押しながらマウスを動かす
  • ホイールをまわす

カメラを中心に回転。周囲を見回すようなカメラの動き。

  • 右ボタンを押しながら、マウスを動かす

視点の平行移動

  • Alt + Ctrl とマウスの左ボタンを押しながらマウスを動かす
  • 手のマークをONにしてマウスの左ボタンを押しながらマウスを動かす

以下のページを参照:
https://docs.unity3d.com/ja/2018.1/Manual/SceneViewNavigation.html

International Conference on Computational Photography 2018の発表動画を眺めていました

International Conference on Computational Photography 2018は発表の動画が公開されているので、参加できない人も発表を見ることができて便利です。
iccp2018.ece.cmu.edu
発表のタイトルをクリックするとYoutubeの動画に飛びます。
個人的には"Acquiring and Characterizing Plane-to-Ray Indirect Light Transport"が気になりました。
プロジェクターとローリングシャッターカメラのタイミング制御がむつかしそうですが、鏡面反射と拡散反射が分離できたりマテリアルが分離できたり興味深いです。

Deep learning を使ったobject_detectionの情報

Deep learning を使ったobject_detectionの情報は以下のサイトを見ればすべてまとまっています。
サーベイ論文をもとにして、各手法の論文や実装サイトへのリンクが時系列でまとめられています。
github.com

transfer learning, fine tunning, distillationについて調べてみました

Transfer learning

ある領域で学習したモデルを別の領域の学習に利用する手法のことです。
例えばimage netのような膨大な量の学習データを使用して1000カテゴリ分類の学習を行ったとして、その結果を用いて学習データの少ない10カテゴリ分類の問題を解くという手法です。
具体的には、1000カテゴリ問題を解くネットワークと解きたい問題のネットワークを途中までは同じにして、重みに転移元(ここでは1000カテゴリ分類問題)の学習結果を使用します。
そして、少ないデータを使用して出力層近くの重みのみを学習することで、非常に精度よく10カテゴリ問題のモデルを構築できるという手法。
転移元と転移先の問題が似ていることが転移がうまくいく条件になります。
画像の分類なら、共通する特徴や、それを使用してクラス分類するという問題設定が共通しているので、転移学習が有効に働きます。

Fine tunning

fine tunningとはすでにあるのモデルの一部を再利用して、新しいモデルを構築する手法のことだそうです。 素粒子理論で出てくる超対称性の話とは違います。
転移学習と同じ手法に見えますが、以下のような違いがあります。
転移学習は上の例で書いたように、既存の学習済モデル(出力層以外の部分)を、重みデータは変更せずに特徴量抽出機として利用して、出力層部分のみ学習することで、新しいモデルを構築する手法です。
これに対して、ファインチューニングは既存の学習済モデル(出力層以外の部分)の重みデータを一部再学習して特徴量抽出機として利用するという手法です。
つまり転移学習では転移済み学習モデルは固定しているが、ファインチューニングでは元の学習済み重みをさらに書き換えて、新しいモデルに"詳細にtunningする"手法だといえます。
fine tunningを使用する目的はtransfer learningと同じで、少ない学習データで高い正解率を得るためですが、fine tunningの方がtransfer learningよりも柔軟性があるといえます。

Transfer learningは特徴量抽出機の部分を固定したfine tunningといえるかもしれません。

Distillation

Distillation(蒸留)というのは、上の二つと違いネットワークの構造にかかわる技術です。
Distillationは学習済みの複雑なネットワークと"ほぼ"同等なシンプルなネットワークを新たに学習する手法です。
なぜそんなことが必要かというと、ディープラーニングは実用上より少ないメモリでより高速に動作する必要があり、そのためには出力は同等のよりシンプルなネットワークを作ることに意味があるからです。
元のネットワークが非常に大規模なアンサンブルモデルの場合、それをシンプルなたった一つのネットワークで表現できるということには実用上大きな意味があります。
具体的には、例えば1000カテゴリ分類する複雑なネットワークの出力に対して、その出力の確率分布をソフトターゲットと呼び、そのソフトターゲットを出力するようなシンプルなネットワークを構築することでdistillationができます。
蒸留について非常にわかりやすく解説してあるサイトです。
Deep Learningにおける知識の蒸留
たとえて言うなら、教師が正解だけでなく問題の解き方までかみ砕いて教えることで、生徒は少ない学習量で効率よく問題に正解できるようになるということですね。