鉴黄、视频、图片去重、图像搜索业务分析与实践

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

PostgreSQL 在视频、图片去重,图像搜索业务中的应用

      作者

digoal

      日期

2016-11-26

      标签

PostgreSQL , Haar wavelet , 图像搜索 , 图片去重 , 视频去重


      背景

图像处理的业务场景比较多,例如 图像搜索、视频去重、人脸识别、美图、图片去重 等。

比如,视频去重,一些用户上传了较多的视频,同一部电影可能有不同的版本,分辨率不一样,音轨不一样,压缩比不一样。这种情况会导致服务端重复存储大量的视频。

又比如甄别黄色视频或黄色图片,鉴黄师的职业要消失了。

有什么方法可以得到重复的视频呢? 如何鉴别黄色视频和图片呢? 本文将给你揭晓。    

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

市面上常见的搜索引擎有谷歌、百度、搜狗等图片搜索引擎。

http://image.baidu.com/

http://images.google.com.hk

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

screenshot

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

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

如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章

《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》

      PostgreSQL 图像搜索插件背景技术

PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储,可以参考WIKI和一篇关于HW的文献。

https://en.wikipedia.org/wiki/Haar_wavelet


https://wiki.postgresql.org/images/4/43/Pgcon_2013_similar_images.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索引,快速按相似度排行输出结果。

例子

pic

pic

pic

pic

pic

pic

pic

pic

pic

      视频去重业务

视频去重,可以抽取视频中的关键帧,自关联产生笛卡尔积,计算不同视频的任意两张图片的相似度,相似度达到一定阈值,可以认为是相同视频。

例子

创建图片表,并将所有视频的关键帧导入表中
create table image (id serial8 primary key, movie_id int, data bytea);

导入图片,假设为jpeg格式
... 略 ...

生成patten 和 signature
CREATE TABLE pat AS (
    SELECT
        id, movie_id,
        shuffle_pattern(pattern) AS pattern, 
        pattern2signature(pattern) AS signature 
    FROM (
        SELECT 
            id, movie_id,
            jpeg2pattern(data) AS pattern 
        FROM 
            image
    ) x 
);

计算不同视频的相似度
select t1.movie_id, t1.id, t1.signature<->t2.signature from 
pat t1 join pat t2 on (t1.movie_id<>t2.movie_id) 
order by t1.signature<->t2.signature desc 

or 

select t1.movie_id, t1.id, t1.signature<->t2.signature from 
pat t1 join pat t2 on (t1.movie_id<>t2.movie_id) 
where t1.signature<->t2.signature > 0.9 
order by t1.signature<->t2.signature desc 

      小结

1. PostgreSQL是一个非常强大的数据库,功能高度可定制。而且不需要动到PostgreSQL的内核。 安全可靠。

2. 使用图像搜索的技术就是PostgreSQL功能扩展的例子,速度杠杠的,还记得我以前给出的关于地理位置近邻查询的性能指标吗。

《PostgreSQL 百亿地理位置数据 近邻查询毫秒级反馈》

3. 如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章

《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》

目录
打赏
0
0
0
4
20702
分享
相关文章
京东拍立淘图片搜索 API 接入实践:从图像识别到商品匹配的技术实现
京东拍立淘图片搜索 API 是基于先进图像识别技术的购物搜索接口,支持通过上传图片、URL 或拍摄实物搜索相似商品。它利用机器学习和大数据分析,精准匹配商品特征,提供高效、便捷的搜索体验。接口覆盖京东海量商品资源,不仅支持外观、颜色等多维度比对,还结合用户行为数据实现智能推荐。请求参数包括图片 URL 或 Base64 编码,返回 JSON 格式的商品信息,如 ID、价格、链接等,助力消费者快速找到心仪商品,满足个性化需求。
235 18
1688图片搜索逆向工程与多模态搜索融合实践——基于CLIP模型的特征向
本文介绍了通过逆向工程分析实现图片搜索的技术方案,包括请求特征捕获、签名算法破解及多模态搜索的实现。利用CLIP模型提取图像特征,并结合Faiss优化相似度计算,提升搜索效率。最后提供完整调用示例,模拟实现非官方API的图片搜索功能。
京东拍立淘图片搜索 API 接口使用指南:从原理到实践
京东拍立淘图片搜索API,基于先进图像识别技术,支持上传图片、URL或拍摄实物搜索相似商品。其特点包括:搜索便捷高效,用户可快速发起搜索;精准匹配结果,通过算法捕捉商品特征确保准确;数据覆盖广泛,依托京东海量商品资源满足个性化需求;智能推荐拓展,根据用户行为挖掘潜在需求,提升购物体验。
通过图片搜索引擎自动下载图片
通过图片搜索引擎自动下载图片
133 0
《图像搜索与识别在大规模场景中的研究与实践》电子版地址
图像搜索与识别在大规模场景中的研究与实践
114 0
《图像搜索与识别在大规模场景中的研究与实践》电子版地址
PgSQL · 应用案例 · PostgreSQL 图像搜索实践
背景 imgsmlr是PostgreSQL的一款支持以图搜图的插件, 支持 1、几种图像特征值数据类型, 2、图像特征值相似算子, 3、图像特征值相似排序索引支持, 4、图像相似排序的索引(通过扩展GiST索引接口实现)支持, 5、png,gif等图像格式特征值提取函数。
2082 0
阿里云国际站:拍立淘-以图搜图中的图像搜索算法是怎么样的?
@luotuoemo飞机@TG 阿里云国际站:拍立淘-以图搜图中的图像搜索算法是怎么样的?图像搜索在现代搜索系统中扮演了重要角色,尤其在电子商务网站如阿里巴巴等,它更是一个必不可少的功能。拍立淘是阿里云国际站的一个以图搜图功能,它使用了复杂的图像搜索算法进行图片匹配和识别。以下是对该算法的简单描述。
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等