弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wavelet)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 背景 图片搜索是继文字搜索后又一个比较常用的搜索引擎。 市面上常见的搜索引擎有谷歌、百度、搜狗等图片搜索引擎。http://image.baidu.com/http://images.google.com.hk 例如在搜索引擎提供的接口中上层了一张雪人的图片,搜出来一堆和雪人近似的图

背景

图片搜索是继文字搜索后又一个比较常用的搜索引擎。

市面上常见的搜索引擎有谷歌、百度、搜狗等图片搜索引擎。
http://image.baidu.com/
http://images.google.com.hk

例如在搜索引擎提供的接口中上层了一张雪人的图片,搜出来一堆和雪人近似的图片。
screenshot

图片搜索是怎么做到的呢?

万能的PostgreSQL绝不落下这么好玩的东东,通过PG万能的API,可以扩展它的图片搜索功能。

如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章
《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》
https://yq.aliyun.com/articles/55981

PostgreSQL 图像搜索插件背景技术

PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储,可以参考WIKI和一篇关于HW的文献。
https://en.wikipedia.org/wiki/Haar_wavelet
http://www.cs.toronto.edu/~kyros/courses/320/Lectures.2013s/lecture.2013s.10.pdf
截取几页,注意烧脑。
screenshot

screenshot

screenshot

screenshot

PostgreSQL 图像搜索插件介绍

依赖gd.h

# yum install -y gd-devel

下载安装imgsmlr

$ git clone https://github.com/postgrespro/imgsmlr
$ cd imgsmlr
$ export PGHOME=/home/digoal/pgsql9.5
$ export PATH=$PGHOME/bin:$PATH:.

$ make USE_PGXS=1
$ make USE_PGXS=1 install

安装插件

$ psql
psql (9.5.3)
Type "help" for help.
postgres=# create extension imgsmlr;
CREATE EXTENSION

imgsmlr新增了两个数据类型

Datatype Storage length Description
pattern 16388 bytes Result of Haar wavelet transform on the image
signature 64 bytes Short representation of pattern for fast search using GiST indexes

gist 索引方法(支持pattern和signature类型), 以及KNN操作符,可以用于搜索相似度

Operator Left type Right type Return type Description
<-> pattern pattern float8 Eucledian distance between two patterns
<-> signature signature float8 Eucledian distance between two signatures

新增了几个函数
将图像的二进制转换为pattern类型,将pattern中存储的数据转换为signature类型

Function Return type Description
jpeg2pattern(bytea) pattern Convert jpeg image into pattern
png2pattern(bytea) pattern Convert png image into pattern
gif2pattern(bytea) pattern Convert gif image into pattern
pattern2signature(pattern) signature Create signature from pattern
shuffle_pattern(pattern) pattern Shuffle pattern for less sensitivity to image shift

PostgreSQL 图像搜索插件测试

导入一些图片,例如(越多越好)
screenshot

建立图片表

create table image (id serial, data bytea);

导入图片到数据库

insert into image(data) select pg_read_binary_file('文件路径');

将图片转换成 patten 和 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 
);

创建索引

ALTER TABLE pat ADD PRIMARY KEY (id);
CREATE INDEX pat_signature_idx ON pat USING gist (signature);

近似度查询,例如查询与id = :id的图像相似的图像,按相似度排行,取出前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

这里可以用到KNN索引,快速按相似度排行输出结果。

小结

  • PostgreSQL是一个非常强大的数据库,功能高度可定制。而且不需要动到PostgreSQL的内核。 安全可靠。
  • 使用图像搜索的技术就是PostgreSQL功能扩展的例子,速度杠杠的,还记得我以前给出的关于地理位置近邻查询的性能指标吗。
    《PostgreSQL 百亿地理位置数据 近邻查询毫秒级反馈》

https://yq.aliyun.com/articles/2999

  • 如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章
    《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》

https://yq.aliyun.com/articles/55981

祝大家玩得开心,欢迎随时来 阿里云促膝长谈 业务需求 ,恭候光临。

阿里云的小伙伴们加油,努力做 最贴地气的云数据库

相关文章
|
1月前
|
存储 人工智能 算法
基于向量检索服务与ModelScope模型搭建文本搜图片---魏红斌版
【1月更文挑战第9天】综合产品理解和实操经验,总结向量检索服务的综合水平
98726 4
基于向量检索服务与ModelScope模型搭建文本搜图片---魏红斌版
|
5月前
|
存储 关系型数据库 数据库
沉浸式学习PostgreSQL|PolarDB 13: 博客、网站按标签内容检索, 并按匹配度排序
在内容检索(例如网站的文章检索、搜索引擎的内容搜索)的场景中, 除了内容本身的匹配与否作为判断条件, 还有一个重要的需求是按匹配度、内容的新鲜度等进行排序返回, 匹配度越高|新鲜度|权重越高的优先返回. 场景1: 博客类网站, 设定了一些内容标签, 每篇文章在发表时需要给文章设定标签, 一篇文章可能会设定若干个标签. 同时文章发表时间越大表示越新鲜. 用户在浏览时, 选择某个标签, 按新鲜度顺序返回这个标签下的文章.
660 0
|
5月前
|
存储 算法 OLAP
ChatGPT都推荐的向量数据库,不仅仅是向量索引
本文带大家一起了解阿里云 AnalyticDB 技术负责人姚奕玮在 QCon 全球软件开发大会(北京站)2023 上的精彩演讲,解密 AnalyticDB 全自研企业级向量数据库核心技术,以及新一代向量数据库在云原生存算分离和 AI 原生上的技术演进路线。
|
7月前
|
存储 缓存 人工智能
如何让聊天机器人更懂你?Tair向量检索给你答案
Tair是阿里云企业级内存数据库,广泛应用于电商、游戏等各领域,兼容Redis生态(可平替开源Redis),并且同时具备向量检索能力,实现了缓存+向量二合一。
如何让聊天机器人更懂你?Tair向量检索给你答案
|
9月前
|
SQL 关系型数据库 MySQL
阿里云数据库SQL挑战赛赛题三:计算三角形面积
阿里云开发者社区及数据库团队联合举办「阿里云数据库SQL挑战赛」,来自阿里云数据库团队的技术专家为各位开发者准备了三道由浅入深的赛题,快来试试你有多会写 SQL 吧。此外,我们还为开发者提供了 3 个月免费的 RDS MySQL Serverless 资源,参赛的同时还能体验云上开发的便利性。
766 1
|
存储 并行计算 Cloud Native
使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索
432 0
|
存储 并行计算 算法
PolarDB 开源版通过pg_similarity实现17种文本相似搜索 - token归一切分, 根据文本相似度检索相似文本.
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍PolarDB 开源版通过pg_similarity实现17种文本相似搜索 - token归一切分, 根据文本相似度检索相似文本.
479 0
|
NoSQL MongoDB 数据库
一幅长文细学MongoDB(四)——索引
本文主要讲述了MongoDB的索引机制以及如何操作索引
232 0
|
关系型数据库
《高维向量检索技术在PG中的设计与实践》电子版地址
高维向量检索技术在PG中的设计与实践
59 0
《高维向量检索技术在PG中的设计与实践》电子版地址
|
存储 机器学习/深度学习 算法
PG+MySQL第11课-多维向量搜索
多维向量搜索不仅可以用在特征值的相似圈选这类场景,还可以用在图像识别场景。而不同的向量支持不同的距离算法,如cube、imgsmlr和pase.
PG+MySQL第11课-多维向量搜索

相关产品

  • 云数据库 RDS MySQL 版
  • 云原生数据库 PolarDB