搭建以图搜图系统

本文介绍了以图搜图的概念,以及搭建以图搜图系统的流程。

概念

以图搜图是一种基于图像内容的检索技术,旨在通过输入一张图像来寻找相似或相关的图像。它基于图像的视觉特征,例如颜色、纹理、形状等,通过计算机视觉和机器学习技术,将图像转换为可计算的特征向量,并将其与数据库中的其他图像进行比较和匹配。

以图搜图的应用场景非常广泛。诸如:

  • 在电子商务领域,用户可以通过拍照或上传一张商品图片来搜索相似的商品,从而提供更加精准的购物推荐。

  • 在媒体管理领域,用户可以通过输入一张图片来寻找与之相关的图片,用于整理和管理大量的媒体资源。

  • 在社交媒体领域,用户可以通过上传一张照片来搜索相关的图片,例如找到相同的地点或相似的主题。

此外,以图搜图系统还可以应用于版权保护和网络安全领域,用于检测和识别盗版图片或有害图片等。

搭建流程

创建图片数据存储表

创建图片数据存储表的SQL语句如下:

CREATE TABLE image(
  id bigint(20) comment '主键id',
  image_address varchar(255) comment '图片存储地址', 
  primary key(id)
);

其中,image_address字段可以存储图片的公网地址或base64编码。

说明

image_address字段存储的是图片的base64编码,image_address字段类型应设置为LONGTEXT以保证存储文本完整。请确保该编码的大小不超过2 MB。

插入图片数据

插入图片数据的SQL语句如下:

INSERT INTO image(id, image_address) values(1, 'https://xxx/image.bmp');

创建向量表

创建向量表的SQL语句如下:

/*polar4ai*/CREATE TABLE image_vector(
  id bigint,
  image_address varchar,
  image_address_vector vector_512,
  primary key(id)
);

其中,image_address_vector为向量类型字段,维度为512。

说明
  • 向量表中的idimage_address 字段类型请与图片数据存储表中的idimage_address字段类型分别保持一致,以保证存储数据完整。

  • 不同租户可创建不同数据库,通过不同数据库区分数据。如有增量向量表数据,需要按照下述向量化操作手动同步。

将图片向量化

PolarDB for AI支持在线和离线两种方式将图片向量化写入向量表。其中,在线方式每次仅支持将一张图片进行图片向量化,而离线方式支持将多张图片批量向量化。

说明

图片向量化操作应用_polar4ai_image2vec模型,目前该模型仅支持输出512维向量。

离线向量化

  1. 假如现在您需要将图片数据存储表image)中所有图片向量化,则SQL语句如下所示:

    /*polar4ai*/SELECT * FROM predict(model _polar4ai_image2vec, SELECT id,image_address FROM image) 
    with(
      primary_key='id',
      x_cols='image_address',
      mode='async',
      vec_col='image_address_vector',
      input_model='url'
    ) 
    INTO image_vector;

    参数说明

    参数

    说明

    primary_key

    向量表image_vector)中的主键字段。

    x_cols

    图片数据存储表image)中的图片存储地址字段。

    mode

    图片写入模式,固定为async。

    vec_col

    向量表image_vector)中的图片地址向量类型字段。

    input_mode

    图片的存储类型。取值范围为:

    • url(默认):图片公网地址。

    • base64:图片base64编码。

    例如,若image_address列中存储的为图片公网地址,则input_mode需为url。若image_address列中存储的为图片base64编码,则input_mode需为base64。

  2. 离线任务SQL执行完毕后会得到task_id,如17c45d84-3633-11f0-add9-ab1f3c25b505。您可以执行以下SQL查看任务是否完成。

    /*polar4ai*/SHOW TASK `17c45d84-3633-11f0-add9-ab1f3c25b505`;

    当查询到taskStatusfinish时,代表离线任务已完成。您可以下一步图片检索了。

在线向量化

  • 若图片来源于数据库,则在线将图片向量化的SQL语句如下:

    /*polar4ai*/SELECT * FROM predict(model _polar4ai_image2vec, SELECT image_address FROM image WHERE id=1) with();
  • 若图片来源于互联网,则在线将图片向量化的SQL语句如下:

    /*polar4ai*/SELECT * FROM predict(model _polar4ai_image2vec, SELECT 'http://xxxx/image.png') with();
  • 若图片为base64编码,则在线将图片向量化的SQL语句如下:

    /*polar4ai*/SELECT * FROM predict(model _polar4ai_image2vec, SELECT '/9j/4AAQSk.....RAEREA//20==') with();

进行图片检索

进行图片检索的SQL语句如下:

/*polar4ai*/SELECT id,'distance(image_address_vector, [1,2,3,4,5……,512])' FROM image_vector LIMIT 10;
说明
  • image_address_vector向量表image_vector)中的图片地址向量类型字段。

  • 执行图片检索时,请将上述的[1,2,3,4,5……,512]值替换为对应检索图片的向量值。