摘要: 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. C#中Func与Action的理解

    Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托.最初使用委托时,均需要先定义委托类型,然后定义一个符合委托类型签名的函数,在调用前,需声明并创建委托对象,将指定函 ...

  2. 找不到opencv_world320d.dll的问题

    OpenCV执行时出现找不到opencv_world320d.dll的问题,解决办法:把自己opencv文件目录下的D:\opencv3.2.0\opencv\build\x64\vc14\bin(本 ...

  3. 使用控制台搭建vue-cli脚手架

    注意: 1.安装前您需要查看自己是否有node环境  检查:node - v 2.如果没有的话,需要先搭建好才能进行下一步操作 (参考:https://www.cnblogs.com/sylys/p/ ...

  4. Sublime-emmet插件的使用

    emmet是使用Sublime编写html代码时最好用的一个插件,下面简单介绍一下emmet插件的安装和使用 安装 第一步:打开sublime,首先输入command + shift + p,然后输入 ...

  5. Dubbo学习源码总结系列四--集群容错机制

    Dubbo提供了哪些集群容错机制?如何实现的?         提供了六种集群容错机制,包括Failover(失败自动切换,尝试其他服务器).Failfast(失败立即抛出异常).Failsafe(失 ...

  6. 【转载】JDK8 特性 stream(),lambda表达式,

    Stream()表达式 虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同: 无存储.stream不是一种数据结构 ...

  7. 优化Nginx并发访问量

    通过修改Nginx配置文件,优化linux内核参数,实现高并发测试. 1.优化前使用ab高并发测试 [root@proxy ~]# ab -n 2000 -c 2000 http://192.168. ...

  8. CF3D Least Cost Bracket Sequence(2500的实力贪心...

    哎,昨天一直在赶课设..没有写 最近听了一些人的建议,停止高级算法的学习,开始刷cf. 目前打算就是白天懒得背电脑的话,系统刷一遍蓝书紫书白书之类的(一直没系统刷过),回宿舍再上机吧. https:/ ...

  9. python 判断一个数是整数还是小数

    a=81**0.5 s=str(a).split('.') if float(s[1])==0: print('整数') else :print('小数')

  10. vue项目中router路由配置

    介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    cnpm install vue-rou ...