HPE Blog, Japan
1755006 メンバー
3789 オンライン
108828 解決策
新規ポスト
ayonekura

AI/IoT Data Pipline Lab - Google Cloud Visual Inspection AIを使用した外観検査ソリューションの検証 ~ モデル展開編

AI/IoT Data Pipline Lab - Google Cloud Visual Inspection AIを使用した外観検査ソリューションの検証 ~ モデル評価編 」では、Visual Inspection AI作成した外観検査用モデルを評価する方法ついてお伝えしました。本稿では、Visual Inspection AIで作成したモデルを自身の環境に展開します。Visual Inspection AIのモデルはコンテナ形式でエクスポートされます。コンテナ動作環境があればどこで動作させることが可能です。そこで、Dockerがインストールされている環境でモデルコンテナを起動し、画像データから良品と不良品を推論してみます。

モデルの展開モデルの展開

 

展開用モデルコンテナの作成
自身の準備する環境にモデルを展開するため、モデルをエクスポートします。モデルの評価の際にテスト用にモデルをエクスポートしましたが、同様の手順で展開用にモデルをエクスポートします。モデルの評価時と同様にVisual Inspection AIの[Models]メニューから[Test&Use]の画面を開き、[CREATE SOLUTION ARTIFAC]をクリックします。

展開用モデルのエクスポート展開用モデルのエクスポート
[Usage Type]は[Deployment]を選択してください。
 
展開用モデルのパラメータ展開用モデルのパラメータ
[Container type]では、[GPU Container]が選択できるようになっています。GPUを搭載したサーバ上で動作させる場合はこちらを選択できます。
GPUを利用する場合GPUを利用する場合
画面の指示に従って操作します。数分で実行環境で動作可能なモデルコンテナが作成されます。Purpose]列がDeploymentであるコンテナが作成されます。鉛筆マークをクリックするとモデルコンテナの情報が表示されます。
モデルコンテナの一覧モデルコンテナの一覧
[Container Registry Location]をメモしておきます。
コンテナ情報の表示コンテナ情報の表示

 
Docker環境へのモデルの展開
続いて、Dockerがインストールされた環境にモデルコンテナを展開します。同環境にはgcloudコマンドツールもインストールされており、Google Cloudを操作するために必要な認証等の設定は実施済みの環境となります。
gcloudを使用して Container Registry へのリクエストを認証するように Docker を構成します。

 

 

 

 

 

 

$ gcloud auth configure-docker
Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
After update, the following will be written to your Docker config file located at [/root/.docker/config.json]:
 {
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

Do you want to continue (Y/n)?  Y

Docker configuration file updated.​

 

 

 

 

 

 

検証ではモデルコンテナの保存先として、検証当時のデフォルトの選択肢となっていたContainer Registryを指定していますが、Contaire Registryは今後Artifact Registryに移行していく予定となっています。
モデルコンテナを起動します。起動するコンテナイメージとして、メモしたContainer Registry Locationを指定します。

 

 

 

 

 

 

# docker run --rm -d --name cosmetic-prediction --publish=8602:8602 --publish=8603:8603 <Container Registry Location>
# docker ps
CONTAINER ID   IMAGE                                                                             COMMAND                  CREATED         STATUS         PORTS                                                                     NAMES
04d09993b783   <Container Registry Location>                                              "/google/visual_insp…"   3 seconds ago   Up 2 seconds   8601/tcp, 0.0.0.0:8602-8603->8602-8603/tcp, :::8602-8603->8602-8603/tcp   cosmetic-prediction

 

 

 

 

 

 

起動したモデルコンテナにhttpでアクセス(POST)すると推論結果を取得できるようになっています。画像データをBase64でエンコードし、リクエスト用のjsonファイルを作成します。

 

 

 

 

 

 

$ base64_image=`cat <画像データ> | base64 -w 0`
$ # 例) base64_image=`cat kekkan.jpg | base64 -w 0`
$ cat <<EOF > request.json
{
   "image_bytes": "$base64_image"
}
EOF

 

 

 

 

 

 

curlコマンドでアクセスして推論結果を取得してみます。推論結果には、欠陥箇所を予測した画像データなどや、予測における信頼度の情報が取得できます。

 

 

 

 

 

 

$ curl -X POST -H "Content-Type: application/json" -d '@request.json' http://localhost:8602/v1/visualInspection:predict | jq .
{
  "predictionResult": {
    "annotationsGroups": [
      {
        "annotationSet": {
          "name": "projects/456322257564/locations/us-central1/datasets/2696163040004407296/annotationSets/3281272550771916800",
          "displayName": "Predicted Masks Regions",
          "mask": {},
          "createTime": "2022-11-02T15:37:39.721414Z",
          "updateTime": "2022-11-02T15:37:39.721414Z"
        },
        "annotations": [
          {
            "name": "localAnnotations/1",
            "annotationSetId": "3281272550771916800",
            "mask": {
              "confidenceMask": {
                "imageBytes": "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"
              },
              "categoryMask": {
                "imageBytes": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAIUCAIAAACCRSFiAAAEuElEQVR4Xu3czVHDMBCA0UA5lEUjDI1QFvWQUwbkYMvy32r13tGTiR0d9oucjG83AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEjtpTwAw3j/eCsP/fX1+V0eAk4hTiP6PZRHmL+LEWowwrrBhcRpFKsGdKeTd9Vn3FGnywWRiVN+u4/sxVn8OOPiK6d2v9qTNXxkYEqckut91ndKomAjccpMmS6kT7CFOKWlTBFIFLQRp5yUKQ59ggbilI0sBaRPsNZreQAAriZOcDjbWVjLbb1UDMHI3NyDenZOAIQjTnAS+1qoJ04AhCNOcBK/OUE9cQIgHHECIBxxAiAccQIgHHGCM/g3BKwiTqmYgEAO4pSNPgEJeLZeTh5GEIpvDLCWnRMcS5mggZ1TWjZP/5nWolirxws2ruH0REAlccps42ztRdGSI5LQtpJHXAkMQpySa5uqwV0+9GtW9fKLhK6JU341kzSysFN+ZmHDXjP0QpyGMDNGIzDKgYI4jSJUn9QImCdOYzk0UffkTN9fh4AG4jSiaUKe0hUArnePVmW3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAON4PMShoJZW+TYcAAAAASUVORK5CYII="
              },
              "annotationSpecColors": [
                {
                  "annotationSpecId": "1617265605981765632",
                  "color": {
                    "red": 0.384313732,
                    "green": 0.498039216,
                    "blue": 0.164705887
                  },
                  "annotationSpecDisplayName": "paint"
                },
                {
                  "annotationSpecId": "5449828888874057728",
                  "color": {},
                  "annotationSpecDisplayName": "none"
                }
              ]
            },
            "source": {
              "type": "MACHINE_PRODUCED",
              "sourceModel": "projects/456322257564/locations/us-central1/solutions/2564201853461987328/modules/5751290238198611968/models/4876166943419138048"
            }
          }
        ]
      },
      {
        "annotationSet": {
          "name": "projects/456322257564/locations/us-central1/datasets/2696163040004407296/annotationSets/3339819345927733248",
          "displayName": "Predicted Classification Labels",
          "classificationLabel": {},
          "createTime": "2022-11-02T15:37:39.819629Z",
          "updateTime": "2022-11-02T15:37:39.819629Z"
        },
        "annotations": [
          {
            "name": "localAnnotations/0",
            "annotationSpecId": "1555904061058842624",
            "annotationSetId": "3339819345927733248",
            "classificationLabel": {
              "confidenceScore": 0.709148288
            },
            "source": {
              "type": "MACHINE_PRODUCED",
              "sourceModel": "projects/456322257564/locations/us-central1/solutions/2564201853461987328/modules/5751290238198611968/models/4876166943419138048"
            },
            "annotationSpecDisplayName": "defect"
          }
        ]
      }
    ]
  },
  "predictionLatency": "1.829452973s"
}

 

 

 

 

 

 

categoryMaskのimageBytesを復元してみると以下のような画像となっており、元画像と比較してみると白いマジック部分が緑色になっていて、欠陥と認識されたことがわかるかと思います。

 

 

 

 

 

 

 画像データのデコード
$ echo iVBORw0KGgoAAAANSUhE...<省略>...AAAAAAAAAAON4PMShoJZW+TYcAAAAASUVORK5CYII= | base64 -d > categoryMask.jpg

 

 

 

 

 

 

kekkan.jpgkekkan.jpg

categoryMask.jpgcategoryMask.jpg

まとめ
今回は、展開用にモデルをエクスポートし、Dockerがインストールされた環境でモデルを起動しました。また、起動後、httpでアクセスし画像データの推論を実施してみました。推論結果として欠陥箇所が示された画像を取得できることが確認できました。
 
関連リンク
  • AI/IoT Data Pipline Lab - Google Cloud Visual Inspection AIを使用した外観検査ソリューションの検証
  1. 概要編
  2. モデル作成編
  3. モデル評価編
  4. モデル展開編 (本稿)
  5. エッジ展開編
  6. 制御システム連携編

 

0 感謝
作者について

ayonekura

Solution Architects, Container and Cloud