stMind

about Tech, Computer vision and Machine 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

CourseraのDeep Learning SpecializationのCourse2まとめ

www.coursera.org

引き続き、Deep Learning SpecializationのCourse2を受講しました。Course1では日本語訳がありましたが、Course2では英語字幕(時々誤り有り)のみで、仕事で頭を使ってから帰った後で取り組むのは難しいものがありました。結局、週末に一気に仕上げる感じでしたが、Course2もCourse1と同様で、具体的なケースで基本の説明、なぜworkするかの理由が説明されるので、すいすいと進めることが出来たように思います。

Course2振り返り

Week1, Week2, Week3の構成で、特にWeek1が他の二つに比べて大ボリュームで盛りだくさんでした。自分のCoursera学習スタイルは、

  • Videoは、重要なスライドをEvernoteに画像で貼り付け、解説を聞いて自分なりにまとめた説明とともにノートに保存
  • ノートにはタグ付けして、QuizとProgramming assignmentに取り組むときに、忘れた内容があったらタグ検索して参照

という感じで、今回のCourse2では約30のノートが出来ました。

基本的にはこれまでに一度は聞いたことのある概念(Regularization,Batch Normalizationなど)なのですが、なぜRegularizationがOverfittingを防ぐのか?Batch Normalizationは何をしているのか?などの理解が、複雑な数式なしに深めることが出来たと感じています。Course1と合わせて、Deep Learningの基本理解はこのCourse2まで受講すれば十分だと思えるくらいの濃い内容のコースでした。

CourseraのDeep Learning SpecializationのCourse1まとめ

www.coursera.org

Andrew Ng先生のディープラーニング講座を始めました。Course1はNeural Network and Deep Learningで、Logistic regressionから始まって、Neural Networkの基本、Shallow and Deep Neural Networkという流れで学習するコースになってます。

全体の印象

ディープラーニングを勉強しようと思ってウェブを検索してみると、フレームワークを利用したプログラミング例で確かに結果が得られるのだけど、ブラックボックスでいまいち何をやっているのかが曖昧だったり、一方で内部を数式から理解しようとすると線形代数微積分学の知識が必要とされて、数式をおいきれなくなって挫折したりということが多い気がします。 このコースでは両者のバランスが良くて、最初にWx + bを理解する必要はあるけれど、コース全体で一貫して同じ表現が登場するので、記憶に定着して、やっていることが段階的につかめるようになっていると思います。また、各週のprogramming assignmentでNeural Networkを実装するときにも変数名に同じ表現を使うので、ビデオ内容と実装が直結していて感覚的にも理解が深まりやすいです。

やや難しいBack propagation

Ng先生もビデオの中で語っていますが、Back propagation(逆伝播)は少し難しい内容かもしれません。Back propagationは、Computation graph(計算グラフ)を知っていると理解しやすいと思いますが、このコースでは少ししか触れられていません。なので、評判の良いゼロから作るDeep Learningを参考書として持っておくといいかもしれません。事前に、Computation graphの所を読んでおくとより良いと思います。実際、自分が取り組んだときに非常に役に立ちました。

英語

英語も一つの心配事項なのかなと思いますが、Course1に限って言えばほとんどのビデオに日本語訳があるので、心配ないと思います。Course1以降は今取り組み始めたところですが、英語字幕のみのようなので、英語が苦手な場合には少し難しさが増してしまうかもしれません。ただ、Course1が完了できれば、ディープラーニング学習の導入としては十分理解出来たと言えると思います。