7.5 イメージ・トランスフォーマONNX形式モデル
イメージ・トランスフォーマは、コンピュータでイメージやビデオを解釈および分析するために役立つ、機械学習の一部です。これにより、イメージ埋込みの作成(イメージ・トランスフォーマを使用)、オブジェクトの分類、異常の検出、画像やビデオ内のオブジェクトの識別などのタスクを実行するためのツールが提供されます。
- イメージをJPEGなどの形式から3D数値配列にデコードします。
- イメージのサイズを標準の寸法に変更します。
- ピクセル値が正規化されます。
- イメージのノイズを減らします。
- フォーカスするためにイメージの一部を切り取ります。
イメージ・トランスフォーマ・モデルはONNX形式に変換でき、Oracle Databaseで直接使用できます。各イメージ・トランスフォーマにはそれ固有の前処理パイプラインが必要になり、Oracleでは、このようなモデル用にOML4Py前処理パイプラインが提供されています。
- Oracle Databaseでの事前トレーニング済イメージ・トランスフォーマ・モデル
Oracle Databaseでは、セマンティック類似検索のベクトルを生成するための、事前トレーニング済イメージ・トランスフォーマ・モデルの使用がサポートされています。 - 例: イメージ・トランスフォーマ・モデルからの埋込みの生成
次の例では、DBMS_VECTOR
またはDBMS_DATA_MINING
パッケージを使用した、イメージ・トランスフォーマ・モデルによるイメージからの埋込みの生成を示し、SQL予測演算子による推論にONNXランタイムを使用します。
親トピック: ONNX Runtimeの統合
7.5.1 Oracle Databaseでの事前トレーニング済イメージ・トランスフォーマ・モデル
Oracle Databaseでは、セマンティック類似検索のベクトルを生成するための、事前トレーニング済イメージ・トランスフォーマ・モデルの使用がサポートされています。
Hugging Faceなどの機械学習プラットフォームからイメージ・トランスフォーマ・モデルにアクセスでき、事前トレーニング済のモデルをすぐに使用できます。
- 事前トレーニング済モデルのダウンロード: イメージ・トランスフォーマ・モデルをデータベースにダウンロードします。
- 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モデルをロードする必要がある場合があります。これは、モダリティごとに、異なる前処理および後処理パイプラインがあるためです。- ResNet-50: イメージ分類用に広く使用されているモデル。
- CLIP ViT-Base-Patch32: テキストおよびイメージのコンテンツをリンクするためのマルチモーダル・モデル。
- ViT Base-Patch: イメージ分析および分類用に設計されたビジョン・トランスフォーマ・モデル。
親トピック: イメージ・トランスフォーマONNX形式モデル
7.5.2 例: イメージ・トランスフォーマ・モデルからの埋込みの生成
次の例では、DBMS_VECTOR
またはDBMS_DATA_MINING
パッケージを使用した、イメージ・トランスフォーマ・モデルによるイメージからの埋込みの生成を示し、SQL予測演算子による推論にONNXランタイムを使用します。
- データ・セットをユーザーが使用できる。
DM_DUMP
ディレクトリが存在し、イメージ前処理で拡張されたイメージ・トランスフォーマ・モデル用ONNXモデルのファイルを含んでいる。ONNXパイプライン・モデル: イメージの埋込みおよびONNXパイプライン・モデル: マルチモーダル埋込みの手順に従って、ResNet-50およびClip ViTモデルのONNXファイルを生成します。Oracle DatabaseへのONNXモデルのインポートのエンドツーエンドの例も参照してください。
次の例では、ディレクトリ・オブジェクト(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;
/
次の例では、イメージ・ファイルが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.
次の例では、イメージ前処理パイプラインで拡張されたイメージ・トランスフォーマ・モデルをロードする方法と、それを使用して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ベースのパッチ・モデル(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.
親トピック: イメージ・トランスフォーマONNX形式モデル