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

图片搜索是怎么做到的呢?
万能的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
- $ 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 图像搜索插件测试
导入一些图片,例如(越多越好)

建立图片表
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索引,快速按相似度排行输出结果。
例子









视频去重业务
视频去重,可以抽取视频中的关键帧,自关联产生笛卡尔积,计算不同视频的任意两张图片的相似度,相似度达到一定阈值,可以认为是相同视频。
例子
- 创建图片表,并将所有视频的关键帧导入表中
- 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扩展开发感兴趣,可以参考我写的文章
PostgreSQL 在视频、图片去重,图像搜索业务中的应用的更多相关文章
- PostgreSQL视频去重 图片去重系列1
PostgreSQL 在视频.图片去重,图像搜索业务中的应用 图片搜索 PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储 gist 索引方法(支持pa ...
- 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示
在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...
- 如何使用捷映App制作朋友圈九宫格视频图片合集
在刷朋友圈的过程中,看到九宫格的视频图片合集,带有酷炫的音效和动效,展现效果非常好,那么我们该如何制作呢?下面我为大家介绍. 第一步,我们需要在各大应用市场搜索[捷映视频制作]App,点击[安装]. ...
- vivo 短视频推荐去重服务的设计实践
一.概述 1.1 业务背景 vivo短视频在视频推荐时需要对用户已经看过的视频进行过滤去重,避免给用户重复推荐同一个视频影响体验.在一次推荐请求处理流程中,会基于用户兴趣进行视频召回,大约召回2000 ...
- C#利用开源软件ffMpeg截取视频图片
#region 从视频画面中截取一帧画面为图片 /// <summary> /// 从视频画面中截取一帧画面为图片 /// </summary> /// <param n ...
- 用canvas给视频图片添加特效
Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...
- swiper 仿淘宝详情页面 视频图片切换
1.好兄弟,看一下是否是你需要的 2.废话不多说 直接上代码,复制粘贴一下 自己引用一下swiper.js和css 然后就可以开始玩儿了 <!DOCTYPE html> <html& ...
- SIFT算法总结:用于图像搜索
原始文章链接:http://bubblexc.com/y2011/163/ 原文链接:http://blog.csdn.net/cserchen/article/details/5606859 关于三 ...
- FFmpeg-截取视频图片
FFmpeg-截取视频图片 标签(空格分隔): linux 安装FFmpeg 官网:http://www.ffmpeg.org/ 这里主要是linux环境下的安装 1. wget http://ffm ...
随机推荐
- jsp对象 指令 动作
转载来源:https://blog.csdn.net/u010897406/article/details/49618413 jsp九大内置对象:1>out 向客户端输出数据,字节流.如out. ...
- Java学习day10-面向对象特征之一:封装和隐藏
一.包package和引用import 1.关键字package package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包(若缺省该语句,则指定为无名包).包的存在是为了区别同名 ...
- HihoCoder - 1093 小Hi和小Ho (SPFA)
描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两 ...
- weight (搜索对象的选取)
#10249. 「一本通 1.3 例 5」weight [题目描述] 已知原数列 $a_1,a_2,\cdots,a_n$ 中的前 1项,前 2 项,前3项, $\cdots$ ,前 n 项的和, ...
- 用Java语言做ACM的注意事项
①用Java时只需要粘贴包里面的内容,包名是不需要的.//有包名的去掉包名 ②提交题目时类名一定要是 Main,否则判题系统是不认识代码的. ③Java的util类里面的Scanner.in里面的 i ...
- Smarty模板引擎模板文件.tpl和.html的区别
在WEB开发中,PHP作为业务逻辑,HTML作为表现逻辑.但是在Smarty一些文档中可以看到模板文件的拓展名是.tpl,而不是.html,其实所谓的.tpl就是.html. 模版文件可以用任意的扩展 ...
- 线程池-连接池-JDBC实例-JDBC连接池技术
线程池和连接池 线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...
- 08Servlet
1.Servlet概念 1.1 servlet的特点 1)sevlet是一个普通的java类,继承HttpServlet类. 2)其实实现了Servlet接口的java类,才是一个Servlet类. ...
- windows 2003 系统管理员debug
- 为什么需要bootloader
本文链接:https://blog.csdn.net/u012351051/article/details/50557899 受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和 ...