前回、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など色々返却されるデフォルトのほうがなんとなく優秀そうな。。。学習量を増やした場合、精度どのくらいあがるかなど、もう少し検証したいと思います。