ざっくばらんメモ_27:kaggle bowl2018

kaggle bowl2018

コンペ
code
前回はDilated Residual Networkを用いた推論を行い、あまり結果が良くなかった。
今回はpytorchベースのsegmentationコードを folkし、今回のデータに合わせた形でadapterを加えつつ試した。
まず初めにbilinear補完によるupsampleを用いたFCNを学習した。
結果:LB0.148と結果は微妙。
upsamplingにdense upsampling (cf. https://arxiv.org/abs/1702.08502 )を用いた版を 学習するも、model colapseしてしまうのか、0のみを出力するようなモデルが出来てしまった。
一般のcityscapesなどでは高性能を発揮してきたモデルなのでうまくいくと踏んでいたが、 そうでもないようである。

ざっくばらんメモ_26:kaggle bowl2018

kaggle bowl2018

コンペ
code
前回はUNetを用いた予測を行った。
今回はもう少し最新の手法を試す。
選んだのはDilated Residual Networkで こちらはコードが公開されているため適用しやすい。
このモデルを学習するためには規定のフォルダ構造にしなければならないので、 その前処理のみを行って実際に学習を行った。
結果:LB0.222でむしろUNetより結果が悪化してしまう。
cityscapesなどの多クラスかつ高解像度なタスクで高性能をたたき出しているが、 今回の低解像度かつ2クラスのみのモデルには相性が悪いのかもしれない。

ざっくばらんメモ_25:kaggle bowl2018, Coursera Robotics Perception

kaggle, bowl2018

コンペ
code
まずはtensorflowベースのUNetを用いた手法がkernelに公開されているのでそれに沿って 実装を行っていく。
ただそのまま走らせるのでは面白くないので、いくつかdata augmentation手法を適用して データを増やしたものを用いて学習をする。
ひとまず、そのまま走らせた結果:LB:0.303。
その後、データをいくつか見ると、白黒反転した画像がいくつか含まれている事が分かったので、 data augmentationに白黒反転を追加しテスト。結果:LB:0.341
Leader Boardを見ていると、まだ終盤ではないからか得点が拮抗しておらず、 上位勢においてもばらつきが大きい。
いずれにせよ上位勢はLB0.5を超えているので先は長い。

データをもう少し眺めてみると、比較的白黒に近い画像が多いのに対して、 たまに色がしっかりとついた画像が散在する。
こうした画像に対するロバスト性を上げるための工夫が必要なように思える。

Coursera: Robotics Perception

前回までは非線形最適化を用いたPnP問題などの解法について学んだ。

今回はOptical Flowについて学ぶ。
Optical Flowでは微小変化した2つのposeから得られた画像を用いてその間の変分量を考える。
この変化量を各画像特徴点ごとに求め、そのベクトルを示したものがoptical flowになる。
その変化量は、pose位置の変化量に対応した特徴点のtranslationとrotationに関する変化の和として考える事が出来る。
ここでrotationは深さに独立した値として求まる。
translationは深さに依存するが、深さセンサ搭載のカメラを利用した場合、解くのは簡単になる。
そうでない場合でも、特徴点、点の移動方向、移動量との幾何学的関係を用いて、移動量に関する最小二乗誤差の問題にできる。
この場合移動量をサンプリングして、最も誤差が少なるものを選び取る手法が用いられる。

続いて、Structure from Motion (SfM)について学んだ。
SfMでは、複数の画像を入力として、画像内の物体を3次元復元し、かつ各画像に対応してカメラ位置を推定する。
この場合、物体の特徴点に関する3次元点から各画像の2次元への写像を考え、 その写像の推定値に関する2次元点の写像誤差を最小化する。
この問題はBundle Adjustmentと呼ばれる。
誤差を最小化は勾配法(Gauss-Newton法)が用いられるがそのためには全特徴点と全パラメータに関する、 ヤコビアン行列Jを求め、そのJT*Jの逆行列を計算する必要があり、高コストである。
そこでJに関する変換をいくつか重ねる事で、フレーム間の関係と特徴点間の関係に切り分ける事が可能で、 その事により効率的な計算が可能になる。

SfMに関連した技術としてVisual Odometry (VO)についても学んだ。
VOは複数画像をもとにカメラ位置を推定する点ではSfMに似ているが、 逐次的に前回までの結果から次の画像に関するカメラ位置、つまり軌跡(odometry)を予測していく。
またVSLAMはVOと同一視されるが、VSLAMの場合はさらに復元した3次元特徴を利用した 地図生成までを扱う。
VOにおいても、直近の観測結果を用いてBundle Adjustmentが行われる。
この時、外れ値除去が非常に重要で、どのフレームのどの特徴点対応を用いるかで結果が大きく変わってしまう。
また軌跡を描いていくにあたって、以前訪れた場所に再訪した場合、以前観測した3次元特徴点との対応をとる事も 精度の面で重要で、これはloop closureと呼ばれる。

ざっくばらんメモ_24:kaggle bowl2018, Coursera Robotics Perception

kaggle bowl 2018

次のトライとして去年もあったdata science bowlの2018年版 へチャレンジしてみることにする。
今回のお題はがん検出自動化に向けた画像ベースの細胞核検出問題。
核検出は分析のスタートポイントとなるため重要との事。
評価は検出箇所に関する正解値とのIoUを用いる。
この時、IoUに対する複数の閾値を用意し、それを超えたかどうかで positive/negativeを判定、True Positiveの比率を用いて評価する。
これはさらに各IoU閾値に対して求められ、最後に平均化される。
続いて、データセットをダウンロードする。
データは主に核の画像で成り立っていて、様々なコンディションで撮影されている。
またその画像に対して正解値として核に対するマスク画像が与えられている。
またデータはstage1とstage2に分かれており、stage2のデータは後程公開される。
ちなみにstage2はテストデータのみの公開でstage1のテストデータとともに予測する必要がある。
マスクデータはヒューマンエラーが含まれている事が示唆されていて、自分で修正する事も可能だとの事。
また今回マスクデータはデータ量軽減のために特殊なエンコードがされているのでその形式で予測結果も 出さなければならない。

Coursera: Robotics Perception

引き続き、Coureraのrobotics perceptionのコースを受けている。
今回はWeek3の最終日で、programming assignmentを行う。
このassignmentでは簡単なARアプリケーションを作成する。
この課題では、複数の画像が与えられ、そこに写っている四角形物体の コーナーをトラッキングするコードを実装する。
続いてそれらの結果からcamera -- world coordinate間の写像行列を 推定する。
以上の結果を用いて最後に四角形物体上に立方体をレンダリングした画像を作成 する。

コーナーのトラッキングに関しては画像の勾配からトラッキング方向を予測しながら トラッキングを行うKLT手法を用いる。
続いて写像行列の推定は、Week2で既に実装した、複数点のworld -- camera coordinateの 位置関係情報からSVDを用いて予測する。
しかしその場合予測された行列は、回転行列の部分は正規直交でなく、また向きに関して一位に決まらないなど の問題があるので、SVDをさらに適応してクリーンアップするコードを実装する。
さらにassignmentの推奨でこのように実装したコードのテストを実装する事が推奨されているので、 ランダム行列とそれに対するQR分解を用いた正規直交行列を回転行列として用意、また translation, scaleに関しても正規分布を用いてランダム生成をして、それを用いたテストコードで 動作確認を行った。

ざっくばらんメモ_23:Detectron

FAIR Detectronのトライ

Facebook Researchが最近公開したCaffe2ベースの画像認識ライブラリDetectronを試す。
主なインストール手順はGitHubに公開。
環境はaws p2.xlarge, ubuntu 16.04、conda environmentを利用。
インストール環境を整えるにあたって要求環境がpython2であることに注意する。

まずCaffe2ベースなのでこのページに則ってインストールを行う。
インストールは地味に時間がかかる。
ここで現在caffe2はcuda8.0のみサポートなので気を付ける。
またDetectronはCudnn6.0でテストされているので、合わせておくのが無難。
またインストール時はsource deactivateでconda環境から抜けておいた方がライブラリリンクの問題を回避できて無難。
無事インストールを終えるてテストコードを走らせようとするとエラーが出た。

RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

この問題はpip install -U numpyで解決できた。

これで準備ができたので、COCO API、Detectronをcloneしインストール。ここまで来るとスムーズ。
続いてpretrainモデルを用いたinferenceを行ってみる。
簡単に動くでもスクリプトがあるのでそれを走らせるとpretrain済のMask RCNNがダウンロードされてきてすぐに適用され結果が返ってくるので とてもシンプルであった。
特に処理時間がちゃんと出力されてくるのがリアルタイムを意識したcaffe2らしくて良い

python2 tools/infer_simple.py \
    --cfg configs/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml \
    --output-dir /tmp/detectron-visualizations \
    --image-ext jpg \
    --wts https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl \
    demo
E0205 04:16:35.846588 29047 init_intrinsics_check.cc:54] CPU feature avx is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.
E0205 04:16:35.846622 29047 init_intrinsics_check.cc:54] CPU feature avx2 is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.
E0205 04:16:35.846634 29047 init_intrinsics_check.cc:54] CPU feature fma is present on your machine, but the Caffe2 binary is not compiled with it. It means you may not get the full speed of your CPU.
INFO io.py:  67: Downloading remote file https://s3-us-west-2.amazonaws.com/detectron/ImageNetPretrained/MSRA/R-101.pkl to /tmp/detectron-download-cache/ImageNetPretrained/MSRA/R-101.pkl
  [============================================================] 100.0% of 170.2MB file  
INFO io.py:  67: Downloading remote file https://s3-us-west-2.amazonaws.com/detectron/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl to /tmp/detectron-download-cache/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2
014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl
  [============================================================] 100.0% of 490.5MB file  
WARNING cnn.py:  40: [====DEPRECATE WARNING====]: you are creating an object from CNNModelHelper class which will be deprecated soon. Please use ModelHelper object with brew module. For more information, please refer to caffe2.ai and python/brew.py, python/brew_test.py for more information.
INFO net.py:  57: Loading weights from: /tmp/detectron-download-cache/35861858/12_2017_baselines/e2e_mask_rcnn_R-101-FPN_2x.yaml.02_32_51.SgT4y1cO/output/train/coco_2014_train:coco_2014_valminusminival/generalized_rcnn/model_final.pkl
I0205 04:16:54.497457 29047 net_dag_utils.cc:118] Operator graph pruning prior to chain compute took: 0.000261409 secs
I0205 04:16:54.497767 29047 net_dag.cc:61] Number of parallel execution chains 63 Number of operators = 402
I0205 04:16:54.527851 29047 net_dag_utils.cc:118] Operator graph pruning prior to chain compute took: 0.000224148 secs
I0205 04:16:54.528105 29047 net_dag.cc:61] Number of parallel execution chains 30 Number of operators = 358
I0205 04:16:54.530202 29047 net_dag_utils.cc:118] Operator graph pruning prior to chain compute took: 1.6249e-05 secs
I0205 04:16:54.530248 29047 net_dag.cc:61] Number of parallel execution chains 5 Number of operators = 18
INFO infer_simple.py: 111: Processing demo/24274813513_0cfd2ce6d0_k.jpg -> /tmp/detectron-visualizations/24274813513_0cfd2ce6d0_k.jpg.pdf
INFO infer_simple.py: 119: Inference time: 2.566s
INFO infer_simple.py: 121:  | im_detect_bbox: 2.504s
INFO infer_simple.py: 121:  | misc_mask: 0.026s
INFO infer_simple.py: 121:  | im_detect_mask: 0.033s
INFO infer_simple.py: 121:  | misc_bbox: 0.004s
INFO infer_simple.py: 124:  \ Note: inference on the first image will be slower than the rest (caches and auto-tuning need to warm up)
INFO infer_simple.py: 111: Processing demo/15673749081_767a7fa63a_k.jpg -> /tmp/detectron-visualizations/15673749081_767a7fa63a_k.jpg.pdf
INFO infer_simple.py: 119: Inference time: 0.640s
INFO infer_simple.py: 121:  | im_detect_bbox: 0.470s
INFO infer_simple.py: 121:  | misc_mask: 0.082s
INFO infer_simple.py: 121:  | im_detect_mask: 0.084s
INFO infer_simple.py: 121:  | misc_bbox: 0.004s
INFO infer_simple.py: 111: Processing demo/34501842524_3c858b3080_k.jpg -> /tmp/detectron-visualizations/34501842524_3c858b3080_k.jpg.pdf
INFO infer_simple.py: 119: Inference time: 0.518s
...

ざっくばらんメモ_22:kaggle recruit, coursera

kaggle recruit challenge

最近あまり時間が取れず、あまり進捗はなし。

しかしkernelがいくつか更新されており、 最近公開されている手法をいくつかアンサンブルで 組み合わせ、重み付けを変えるなどしていた所、 最終的に0.478 (164位) を達成。

時間はないときは他人の手法をアンサンブルするのは 一つの手っ取り早い手法の一つかもしれない。 しかしForum Discussionにもあったが、アンサンブルしているとはいえ、 public leader boardに強く依存した重み付け調整をしたので、過剰適合の 恐れが強い。

Robotics: Perception@Coursera

Visual SLAMをざっくりと速習できる教材を探していた所、 あまりよさげなのは見当たらず、唯一CourseraにRobocics: Perceptionという コースがペンシルバニア大の提供であったので受講することにした。

このコースは一か月を想定し、最初の一週間は無料、それ以後は 毎月30ドルかかるとのこと。遅れずに進めば30ドルで済む。安い。

まず最初の週を終えたが、ここでは3次元空間がカメラを通した2次元空間でどのように見えるかの基本的な理論を学べる。

授業は基本的にわかりやすいが、スライドが時々分かりづらかったり、幾何学的な説明を教授が身振り手振りで教えようとするのだが、 微妙にわかりにくい時があったりもした。全体としては現状は満足。

また間に何度かクイズがあり、最後にはコーディングエクササイズをして課題を提出する必要がある。

すべてのカリキュラムをクリアするとcertificateも貰えるよう。なんの役に立つかはまだ分からない。

stackGan-v2をトライ

最近突然話題になり始めたattnGANに関して、 そのコードをトライしようと思ったがまだ公開されていなかった。

そこで著者らの関連作であるstackGAN++をとりあえずトライ。

こちらはコードが既に公開されている。 ちなみにPytorch版。

AWS p2.xlarge Ubuntu 16.04環境, Pytorch=v0.3.0, torchvision=v0.2.0でトライ。

まずはdependencyをインストール。conda createで専用の環境を作成しインストール。

ここでpython2.7指定なのでpython3系でやってしまうと詰まるので注意する。

いずれもpip installでインストールした。

続いてデータのダウンロード。

1.で指定されているpreprocess済のbirdデータ用 char-CNN-RNN text embeddingsモデルを取得。

ここからダウンロードできるが、 その中のbirds/train/char-CNN-RNN-embeddings.pickle当たりがおそらくはそう。

次に2.で指定されているbirdデータそのもの をダウンロード。

3.4.ので指定されているimagenetとLSUNデータはとりあえず今回はダウンロードせず。

これで準備が整ったはずなので、さっそくbirdsデータの学習スクリプトをトライ。

python main.py --cfg cfg/birds_3stages.yml --gpu 0

しかし早速エラーを得る。

IOError: [Errno 2] No such file or directory: u'../data/birds/text/002.Laysan_Albatross/Laysan_Albatross_0002_1027.txt'

見てみると、textというフォルダがたしかに存在せず、代わりにtext_c10というフォルダがあったのでソフトリンクで くっつけて対処(これで本当に良いかは不明)。

再度走らせると今度は無事学習が開始。

学習過程はoutputフォルダにログが存在するので、tensorboardを使って モニタ出来る。

またpretrained modelを使って生成テストもできる。

生成できた画像の例。

Black_Footed_Albatross_0001_796111_256_sentence2.png Black_Footed_Albatross_0005_796090_256_sentence5.png Black_Footed_Albatross_0005_796090_256_sentence6.png Black_Footed_Albatross_0007_796138_256_sentence6.png

色々複数体が合体しているものが多い印象で、良くニューロンの可視化でも似たようなことが起きている事から 今時のネットワークは単体とそうでないものの見分けがつかないのかもしれない。