Векторный поиск изображений в BigQuery: как это работает
Поиск по изображениям — это не магия, а просто векторы. С помощью BigQuery можно превратить картинки в числа и искать похожие платья, даже если у вас есть только смутное представление о том, что нужно.
Изображения преобразуются в числовые векторы. Чем ближе векторы в многомерном пространстве, тем больше сходство между картинками. Это позволяет искать не по ключевым словам, а по визуальному подобию.
Создание модели
Сначала создается модель для генерации эмбеддингов. В BigQuery это делается так:
CREATE OR REPLACE MODEL `image_embedding.image_embeddings_model`
REMOTE WITH CONNECTION `[PROJECT_ID].us.llm-connection`
OPTIONS (
ENDPOINT = 'multimodalembedding@001'
);
Загрузка изображений
Изображения хранятся в Google Cloud Storage, а в BigQuery создается внешняя таблица для доступа к ним:
CREATE OR REPLACE EXTERNAL TABLE `image_embedding.external_images_table`
WITH CONNECTION `[PROJECT_ID].us.llm-connection`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ['gs://[BUCKET_NAME]/*'],
max_staleness = INTERVAL 1 DAY,
metadata_cache_mode = 'AUTOMATIC'
);
Генерация эмбеддингов
Теперь можно преобразовать изображения в векторы и сохранить результаты:
CREATE OR REPLACE TABLE `image_embedding.dress_embeddings` AS SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL `image_embedding.image_embeddings_model`,
TABLE `image_embedding.external_images_table`,
STRUCT(TRUE AS flatten_json_output,
512 AS output_dimensionality)
);
Поиск по тексту
Чтобы найти ‘синее платье’, запрос преобразуется в вектор и сравнивается с сохраненными эмбеддингами:
CREATE OR REPLACE TABLE `image_embedding.image_search_via_text` AS
SELECT base.uri AS image_link, distance
FROM
VECTOR_SEARCH(
TABLE `image_embedding.dress_embeddings`,
'ml_generate_embedding_result',
(
SELECT ml_generate_embedding_result AS embedding_col
FROM ML.GENERATE_EMBEDDING
(
MODEL`image_embedding.image_embeddings_model` ,
(
SELECT 'Blue dress' AS content
),
STRUCT
(
TRUE AS flatten_json_output,
512 AS output_dimensionality
)
)
),
top_k => 5
)
ORDER BY distance ASC;
SELECT * FROM `image_embedding.image_search_via_text`;
Поиск по изображению
Можно загрузить картинку и найти похожие варианты. Сначала создается таблица для тестового изображения:
CREATE OR REPLACE EXTERNAL TABLE `image_embedding.external_images_test_table`
WITH CONNECTION `[PROJECT_ID].us.llm-connection`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ['gs://[BUCKET_NAME]/test-image-for-dress/*'],
max_staleness = INTERVAL 1 DAY,
metadata_cache_mode = 'AUTOMATIC'
);
Затем генерируется эмбеддинг для этого изображения:
CREATE OR REPLACE TABLE `image_embedding.test_dress_embeddings` AS
SELECT *
FROM ML.GENERATE_EMBEDDING
(
MODEL `image_embedding.image_embeddings_model`,
TABLE `image_embedding.external_images_test_table`, STRUCT(TRUE AS flatten_json_output,
512 AS output_dimensionality
)
);
И наконец, выполняется поиск:
SELECT base.uri AS image_link, distance
FROM
VECTOR_SEARCH(
TABLE `image_embedding.dress_embeddings`,
'ml_generate_embedding_result',
(
SELECT * FROM `image_embedding.test_dress_embeddings`
),
top_k => 5,
distance_type => 'COSINE',
options => '{'use_brute_force':true}'
);
Где это пригодится
- Интернет-магазины: поиск товаров по фото
- Модные бренды: анализ трендов
- Контент-модерация: выявление неподходящих изображений
- Защита авторских прав: поиск копий изображений
Технология работает не только с платьями, но и с любыми другими изображениями. Главное — правильно настроить модель и не перепутать векторы.