Image Search を使ってみる #10 V2 API

画像検索のAPI を提供する”Alibaba Cloud Image Search”のAPIがV2として機能アップしています。 アナウンスは2019年6月7日となりますが、その変更内容を見ていきます。

1. Image Search の概念

まずはImage Search の概念のおさらいです。 Image Search はAPIを提供するサービスです。 言い方を変えると、利用者への検索画面や検索結果を返す画面を実現するWebアプリを別途作成する必要があります。(以下の図中のECS上のWebアプリ)。

Webアプリから利用するAPIですが、大きく以下の3つが提供されています。このAPIのV2が利用可能になったというのが今回の記事のテーマとなっています。

  • 画像の追加
  • 画像の検索
  • 画像の削除

画像の追加の方法は色々ありますがOSS(オブジェクトストレージ)からのアップロードが一般的でしょうか。 APIを利用することでOSS上にある画像をImage Searchへアップロードすることが可能です。 削除も同様です。

この時、オリジナルの画像をOSSにアップロードする処理や、またアップロード時に属性情報を記述したJSONファイルの生成などの処理も必要です。 図にすると以下の感じです。

また、JSONには画像のidや商品名、その他情報を記載します。この情報をデータベースに格納し、Webアプリから参照することになります(検索結果として画像と一緒に商品名や価格などを表示する、など)。 図にすると以下ですが、RDSではなくNoSQLなTable Storeの利用でもよいでしょうし、複数のECSとSLBで冗長化する構成が現実的だと思います。

他にも画像の検索結果画面で表示する画像をどこに置くか、どこから表示させるかということも考える必要があります。 単純なのはOSS上の画像をOSSのWebサーバ機能を利用し表示させる方法です。 OSSの標準機能で画像のリサイズも可能です。  または、ECS上のWebサーバを経由して表示させる方法も考えられます。 この場合、Alibaba Cloud NAS に画像を集約し、複数のECSでNFSマウントし一元管理することが可能です。

次に、画像の検索のAPIについてです。 画像の検索のAPIでは入力情報に画像データを含みます。 APIでは入力した画像データと類似する画像についてid情報や類似度のスコアを応答します。 Web アプリではそのスコアにもとづき、検索結果をサムネイルなどで表示することになります。 最初に説明した通り、Image Search のAPIが返すのはidや類似度のスコアの情報となるため、別途準備するWebアプリ側でスコアをどう判断するか、また、どの画像をどうやって表示するか、その際に付帯情報(商品名や価格、リンク情報)をどう一緒に表示するかはUI設計含めて個別に作成する必要があります。

その他設計時の注意事項としては、Image SearchのAPIはパブリックアクセスのみ対応します。 したがって、一見同じ東京リージョンにあるECSとImage Searchですが、API通信は一度パブリックネットワークを経由することになります。同じリージョンなのでLatencyの問題よりも、トラフィックの従量課金が発生することに注意が必要でしょう。

Image Search の提供する3つのAPI、そして実際のサービス化に必要なアーキテクチャについて簡単にまとめてみました。

2. Image Search V2 APIの概要

公式サイトのアナウンスは以下の通りです。

https://jp.alibabacloud.com/notice/imagesearch-v2api-20190607?spm=a21mg.8156562.494434.2.566b3912EbUOLX

「 API v2は従来の画像を使って画像を検索する以外に商品idと画像名での検索が可能になりました。また、検索画像の属性を追加して検索結果をフィルタリングできるようになりました。さらに、より豊富な言語のSDKを提供します。」 とのことです。 変更ポイントは大きく以下の2点のようです。

  • 画像以外の検索方法の追加
  • SDKの言語の追加

それぞれ具体的にどのような内容か確認します。

2.1.画像以外の検索方法

変更のBefore/Afterは以下の通りです。

BeforeAfter
バージョンV1V2
検索方法画像画像/商品id/画像名

検索方法について公式のドキュメントセンターを確認します。 

リクエストパラメータとして色々とパラメータを指定できるようになっています。 

https://jp.alibabacloud.com/help/doc-detail/113680.htm?spm=a21mg.p38356.b99.32.39a65879bqnUSh

名前必須説明
InstanceNameStringはいImage Search インスタンス名
TypeStringいいえ検索タイプ。選択肢:
1. SearchByPic(デフォルト):画像に基づいて類似画像を検索します。
2. SearchByName:追加した画像( ProductId と PicName で画像を特定)に基づいて類似画像を検索します。
PicContentStringBase64 でエンコードした画像コンテンツ。最大 2 MB サイズの画像と 5 秒の送信待ち時間をサポートします。現在 jpg および png の画像形式のみサポートしています。縦と横の画素数は共に 200 以上 1024 以下でなければならず、画像に回転情報を含めることはできません。
説明:
1. Type=SearchByPic の場合、入力する必要があります。
2. Type=SearchByName の場合、入力する必要はなく、このパラメーターは無効になります。
ProductIdString商品 ID
説明:
1. Type = SearchByPic の場合、入力する必要はなく、このパラメーターは無効になります。
2. Type=SearchByName の場合、追加済みの画像の ProductId を入力する必要があります。
PicNameString画像名。
説明:
1. Type = SearchByPic の場合、入力する必要はなく、このパラメーターは無効になります。
2. Type = SearchByPic の場合、追加済みの画像の PicName を入力する必要があります。
CategoryIdIntegerいいえ商品カテゴリ。カテゴリの参照
説明:
1. Type=SearchByPic の場合、入力は任意です。1)商品画像検索の場合:カテゴリが設定されている場合はその設定が優先され、設定されていない場合はシステムがカテゴリ予測を実行し、予測されたカテゴリの結果を Response で取得できます。2)一般画像検索の場合:カテゴリが設定されているかどうかに関わらず、システムによりカテゴリが 88888888 に設定されます。
2. Type=SearchByName の場合、入力する必要はなく、このパラメーターは無効になります。
CropBooleanいいえ被写体認識の要否。デフォルトは true です。
説明:
1.Type=SearchByPic の場合、入力は任意です。1)true の場合、システムにより被写体認識が行われ、認識された被写体による検索が実行されます。被写体認識結果を Response で取得できます。2)false の場合、被写体は認識されず、画像全体として検索されます。
2. Type=SearchByName の場合、入力する必要はなく、このパラメーターは無効になります。
RegionStringいいえx1、x2、y1、y2 の形式で表される画像の被写体範囲。x1、y1 は左上の点、x2、y2 は右下の点です。
説明:
1. Type=SearchByPic の場合、入力は任意です。ユーザーが Region を設定した場合、Crop パラメーターの値に関わらず、その Region で検索を実行します。
2. Type=SearchByName の場合、入力する必要はなく、このパラメーターは無効になります。
NumIntegerいいえ戻り値の数。有効範囲:1〜100、デフォルト:10
StartIntegerいいえ戻り値の開始位置。有効範囲:0〜499、デフォルト:0
FilterStringいいえフィルター条件。
説明: int_attr でサポートされている演算子は >、>=、<、<=、=、str_attr でサポートされている演算子は = と != で、複数条件は AND と OR で接続します。
例: 
1. IntAttr で結果をフィルタリングする場合、int_attr>=100
2. StrAttr で結果をフィルタリングする場合、str_attr!=”value1”
3. IntAttr と StrAttr を組み合わせて結果をフィルタリングする場合、int_attr=1000 AND str_attr=”value1”

ポイントは以下でしょうか。 被写体認識のON/OFFやRegionの指定はより柔軟なWebアプリの機能実装につながる良い機能追加だと思いました。

  • ”Type”で従来型の画像をインプットにした検索と新方式を指定
  • ” PicContent ”でbase64で検索画像をアップロード可能に
  • “Crop”で被写体認識をON/OFFできる 
  • ”Region”で被写体範囲を指定できる(アプリ側で先に被写体を認識したり、1つの画像に複数の被写体がある場合の選択結果を指定する場合に利用できる)
  • “Filter”でフィルタリングが可能に。

さらに画像の追加時にも”Crop”のON/OFFや”Region”の指定、4096文字までの “CustomContent”属性情報の追加、そして検索時の”Filter”で指定するタグを”InAttr”と”StrAttr”として指定できるようになっています。 詳細は公式ドキュメントを確認してみてください。

https://jp.alibabacloud.com/help/doc-detail/113679.htm?spm=a21mg.p38356.b99.31.12ed6a600DF1kb

2.2. SDKの言語の追加

SDKの対応言語としてPython、GO、NETに対応しました。

BeforeAfter
バージョンV1V2
SDKJava
Node.js
PHP
Java
Python
PHP
Node.js
GO
.NET

3. まとめ

タイトルは”使ってみる”なのですが、ドキュメントベースで変更点をまとめてみました。なのでV2は使ってはいません。

V1は画像を検索キーとする単純な機能でした。 V2では画像以外にもidや画像名でも検索できるようになりました。 想定される利用シーンは、例えば商品名が明確にわかっているものをキーワードで検索したい場合や、管理者インターフェースでの利用などが想定されます。 また、CropのON/OFF指定やRegion指定が可能になったことで、被写体の識別をWebアプリやスマホアプリ側で済ませ、複数被写体から1個を指定したうえでの検索がより簡単に実現できるようになったと思われます。 今後のV3,V4とどんどん機能が追加されていくことを期待します。