開発環境
- macOS 10.13
- Swift4
- XCode9
- Python2.7
今更ですが、coremlでの画像認識をsvm形式のmodelで試してみました。
ここでは、元となるmodelを作るまで。
学習データ
手書き数字データを公開しているWebサイトから学習用イメージを取得して、それをsvm形式のモデルに変換するのだけど、やり方については、僕はこの本のやり方で.modelファイルを作りました。
JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
手順を書けば
1. THE MNIST DATABASEからtrain-images-idx3-ubyte.gzをダウンロード
2. train-images-idx3-ubyteをCSVに変換
やり方は本を読むかネットで調べてください。
3. そのCSVからSVM形式のファイルを作る
SVM形式は以下のフォーマットになっている。
<label> <index1>:<value1> <index2>:<value2> <index3>:<value3> ...
mnistのデータは28x28のモノクロ画像なので、28x28=784の行列が色の明暗が0〜255で現れている。
本では明暗を255で割って0〜1で表現している。
例えば5を表すsvm形式のデータは以下のようになる(valueの値は適当)
5 0:0 1:0.12345 2:0.2344 3:0 ...
注意するのは、valueが0のものは省略出来る。省略した方がファイルのサイズが小さくなるが、一つの数字の行列の数がバラバラになり、今回作るmlmodelとしてはうまく動かないかもしれないので、省略せずに作る事
これも実際の作り方に関しては本を読むかネットで調べて欲しい。
4. libsvmをダウンロードしてコンソールから使えるようにする
#ダウンロードしたlibsvmフォルダ内で
$ sudo make
$ cd python
$ sudo make
楽するなら、libsvmコマンドのエイリアスを作っておくと便利
5. svm-trainでsvmファイルからmodelを作る
$ svm-train train.svm train.model
出来たmodelの内容の先頭はこんな感じ
svm_type c_svc
kernel_type rbf
gamma 0.00127551
nr_class 10
total_sv 19625
rho -0.875385 -1.57898 -1.86108 -1.69481 0.0843436 -1.11201 -1.37594 -0.864901 -3.56646 -0.464904 -0.707754 -0.23612 0.590029 0.370307 -0.106454 -0.0409962 -0.255275 0.229151 0.622187 1.22355 1.48548 0.365479 0.791545 0.736575 0.112124 2.15981 1.73285 0.383973 0.693789 0.201564 1.14541 1.10034 -0.121608 1.22076 0.184059 -0.729355 -1.53266 -1.24009 -2.48586 -0.945167 -0.414781 -2.42301 0.181592 0.114848 -0.102643
label 5 0 4 1 9 2 3 6 7 8
nr_sv 2632 1098 1988 1171 2667 1999 2289 1451 1833 2497
SV
0 0 0 0 1 1 0 0 0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:0 15:0 16:0 17:0 18:0 19:0 20:0 2
これでモデルを用意できました。このモデルは他の言語でも利用出来ます。