7.5 イメージ・トランスフォーマONNX形式モデル

イメージ・トランスフォーマは、コンピュータでイメージやビデオを解釈および分析するために役立つ、機械学習の一部です。これにより、イメージ埋込みの作成(イメージ・トランスフォーマを使用)、オブジェクトの分類、異常の検出、画像やビデオ内のオブジェクトの識別などのタスクを実行するためのツールが提供されます。

イメージ・トランスフォーマでは、入力としてイメージが直接使用されることはありません。イメージをモデルが理解できる形式に変換するには、前処理が必要です。一般的な前処理ステップは次のとおりです:
  • イメージをJPEGなどの形式から3D数値配列にデコードします。
  • イメージのサイズを標準の寸法に変更します。
  • ピクセル値が正規化されます。
  • イメージのノイズを減らします。
  • フォーカスするためにイメージの一部を切り取ります。

イメージ・トランスフォーマ・モデルはONNX形式に変換でき、Oracle Databaseで直接使用できます。各イメージ・トランスフォーマにはそれ固有の前処理パイプラインが必要になり、Oracleでは、このようなモデル用にOML4Py前処理パイプラインが提供されています。

7.5.1 Oracle Databaseでの事前トレーニング済イメージ・トランスフォーマ・モデル

Oracle Databaseでは、セマンティック類似検索のベクトルを生成するための、事前トレーニング済イメージ・トランスフォーマ・モデルの使用がサポートされています。

Hugging Faceなどの機械学習プラットフォームからイメージ・トランスフォーマ・モデルにアクセスでき、事前トレーニング済のモデルをすぐに使用できます。

Oracle Databaseで事前トレーニング済イメージ・トランスフォーマ・モデルを使用するための大まかなステップを次に示します:
  • 事前トレーニング済モデルのダウンロード: イメージ・トランスフォーマ・モデルをデータベースにダウンロードします。
  • ONNX形式へのイメージ・トランスフォーマ・モデルの変換: ONNXパイプラインを使用して、事前トレーニング済イメージ・トランスフォーマ・モデルをONNX形式に変換します。イメージ・デコード用のOracleのカスタムONNX操作を実装してイメージ前処理を追加し、モデル固有のONNX前処理パイプラインを作成します。詳細は、データベース内のベクトル生成用のONNX形式での事前トレーニング済モデルのインポートを参照してください。
  • ONNX形式のイメージ・トランスフォーマ・モデルのインポート: DBMS_VECTOR.LOAD_ONNX_MODELプロシージャまたはDBMS_DATA_MINING.IMPORT_ONNX_MODELを使用して、ONNXモデルをOracleデータベースにインポートします。インポート後、VECTOR_EMBEDDING演算子を使用して、データベースにBLOBとして格納されているJPEGイメージからベクトル埋込みを生成します。

ノート:

JPEGイメージのみがサポートされています。マルチモーダル・モデルの場合は、複数のONNXモデルをロードする必要がある場合があります。これは、モダリティごとに、異なる前処理および後処理パイプラインがあるためです。
Oracleデータベースでは、次のような一般的な事前トレーニング済モデルがサポートされています:
  • ResNet-50: イメージ分類用に広く使用されているモデル。
  • CLIP ViT-Base-Patch32: テキストおよびイメージのコンテンツをリンクするためのマルチモーダル・モデル。
  • ViT Base-Patch: イメージ分析および分類用に設計されたビジョン・トランスフォーマ・モデル。

7.5.2 例: イメージ・トランスフォーマ・モデルからの埋込みの生成

次の例では、DBMS_VECTORまたはDBMS_DATA_MININGパッケージを使用した、イメージ・トランスフォーマ・モデルによるイメージからの埋込みの生成を示し、SQL予測演算子による推論にONNXランタイムを使用します。

これらの例では、次のことを前提としています:
BLOBへのファイルの内容のロード

次の例では、ディレクトリ・オブジェクト(DM_DUMP)に格納されているファイルの内容をデータベース内のBLOBにロードします。この関数は、ファイルの内容を含むBLOBを返します。

create or replace
    function loader(p_filename varchar2) return blob is
      bf bfile := bfilename('DM_DUMP',p_filename);
      b blob;
    begin
      dbms_lob.createtemporary(b,true);
      dbms_lob.fileopen(bf, dbms_lob.file_readonly);
      dbms_lob.loadfromfile(b,bf,dbms_lob.getlength(bf));
      dbms_lob.fileclose(bf);
     return b;
   end;
   /
image_data表の作成

次の例では、イメージ・ファイルがDM_DUMPディレクトリにあると想定して、image_data表を作成します。image_data表は、さらにベクトル埋込みの生成に使用されます。

SQL> CREATE TABLE image_data (
      ID NUMBER,
      NAME VARCHAR2(20),
      IMAGE BLOB
    );

Table created.


SQL> insert into image_data values (1,'cat.jpg',loader('cat.jpg'));

1 row created.

SQL> insert into image_data values (2,'cat2.jpg',loader('cat2.jpg'));

1 row created.

SQL> insert into image_data values (3,'chicken.jpg',loader('chicken.jpg'));

1 row created.

SQL> insert into image_data values (4,'horse.jpg',loader('horse.jpg'));

1 row created.

SQL> insert into image_data values (5,'dog.jpg',loader('dog.jpg'));

1 row created.

SQL> insert into image_data values (6,'cat.png',loader('cat.png'));

1 row created.

SQL> commit;

Commit complete.
ResNet-50コンピュータ・イメージ・トランスフォーマのロードおよびベクトル埋込みの生成

次の例では、イメージ前処理パイプラインで拡張されたイメージ・トランスフォーマ・モデルをロードする方法と、それを使用してBLOB内のイメージからベクトル埋込みを生成する方法を示します。この例では、DM_DUMPディレクトリが存在し、ONNXベースのイメージ前処理パイプラインで拡張されたResNet-50モデルのONNXファイルが含まれていることを前提としています。

この例では、DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、事前トレーニング済ONNX形式トランスフォーマ・モデル(pp_resnet_50.onnx)をデータベースにppresnet50としてインポートします。別の方法として、DBMS_DATA_MINING.IMPORT_ONNX_MODELを使用してモデルをロードすることもできます。ディクショナリ・ビューをチェックし、image_data表のスキーマを調べた後、このモデルでは、VECTOR_EMBEDDING演算子を使用してimage_data表内の各イメージのベクトル埋込みを生成する問合せが実行されます。ベクトル埋込みは、さらにイメージ分類、類似検索または特徴抽出に使用できます。この問合せは、各ベクトルの最初の40文字を返します。cat.png (PNGファイル)などのサポートされていない形式の場合、VECTOR_EMBEDDING演算子では、NULL値が返されます。

-- Metadata for an embedding model
SQL> define ppjsonmd = '{"function" : "embedding"}';

SQL> exec DBMS_VECTOR.LOAD_ONNX_MODEL('DM_DUMP', 'pp_resnet_50.onnx', 'ppresnet50');

PL/SQL procedure successfully completed.


SQL> SELECT mining_function, algorithm, model_size FROM user_mining_models WHERE model_name = 'PPRESNET50';

MINING_FUNCTION                ALGORITHM            MODEL_SIZE
------------------------------ -------------------- ----------
EMBEDDING                      ONNX                 93979933


SQL> SELECT attribute_name, attribute_type, data_type, vector_info FROM user_mining_model_attributes WHERE model_name = 'PPRESNET50' ORDER BY 1;

ATTRIBUTE_NAME              ATTRIBUTE_TYPE       DATA_TYPE  VECTOR_INFO
--------------------    --------------------  ----------    --------------------
DATA                         UNSTRUCTURED         BLOB
ORA$ONNXTARGET               VECTOR               VECTOR     VECTOR(2048,FLOAT32)

 
SQL> describe image_data
 Name                                                                                                                    Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 ID                                                                                                                                              NUMBER
 NAME                                                                                                                                      VARCHAR2(20)
 IMAGE                                                                                                                                     BLOB

 
SQL> SELECT name, substr(vector_embedding(ppresnet50 using image as data), 0, 40) as vec FROM image_data;

NAME                       VEC
-------------------- ----------------------------------------
cat.jpg              [0,3.69947255E-002,1.727576E-002,0,6.437
cat2.jpg             [5.25364205E-002,0,0,2.8940714E-003,0,4.
chicken.jpg          [2.14146048E-001,7.94866239E-004,2.95593
horse.jpg            [1.63398478E-002,0,4.99145657E-001,0,0,1
dog.jpg              [0,0,7.96773005E-004,0,0,0,1.00504747E-0
cat.png

6 rows selected.

別の方法としては、DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャを使用してppresnet50モデルをデータベースにインポートし、例で示されているとおりに残りのステップを進めます。ここでは、ローダー関数によって、ファイルまたはONNXファイルの内容がBLOBにロードされます。

SQL> exec DBMS_DATA_MINING.IMPORT_ONNX_MODEL('ppresnet50', loader('pp_resnet_50.onnx'), JSON('&ppjsonmd'));

PL/SQL procedure successfully completed.
CLIP ViTモデルをロードして、イメージからベクトル埋込みを生成(イメージ・モダリティ)し、テキスト説明から埋込みを生成してイメージを検索(テキスト・モダリティ)する

次の例では、CLIP ViTベースのパッチ・モデル(ppclip)を使用して、事前構成されたONNXベースのイメージ埋込みパイプラインをチェックし、ベクトル埋込みを生成します。この例では、DM_DUMPディレクトリが存在し、CLIP ViTベースのパッチ・モデルの各モダリティのONNXファイルが含まれていることを前提としています。pp_clip_img.onnxは、イメージ・モダリティに必要なONNXベースのイメージの前処理および後処理のパイプラインで拡張されたモデルを保持します。pp_clip_txt.onnxは、テキスト・モダリティのONNXベースの前処理および後処理のパイプラインで拡張されたモデルを保持します。ONNXパイプライン・モデル: マルチモーダル埋込みの手順に従って、CLIP ViTベース・パッチ・モデルの各モダリティのONNXファイルを取得します。

SQL> set echo on
SQL> -- Import clip model with image preprocessing (image modality)
SQL> exec DBMS_VECTOR.LOAD_ONNX_MODEL('DM_DUMP', 'pp_clip_img.onnx', 'clipimg');

PL/SQL procedure successfully completed.

SQL> -- Import clip model with text preprocessing (text modality)
SQL> exec DBMS_VECTOR.LOAD_ONNX_MODEL('DM_DUMP', 'pp_clip_txt.onnx', 'cliptxt');

PL/SQL procedure successfully completed.

SQL> -- Show difference between the two modality:
SQL> SELECT model_name, attribute_name, attribute_type, data_type, vector_info FROM user_mining_model_attributes WHERE model_name LIKE 'CLIP%' ORDER BY 1,2;


MODEL_NAME     ATTRIBUTE_NAME 	 ATTRIBUTE_TY 	   DATA_TYPE 	    VECTOR_INFO
----------     ---------------- ------------       ---------------- --------------------
CLIPIMG 	DATA 		    UNSTRUCTURED           BLOB
CLIPIMG 	ORA$ONNXTARGET 	    VECTOR 	           VECTOR 	    VECTOR(512,FLOAT32)
CLIPTXT 	DATA 		    TEXT 		   VARCHAR2
CLIPTXT 	ORA$ONNXTARGET 	    VECTOR 	           VECTOR 	    VECTOR(512,FLOAT32)


SQL> -- Create a table with vectors generated from image using clip
SQL> CREATE TABLE image_vectors as select name, vector_embedding(clipimg using image as data) as embedding FROM image_data;

Table created.

SQL> -- Find top-3 similar image from text description
SQL> select name from image_vectors order by vector_distance(vector_embedding(cliptxt using 'Cat picture' as data), embedding) fetch first 2 rows only;

NAME
--------------------
cat.jpg
cat2.jpg
 
別の方法としては、DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャを使用してclipimgモデルとcliptxtモデルをデータベースにロードします。
-- Import CLIP model with image preprocessing (image modality)
SQL> exec DBMS_DATA_MINING.IMPORT_ONNX_MODEL('clipimg', loader('pp_clip_img.onnx'), JSON('{"function" : "embedding"}'));

PL/SQL procedure successfully completed.

-- Import CLIP model with text preprocessing (text modality)
SQL> exec DBMS_DATA_MINING.IMPORT_ONNX_MODEL('cliptxt', loader('pp_clip_txt.onnx'), JSON('{"function" : "embedding"}'));

PL/SQL procedure successfully completed.