7.3 機械学習のコンピュータ・ビジョン
コンピュータ・ビジョン(CV)は、コンピュータがイメージやビデオを解釈および分析するのに役立つ機械学習の一部です。イメージ埋込みの作成、オブジェクトの分類、異常の検出、画像やビデオ内のオブジェクトの識別などのタスクを実行するためのツールを提供します。
- イメージをJPEGなどの形式から3D数値配列にデコードします。
- イメージのサイズを標準の寸法に変更します。
- ピクセル値を正規化します。
- イメージのノイズを減らします。
- フォーカスするためにイメージの一部を切り取ります。
各CVモデルには独自の前処理パイプラインが必要で、OracleではCVモデル用のOML4Py前処理パイプラインが用意されています。
- Oracle Databaseの事前トレーニング済コンピュータ・ビジョン・モデル
Oracle Databaseでは、視覚データを処理するための事前トレーニング済コンピュータ・ビジョン(CV)モデルの使用がサポートされています。 - 例: コンピュータ・ビジョン・モデルからの埋込みの生成
次の例は、DBMS_VECTOR
とONNX
の統合を使用した、コンピュータ・ビジョン・モデルによるイメージからの埋込みの生成を示しています。
親トピック: ONNX Runtimeの統合
7.3.1 Oracle Databaseの事前トレーニング済コンピュータ・ビジョン・モデル
Oracle Databaseでは、視覚データを処理するための事前トレーニング済コンピュータ・ビジョン(CV)モデルの使用がサポートされています。
Hugging Faceなどの機械学習プラットフォームからコンピュータ・ビジョン・モデルにアクセスでき、事前トレーニング済のモデルをすぐに使用できます。
- 事前トレーニング済モデルのダウンロード: 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モデルをロードする必要がある場合があります。- ResNet-50: イメージ分類用に広く使用されているモデル。
- CLIP ViT-Base-Patch32: テキストおよびイメージのコンテンツをリンクするためのマルチモーダル・モデル。
- ViT Base-Patch: イメージ分析および分類用に設計されたビジョン・トランスフォーマ・モデル。
親トピック: 機械学習のコンピュータ・ビジョン
7.3.2 例: コンピュータ・ビジョン・モデルからの埋込みの生成
次の例は、DBMS_VECTOR
と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.
次の例は、イメージ前処理パイプラインで拡張された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ベースのパッチ・モデル(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
親トピック: 機械学習のコンピュータ・ビジョン