画像分析の認知スキル

画像分析スキルでは、画像の内容に基づいて、さまざまな視覚的特徴のセットを抽出できます。 たとえば、イメージからキャプションを生成したり、タグを生成したり、セレブリティやランドマークを特定したりできます。 この記事は、画像分析スキルのリファレンス ドキュメントです。 使用手順については、画像からのテキストや情報の抽出に関する記事を参照してください。

このスキルでは、Azure AI サービスの Azure AI Vision によって提供される機械学習モデルが使用されます。 画像分析は、次の要件を満たす画像で動作します。

  • 画像は、JPEG、PNG、GIF、または BMP 形式で表示されている
  • イメージのファイル サイズが 4 メガバイト (MB) 未満である
  • イメージのディメンションが 50 x 50 ピクセルよりも大きい値である

このスキルは、AI Image Analysis API バージョン 3.2 を使用して実装されます。 ソリューションで、そのサービス API の新しいバージョン (バージョン 4.0 など) を呼び出す必要がある場合は、Web API カスタム スキルを使用して実装することを検討してください。

Note

このスキルは Azure AI サービスにバインドされており、1 日にインデクサーあたり 20 ドキュメントを超えるトランザクションには課金対象リソースが必要です。 組み込みスキルの実行は、既存の Azure AI サービスの従量課金制の価格で課金されます。

さらに、画像抽出は Azure AI Searchによって課金

@odata.type

Microsoft.Skills.Vision.ImageAnalysisSkill

スキルのパラメーター

パラメーターの大文字と小文字は区別されます。

パラメーター名 説明
defaultLanguageCode 結果を返す言語を示す文字列。 サービスは、指定された言語で認識結果を返します。 このプロパティが指定されていない場合の既定値は "en" です。

サポートされている言語には、Azure AI Vision の 一般提供言語のサブセットが 含まれます。 AI Vision サービスに一般提供状態の言語が新しく導入されると、このスキル内で完全に統合されるまでに遅延が予想されます。
visualFeatures 結果として返すビジュアル フィーチャー型を示す文字列の並び。 有効なビジュアル フィーチャー型には以下があります。
  • adult - 画像がポルノ (裸や性行為を表している)、不快 (極端な暴力や流血を表している)、性的なものを想起させる内容 (わいせつなコンテンツ) かどうかを検出します。
  • brands - おおよその場所など、画像内のさまざまなブランドを検出します。
  • categories - Azure AI サービスで定義されている分類法に従って画像コンテンツを分類します。
  • description - サポートされる言語の完全な文章を使用して画像のコンテンツを説明します。
  • faces - 顔の有無を検出します。 存在する場合は、座標、性別、および年齢を生成します。
  • objects - おおよその場所など、画像内のさまざまなオブジェクトを検出します。
  • tags - イメージのコンテンツに関係する単語の詳細な一覧のタグです。
ビジュアル フィーチャー名は大文字と小文字が区別されます。 colorimageType のビジュアル フィーチャーはどちらも非推奨となっていますが、この機能にはカスタム スキルを通じてアクセスできます。 各 defaultLanguageCode でサポートされているビジュアル フィーチャーについては、Azure AI Vision の「画像分析」ドキュメントを参照してください。
details 結果として返すドメイン固有の詳細を示す文字列の並び. 有効なビジュアル フィーチャー型には以下があります。
  • celebrities - イメージ内でセレブリティが検出された場合に、そのセレブリティを特定します。
  • landmarks - イメージ内でランドマークが検出された場合に、そのランドマークを特定します。

スキルの入力

入力名 説明
image 複合型。 現在、"/document/normalized_images" フィールドでのみ機能します。このフィールドは、Azure BLOB インデクサーによって作成されます。このフィールドは、次以外noneの値に設定されている場合imageActionに生成されます。

スキルの出力

出力名 説明
adult 出力は、単一の adult オブジェクトです。複合型のオブジェクトで、ブール型のフィールド (isAdultContentisGoryContentisRacyContent) と double 型のスコア (adultScoregoreScoreracyScore) から成ります。
brands 出力は brand オブジェクトの配列で、オブジェクトは、name (文字列) と confidence スコア (double) から成る複合型になっています。 また、画像内における境界ボックスの配置を示す 4 つの座標 (ピクセル単位の xywh) と共に rectangle が返されます。 四角形の場合、x, y が左上です。 左下は x, y+h です。 右上は x+w, y です。 右下は x+w, y+h です。
categories 出力は category オブジェクトの配列で、各 category オブジェクトは、name (文字列)、score (double)、オプションの detail (著名人またはランドマークの詳細を含む) から成る複合型になっています。 カテゴリ名の全一覧については、カテゴリの分類に関する記事を参照してください。 detail は入れ子になった複合型です。 著名人の詳細は、名前、信頼度スコア、顔の境界ボックスから成ります。 ランドマークの詳細は、名前と信頼度スコアから成ります。
description 出力は、複合型の単一の説明オブジェクトで、caption (Text (文字列) と confidence (double) から成る配列) と tags のリストから成ります。
faces agegender、そして画像内における境界ボックスの配置を示す 4 つの座標 (ピクセル) を含む faceBoundingBox から成る複合型です。 座標は topleftwidthheight です。
objects 出力は、ビジュアル フィーチャー オブジェクトの配列です。 各オブジェクトは複合型であり、object (文字列)、confidence (double)、rectangle (境界ボックスの 4 つの座標によって画像内における配置が示されます)、そしてオブジェクトの名前と信頼度を含む parent から成ります。
tags 出力は imageTag オブジェクトの配列で、タグ オブジェクトは name (文字列)、hint (文字列)、confidence (double) から成る複合型です。 ヒントが追加されるのはまれです。 タグがあいまいである場合にのみ生成されます。 たとえば、"カーリング" としてタグ付けされた画像には、その内容がわかりやすいよう "スポーツ" というヒントが割り当てられます。

サンプル スキル定義

{
    "description": "Extract image analysis.",
    "@odata.type": "#Microsoft.Skills.Vision.ImageAnalysisSkill",
    "context": "/document/normalized_images/*",
    "defaultLanguageCode": "en",
    "visualFeatures": [
        "adult",
        "brands",
        "categories",
        "description",
        "faces",
        "objects",
        "tags"
    ],
    "inputs": [
        {
            "name": "image",
            "source": "/document/normalized_images/*"
        }
    ],
    "outputs": [
        {
            "name": "adult"
        },
        {
            "name": "brands"
        },
        {
            "name": "categories"
        },
        {
            "name": "description"
        },
        {
            "name": "faces"
        },
        {
            "name": "objects"
        },
        {
            "name": "tags"
        }
    ]
}

サンプルのインデックス

単一のオブジェクト (adultdescription など) について、それらをインデックス内の Collection(Edm.ComplexType) として構造化することで、そのすべての adultdescription の出力を取得できます。 インデックスのフィールドへの出力のマッピングについて詳しくは、「複合型から情報をフラット化する」を参照してください。

{
    "fields": [
        {
            "name": "metadata_storage_name",
            "type": "Edm.String",
            "key": true,
            "searchable": true,
            "filterable": false,
            "facetable": false,
            "sortable": true
        },
        {
            "name": "metadata_storage_path",
            "type": "Edm.String",
            "searchable": true,
            "filterable": false,
            "facetable": false,
            "sortable": true
        },
        {
            "name": "content",
            "type": "Edm.String",
            "sortable": false,
            "searchable": true,
            "filterable": false,
            "facetable": false
        },
        {
            "name": "adult",
            "type": "Edm.ComplexType",
            "fields": [
                {
                    "name": "isAdultContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "isGoryContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "isRacyContent",
                    "type": "Edm.Boolean",
                    "searchable": false,
                    "filterable": true,
                    "facetable": true
                },
                {
                    "name": "adultScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "goreScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "racyScore",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                }
            ]
        },
        {
            "name": "brands",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "rectangle",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "x",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "y",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "w",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "h",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "categories",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "score",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "detail",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "celebrities",
                            "type": "Collection(Edm.ComplexType)",
                            "fields": [
                                {
                                    "name": "name",
                                    "type": "Edm.String",
                                    "searchable": true,
                                    "filterable": false,
                                    "facetable": false
                                },
                                {
                                    "name": "faceBoundingBox",
                                    "type": "Collection(Edm.ComplexType)",
                                    "fields": [
                                        {
                                            "name": "x",
                                            "type": "Edm.Int32",
                                            "searchable": false,
                                            "filterable": false,
                                            "facetable": false
                                        },
                                        {
                                            "name": "y",
                                            "type": "Edm.Int32",
                                            "searchable": false,
                                            "filterable": false,
                                            "facetable": false
                                        }
                                    ]
                                },
                                {
                                    "name": "confidence",
                                    "type": "Edm.Double",
                                    "searchable": false,
                                    "filterable": false,
                                    "facetable": false
                                }
                            ]
                        },
                        {
                            "name": "landmarks",
                            "type": "Collection(Edm.ComplexType)",
                            "fields": [
                                {
                                    "name": "name",
                                    "type": "Edm.String",
                                    "searchable": true,
                                    "filterable": false,
                                    "facetable": false
                                },
                                {
                                    "name": "confidence",
                                    "type": "Edm.Double",
                                    "searchable": false,
                                    "filterable": false,
                                    "facetable": false
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "description",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "tags",
                    "type": "Collection(Edm.String)",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "captions",
                    "type": "Collection(Edm.ComplexType)",
                    "fields": [
                        {
                            "name": "text",
                            "type": "Edm.String",
                            "searchable": true,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "confidence",
                            "type": "Edm.Double",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "faces",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "age",
                    "type": "Edm.Int32",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "gender",
                    "type": "Edm.String",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "faceBoundingBox",
                    "type": "Collection(Edm.ComplexType)",
                    "fields": [
                        {
                            "name": "top",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "left",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "width",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "height",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "objects",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "object",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "rectangle",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "x",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "y",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "w",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "h",
                            "type": "Edm.Int32",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                },
                {
                    "name": "parent",
                    "type": "Edm.ComplexType",
                    "fields": [
                        {
                            "name": "object",
                            "type": "Edm.String",
                            "searchable": true,
                            "filterable": false,
                            "facetable": false
                        },
                        {
                            "name": "confidence",
                            "type": "Edm.Double",
                            "searchable": false,
                            "filterable": false,
                            "facetable": false
                        }
                    ]
                }
            ]
        },
        {
            "name": "tags",
            "type": "Collection(Edm.ComplexType)",
            "fields": [
                {
                    "name": "name",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "hint",
                    "type": "Edm.String",
                    "searchable": true,
                    "filterable": false,
                    "facetable": false
                },
                {
                    "name": "confidence",
                    "type": "Edm.Double",
                    "searchable": false,
                    "filterable": false,
                    "facetable": false
                }
            ]
        }
    ]
}

サンプル出力フィールドのマッピング

ターゲット フィールドは、複合フィールドまたはコレクションにすることができます。 インデックスの定義では、任意のサブフィールドが指定されます。

"outputFieldMappings": [
    {
        "sourceFieldName": "/document/normalized_images/*/adult",
        "targetFieldName": "adult"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/brands/*",
        "targetFieldName": "brands"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/categories/*",
        "targetFieldName": "categories"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/description",
        "targetFieldName": "description"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/faces/*",
        "targetFieldName": "faces"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/objects/*",
        "targetFieldName": "objects"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/tags/*",
        "targetFieldName": "tags"
    }

出力フィールドのマッピングのバリエーション (入れ子になったプロパティ)

出力フィールドのマッピングは、単なる著名人やランドマークなどの下位レベルのプロパティに定義できます。 この場合、それぞれの詳細を専用に格納するフィールドがインデックス スキーマにあることを確認してください。

"outputFieldMappings": [
    {
        "sourceFieldName": "/document/normalized_images/*/categories/detail/celebrities/*",
        "targetFieldName": "celebrities"
    },
    {
        "sourceFieldName": "/document/normalized_images/*/categories/detail/landmarks/*",
        "targetFieldName": "landmarks"
    }

サンプル入力

{
    "values": [
        {
            "recordId": "1",
            "data": {
                "image": {
                    "data": "BASE64 ENCODED STRING OF A JPEG IMAGE",
                    "width": 500,
                    "height": 300,
                    "originalWidth": 5000,
                    "originalHeight": 3000,
                    "rotationFromOriginal": 90,
                    "contentOffset": 500,
                    "pageNumber": 2
                }
            }
        }
    ]
}

サンプル出力

{
  "values": [
    {
      "recordId": "1",
      "data": {
        "categories": [
          {
            "name": "abstract_",
            "score": 0.00390625
          },
          {
            "name": "people_",
            "score": 0.83984375,
            "detail": {
              "celebrities": [
                {
                  "name": "Satya Nadella",
                  "faceBoundingBox": [
                        {
                            "x": 273,
                            "y": 309
                        },
                        {
                            "x": 395,
                            "y": 309
                        },
                        {
                            "x": 395,
                            "y": 431
                        },
                        {
                            "x": 273,
                            "y": 431
                        }
                    ],
                  "confidence": 0.999028444
                }
              ],
              "landmarks": [ ]
            }
          }
        ],
        "adult": {
          "isAdultContent": false,
          "isRacyContent": false,
          "isGoryContent": false,
          "adultScore": 0.0934349000453949,
          "racyScore": 0.068613491952419281,
          "goreScore": 0.08928389008070282
        },
        "tags": [
          {
            "name": "person",
            "confidence": 0.98979085683822632
          },
          {
            "name": "man",
            "confidence": 0.94493889808654785
          },
          {
            "name": "outdoor",
            "confidence": 0.938492476940155
          },
          {
            "name": "window",
            "confidence": 0.89513939619064331
          }
        ],
        "description": {
          "tags": [
            "person",
            "man",
            "outdoor",
            "window",
            "glasses"
          ],
          "captions": [
            {
              "text": "Satya Nadella sitting on a bench",
              "confidence": 0.48293603002174407
            }
          ]
        },
        "faces": [
          {
            "age": 44,
            "gender": "Male",
            "faceBoundingBox": [
                {
                    "x": 1601,
                    "y": 395
                },
                {
                    "x": 1653,
                    "y": 395
                },
                {
                    "x": 1653,
                    "y": 447
                },
                {
                    "x": 1601,
                    "y": 447
                }
            ]
          }
        ],
        "objects": [
          {
            "rectangle": {
              "x": 25,
              "y": 43,
              "w": 172,
              "h": 140
            },
            "object": "person",
            "confidence": 0.931
          }
        ],
        "brands":[  
           {  
              "name":"Microsoft",
              "confidence": 0.903,
              "rectangle":{  
                 "x":20,
                 "y":97,
                 "w":62,
                 "h":52
              }
           }
        ]
      }
    }
  ]
}

エラーになる場合

次のエラーが発生した場合、要素は抽出されません。

エラー コード 説明
NotSupportedLanguage 指定された言語はサポートされていません。
InvalidImageUrl イメージの URL の形式が不適切か、アクセスできません。
InvalidImageFormat 入力データが有効な画像ではありません。
InvalidImageSize 入力イメージが大きすぎます。
NotSupportedVisualFeature 指定された特徴の種類が有効ではありません。
NotSupportedImage サポートされていないイメージ、たとえば、子供のポルノ イメージです。
InvalidDetails サポートされていないドメイン固有のモデルです。

"One or more skills are invalid. Details: Error in skill #<num>: Outputs are not supported by skill: Landmarks" のようなエラーが表示された場合は、パスを確認してください。 セレブリティとランドマークはどちらも detail の下のプロパティです。

"categories":[  
      {  
         "name":"building_",
         "score":0.97265625,
         "detail":{  
            "landmarks":[  
               {  
                  "name":"Forbidden City",
                  "confidence":0.92013400793075562
               }
            ]

関連項目