Image Searchを使ってみる#2 インポート編

Image Searchに画像をインポートする手順を紹介します。 

1. インポート方法

公式サイト では以下の3つのインポート方法が紹介されています。

  1. アップロード ・・・Image Searchへ直接アップロード
  2. OSSインポート ・・・OSS経由でインポート
  3. その他のアクション ・・・API/SDK経由でインポート

今回は”2. OSSインポート”を利用します。

2. インポートできる画像の仕様

まず、Image Searchへインポートする際の画像の仕様を確認します。

追加および検索する際の画像サイズと解像度の要件
画像のサイズは 2 MB以下で、長さと幅のピクセルは 200 以上 1024 以下でなければなりません。

サポートされている画像フォーマット
システムは、JPG と PNG の 2 種類の画像をサポートしており、画像には回転情報を含むことはできません。

https://jp.alibabacloud.com/help/doc-detail/74408.htm?spm=a21mg.p38356.b99.21.332c6061RJ9DBk

サイズは2MB以下、ピクセルは200~1024の範囲内、また、JPGとPNGのみがサポートされていることがわかりました。

今回、テスト用にスマートフォンで写真を撮ったのですが、サイズとピクセルについて上記条件に適合していません。  せっかくなのでOSSのイメージ処理機能(スタイル)を使ってみようと思います。

3. OSSバケットの作成

Image Searchにインポートする画像を保管するOSSバケットを作成します。

4. OSSスタイルの作成

画像サイズをリサイズするためにスタイルを作成します。 ”イメージ処理”から”スタイルの作成”をクリックします。

”スタイル名”を入力します。

下の方にスクロールし、サイズ変更モードで幅を”200”、高さを”400”に設定します。 オリジナルの画像は1960×4032です。ちょっと比率が変わりますがとりあえず試してみます。

スタイルを作成することが出来ました。

5. OSSへの画像アップロード

コンソールから画像をアップロードします。以下の画像はアップロード後です。

まだ、先ほど作成したスタイルは適用されていません。画像を一つクリックし、プレビュー画面から”イメージスタイル”に作成したスタイル”imagesearch”を指定します。

しかし、OSSのマニュアルに以下の記載を見つけます。 

bucket.aliyuncs.com/sample.jpg?x-oss-process=style/stylename

これは、IMGでサポートされているデフォルトのスタイルのアクセス方法です。

https://jp.alibabacloud.com/help/doc-detail/48884.htm

スタイルを適用した画像を利用するには、画像名+所定の文字列となります(以下の例では” sample.jpg?x-oss-process=style/stylename ”)。これではImage Searchにインポート出来そうにありません。

手順は省略しますが、、、パソコン側で画像を処理し、再度OSSにアップロードしました。

6. increment.meta ファイルの作成

商品画像検索モードでは”increment.meta”ファイルの作成が必要になります。

指定されたパスに increment.meta ファイルが作成されていることを確認してください。このファイルには、OSS インポートタスクに関する情報を格納します。ファイル形式は、次の要件を満たしている必要があります。

・各行には、商品写真 (商品検索) または画像 (一般検索) が 1 つだけ含まれていること。
・商品写真および画像の情報はすべて、次に示す JSON 形式の内容であること。

https://jp.alibabacloud.com/help/doc-detail/66580.htm?spm=a21mg.p38356.a3.3.6ba08040gOGjpH
名前タイプ説明備考
operatorString操作このフィールドには、画像に対して実行される操作を指定します。
ADD で、商品写真/画像を新しく追加します。
DELETE で、商品写真/画像を削除します。
item_idString一意の商品写真/画像識別子商品検索の場合、このフィールドに商品 ID を指定します。
一般検索の場合、このフィールドに画像名を指定します。
cat_idIntegerカテゴリー情報商品検索の場合、このフィールドには画像が属するカテゴリーを指定します。詳細は、カテゴリーリファレンスを参照してください。
一般検索の場合、このフィールドは必要ありません。空のままにするか、値を 88888888 に設定してください。
cust_contentStringカスタムコンテンツこのフィールドには、検索結果に表示されるカスタムコンテンツを指定します。システムがこれを変更することはありません。
pic_listArray画像リストこのフィールドには、インポートする画像名のリストを指定します。

ここで大事な設定があります。”cat_id”です。 Image Searchの事前学習された恩恵を受けるにはインポートする画像のカテゴリを明示的に指定する必要があります。 公式サイトで紹介されている以下のカテゴリから指定します。

公式サイトのURLはこちら

カテゴリー ID説明
0トップス
1ドレス
2ボトムズ
3バッグ
4シューズ
5アクセサリー
6スナック
7メイクアップ
8ボトルドリンク
9家具
20おもちゃ
21下着
22デジタル機器
88888888その他

最終的に”increment.meta”として以下のようなJSONファイルを作る必要があります。

{"operator":"ADD","item_id":"1000", "cat_id":0, "cust_content":"k1:v1,k2:v2,k3:v3", "pic_list":["girl_cloth1.jpg"]}

今回インポートする画像数は約20個です。今回はシェルスクリプトでJSONファイルを作成します。 

for i in seq 1 21
do
echo “{“operator”:”ADD”,”item_id”:”$i”, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“$i.jpg”]}”
done

※後述されますが、上記処理には誤りがあります。JSONで必要なダブルクォーテーションが抜け落ちてしまいます。

シェルの実行結果は以下の通り。これを ”increment.meta” にします。

{operator:ADD,item_id:1, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[1.jpg]}
{operator:ADD,item_id:2, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[2.jpg]}
{operator:ADD,item_id:3, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[3.jpg]}
{operator:ADD,item_id:4, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[4.jpg]}
{operator:ADD,item_id:5, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[5.jpg]}
{operator:ADD,item_id:6, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[6.jpg]}
{operator:ADD,item_id:7, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[7.jpg]}
{operator:ADD,item_id:8, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[8.jpg]}
{operator:ADD,item_id:9, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[9.jpg]}
{operator:ADD,item_id:10, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[10.jpg]}
{operator:ADD,item_id:11, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[11.jpg]}
{operator:ADD,item_id:12, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[12.jpg]}
{operator:ADD,item_id:13, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[13.jpg]}
{operator:ADD,item_id:14, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[14.jpg]}
{operator:ADD,item_id:15, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[15.jpg]}
{operator:ADD,item_id:16, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[16.jpg]}
{operator:ADD,item_id:17, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[17.jpg]}
{operator:ADD,item_id:18, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[18.jpg]}
{operator:ADD,item_id:19, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[19.jpg]}
{operator:ADD,item_id:20, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[20.jpg]}
{operator:ADD,item_id:21, cat_id:8, cust_content:k1:v1,k2:v2,k3:v3, pic_list:[21.jpg]}

※後述されますが、上記内容には誤りがあります。JSONで必要なダブルクォーテーションが抜け落ちています。

作成した ”increment.meta”ファイルをOSSにアップロードします。 アップロード場所は画像ファイルと同じ階層(オブジェクトストレージなので階層という表現は不適切かもしれませんが)になります。

以下、OSSにアップロードした後のコンソールの画像です。

7. RAMロールの作成

OSSからImage Searchへ画像をインポートするためにはRAMロールの準備が必要です。

公式サイトのURLはこちら

コンソールからRAMの管理画面にアクセスします。”ロール管理”から”新規ロール”をクリックします。

”サービスロール”をクリックします。

”ImageSearchサービス”をクリックします。 一つ下に日本サイトではまだ利用出来ない”BatchComputeサービス”のロールがありますね。

ロール名を入力し、”作成”をクリックします。

”許可”をクリックします。

作成したロールの設定画面が表示されますが、一度、RAMの管理画面に戻ります。

左メニューの”権限付与ポリシー管理”をクリックし、”権限付与ポリシーを作成”をクリックします。

”空白のテンプレート”をクリックします。

“Resource”には実際のバケット名やパスを指定します。詳細は以下参照。

公式サイトのURLはこちら

権限付与ポリシーの作成が完了しました。 画面を閉じます。

”権限付与ポリシーの編集”をクリックします。

”ロールの管理”から作成したロール”ImageSearchOSAccessRole”をクリックします。

”権限付与ポリシーの編集”をクリックします。

”権限付与ポリシー”をクリックし、次に”権限付与ポリシーの編集”をクリックします。

作成した権限付与ポリシー”ImageSearchAccessOSSReadBucetOnly”を検索し、追加します。

RAMの設定は以上で完了です。 

最後に次の工程で利用するARNを確認しておきます。

ロール管理から作成したロール”ImageSearchOSSAccessRole”をクリックします。

Arnの文字列を控えておきます。 

8. Image Searchへのインポート

コンソールからImage Searchの管理画面にアクセスします。

インスタンスIDをクリックします。

”インポート”をクリックします。

以下の3項目に必要な情報を入力し、”インポート”を実行します。

  • ARN
  • バケット名
  • パス(バケット中のディレクトリ階層。今回はディレクトリ無しなので/のみ)

インポートが完了しました。 しかし、画像枚数は”0”です。 トラブルシューティングのために”インポート履歴の表示”をクリックします。

”一部の画像のインポートが失敗しました”とエラーメッセージを確認出来ます。 今回は成功が0枚なのですべて失敗しているのでOSSの指定方法やRAMの設定に問題があるものと推測します。 ”レポートをダウンロードする”から詳細情報を確認することにします。

ダウンロードしたファイルを確認します。”invalid json”とのことなので、increment.metaファイルの書き方に問題があったようです。OSSの指定でもRAMの設定でもありませんでした。

マニュアルのサンプルと見比べます。”(ダブルクォーテーション)が抜け落ちています。 JSON生成時のシェルスクリプトを修正します。

!/bin/sh
for i in seq 1 21
do
echo “{\”operator\”:\”ADD\”,\”item_id\”:\”$i\”, \”cat_id\”:8, \”cust_content\”:\”k1:v1,k2:v2,k3:v3\”, \”pic_list\”:[\”$i.jpg\”]}”
done

このスクリプトで再作成した increment.meta ファイルをOSSに再度アップロードします。 increment.meta ファイルの内容は以下の通りです。

{“operator”:”ADD”,”item_id”:”1″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“1.jpg”]}
{“operator”:”ADD”,”item_id”:”2″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“2.jpg”]}
{“operator”:”ADD”,”item_id”:”3″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“3.jpg”]}
{“operator”:”ADD”,”item_id”:”4″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“4.jpg”]}
{“operator”:”ADD”,”item_id”:”5″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“5.jpg”]}
{“operator”:”ADD”,”item_id”:”6″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“6.jpg”]}
{“operator”:”ADD”,”item_id”:”7″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“7.jpg”]}
{“operator”:”ADD”,”item_id”:”8″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“8.jpg”]}
{“operator”:”ADD”,”item_id”:”9″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“9.jpg”]}
{“operator”:”ADD”,”item_id”:”10″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“10.jpg”]}
{“operator”:”ADD”,”item_id”:”11″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“11.jpg”]}
{“operator”:”ADD”,”item_id”:”12″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“12.jpg”]}
{“operator”:”ADD”,”item_id”:”13″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“13.jpg”]}
{“operator”:”ADD”,”item_id”:”14″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“14.jpg”]}
{“operator”:”ADD”,”item_id”:”15″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“15.jpg”]}
{“operator”:”ADD”,”item_id”:”16″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“16.jpg”]}
{“operator”:”ADD”,”item_id”:”17″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“17.jpg”]}
{“operator”:”ADD”,”item_id”:”18″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“18.jpg”]}
{“operator”:”ADD”,”item_id”:”19″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“19.jpg”]}
{“operator”:”ADD”,”item_id”:”20″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“20.jpg”]}
{“operator”:”ADD”,”item_id”:”21″, “cat_id”:8, “cust_content”:”k1:v1,k2:v2,k3:v3″, “pic_list”:[“21.jpg”]}

コンソールのImage Search管理画面から再度インポートを実行します。まだ処理中ですが、画像枚数はカウントアップしました。 JSONの問題は解消されました。

インポートが完了しました。 今回は21枚の画像だったのですが1分かかっていないようです(上の画像を張り付けて、文言書いている間に終了していた)。

9. OSSスタイルを使用したインポート

OSSスタイルを適用した画像にアクセスする場合、ファイル名の後に”?x-oss-process=style/stylename”を付与する必要があります。

権限付与ポリシーの書き方を見る限り、画像を示すimagesearch-bigriver/*のあとにスタイル適用のための文字列を追加すれば実現出来そうです。

権限付与ポリシーを変更します。

試すにあたり、一度、取り込んだ画像を削除しようとしたのですが、マニュアルにある手順が実行できません。 APIでは実行できそうなのですがOpenAPI ExplorerはImage Search未対応のようだったのと、CLI実行環境が手元になかったのでまたの機会に試すことにします。

マニュアルでは以下の通り、”リセット”メニューが表示されますが、

実際の画面には”リセット”メニューが表示されません。

マニュアルが英語GUIだったので一応確認します。 Englishに言語を変えても同じでした。