IBM WatsonのVisual Recognitionの独自クラスで画像認識する (Python)

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