PostgreSQL 在視頻、圖片去重,圖像搜索業務中的應用

来源:https://www.cnblogs.com/88223100/archive/2022/10/15/Application-of-PostgreSQL-in-video-and-image-duplication-removal-and-image-search.html
-Advertisement-
Play Games

圖像處理的業務場景比較多,例如 圖像搜索、視頻去重、人臉識別、美圖、圖片去重 等。 比如,視頻去重,一些用戶上傳了較多的視頻,同一部電影可能有不同的版本,解析度不一樣,音軌不一樣,壓縮比不一樣。這種情況會導致服務端重覆存儲大量的視頻。 又比如甄別黃色視頻或黃色圖片,鑒黃師的職業要消失了。 有什... ...


 

背景

圖像處理的業務場景比較多,例如 圖像搜索、視頻去重、人臉識別、美圖、圖片去重 等。

比如,視頻去重,一些用戶上傳了較多的視頻,同一部電影可能有不同的版本,解析度不一樣,音軌不一樣,壓縮比不一樣。這種情況會導致服務端重覆存儲大量的視頻。

又比如甄別黃色視頻或黃色圖片,鑒黃師的職業要消失了。

有什麼方法可以得到重覆的視頻呢? 如何鑒別黃色視頻和圖片呢? 本文將給你揭曉。    

另一方面,圖片搜索是繼文字搜索後又一個比較常用的搜索引擎。

市面上常見的搜索引擎有谷歌、百度、搜狗等圖片搜索引擎。

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新增了兩個數據類型

DatatypeStorage lengthDescription
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操作符,可以用於搜索相似度

OperatorLeft typeRight typeReturn typeDescription
<-> pattern pattern float8 Eucledian distance between two patterns
<-> signature signature float8 Eucledian distance between two signatures

新增了幾個函數

將圖像的二進位轉換為pattern類型,將pattern中存儲的數據轉換為signature類型

FunctionReturn typeDescription
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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在一個項目中,客戶要求對報表中的簽名進行仿手寫的簽名處理,因此我們原先只是顯示相關人員的姓名的地方,需要採用手寫方式簽名,我們的報表是利用FastReport處理的,在利用楷體處理的時候,開發展示倒是正常效果,不過實際上在伺服器運行的時候,出來的確實正規的宋體格式,相應的字體都已經安裝,不過還是沒有... ...
  • 1.進程 進程的概念從字義上理解相對還是比較抽象的,但進程實際上對我們並不陌生,可以說它無時不刻的伴隨著我們的生活。當你每天上班打開電腦,運行微信與好友通訊、運行瀏覽器閱讀網頁新聞等,這一些將程式運行起來的操作,都屬於創建了一個進程。並且我們可以對同一種程式重覆運行多次,這意味著一個程式可以創建多個 ...
  • 一:背景 1.講故事 前段時間有位朋友微信找到我,說他生產機器上的 Console 服務看起來像是卡死了,也不生成日誌,對方也收不到我的httpclient請求,不知道程式出現什麼情況了,特來尋求幫助。 哈哈,一般來說卡死的情況在窗體程式(WinForm,WPF) 上特別多,在 Console,We ...
  • 導圖 1.inode表結構 每個文件的屬性信息,比如:文件的大小,時間,類型,許可權等,稱為文件的元數據(meta data) 元數據是存放在inode(index node)表中。inode 表中有很多條記錄組成,第一條記錄對應的存放了一個 文件的元數據信息。 1.1硬鏈接和軟連接 硬連接 同一個文 ...
  • GPIO 引腳號定義 #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< 選擇Pin0 */ //(00000000 00000001)b #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< 選擇Pin1 */ //(0000000 ...
  • 群星stellaris mac版是一款深度策略游戲,科幻類的太空作戰游戲,游戲中包含了大量的外星種族和緊湊的游戲劇情;玩家在游戲中會對各個星系根據順序先後進行探索,並遇到遇到多種多樣的有趣的外星生物和隨機產生的敵人。 詳情:群星Stellaris for mac(策略游戲) 群星stellaris ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 前文回顧 實現一個簡單的Database1(譯文) 實現一個簡單的Database2(譯文) 實現一個簡單的Database3(譯文) 實現一個簡單的D ...
  • 一、首先創建一張測試表,隨便插入一點測試數據: CREATE TABLE `test_index` ( `id` int(11) NOT NULL AUTO_INCREMENT, `no` int(11) NOT NULL DEFAULT '0' COMMENT '訂單號,int型', `no_st ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...