stMind

about Tech, Computer vision and Machine learning

kaggleのデータファイルをwgetで並列ダウンロード

kaggleのデータファイルをwgetで並列ダウンロードする方法を調べた。スクリプトを書いたりすることなく、コマンドラインで完結するのでお手軽。

1. pupでリンクアドレスを取得する

chromeデベロッパーツール等で確認、CSSセレクタを使ってアドレスを取り出す。baseのURLはawkで付け足した。

$ curl -s https://www.kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/data | pup 'tbody tr td a attr{href}' | awk '{print "https://kaggle.com" $1}'

結果はこんな感じ。

https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/dev_train_basic.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/cookie_all_basic.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/ipagg_all.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/dev_test_basic.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/property_category.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/sampleSubmission.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/id_all_ip.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/id_all_property.csv.zip
https://kaggle.com/c/icdm-2015-drawbridge-cross-device-connections/download/database.sqlite.zip

リダイレクトしてurls.txtに保存する。

2. ブラウザで手作業

ここは手作業で行う。
ompetition rulesを確認するのと、wgetで使うためのcookieを保存する。cookiechromeのextensionを使う。

こちらも参考に。

3. xargsとwgetで並列ダウンロード

xargsとwgetを合わせて使うと並列ダウンロードが出来る!

wgetのオプションで手作業では保存したcookies.txtを指定してあげる。

$ xargs -P 20 -n 1 wget --load-cookies cookies.txt < urls.txt

後はダウンロードが完了するのを待つだけ。

sampleSubmission.csv.zip        100%[======================================================>] 126.38K   336KB/s   in 0.4s   

2015-06-28 22:11:23 (336 KB/s) - 'sampleSubmission.csv.zip' saved [129409/129409]

dev_test_basic.csv.zip          100%[======================================================>] 713.96K   404KB/s   in 1.8s   

2015-06-28 22:11:25 (404 KB/s) - 'dev_test_basic.csv.zip' saved [731093/731093]

dev_train_basic.csv.zip         100%[======================================================>]   2.14M   473KB/s   in 4.6s   

2015-06-28 22:11:28 (473 KB/s) - 'dev_train_basic.csv.zip' saved [2248158/2248158]

property_category.csv.zip       100%[======================================================>]   2.96M   374KB/s   in 8.1s   s

2015-06-28 22:11:31 (376 KB/s) - 'property_category.csv.zip' saved [3109199/3109199]

cookie_all_basic.csv.zip        100%[======================================================>]  34.08M   848KB/s   in 40s    s

2015-06-28 22:12:03 (863 KB/s) - 'cookie_all_basic.csv.zip' saved [35739382/35739382]

ipagg_all.csv.zip               100%[======================================================>] 112.23M  1.05MB/s   in 2m 34s s

2015-06-28 22:13:57 (747 KB/s) - 'ipagg_all.csv.zip' saved [117684953/117684953]

id_all_ip.csv.zip               100%[======================================================>] 225.42M   876KB/s   in 3m 55s s

database.sqlite.zip               4%[=>                                                     ] 162.76M   738KB/s   eta 78m 35s2015-06-28 22:15:18 (982 KB/s) - 'id_all_ip.csv.zip' saved [236366458/236366458]

id_all_property.csv.zip         100%[======================================================>] 356.89M  1.53MB/s   in 4m 53s s

2015-06-28 22:16:16 (1.22 MB/s) - 'id_all_property.csv.zip' saved [374222833/374222833]

database.sqlite.zip             100%[======================================================>]   3.35G  1.59MB/s   in 39m 2s s
2015-06-28 22:50:25 (1.46 MB/s) - 'database.sqlite.zip' saved [3594725459/3594725459]

「The Platform : IT企業はなぜ世界を変えるのか」を読んだ

ザ・プラットフォーム:IT企業はなぜ世界を変えるのか?

ザ・プラットフォーム:IT企業はなぜ世界を変えるのか?

いつも思うことだけど、GoogleAppleFacebookTwitterがない世界を想像するのがもはや困難になってしまった位に生活の基盤になった。また、日本ではまだ定着したとは言えないけれど、AirbnbやUberなどのSharingサービスや、CourseraなどのMOOCも徐々に基盤になりつつある。日本ということで考えると、DeNAGREEなどのソーシャルゲームCookpadなどの料理検索、LINEやInstagramなどのコミュニケーションサービスもすでに生活の基盤になってる。 さてこれから先はどんなサービスが基盤になるのか?個人的には、ARやVRが情報可視化の基盤として定着するのではないかなと思ってる。使い勝手の良いウェアラブルHWが出ればという条件があるけれど。

numpy, scipy, sklearnを駆使してBag of Visual Words

bag of visual wordsは多くの場面で出てくるのでさくっと使えるようにしておきたい。numpyとscipyをsklearnを使えば、とても簡単に使えるので流れをまとめておくことにします。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import scipy.cluster.vq as vq
from sklearn.datasets import load_digits
from sklearn.cross_validation import train_test_split


def main():
    digits = load_digits()
    print digits.data.shape # (1797, 64)

    # split digits data
    X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)

    # computing the visual words
    K = int(np.sqrt(digits.data.shape[0]/2))
    codebook, distortion = vq.kmeans(X_train, K)
    print codebook

    # computing the histogram of visual words
    code, dist = vq.vq(X_test, codebook)
    vw_hist, bin_edges = np.histogram(code,
                                      bins=codebook.shape[0],
                                      normed=True)
    print vw_hist

if __name__ == '__main__':
    main()

といっても、やってることはscipyのvq.kmeansでcodebookを作成、作ったcodebookを元にvq.vqとnumpyのhistogramでbovwベクトルを作成するだけです。ほんとに簡単でした。

CVPR2015の採択論文タイトルのWordCloud

CVPR 2015 Webpage

CVPR2015のProgramがアナウンスされているみたいなので、論文のタイトルをスクレイピングしてWord Cloudを作ってみました。

論文のタイトルはpupを使って取得しました。Oralの発表者がPosterも発表するケースもあるようなので、sortとuniqも入れてます。

$ curl -s http://www.pamitc.org/cvpr15/program.php | pup 'td > b:first-child' text{} | sort | uniq > cvpr2015papers.txt

pupの書き方についてはこちらを参考にしました。

mattn.kaoriya.net

pythonのWordCloudライブラリを使って作成します。最初に作ったWord Cloudは真ん中にでかく"Image"となっていたので、一つだけstopwordsに追加しています。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import os
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt


def main():
    d = os.path.dirname(__file__)
    DOC_NAME = "cvpr2015papers.txt"
    text = open(os.path.join(d, DOC_NAME)).read()

    # adding computer vision specific stopwords
    stopwords = STOPWORDS.copy()
    stopwords.add("image")

    wc = WordCloud(max_words=300, stopwords=stopwords, width=800, height=400)
    wc.generate(text)
    wc.to_file(os.path.join(d, "cvpr2015wordcloud.png"))

    plt.imshow(wc)
    plt.axis("off")
    plt.show()

if __name__ == "__main__":
    main()

WordCloudを使う時は、FONT_PATHを設定しておく必要があります。

$ export FONT_PATH=/Library/Fonts/Osaka.ttf

出来た画像はこのような感じです。

f:id:satojkovic:20150606231348p:plain

Word Cloudを眺める

まずDeepですが、Deepを含むタイトル数を調べてみると、

$ cat cvpr2015papers.txt | grep -i "deep" | wc -l
      57

全体が602件なので約10%がDeepを含んでいることになります。NeuralやNetwork, Convolutionalも大きく表示されていて、2015年も引き続きDeep Learning系は多そうですね。

それから、Videoも大きく表示されています。

$ cat cvpr2015papers.txt | grep -i video | wc -l
      47

Action RecogntionやEvent Detection、Video ClassificationをDeep Networkでというタイトルになっているものもあって、SingleフレームからMultipleフレームへもDeep Learningが対象を広げているのでしょうね。

3Dも同じ流れかも。

$ cat cvpr2015papers.txt | grep -i 3D | wc -l
      37

細かい所を見るともっと色々な視点で見れそうですが、Deep系はまだまだHotなTopicであることは間違いなさそうです。

参考

一応、使ったテキストファイルとスクリプトgithubにあげておきました。

github.com

Internetのインタフェース

融けるデザイン ―ハード×ソフト×ネット時代の新たな設計論

融けるデザイン ―ハード×ソフト×ネット時代の新たな設計論

これはGW前から読んでいた一冊。まだ読了していないけど、とても興味深かったのが「Internetのインタフェースをどうデザインするか」という箇所。

これを見て思い出したのが、MITの石井教授の「情報は流水で、デバイスは蛇口」の話とかnext.rikunabi.com

Google Glassとか、ちょっと古いけどSixth Senseなど。 www.ted.com

現状のインタフェースの問題は、スマホタブレットの普及のおかげで日常のあらゆる場面で情報を得ることは出来ても、情報を得て人間が行動し、問題を解決するところまでには至ってないところだとこの書籍では述べられていて、なるほどなと思いました。Apple Watchが発売されて、スマートウォッチ系がホットな話題になってますが、これも一歩進んだ情報の取得手段でしかなくて、アクチュエータ的なインタフェースになってないと考えると、それほどエポックメイキングなデバイスになっていないのではないかという説明が出来る気がしました。

やっぱり、スマートウォッチはまだ過渡期で、ウェアラブルというかユビキタスというか、その辺りを狙う一つのステップなんじゃないかというように思います。

大企業向けのリーンスタートアップ論

シリアル・イノベーター ─ 「非シリコンバレー型」イノベーションの流儀

シリアル・イノベーター ─ 「非シリコンバレー型」イノベーションの流儀

GWに一気読みしました。

この本の内容を一言で表すなら、「大企業向けリーンスタートアップ」。 顧客ニーズの理解と技術的解決策の探求を反復しながら、顧客の真の課題を再定義し、その課題に対してシンプルな解決策を再構成するというプロセスが、ブレークスルー型イノベーションを実現するための方法であるというのは、まさにリーンスタートアップ的な考え方だと感じました。 この本で一つ特徴的なのは、大企業における社内政治を考慮している点で、既存事業の維持と改善に大半のリソースが使われる組織を動かすには、他人を巻き込み賛同を得る、データで説得する、会社の戦略に適合させる努力をするなど、他部門まかせになりがちなプロセスも技術者が主体的に行わなければならないと述べられています。

新しい考え方ではないと思いますが、実例も多く記載されているので、自分の組織を思い浮かべながら、どうアレンジすればいいかと考えながら読んでみると、意外に新しい発見があるかもしれません。

プランクトン画像分類で1位になったチームの解説ブログのメモ(2)

benanne.github.io

プランクトン画像分類で1位を取ったチームの解説ブログを読み進めました。 今回は、ネットワークアーキテクチャの所。

Kaggleで1位を取るためには、これくらいの改良をする必要があるんですね...勉強になります。

Network architecture

  • OxfordNetに強くインスパイアされたアーキテクチャ
    • 最終的には16層のNNで構成
      • 6層から始めて、精度向上を確かめながら1層ずつ追加
    • 補足: OxfordNet
      • Input: 224x224, RGB
        • 前処理でRGBの平均値を各ピクセルから引いておく
      • conv layer: 3x3. strideは1ピクセル. 出力は入力と同サイズ.
      • pooling layer: 5つのmax pooling層. 2x2. strideは2ピクセル
      • fully connected layer: 4096チャネルが2層と1000チャネルが1層
      • softmax layer
      • 隠れ層は全部ReLU
  • Cyclic pooling
    • 概要
      • 回転に対する不変性を獲得するため
      • 0度, 90度, 180度, 270度の4種類の回転を適用した画像
      • 4画像を並列処理、出力される特徴マップをpooling(4-way cyclic pooling)
    • 実装は効率的
      • 4種類の回転処理に内挿は不要
    • バッチサイズを4分の1に削減
    • root-mean-square poolingが一番よい結果
      • mean poolingとmax poolingと比較して
    • 8-way cyclic poolingも実施
      • 0度, 45度の入力画像を生成
      • 8-way cyclic pooling + dihedral poolingはうまくいかなかった
  • Rolling feature maps
    • 4-way cyclic poolingで出力された特徴マップを結合、次層の入力とする
    • 結合操作をroll operationと呼ぶ
      • 0+90+180+270, 90+180+270+0, 180+270+0+90, 270+0+90+180
    • 結果として実際の4倍のFilterを持つことに相当する
    • CUDAとTheanoをPyCUDAで連携させて実装
    • roll operationなしでcyclic poolingを含むNetworkは可能だが、cyclic poolingなしでroll operationを含むNetworkは出来ない
  • Nonlinearites
    • leaky ReLUsを使うと最も良い結果が得られた
      • y = max(x, a*x)
      • aはスケール係数で0にすれば通常のReLU
      • 最終的にa = 1/3とした
  • Spatial pooling
    • 最終的にpooling層は4つ使用した
    • 2x2のmax-poolingからトライしたが、最終的には3x3でstride2(3x3s2)のmax-poolingを使った
      • 計算コストを大きく上げることなく、大きいサイズの入力画像を使うことができた
        • 5x5の特徴マップを得るのに4層の2x2のmax-poolingだと入力画像サイズは80x80
        • 3x3s2のmax-poolingだと95x95で同じ5x5の特徴マップを得ることが出来る
  • Multiscale architectures
    • 画像サイズに基づいてリスケールした入力画像を使うネットワークと、固定係数でリスケールした入力画像を使う小さいネットワークとの組み合わせがベスト
  • Additional image features
    • 画像特徴を抽出して入力とするネットワークを学習
      • softmax層の手前で結合するので'late fusing'と呼ぶ
    • 試した特徴の例(太字は最終的に使用した特徴)
      • Image size in pixels
      • Size and shape estimates based on image moments
      • Hu moments
      • Zernike moments
      • Parameter Free Threshold Adjacency Statistics
      • Linear Binary Patterns
      • Haralick texture features
      • Feature from the competition tutorial
      • Combinations of the above
    • 太字の3つの特徴は精度向上に際立っていた
  • Example convnet architecture
    • convolution層: 10
    • fully connected層: 3
    • spatial pooling層: 4
    • 入力: (32, 1, 95, 95) = (batch size, num of channels, height, width)
    • 出力: (32, 121) = 121クラスに対する確率
Layer type Size Output shape
cyclic slice(回転でbatch size4倍) (128, 1, 95, 95)
convolution 32 3x3 filters (128, 32, 95, 95)
convolution 16 3x3 filters (128, 16, 95, 95)
max pooling 3x3, stride 2 (128, 16, 47, 47)
cyclic roll(回転でchannel数4倍) (128, 64, 47, 47)
convolution 64 3x3 filters (128, 64, 47, 47)
convolution 32 3x3 filters (128, 32, 47, 47)
max pooling 3x3 stride 2 (128, 32, 23, 23)
cyclic roll (128, 128, 23, 23)
convolution 128, 3x3 filters (128, 128, 23, 23)
convolution 128, 3x3 filters (128, 128, 23, 23)
convolution 64, 3x3 filters (128, 64, 23, 23)
max pooling 3x3 stride 2 (128, 64, 11, 11)
cyclic roll (128, 256, 11, 11)
convolution 256, 3x3 filters (128, 256, 11, 11)
convolution 256, 3x3 filters (128, 256, 11, 11)
convolution 128, 3x3 filters (128, 128, 11, 11)
max pooling 3x3 stride 2 (128, 128, 5, 5)
cyclic roll (128, 512, 5, 5)
fully connected 512, 2 piece maxout units (128, 512)
cyclic pooling(4方向の特徴マップを統合) (32, 512)
fully connected 512 2 piece maxout units (32, 512)
fully connected 121-way softmax (32, 121)