Background
探し物をしていたら、SVMのサイトに行き着いて、ちょうどソースが公開してあったので、試してみた。
眼鏡かけている人と眼鏡かけていない人の分類だった。
Summary
- 見つけたサイトを真似してR言語でSVMを使った分類してみた。(e1071)
- R言語の画像処理ライブラリ(biOps)が古くなっていてCRANから外れていた。(でも動かせた)
- オリジナルのソースの一部に不具合?があった。でも、あれこれやったら直った。
- 画像の集め方は、Windows版のフリーソフトが簡単
感想
- 正解率 74% 画像の選び方など、あまり丁寧にやっていないけど、簡単なプログラムで、これだけできるってすごい。
- R言語でちゃんとしたスクリプトを動かすのは初めてだったので、いろいろ遠回りして勉強にはなった。
- 有名なライブラリがCRANから外れている。Rの書籍などでも使われているので、困る初学者が多そう。
- 画像の収集、以前はGoogleのAPIとかで自由にできたみたいだけど、今はImageSpider(Windows版のフリーソフトが簡単)
- R、遅い。でもライブラリやドキュメントは豊富。使い道次第。
References...1つだけ読むなら
Details
RとRStudioをインストール。
ソースをダウンロード。Reference 2 (Github)からソースをダウンロード。Rのファイル一つだけなので、直接Rstudioに貼り付けた。
環境は以下
R version 3.3.0 (2016-05-03) -- "Supposedly Educational"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)
RStudio
Version 0.99.902 – © 2009-2016 RStudio, Inc.
ライブラリのインストール。
ライブラリが入っていなかったので、インストール。
e1071はCRANからインストールできたが、biOpsはメンテナンスされていないようで、CRANから外されていた。archiveにはtarballがあったので、それをインストール
(結局)Rのバージョンが上がって、古いライブラリが使えなくなったようだ。
画像用ディレクトリ作成
Reference 1に書いてあったが、画像ファイルがないので、そのままでは動かない。画像だけじゃなく、ディレクトリ構造もわからない。ソースを見ながらmkdir
ディレクトリ構造。
.
├── bin
├── data
│ ├── glasses
│ ├── no_glasses
│ ├── sample_glasses
│ └── sample_no_glasses
└── glasses_classifier.R
とにかく動かしてみる(その1)
> library(e1071)
警告メッセージ:
R graphics engine version 11 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed.
対応方法はわからないので、気にせず、そのまま進む。
とにかく動かしてみる(その2)
‘cross’ must not exceed sampling size!
サンプル数が10以上ないとエラーになるらしい。
http://www.datasciencecentral.com/profiles/blogs/svm-in-practice
画像を集めてきて、先に進む。
ImageSpiderというWindows版フリーソフトがオススメ。
wgetとか、GoogleやBingのAPIとかより簡単。
http://www.vector.co.jp/soft/winnt/net/se425690.html
とにかく動かしてみる(その3)
エラーが出た。
TuneSVM(dataset, kRoughGammaRange, kRoughCostRange)
svm.default(x, y, scale = scale, ..., na.action = na.action) でエラー:
外部関数の呼び出し (引数 10) 中に NA/NaN/Inf があります
追加情報: 50 件以上の警告がありました (最初の 50 個の警告を見るには warnings() を使って下さい)
いろいろ探し回った結果、元のスクリプトの一部に不足があったみたい。
作者さんのところでは動いていたのかもしれないけど、自分の環境では動かなかった。
オリジナル: tunecontrol = tune.control(sampling="cross", nrow(dataset))
修正 : tunecontrol = tune.control(sampling="cross", cross = nrow(dataset))
Githubにライセンス表示がなかったので、問題の箇所だけ。
https://github.com/Salinger/glasses_classifier/blob/master/glasses_classifier.R
結果
パラメータ | 正解率(%) |
---|---|
デフォルト | 72.9 |
グリッドサーチ(粗) | 74.9 |
グリッドサーチ(細) | 73.6 |
画像の選び方など、あまり綺麗に統一していないのも一因かな?
簡単なプログラムで、これだけできるってすごい。