imgsmlr 拡張機能は、PolarDB for PostgreSQL および 用のサードパーティ拡張機能で、類似画像検索をサポートします。imgsmlr 拡張機能は、Haar ウェーブレット変換アルゴリズムを使用して、PNG や GIF ファイルなどの画像から特徴値を取得します。その後、インデックスを使用して類似画像を取得します。
適用範囲
サポートされている PolarDB for PostgreSQL のバージョン:
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.9.8.0 以降)
PostgreSQL 14 (マイナーエンジンバージョン 14.10.18.0 以降)
コンソールでマイナーエンジンバージョンを表示するか、SHOW polardb_version; 文を実行します。クラスターがマイナーエンジンバージョンの要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
使用方法
データの型
imgsmlr 拡張機能は、pattern と signature の 2 つのデータの型を提供します。
データの型 | ストレージサイズ | 説明 |
pattern | 16388 バイト | 画像に対する Haar ウェーブレット変換の結果。 |
signature | 64 バイト | パターンのコンパクトな表現。GiST インデックスを使用して高速検索ができます。 |
関数
imgsmlr 拡張機能は、いくつかの関数を提供します。これらの関数を使用して、さまざまな画像タイプを pattern 型に変換できます。この拡張機能は、取得を容易にするために pattern から signature を作成する関数も提供します。
関数 | 戻り値の型 | 説明 |
jpeg2pattern(bytea) | pattern | JPEG 画像を pattern 型に変換します。 |
png2pattern(bytea) | pattern | PNG 画像を pattern 型に変換します。 |
gif2pattern(bytea) | pattern | GIF 画像を pattern 型に変換します。 |
pattern2signature(pattern) | signature | pattern から signature を作成します。 |
shuffle_pattern(pattern) | pattern | pattern をシャッフルして、画像のオフセットに対する秘密度を減らします。 |
オペレーター
pattern 型と signature 型はどちらも、ユークリッド距離の <-> オペレーターをサポートしています。signature 型は、<-> オペレーターの GiST インデックスもサポートしています。
オペレーター | 左辺値の型 | R 値型 | 戻り値の型 | 説明 |
<-> | pattern | pattern | float8 | 2 つの pattern 間のユークリッド距離を計算します。 |
<-> | signature | signature | float8 | 2 つの signature 間のユークリッド距離を計算します。 |
例
拡張機能のインストール
CREATE EXTENSION imgsmlr;画像特徴値のテーブルを作成する
image テーブルに id 列と data 列が存在すると仮定します。data 列には、バイナリ JPEG データが含まれています。次の SQL 文を実行して、画像の pattern と signature を含むテーブルを作成できます。
CREATE TABLE pat AS (
SELECT
id,
shuffle_pattern(pattern) AS pattern,
pattern2signature(pattern) AS signature
FROM (
SELECT
id,
jpeg2pattern(data) AS pattern
FROM
image
) x
);GiST インデックスの作成
ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);類似画像の検索
指定された id の画像に最も類似する上位 10 件の画像を見つけるには、サブクエリを使用します。サブクエリは signature の GiST インデックスを使用して、上位 100 件の候補画像を取得します。次に、外部クエリがこれらの候補を pattern で検索し、上位 10 件の一致を見つけます。
SELECT
id,
smlr
FROM
(
SELECT
id,
pattern <-> (SELECT pattern FROM pat WHERE id = :id) AS smlr
FROM pat
WHERE id <> :id
ORDER BY
signature <-> (SELECT signature FROM pat WHERE id = :id)
LIMIT 100
) x
ORDER BY x.smlr ASC
LIMIT 10;拡張機能のアンインストール
DROP EXTENSION imgsmlr;