摘要: 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. 剑指Offer编程题(Java实现)——替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路1 在字符串尾部填充任 ...

  2. 全球编程语言薪资排行榜,Java竟然垫底!!!

    近日,Stack Overflow 发布了 2019 年度开发者调查报告,这次调查有来自全球的几乎将近 90000 名开发者参与,是对世界各地开发人员进行的规模最大,最全面的调查. 这次调查报告中总结 ...

  3. VS2010中解决Qt“Unable to find a Qt build“

    转自:http://blog.sina.com.cn/s/blog_687960370101d0eu.html 三种方法: 1.在QT菜单下单击OPTION,然后单击ADD,选择QT安装路径. 2.运 ...

  4. 2019牛客暑期多校训练营(第三场) - D - Big Integer - 数论

    https://ac.nowcoder.com/acm/contest/883/D \(A(n)\) 是由n个1组成的一个整数. 第一步:把 \(A(n)\) 表示为 \(\frac{10^n-1}{ ...

  5. python的cls,self,classmethod,staticmethod

    python类里会出现这三个单词,self和cls都可以用别的单词代替,类的方法有三种, 一是通过def定义的 普通的一般的,需要至少传递一个参数,一般用self,这样的方法必须通过一个类的实例去访问 ...

  6. Delphi Unicode学习

    String.AnsiString及Tbytes之间的转换一.string转为AnsiString1.直接赋值 (有警告)2.AnsiString()类型强制转换.(无警告) 二.AnsiString ...

  7. sde自动备份到文件gdb

    本方法原理是使用python(以下简称py)调用arcmap的gp,在上再用bat调用py的方式实现.优点是能应用于所有数据库类型(包括pg,oracle等)的sde库 环境:arcmap 10.4, ...

  8. [译]理解 SwiftUI 里的属性装饰器@State, @Binding, @ObservedObject, @EnvironmentObject

    原文地址:https://mecid.github.io/2019/06/12/understanding-property-wrappers-in-swiftui/ @States 通过使用 @St ...

  9. 使用Nginx代理和转发Websocket连接

    1.Websocket 简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 2.Nginx 简介 ...

  10. Shell脚本的fork炸弹

    #!bin/bash#功能:快速消耗计算机资源,致使计算机死机#作者:liusingbon#定义函数名为.(点), 函数中递归调用自己并放入后台执行function . { .|.& };.