stMind

about Tech, Computer vision and Machine learning

Stand on the words of giants

「世界」を変えろ!  急成長するスタートアップの秘訣

「世界」を変えろ! 急成長するスタートアップの秘訣

色々なスタートアップの創業者達へのインタビュー本。日本でも馴染みのあるFlickrやLinkedinなどは創業者の名前も知っていましたが、それ以外はサービス名自体が初めて聞いたような人ばかりで、少々イメージがしづらい所があります。 それでも、何かを成し遂げた人たちの言葉は、考え方の新しい指針になるような示唆に富んでいると思います。幾つかを紹介すると、

アイデアに取り掛かるのに一番良いタイミングは、その正しさが自明ではないときです。 リード・ホフマン, Linkedin 創業者  
失敗とは、取り組むべき問題を発見する過程の一部です。 
カテリーナ・フェイク, Flickr 創業者
古い間違いではなく、新しい間違いを犯すこと。 
アデオ, ザ・ファンデッド(TheFunded.com) 創業者

読んでみると、何かしら気づきがあるかも?

「駐輪場」を検索する

no bikers

クロスバイクを初めて手に入れて、時間があったら自転車に乗って出かけたいと思ってます。そこで困ること第一位は、駐輪場。じゃあってことで、Googleで「駐輪場」と検索してみると近くの駐輪場がいくつか出てきます。よしっと思って行ってみると満車… しょうがないのでもう一つ別の場所に行ってみると、こちらも満車… また別の所に行ってみると平日のみの営業とか、既にサービス終了してるとか、一発で探し当てるのはなかなかハードです。

考えてみると、駐輪場の場所だけでは情報としては不十分で、空いてるかどうかを知りたいわけです。リアルタイムに空き状況を計測して利用者に提示する駐車ガイダンスシステム(Parking Guidance System)は車向けで既に使われてますが、自転車向けにもこういうのが欲しいですね。

海外ではどうだろうと思って調べてみると、ユトレヒトで世界で初めてサービスを開始したというニュースを見つけました。

Bicycle Parking Guidance System in Utrecht | BICYCLE DUTCH

P-route bicycleというシステムで、駐輪場に設置されたセンサーで空き数を計測し、ネットワークを経由して市内各所にあるデジタル掲示板に計測された空き数をリアルタイムに表示するシステムです。空き状況がリアルタイムでわかるし、駐輪場まで行かなくても空きが確認できるので、ほんとに便利そうです。日本にも導入されないかな。

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