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

打印 上一主题 下一主题

主题 1857|帖子 1857|积分 5571

 
背景

图像处理的业务场景比较多,例如 图像搜索、视频去重、人脸识别、美图、图片去重 等。
比如,视频去重,一些用户上传了较多的视频,同一部电影可能有不同的版本,分辨率不一样,音轨不一样,压缩比不一样。这种情况会导致服务端重复存储大量的视频。
又比如甄别黄色视频或黄色图片,鉴黄师的职业要消失了。
有什么方法可以得到重复的视频呢? 如何鉴别黄色视频和图片呢? 本文将给你揭晓。    
另一方面,图片搜索是继文字搜索后又一个比较常用的搜索引擎。
市面上常见的搜索引擎有谷歌、百度、搜狗等图片搜索引擎。
http://image.baidu.com/
http://images.google.com.hk
例如在搜索引擎提供的接口中上层了一张雪人的图片,搜出来一堆和雪人近似的图片。

图片搜索是怎么做到的呢?
万能的PostgreSQL绝不落下这么好玩的东东,通过PG万能的API,可以扩展它的图片搜索功能。
如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章
《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》
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
https://wiki.postgresql.org/images/4/43/Pgcon_2013_similar_images.pdf
截取几页,注意烧脑。

 
 
 
  
 
 
PostgreSQL 图像搜索插件介绍

依赖gd.h
 
  1. # yum install -y gd-devel
复制代码
下载安装imgsmlr
 
  1. $ git clone https://github.com/postgrespro/imgsmlr
  2. $ cd imgsmlr
  3. $ export PGHOME=/home/digoal/pgsql9.5
  4. $ export PATH=$PGHOME/bin:$PATH:.
  5. $ make USE_PGXS=1
  6. $ make USE_PGXS=1 install
复制代码
imgsmlr新增了两个数据类型
DatatypeStorage lengthDescriptionpattern16388 bytesResult of Haar wavelet transform on the imagesignature64 bytesShort representation of pattern for fast search using GiST indexesgist 索引方法(支持pattern和signature类型), 以及KNN操作符,可以用于搜索相似度
OperatorLeft typeRight typeReturn typeDescriptionpatternpatternfloat8Eucledian distance between two patternssignaturesignaturefloat8Eucledian distance between two signatures新增了几个函数
将图像的二进制转换为pattern类型,将pattern中存储的数据转换为signature类型
FunctionReturn typeDescriptionjpeg2pattern(bytea)patternConvert jpeg image into patternpng2pattern(bytea)patternConvert png image into patterngif2pattern(bytea)patternConvert gif image into patternpattern2signature(pattern)signatureCreate signature from patternshuffle_pattern(pattern)patternShuffle pattern for less sensitivity to image shiftPostgreSQL 图像搜索插件测试

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

 
 建立图片表
  1. create table image (id serial, data bytea);
复制代码
导入图片到数据库
  1. insert into image(data) select pg_read_binary_file('文件路径');
复制代码
将图片转换成 patten 和 signature
  1. CREATE TABLE pat AS (
  2.     SELECT
  3.         id,
  4.         shuffle_pattern(pattern) AS pattern,
  5.         pattern2signature(pattern) AS signature
  6.     FROM (
  7.         SELECT
  8.             id,
  9.             jpeg2pattern(data) AS pattern
  10.         FROM
  11.             image
  12.     ) x
  13. );
复制代码
创建索引
 
  1. ALTER TABLE pat ADD PRIMARY KEY (id);
  2. CREATE INDEX pat_signature_idx ON pat USING gist (signature);
复制代码
近似度查询,例如查询与id = :id的图像相似的图像,按相似度排行,取出前10条
 
  1. SELECT
  2.     id,
  3.     smlr
  4. FROM
  5. (
  6.     SELECT
  7.         id,
  8.         pattern <-> (SELECT pattern FROM pat WHERE id = :id) AS smlr
  9.     FROM pat
  10.     WHERE id <> :id
  11.     ORDER BY
  12.         signature <-> (SELECT signature FROM pat WHERE id = :id)
  13.     LIMIT 100
  14. ) x
  15. ORDER BY x.smlr ASC
  16. LIMIT 10
复制代码
这里可以用到KNN索引,快速按相似度排行输出结果。
例子
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
视频去重业务

视频去重,可以抽取视频中的关键帧,自关联产生笛卡尔积,计算不同视频的任意两张图片的相似度,相似度达到一定阈值,可以认为是相同视频。
例子
  1. 创建图片表,并将所有视频的关键帧导入表中
  2. create table image (id serial8 primary key, movie_id int, data bytea);
  3. 导入图片,假设为jpeg格式
  4. ... 略 ...
  5. 生成patten 和 signature
  6. CREATE TABLE pat AS (
  7.     SELECT
  8.         id, movie_id,
  9.         shuffle_pattern(pattern) AS pattern,
  10.         pattern2signature(pattern) AS signature
  11.     FROM (
  12.         SELECT
  13.             id, movie_id,
  14.             jpeg2pattern(data) AS pattern
  15.         FROM
  16.             image
  17.     ) x
  18. );
  19. 计算不同视频的相似度
  20. select t1.movie_id, t1.id, t1.signature<->t2.signature from
  21. pat t1 join pat t2 on (t1.movie_id<>t2.movie_id)
  22. order by t1.signature<->t2.signature desc
  23. or
  24. select t1.movie_id, t1.id, t1.signature<->t2.signature from
  25. pat t1 join pat t2 on (t1.movie_id<>t2.movie_id)
  26. where t1.signature<->t2.signature > 0.9
  27. order by t1.signature<->t2.signature desc
复制代码
小结

1. PostgreSQL是一个非常强大的数据库,功能高度可定制。而且不需要动到PostgreSQL的内核。 安全可靠。
2. 使用图像搜索的技术就是PostgreSQL功能扩展的例子,速度杠杠的,还记得我以前给出的关于地理位置近邻查询的性能指标吗。
《PostgreSQL 百亿地理位置数据 近邻查询毫秒级反馈》
3. 如果你对PostgreSQL扩展开发感兴趣,可以参考我写的文章
《找对业务G点, 体验酸爽 - PostgreSQL内核扩展指南》
    作者丨digoal
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表