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ベクトルを作成するだけです。ほんとに簡単でした。