前回、shellとCurlで利用してみましたが、今回はPythonで独自クラスを利用してみます。
shellとCurlのサンプルコード掲載投稿はこちら。
Visual Recognitionで画像認識する
shellとCurlでやったおさらいとなります。アカウントを作成し、APIキーを取得したら、classifyメソッドを利用して画像認識を行います。
画像識別するフルーツの画像
https://watson-developer-cloud.github.io/doc-tutorial-downloads/visual-recognition/fruitbowl.jpg
PythonでWatsonを利用するには、pipで”ibm-watson”モジュールをインストールします。
ibm-watsonモジュールをpipでインストール
# ibm-watsonをインストールする pip install --upgrade "ibm-watson>=4.1.0"
Python 画像認識 classify サンプルコード
import json from ibm_watson import VisualRecognitionV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator authenticator = IAMAuthenticator("{api keyを設定する}") visual_recognition = VisualRecognitionV3( version="2018-03-19", authenticator=authenticator ) visual_recognition.set_service_url( "https://api.us-south.visual-recognition.watson.cloud.ibm.com" ) with open("fruitbowl.jpg", "rb") as images_file: classes = visual_recognition.classify( images_file=images_file, accept_language="ja", threshold="0.6" ).get_result() print(json.dumps(classes, ensure_ascii=False, indent=2))
APIKEYとバージョンを指定して、VisualRecognitionインスタンスを生成します。
set_service_urlでエンドポイントのURLを指定します。
VisualRecognitionのclassifyのパラメータに以下を指定します。
- images_file・・・画像ファイル
- accept_language・・・言語
- threshold・・・しきい値(返却される分類のスコアの最低値)
classifyの実行結果
$ python classify.py { "images": [ { "classifiers": [ { "classifier_id": "default", "name": "default", "classes": [ { "class": "果実", "score": 0.788 }, { "class": "オリーブ色", "score": 0.973 }, { "class": "レモン・イエロー (色)", "score": 0.789 } ] } ], "image": "fruitbowl.jpg" } ], "images_processed": 1, "custom_classes": 0 }
結果が取得できました。レスポンスの各値については、公式ドキュメントをご参照ください。
公式ドキュメントURL
https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3?code=python#classify-images
Visual Recognitionで画像認識用の独自クラスを作成する
サンプルで記載されている犬の画像セット3つと猫の画像セット1つを利用して独自クラスを作成します。犬の画像はポジティブ、猫の画像はネガティブな学習データとして利用します。
画像URLは公式ドキュメントのページから取得できます。公式ドキュメントのURLはこちら。
Python 独自クラス作成 create_classifier サンプルコード
import json from ibm_watson import VisualRecognitionV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator def exec(): authenticator = IAMAuthenticator("{API KEYを設定する}") visual_recognition = VisualRecognitionV3( version="2018-03-19", authenticator=authenticator ) visual_recognition.set_service_url( "https://api.us-south.visual-recognition.watson.cloud.ibm.com" ) with open("beagle.zip", "rb") as beagle, open( "golden-retriever.zip", "rb" ) as goldenretriever, open("husky.zip", "rb") as husky, open( "cats.zip", "rb" ) as cats: model = visual_recognition.create_classifier( "dogs", positive_examples={ "beagle": beagle, "goldenretriever": goldenretriever, "husky": husky, }, negative_examples=cats, ).get_result() print(json.dumps(model, indent=2)) if __name__ == "__main__": exec()
API KEYを設定してVisualRecognitionインスタンスを生成し、サービスのURLを設定するところまでは、classifyメソッドと同じです。
学習用画像データが入ったzipファイルをwith openで展開します。カンマ区切りで繋げることで、4つのzipファイルを引数に渡します。
独自クラスを作るには、create_classifierメソッド作成します。第一引数には、nameを指定します。positive_examplesでは、犬のクラスを構成する画像ファイルをclassnameキーと一緒に指定します (”beagle”: beagle、”goldenretriever”: goldenretriever、”husky”: husky) 。negative_examplesには、猫の画像ファイルを指定してます。ネガティブ例にはクラス名の指定は不要です。
なお、 .jpgまたは.pngの画像ファイルが 1つのzipに最低でも10個必要で、最大数は10,000画像 または 100MBのようです。
create_classifierの実行結果
$ python create_classifier.py { "classifier_id": "dogs_113492332", "name": "dogs", "status": "training", "owner": "7b33a505-95fc-4f71-a419-17a78f96f78c", "created": "2019-12-28T21:19:02.872Z", "updated": "2019-12-28T21:19:02.872Z", "classes": [ { "class": "husky" }, { "class": "goldenretriever" }, { "class": "beagle" } ], "core_ml_enabled": true }
結果が取得できました。レスポンスの各値については、公式ドキュメントをご参照ください。
公式ドキュメントURL
https://cloud.ibm.com/apidocs/visual-recognition/visual-recognition-v3#create-a-classifier
独自クラスを利用するには最初のclassifyメソッドのパラメータに”owners=[“me”]”を追加します。
犬(ハスキー)の画像を独自クラスとデフォルトクラスとで、それぞれ画像認識してみます。
独自クラス classify 実行結果
{ "images": [ { "classifiers": [ { "classifier_id": "dogs_113492332", "name": "dogs", "classes": [ { "class": "husky", "score": 0.843 } ] } ], "image": "husky2.jpg" } ], "images_processed": 1, "custom_classes": 3 }
huskyクラスで、0.843という結果が返却されました。また、独自クラスの言語は日本語指定できないようです。
デフォルトクラス classify 実行結果
{ "images": [ { "classifiers": [ { "classifier_id": "default", "name": "default", "classes": [ { "class": "犬", "score": 0.98, "type_hierarchy": "/動物/哺乳類/肉食動物/イヌ/犬" }, { "class": "イヌ", "score": 0.887 }, { "class": "肉食動物", "score": 0.887 }, { "class": "哺乳類", "score": 0.887 }, { "class": "動物", "score": 0.982 }, { "class": "シベリアン・ハスキー", "score": 0.739, "type_hierarchy": "/動物/飼い慣らされた動物/犬/シベリアン・ハスキー" }, { "class": "飼い慣らされた動物", "score": 0.883 }, { "class": "灰白色", "score": 0.807 }, { "class": "緑がかった色", "score": 0.79 } ] } ], "image": "husky2.jpg" } ], "images_processed": 1, "custom_classes": 0 }
犬で0.98、何故かカタカナのイヌでも0.887、シベリアン・ハスキーが0.739、また色も識別できています。
ハスキーかどうかのスコア0.843>0.739と、独自クラスのほうが優秀だといえるのでしょうか。
しかし、犬が0.98など色々返却されるデフォルトのほうがなんとなく優秀そうな。。。学習量を増やした場合、精度どのくらいあがるかなど、もう少し検証したいと思います。