7.3 機械学習のコンピュータ・ビジョン

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

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

各CVモデルには独自の前処理パイプラインが必要で、OracleではCVモデル用のOML4Py前処理パイプラインが用意されています。

7.3.1 Oracle Databaseの事前トレーニング済コンピュータ・ビジョン・モデル

Oracle Databaseでは、視覚データを処理するための事前トレーニング済コンピュータ・ビジョン(CV)モデルの使用がサポートされています。

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

Oracle Databaseで事前トレーニング済CVモデルを使用する場合の概要レベルの手順を次に示します:
  • 事前トレーニング済モデルのダウンロード: Hugging Faceなどの一般的なプラットフォームからデータベースにCVモデルをダウンロードします。
  • ONNX形式へのCVモデルの変換: ONNXパイプラインを使用して、事前トレーニング済のコンピュータ・ビジョン・モデルをONNX形式に変換します。イメージ・デコード用のOracleのカスタムONNX操作を実装してイメージ前処理を追加し、モデル固有のONNX前処理パイプラインを作成します。詳細は、データベース内のベクトル生成用のONNX形式での事前トレーニング済モデルのインポートを参照してください。
  • ONNX形式のCVモデルのインポート: 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.3.2 例: コンピュータ・ビジョン・モデルからの埋込みの生成

次の例は、DBMS_VECTORONNXの統合を使用した、コンピュータ・ビジョン・モデルによるイメージからの埋込みの生成を示しています。

これらの例では、次のことを前提としています:
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コンピュータ・ビジョン・モデルのロードおよびベクトル埋込みの生成

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

この例では、DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、事前トレーニング済ONNX埋込みモデル(pp_resnet_50.onnx)をデータベースにppresnet50としてインポートします。ディクショナリ・ビューをチェックし、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.
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