はじめに
タイトルの通りです.
※python版はBluemixでWatson API のVisual Recognition を使う by python
を参照.
構成は下記の通りです.
- サーバ:Bluemix上でVisual Recognitionのサービスをインスタンス化する
- クライアント:コマンドラインから
curl
コマンドで学習と判別を行う
基本的には下記チュートリアルを参照しました.
Bluemix アカウントはトライアル版です.Bluemixにログインをした状態からスタートします.
手順
Visual Recognition のサービスを準備する
-
Visual Recognitionサービスをインスタンス化する.アプリとのバインドをしないこと.ここでバインドすると資格情報をここで取得できない.
-
資格情報を確認するために,サービスの画面に遷移する.迷子になっても必ずアクセスできるように,ダッシュボードからインスタンス化したVisual Recognitionサービスを選択するフローを示しておく.
ユーザが用意した画像で学習させる
- ポジティブ画像群を***{positive_images}.zip***で保存する.
- 名称は任意でよい.
- 保存場所はローカルで良い.
- 今回はチュートリアル参考にbeagle.zip,husky.zip,golden-retriever.zip を保存した.
- ネガティブ画像群を***{negative_images}.zip***で保存する.
- 名称は任意でよい.
- 保存場所はローカルで良い.
- 今回はチュートリアル参考にcats.zip を保存した.
- 下記書式に従って学習コマンドを実行する
- 書式
-
curl -X POST -F "classname_positive_examples=@{positive_images}.zip" -F "negative_examples=@{negative_images}.zip" -F "name={classifier_name}" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers?api_key={api-key}&version=2016-05-20"
- {positive_images}.zip: ポジティブクラスの画像群を格納したzipファイル.ローカルであれば相対パスでも絶対パスでも良い.クラウド上に保存されたファイルならURLを指定する.クラスは複数指定できる.
-
classname にクラス名が入る.
- 各クラスの接尾詞である"_positive_examples"と"_negative_examples"は固定.
- {negative_images}.zip:ネガティブクラスの画像群を格納したzipファイル.
- {classifier_id}:分類器id
- {api-key}:先に取得したapi-key名
- versionを入れないと動かない.
-
- 例(チュートリアルを参考)
curl -X POST -F "beagle_positive_examples=@beagle.zip" -F "husky_positive_examples=@husky.zip" -F "goldenretriever_positive_examples=@golden-retriever.zip" -F "negative_examples=@cats.zip" -F "name=dogs" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers?api_key={api-key}&version=2016-05-20"
- 画像ファイル群はカレントディレクトリに保存されているものとする.
- 結果を確認する.
- 分類器のidや,クラスの種類等学習機に関わるパラメータが出力されたら,学習完了.
{
"classifier_id": "dogs_xxxxxxxxxx",
"name": "dogs",
"owner": "xxxx-xxxxx-xxx-xxxx",
"status": "training",
"created": "2016-xx-xxTxx:xx:xx.xxxZ",
"classes": [
{"class": "husky"},
{"class": "goldenretriever"},
{"class": "beagle"}
]
}
ユーザ学習によるカスタム分類器を利用する
- 下記内容を
myparams.json
として保存する.
-
{ "classifier_ids": ["dogs_xxxxxxxxxx", "default"] }
-
"dogs_xxxxxxxxxx"
は,先の処理で取得した"classifier_id"
と対応させる. -
"default"
は元々Visual Recognitionが持っている分類器のid. - こうして指定することで,複数の分類器の結果を得られる.
-
- 認識させたい画像を用意する.
- 名称は任意でよい.
- 保存場所はローカルで良い.Web上の画像でも良い.
- 今回はチュートリアル参考にbdogs.jpgを保存した.
- 認識させたい画像をカスタム分類器に送信し,学習結果と照合させる.
- 書式
curl -X POST -F "images_file=@{image}.jpg" -F "parameters=@myparams.json" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key={api-key}&version=2016-05-20"
-
myparams.json
はカレントディレクトリに保存されているものとする.
- 例(チュートリアルを参考)
curl -X POST -F "images_file=@dogs.jpg" -F "parameters=@myparams.json" "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key={api-key}&version=2016-05-20"
- 結果を確認する.
- 前半は元々Visual Recognitionが持っている分類器("classifier_id": "default")による結果.
- "animal", "mammal", "dog"
- 後半はカスタム分類器("classifier_id": "dogs_xxxxxxxxxx")による結果.
- "goldenretriever"
{
"images": [
{
"classifiers": [
{
"classes": [
{
"class": "animal",
"score": 1.0,
"type_hierarchy": "/animals"
},
{
"class": "mammal",
"score": 1.0,
"type_hierarchy": "/animals/mammal"
},
{
"class": "dog",
"score": 0.880797,
"type_hierarchy": "/animals/pets/dog"
}
],
"classifier_id": "default",
"name": "default"
},
{
"classes": [
{
"class": "goldenretriever",
"score": 0.610501
}
],
"classifier_id": "dogs_xxxxxxxxxx",
"name": "dogs"
}
],
"image": "dogs.jpg"
}
],
"images_processed": 1
}
おわりに,その他
- Bluemix上でVisual Recognitionサービス単体を使うだけなら,
curl
コマンド経由でサクッと学習できることが分かりました. - curl以外のAPI経由で学習もしてみたい.
- Visual Recognition API Reference
- クライアントは,Curl, Node.js, Java, Python が対応しているらしい.
- 既存のランタイムと連携できていない.
- visual-recognition-nodej をバインドさせて実行させようとしても,実行できない.状態は不明となる.良く分からない.
- Eclipseとの連携もうまくいかない.チュートリアルを読んでやっているが,書かれた通りの挙動にならない.Bluemix DevOpsでしかうまく行っていない.
- Bluemixのチュートリアルや勉強会資料が沢山あるのはありがたいです.ただ,情報が発散して何をどの順番に読めばよいのか分からなかったり,資料の途中で分からない概念の言葉が出てきてそれを調べるのにまた時間がかかったり,チュートリアルの通りにやってもその通りの挙動にならなかったり,結構躓いています….
- 私がWebプログラミング初心者で力不足だからなのは100で認めるのですが,ラピッドコーディングができることがメリットではあるはずのBluemixのチュートリアルを完了させるまでの環境整備にかなり時間を費やしていて悲しくなるときもありました….