novelty日記

データサイエンスやプログラムなど

ざっくばらんメモ_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

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

ざっくばらんメモ_20:kaggle, visitor function

kaggle recruit challenge

code

Kernelにて今まで公開されてきたメソッドをアンサンブルして LB0.479を実現しているものが公開されていた。

利用されているメソッドの中に自分の公開したものが含まれていた。

そのおかげか自分のkernelがブロンズを獲得。

ただこのメソッドは以前使っていたもので古いので、最新のやり方で出した結果で置き換えたら性能向上できると 考えトライ。しかし結果は変わらず。

現在93位。

visitor functionの作り方

多型な関数表現をしたい時に役立つプログラムデザイン。

elementとvisitorという2つの概念がある。

elementクラスはvisitorクラスを入力とするvirtual accept関数のみを持つ。

この時、想定する全ての型をelementのinheritanceとして宣言。

各element毎に固有の動作を定義しておく。

各elementはinheritanceされてきたaccept関数を持つ。

次に各elementを入力とした関数を持つvisit関数を持つvisitorクラスを宣言。

ここで各elementのaccept関数を定義し、それらは入力されてくるvisitorクラスの visit関数に対して自身(elementクラス)を入力として実行するようにする。

最後に、visitor継承クラスを(複数)作り、それぞれにおいて各element毎にそのelementを 入力とするvisit関数の内容を定義する。

以上をクライアントが利用する場合においては、 クライアントはvisitorクラスのインスタンスを作成し、 それは各elementに関してaccept()関数を通して実行される事になる。

結果、異なった型を持つelementに関して同じvisitor関数を用いて処理が行えるようになる。

ざっくばらんメモ_19:kaggle

kaggle recruit challenge

code

Kernelを見て、公開されているコードなどを元に 前処理と後処理を更新。

またknnとgradient boostingを追加したensembleを構築した。

結果LB0.482(161位)まで向上。

ここから先色々パラメータをいじるも性能向上はせず。

ざっくばらんメモ_18:kaggle, MCMC w/ human preference, classificationと文化

kaggle recruit challenge

code

今までsklearnのGridSearchCV関数などを利用して 自動パラメータチューニングを行ってきたが、時間がかかる割に 性能が改善されない。

Trainデータ内でcross validationにより作るvalidationセットが実際の テストデータと整合していないのか、あるいは別の原因があるのかも しれない。

いずれにせよ、今回手動でsubmissionして得られるLBスコアを見ながら 手動でlightgbmとxgboostのパラメータをある程度チューニングし、 最後に2つの予測結果の平均を取ってみた所、 結果:LB0.492まで向上。

しかしこれ以上は新たなアプローチをしていかないと性能が上がらなそう である。

MCMC with human preferences

NIPS 2017 John Platt's Opening Remarksより。

物理的な実験において、パラメータ設定を行う際に, パラメータサンプリングの度に人からそれが好ましいかそうでないかのフィードバックを もらう事で,human preferenceの山登りをするイメージでサンプリングパスを描く.

classificationは現在の文化を表現する。

NIPS 2017 KeynoteであるThe Trouble with Bias, Kate Crawfordを見た。

まずプレゼンが非常に上手くてそこに感動したが、内容も非常に興味深かった。

内容は学習された機械学習モデルが持ってしまう望ましくないbias(例えば性差別的観点) の問題についてのもの。

今までは、望ましくないbiasに対しては正則化してneutralizedして解決と考えていたが事は そんなに単純ではないようである。

中でも面白かったのが、classificationの歴史とそれがいかにその時々の文化を象徴しているか という事であった。

例えば、画像分類データで一番出てくる人名(クラス)はジョージ・ブッシュだと知られているが、 これは彼の画像がマスコミなどで頻繁に露出しており、それだけ社会的に重要視されてきた証である。

つまり社会的に、あるいは文化的にその時重要だったものがデータ分布を決定し、 またその分類に関するtaxonomyを決めてきたという事である。

実際分類の歴史を紐解くとそれは時代によって次々と変化しており、直近だと、google formで選べる 性別は2つから数十個に増えたらしい。

こうした事から、biasを直すという事はつまり文化、社会のレベルまで働きかける事が本質的には 必要で、データはneutralだから差別してしまう人間より遥か良いというような数年前の論調は間違いで、 上記の難問を解かない限り、またAI winterが来てしまうかもしれない。