本文介绍了以图搜图的概念,以及搭建以图搜图系统的流程。
概念
以图搜图是一种基于图像内容的检索技术,旨在通过输入一张图像来寻找相似或相关的图像。它基于图像的视觉特征,例如颜色、纹理、形状等,通过计算机视觉和机器学习技术,将图像转换为可计算的特征向量,并将其与数据库中的其他图像进行比较和匹配。
以图搜图的应用场景非常广泛。诸如:
在电子商务领域,用户可以通过拍照或上传一张商品图片来搜索相似的商品,从而提供更加精准的购物推荐。
在媒体管理领域,用户可以通过输入一张图片来寻找与之相关的图片,用于整理和管理大量的媒体资源。
在社交媒体领域,用户可以通过上传一张照片来搜索相关的图片,例如找到相同的地点或相似的主题。
此外,以图搜图系统还可以应用于版权保护和网络安全领域,用于检测和识别盗版图片或有害图片等。
搭建流程
创建图片数据存储表
创建图片数据存储表的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。
向量表中的
id
与image_address
字段类型请与图片数据存储表中的id
与image_address
字段类型分别保持一致,以保证存储数据完整。不同租户可创建不同数据库,通过不同数据库区分数据。如有增量向量表数据,需要按照下述向量化操作手动同步。
将图片向量化
PolarDB for AI支持在线和离线两种方式将图片向量化写入向量表。其中,在线方式每次仅支持将一张图片进行图片向量化,而离线方式支持将多张图片批量向量化。
图片向量化操作应用_polar4ai_image2vec
模型,目前该模型仅支持输出512维向量。
离线向量化
假如现在您需要将图片数据存储表(
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。
离线任务SQL执行完毕后会得到
task_id
,如17c45d84-3633-11f0-add9-ab1f3c25b505
。您可以执行以下SQL查看任务是否完成。/*polar4ai*/SHOW TASK `17c45d84-3633-11f0-add9-ab1f3c25b505`;
当查询到
taskStatus
为finish
时,代表离线任务已完成。您可以下一步图片检索了。
在线向量化
若图片来源于数据库,则在线将图片向量化的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]
值替换为对应检索图片的向量值。