圖像處理的業務場景比較多,例如 圖像搜索、視頻去重、人臉識別、美圖、圖片去重 等。 比如,視頻去重,一些用戶上傳了較多的視頻,同一部電影可能有不同的版本,解析度不一樣,音軌不一樣,壓縮比不一樣。這種情況會導致服務端重覆存儲大量的視頻。 又比如甄別黃色視頻或黃色圖片,鑒黃師的職業要消失了。 有什... ...
![](https://img2022.cnblogs.com/blog/27422/202210/27422-20221013150021912-1893103006.png)
背景
圖像處理的業務場景比較多,例如 圖像搜索、視頻去重、人臉識別、美圖、圖片去重 等。
比如,視頻去重,一些用戶上傳了較多的視頻,同一部電影可能有不同的版本,解析度不一樣,音軌不一樣,壓縮比不一樣。這種情況會導致服務端重覆存儲大量的視頻。
又比如甄別黃色視頻或黃色圖片,鑒黃師的職業要消失了。
有什麼方法可以得到重覆的視頻呢? 如何鑒別黃色視頻和圖片呢? 本文將給你揭曉。
另一方面,圖片搜索是繼文字搜索後又一個比較常用的搜索引擎。
市面上常見的搜索引擎有谷歌、百度、搜狗等圖片搜索引擎。
例如在搜索引擎提供的介面中上層了一張雪人的圖片,搜出來一堆和雪人近似的圖片。
圖片搜索是怎麼做到的呢?
萬能的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
截取幾頁,註意燒腦。
![](https://img2022.cnblogs.com/blog/27422/202210/27422-20221013150106258-1003831526.png)
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索引,快速按相似度排行輸出結果。
例子
![](https://img2022.cnblogs.com/blog/27422/202210/27422-20221015120616224-830728038.png)
視頻去重業務
視頻去重,可以抽取視頻中的關鍵幀,自關聯產生笛卡爾積,計算不同視頻的任意兩張圖片的相似度,相似度達到一定閾值,可以認為是相同視頻。
例子
創建圖片表,並將所有視頻的關鍵幀導入表中 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