stMind

about Tech, Computer vision and Machine learning

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)

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

プランクトン画像分類でトップを取ったチームが、自分たちが採用した手法を解説したブログエントリーを 書いてくれています。

benanne.github.io

今回のコンペはフォーラムを読む英語力と、そこで公開されてたcxxnetをビルドする根気があれば、 それだけでそこそこの順位に位置することが出来たんですが(半分より上くらい)、 そこから上位に行こうと思うと当然、機械学習の実践的な知識と実装力が必要になってきて、 初期設定に対してちょちょっとデータ増やしただけではどうにも順位が上がらなかったです。

1位となるような手法は何が違うのかなといった所はかなり興味深い所なので、 読んだことをメモしておきます。 結構長いので、まずはPre-processing and data augmentationまでを。

  • Introduction
    • Software and Hardware
      • numpy
      • theano
      • cuDNN
        • CUDA Deep Neural Network library
      • pyCUDA
      • Lasagne
      • scikit-image
        • for preprocessing and data augmentation
      • ghalton
        • quasi random number generator
      • GPU
        • NVIDIA GTX980, GTX680, Tesla K40
  • Pre-processing and data augmentation
    • Pre-processing
      • Rescaling
        • プランクトン画像のサイズはバラバラなので重要
        • 固定サイズ化
      • Zero Mean Unit Variance
      • プランクトンのサイズ推定
        • image momentsを使って推定
        • Rescalingに使ってみたが結果は変わらず
        • ただし、分類の時の特徴量として使ってみたら結果が良くなった(後述)
      • Data augmentation
        • データセットのサイズを大きくする
        • アフィン変換の手法を適用
          • rotation: 0-360度の間でランダム(一様)
          • translation: -10から10ピクセルの間でランダム(一様)
          • rescaling: 1/1.6から1.6の間でランダム(対数一様)
          • flipping: する or しない(ベルヌーイ)
          • shearing: -20度から20度の間でランダム(一様)
          • stretching: 1/1.3から1.3の間でランダム(対数一様)
        • realtime augmentation
          • 学習フェーズで実行する
          • CPUで実行(学習はGPU
        • パフォーマンスが改善しなかったこと
          • elastic distortion
          • gaussian distribution
            • uniformから変えてみたが結果は改善されず

cxxnetでKaggleのプランクトン画像分類に取り組んだ話

www.kaggle.com

最終結果は286th / 1049でした。

f:id:satojkovic:20150318224423p:plain

今回、初めてKaggleのコンペティションに参加しましたが、やってみて思ったことを書き留めておきます。

  • Forumに投稿されているDeep LearningベースのStarter Codeを使うことでそこそこの順位に位置することが出来る
    • エラーが出てビルド出来ないよ!って言ってる人もたくさんいるので、ビルド&実行して結果をSubmit出来るだけでもDeep Learningではない手法よりも上位にいける
    • ただし、Deep Learningの手法同士の競争はむしろそこから
  • 次のアプローチとしてデータ増強(Data Augmentation)をまずはやってみると良さげ
    • 自分がやったのは、画像の上下、左右フリップ
    • 回転もやってみたが、むしろ順位は下がってしまった
    • Kaggle CIFAR-10の話 - デーが参考になった
    • Forumにも同じ話題があるので
  • GPU必須
    • 最初、自分のMacbookProで実行していたけれど、データ増強で学習画像数を増やせば増やすほど時間がかかってやってらんない
    • cxxnetはGPUで実行するオプションがある
    • GPUのマシンとか持ってなければ、AWSのEC2にNVIDIAが用意しているGPUインスタンスがあるのでそれを使うと良い
    • 1日以上かかっていたのが、1、2時間で学習できるようになった

とかやってたら、Yosemiteをアップデートしたタイミングで、起動しなくなるというトラブルに見まわれ、 復旧に時間がかかってこれ以上は出来ませんでした(若干言い訳)。

一応Starter Codeの素の状態で1.382285ということなんで、0.3くらいのスコア改善は出来たかなという感じです。

参考資料

今回のコンペティションで1位を取ったチームのまとめエントリーがありました。

benanne.github.io