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

图片搜索
PostgreSQL的图像搜索插件使用了非常主流的Haar wavelet技术对图像进行变换后存储
gist 索引方法(支持pattern和signature类型), 以及KNN操作符,可以用于搜索相似度
1,建立图片表
create table image (id serial, data bytea);
2,导入图片到数据库
insert into image(data) select pg_read_binary_file('文件全路径');
错误:
ERROR: absolute path not allowed
PGDATA 为/var/lib/pgsql/9.6/data/,在vi /usr/lib/systemd/system/postgresql-9.5.service里面有
拷贝文件到该目录后
insert into image(data) select pg_read_binary_file('./2/1K7A9699.JPG');
3,将图片转换成 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 );
4,创建索引
ALTER TABLE pat ADD PRIMARY KEY (id); CREATE INDEX pat_signature_idx ON pat USING gist (signature);
5,相似度排行
SELECT id, smlr FROM ( SELECT id, pattern <-> (SELECT pattern FROM pat WHERE id = 74) AS smlr FROM pat WHERE id <> 74 ORDER BY signature <-> (SELECT signature FROM pat WHERE id = 74) LIMIT 100) x ORDER BY x.smlr ASC LIMIT 10;

视频去重
抽取视频中的关键帧
1,建立图片表
2,导入图片到数据库
3,将图片转换成 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 );
create table targer_table as select * from source_table是会复制表结构+表数据,
SELECT name FROM (SELECT name FROM agentinformation) 这种是不对的
You need to alias the subquery.
SELECT name FROM (SELECT name FROM agentinformation) a
or to be more explicit
SELECT a.name FROM (SELECT name FROM agentinformation) a
select x.id, x.movie_id...
4.
计算不同视频的相似度
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
多上面红色那一行,其它一样
报错:
ERROR: function jpeg2pattern(bytea) does not exist
这个是因为扩展imgsmlr安装不正确
\dx命令查看所有已安装的扩展模块

imgsmlr
$ cd imgsmlr $ export PGHOME=/usr/pgsql-9.6 $ export PATH=$PGHOME/bin:$PATH:. $ make USE_PGXS=1 $ make USE_PGXS=1 install
psql -U postgres -d exampledb -h 127.0.0.1 -p 5432
then exeute the sql.
create extension imgsmlr;
查看下
\dx命令查看所有已安装的扩展模块
然后执行
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 );
记得结束加分号
The idea is to find top N similar images by signature using GiST index. Then find top n (n < N) similar images by pattern from top N similar images by signature.
参考
下一步需要测试增量添加图片

最新文章

  1. 使用C#给Linux写Shell脚本(下篇)
  2. 关于html页面布局
  3. .net学习笔记----Asp.net的生命周期之一应用程序生命周期
  4. display:none和visibility:hidden的区别[]
  5. richTextBox1 转到行号
  6. 苹果手表的真实触感信息(Real Touch Messaging)
  7. HTML 5 &amp; checkbox &amp; switch components
  8. c语言利用读取命令行(多行读取)
  9. [Swift]LeetCode168. Excel表列名称 | Excel Sheet Column Title
  10. springBoot2.0+redis+fastJson+自定义注解实现方法上添加过期时间
  11. Docker构建JDK环境
  12. KMP算法2
  13. 线程安全-002-多个线程多把锁&amp;类锁
  14. rsync使用详解
  15. 20145320《网络对抗》逆向及Bof基础实践
  16. 4.easyloader.js文件的作用
  17. MT【79】任意和存在并存
  18. 开启VIM的Python支持
  19. c++ 中const的使用
  20. spring-tool-suite(STS) 创建 spring boot项目

热门文章

  1. 算法笔记_020:深度优先查找(Java)
  2. mysql 流程函数 存储引擎 InnoDB简单特性
  3. 【BIRT】报表显示不全
  4. 转:sock_ev——linux平台socket事件框架(logTrace) .
  5. Git使用教程(全)
  6. cxf 生成客户端代码调用服务
  7. Centos网络时好时超时问题解决
  8. python笔记-字符串
  9. 【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签
  10. 为MFC中的ListBox添加水平滚动条