stMind

about Tech, Computer vision and Machine learning

WIndowsでTensorflow C++ APIを使う準備

TL;DR

WindowsでTensorflowのC++ APIを使わなければいけないケースというのはそれほど多くないと思うし、どうしてもという理由がなければやらない方が良いと思う!

ステップ

基本は、下記のブログを参照すれば出来る。

tadaoyamaoka.hatenablog.com

  1. cmakeを使って、VS2015のソリューションを生成
    • Tensorflowのソースディレクトリはtensorflow/tensorflow/contrib/cmake
    • ソリューションファイルの生成先は、例えばtensorflo/cmake_buildを作って指定する
    • CUDAは9.0で、CuDNNは7.0
  2. configureして、swigが見つからないというエラーが出たらswig.exeのパスを指定
    • swigwin-3.0.12をダウンロード
    • swigwin-3.0.12/swig.exeを指定するだけ
  3. 再度configure、configure doneになったらgenerate
  4. generate doneになったらOpen projectでソリューションファイルを開く
  5. x64でReleaseビルド

注意点

  • ビルドが終了するまで数時間はかかる
  • メモリ16GBのマシンでビルドしたら、いくつかのプロジェクトでリソース不足的なエラーでビルド出来てなかった。結構なハイスペックが要求されそう。

あなたは世界を変えない

Ruby on Railsの作者DHHさんのmediumエントリー。最近読んだ中でも一番良いなと思った。

TwitterFacebookも世界を変えよう❗という明確なミッションを持って始まったわけではないし、そういうミッションを持つことは大変な重荷。壮大な幻想(ミッション)を持つことで、毎日毎日会議を繰り返す日々に無理やり意味をもたせようとしているのでは?みたいな指摘も。

Set out to do good work. Set out to be fair in your dealings with customers, employees, and reality. Leave a lasting impressions on the people you touch, and worry less (or not at all!) about changing the world. Chances are you won’t, and if you do, it’s not going to be because you said you would.

良い仕事をしよう、顧客や従業員、現実に対してフェアでいよう、関わる人に対して良い印象を残そう。そういうことに集中することの方がより大事だよというアドバイスでした。

I have no illusions that my time in this world is going to be remembered through the ages. When it’s over, I’ll be so fortunate as to have left an impression on my friends, my family, and a few colleagues in the industry. And those impressions will fade quickly, so they aren’t even worth elevating much.

私の人生は世代を通じて思い出されるという幻想は持ってない。終わったときに、友達や家族、何人かの同僚に思い出してもらえれば相当幸せだろう。それらの印象もいずれは薄れていくし、もてはやすようなものではない。

相当なオッサンになってきたので、こういう考えもそうだよなぁと思うようになった。

P.S. いくつかmediumでエントリーを見たけど、DHHさんの英語って難しくないですか❓独特の言い方というか、自分が知らないだけなのか…

CourseraのDeep Learning Specializationコースのまとめノートを見つけた

先日全てのレクチャーをやり終えたCourseraのDeep Learning Specializationコース。そのまとめノートをSlideShareで公開している人がいた❗

図解が上手い❗今まで見てきたDeep Learningの解説資料の中でも、分かりやすいランキングのかなり上の方に位置すると個人的に思う。

PASCAL-Part Datasetのmatファイルフォーマットがようやくわかった

f:id:satojkovic:20180228120016p:plain

FCNでSemantic segmentationをやってみようと思いたち、物体のパーツ単位で正解マスクが提供されているPASCAL-Part Datasetを使うことにした。のだが、正解マスクが含まれているmatファイルのフォーマットがよくわからない!データセットにはオリジナル画像 やマスク画像をタイル表示するデモ用のmatlabスクリプトがあるけれど、matlabはあまり慣れてない... こういうのは慣れてるものを使えばいいやということで、ipythonでインタラクティブに解析することにしたよ。

ルート > オブジェクト > パーツ

結局、データのルート > オブジェクト > オブジェクト毎パーツというような階層になってて、書いてみれば直感的にわかるけど、多量にネストされていて理解するまでに時間がかかった...

例えば、下の画像であれば

f:id:satojkovic:20180228141358j:plain

In [1]: import scipy.io as sio

In [2]: data = sio.loadmat('Annotations_Part/2008_003228.mat')

In [3]: data.keys()
Out[3]: dict_keys(['__header__', '__version__', '__globals__', 'anno'])

In [4]: data['anno'][0][0][0]
Out[4]: array(['2008_003228'], dtype='<U11')

# ここがルートで、この画像に含まれるオブジェクト数は4
In [5]: data['anno'][0][0][1].shape
Out[5]: (1, 4)

# オブジェクトの情報
# オブジェクトはpersonが3個、catが1個(画像左の黒い領域)
In [6]: data['anno'][0][0][1][:, 0][0][0]
Out[6]: array(['person'], dtype='<U6')

In [7]: data['anno'][0][0][1][:, 1][0][0]
Out[7]: array(['person'], dtype='<U6')

In [8]: data['anno'][0][0][1][:, 2][0][0]
Out[8]: array(['person'], dtype='<U6')

In [9]: data['anno'][0][0][1][:, 3][0][0]
Out[9]: array(['cat'], dtype='<U3')

# パーツの情報
# 1番目のオブジェクトのパーツ数, personはmaxで24パーツまで
In [11]: data['anno'][0][0][1][:, 1][0][3].shape
Out[11]: (1, 16)

# 0番目のパーツの名前 => head
In [16]: data['anno'][0][0][1][:, 1][0][3][:, 0][0][0]
Out[16]: array(['head'], dtype='<U4')

# 1番目のパーツの名前 => left ear
In [21]: data['anno'][0][0][1][:, 1][0][3][:, 1][0][0]
Out[21]: array(['lear'], dtype='<U4')

# 正解マスク
In [22]: data['anno'][0][0][1][:, 1][0][3][:, 1][0][1]
Out[22]: 
array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)

# 正解マスクのサイズ = 画像サイズ
In [23]: data['anno'][0][0][1][:, 1][0][3][:, 1][0][1].shape
Out[23]: (375, 500)

後は、これを取り出して画像とペアにすれば、FCN用のPart datasetが準備出来ることになる!(ほんとはまだ)

おまけで、matlabのデモコードを実行したときのマスク画像(右下)はこんなの。

f:id:satojkovic:20180228143346p:plain

大学との共同研究の話

今年度もあと1ヶ月あまり。会社員にとって区切りでもあるけど、それ以外の例えば学生にとっても、卒業という大きな節目がやってくる時期。自分は会社員でありながら、特に大学生の卒業はとっても身近な話でもあるんですよね。というのも、大学と共同研究をやっているから。

研究室に配属された時が4年生、情報系なので修士まで行く人が多いので卒業は24才位で、企業に就職していく。そういう学生を何人か見送って来て、今年もそういう時期がやってきたんだなぁと、そんなことを実感しているんです。

自分の時は先輩の研究の一部を研究テーマとして設定して、先輩のプログラムをもらって動かしたり、論文を読んだりして研究を進めていくのが基本形だったけど、今の学生を見てると、自分で自由にテーマ設定して研究している人が多い印象。もちろん、先輩のテーマを引き継いでというのもあるけどね。それに、自分は修士まで行っても大した実績も出せなかったけど、今の学生は国際学会、論文誌への投稿なんて4年生からでも当たり前のように出してて、ほんとに頼もしい。共同研究の打ち合わせを結構な頻度でやってるから、次の打ち合わせまでに研究を進めないと…っていうプレッシャーがかかっているのかもしれないけど。

卒業して企業に入っても、即戦力でやっていけるだろうな。元気に頑張って欲しい❗

P.S. 大学との共同研究って、他の会社はどんな感じでやってるんだろう。(どうでもいいけど、P.S.って最近使わないのか?)

CourseraのDeep Learning Specialization完走❗

f:id:satojkovic:20180219220716p:plain

11月から始めてSequence modelsのコース終了が2月なので、約3ヶ月でCourseraのDeep Learning Specialization(全5コース)を完了❗Gradesも100%で終えることが出来て良かった😊

ちなみに、1ヶ月で5526円の課金が行われるので、自分の場合は受講料金は総額16578円相当となりました。内容とボリュームを考えたら、大変にリーズナブルじゃないかなと。オフラインで講師ありのコースなどがもしあれば(実際にあるのかどうかは知らないけれど)、1つのコースだけでも5万とか10万とかしそうな気がするし。

もちろん、値段だけじゃなく、内容も凄く良くておすすめ。なお、Specializationの内容は下記ブログが詳しい。

p-baleine.hatenablog.com

Arsenalのデータサイエンティスト職

f:id:satojkovic:20180213210834p:plain

アーセナルのデータサイエンティスト職の応募があった。すごい❗

ベンゲル監督にも分析結果を進言出来たりするのかな。夢のような職種だ...

実際の仕事内容を見てみる!

  • 働く場所はロンドンのコルニー(トレーニング場)
  • Trackingデータ、GPSデータ、その他のウェアラブルデータを解析して、怪我の防止やパフォーマンス最適化

Abilities/Skills/Knowledgeは...

  • pythonが好ましいがRでも可→pythonは毎日使ってる
  • ETL(extract/transform/load), data wrangling/data cleansing(前処理), feature engineeringが得意→公開データセットは色々使ってて、こういうことはたくさんやってる
  • modelling rare events, sparse or noisy data→異常検知とかはCourseraのMachine learningコースでやったけどな
  • 回帰、分類、時系列のタスクに関する知識→この辺りはCourseraでも一通りやってる
  • 基本的なデータ可視化、様々なバックグラウンドの人への説明能力→説明は至る所でやってはいるかなぁ
  • PySparkで大規模データを扱えると好ましい→数万データくらいまでかなぁ
  • geo spatialデータの解析経験→近いことは経験あるけど

勝手に自己評価してみた。

エジル信者の自分が、もし仮にエジルのデータ分析をして結果が悪くても、そんなはずない!とか バイアスがかかってしまいそうだけど、アーセナルに自分の保有する技術で貢献出来たら最高だろうなぁ😊

Job Search - Arsenal