摘要: PostgreSQL 在视频、图片去重,图像搜索业务中的应用作者digoal日期2016-11-26标签PostgreSQL , Haar wavelet , 图像搜索 , 图片去重 , 视频去重背景图像处理的业务场景比较多,例如 图像搜索、视频去重、人脸识别、美图、图片去...

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

作者

digoal

日期

2016-11-26

标签

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


背景

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

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

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

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

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

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

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

# 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.  
  6. $ make USE_PGXS=1
  7. $ make USE_PGXS=1 install

安装插件

  1. $ psql
  2. psql (9.5.3)
  3. Type "help" for help.
  4. postgres=# create extension imgsmlr;
  5. 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 图像搜索插件测试

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

建立图片表

create table image (id serial, data bytea);

导入图片到数据库

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.  
  3. 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索引,快速按相似度排行输出结果。

例子

视频去重业务

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

例子

  1. 创建图片表,并将所有视频的关键帧导入表中
  2. create table image (id serial8 primary key, movie_id int, data bytea);
  3.  
  4. 导入图片,假设为jpeg格式
  5. ... 略 ...
  6.  
  7. 生成patten 和 signature
  8. CREATE TABLE pat AS (
  9. SELECT
  10. id, movie_id,
  11. shuffle_pattern(pattern) AS pattern,
  12. pattern2signature(pattern) AS signature
  13. FROM (
  14. SELECT
  15. id, movie_id,
  16. jpeg2pattern(data) AS pattern
  17. FROM
  18. image
  19. ) x
  20. );
  21.  
  22. 计算不同视频的相似度
  23. select t1.movie_id, t1.id, t1.signature<->t2.signature from
  24. pat t1 join pat t2 on (t1.movie_id<>t2.movie_id)
  25. order by t1.signature<->t2.signature desc
  26.  
  27. or
  28.  
  29. select t1.movie_id, t1.id, t1.signature<->t2.signature from
  30. pat t1 join pat t2 on (t1.movie_id<>t2.movie_id)
  31. where t1.signature<->t2.signature > 0.9
  32. order by t1.signature<->t2.signature desc

小结

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

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

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

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

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

PostgreSQL 在视频、图片去重,图像搜索业务中的应用的更多相关文章

  1. PostgreSQL视频去重 图片去重系列1

    PostgreSQL 在视频.图片去重,图像搜索业务中的应用 图片搜索 PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储 gist 索引方法(支持pa ...

  2. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

  3. 如何使用捷映App制作朋友圈九宫格视频图片合集

    在刷朋友圈的过程中,看到九宫格的视频图片合集,带有酷炫的音效和动效,展现效果非常好,那么我们该如何制作呢?下面我为大家介绍. 第一步,我们需要在各大应用市场搜索[捷映视频制作]App,点击[安装]. ...

  4. vivo 短视频推荐去重服务的设计实践

    一.概述 1.1 业务背景 vivo短视频在视频推荐时需要对用户已经看过的视频进行过滤去重,避免给用户重复推荐同一个视频影响体验.在一次推荐请求处理流程中,会基于用户兴趣进行视频召回,大约召回2000 ...

  5. C#利用开源软件ffMpeg截取视频图片

    #region 从视频画面中截取一帧画面为图片 /// <summary> /// 从视频画面中截取一帧画面为图片 /// </summary> /// <param n ...

  6. 用canvas给视频图片添加特效

    Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...

  7. swiper 仿淘宝详情页面 视频图片切换

    1.好兄弟,看一下是否是你需要的 2.废话不多说 直接上代码,复制粘贴一下 自己引用一下swiper.js和css 然后就可以开始玩儿了 <!DOCTYPE html> <html& ...

  8. SIFT算法总结:用于图像搜索

    原始文章链接:http://bubblexc.com/y2011/163/ 原文链接:http://blog.csdn.net/cserchen/article/details/5606859 关于三 ...

  9. FFmpeg-截取视频图片

    FFmpeg-截取视频图片 标签(空格分隔): linux 安装FFmpeg 官网:http://www.ffmpeg.org/ 这里主要是linux环境下的安装 1. wget http://ffm ...

随机推荐

  1. jsp对象 指令 动作

    转载来源:https://blog.csdn.net/u010897406/article/details/49618413 jsp九大内置对象:1>out 向客户端输出数据,字节流.如out. ...

  2. Java学习day10-面向对象特征之一:封装和隐藏

    一.包package和引用import 1.关键字package package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包(若缺省该语句,则指定为无名包).包的存在是为了区别同名 ...

  3. HihoCoder - 1093 小Hi和小Ho (SPFA)

    描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两 ...

  4. weight (搜索对象的选取)

    #10249. 「一本通 1.3 例 5」weight [题目描述] 已知原数列 $a_1,a_2,\cdots,a_n$​​ 中的前 1项,前 2 项,前3项, $\cdots$ ,前 n 项的和, ...

  5. 用Java语言做ACM的注意事项

    ①用Java时只需要粘贴包里面的内容,包名是不需要的.//有包名的去掉包名 ②提交题目时类名一定要是 Main,否则判题系统是不认识代码的. ③Java的util类里面的Scanner.in里面的 i ...

  6. Smarty模板引擎模板文件.tpl和.html的区别

    在WEB开发中,PHP作为业务逻辑,HTML作为表现逻辑.但是在Smarty一些文档中可以看到模板文件的拓展名是.tpl,而不是.html,其实所谓的.tpl就是.html. 模版文件可以用任意的扩展 ...

  7. 线程池-连接池-JDBC实例-JDBC连接池技术

    线程池和连接池   线程池的原理:     来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...

  8. 08Servlet

    1.Servlet概念 1.1 servlet的特点 1)sevlet是一个普通的java类,继承HttpServlet类. 2)其实实现了Servlet接口的java类,才是一个Servlet类. ...

  9. windows 2003 系统管理员debug

  10. 为什么需要bootloader

    本文链接:https://blog.csdn.net/u012351051/article/details/50557899 受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和 ...