背景
影像處理的業務場景比較多,例如 影像搜索、視頻去重、人臉識別、美圖、圖片去重 等,
比如,視頻去重,一些用戶上傳了較多的視頻,同一部電影可能有不同的版本,解析度不一樣,音軌不一樣,壓縮比不一樣,這種情況會導致服務端重復存盤大量的視頻,
又比如甄別黃色視頻或黃色圖片,鑒黃師的職業要消失了,
有什么方法可以得到重復的視頻呢? 如何鑒別黃色視頻和圖片呢? 本文將給你揭曉,
另一方面,圖片搜索是繼文字搜索后又一個比較常用的搜索引擎,
市面上常見的搜索引擎有谷歌、百度、搜狗等圖片搜索引擎,
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
$ 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
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擴展開發感興趣,可以參考我寫的文章
《找對業務G點, 體驗酸爽 - PostgreSQL內核擴展指南》
作者丨digoal本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Application-of-PostgreSQL-in-video-and-image-duplication-removal-and-image-search.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/514319.html
標籤:其他
