利用python打造你的視頻檢索引擎


各位廣大影迷們,是不是在爲自己幾十上百G的視頻文件而頭大呢,又或者是看到了一部動作大片,明明記得自己硬盤上也有,想再次重溫一下,卻怎麼也找不到的悲慘經歷呢。

彆着急,今天就陪同大家,一起打造一個簡單有效的視頻檢索工具,從此以後,媽媽再也不用擔心我找不到自己喜歡看的片片啦!

首先來快速瞭解一下:

開發工具:PyCharm,Opencv,PHash庫,MYSQL以及一些基本的視頻流處理方法。通過本篇文章,將會手把手教你打造自己的檢索工具。

主要實現過程:

  • 構建視頻指紋庫

  • 返回相似視頻結果

  • 計算哈希距離

  • 提取哈希值

  • 輸入查詢的視頻

 

預備知識:

PHash及漢明距離的計算過程具體如下:

(1)縮小尺寸:將圖像縮小到8*8的尺寸,總共64個像素。這一步的作用是去除圖像的細節,只保留結構/明暗等基本信息,摒棄不同尺寸/比例帶來的圖像差異;

(2)簡化色彩:將縮小後的圖像,轉爲64級灰度,即所有像素點總共只有64種顏色;

(3)計算平均值:計算所有64個像素的灰度平均值;

(4)比較像素的灰度:將每個像素的灰度,與平均值進行比較,大於或等於平均值記爲1,小於平均值記爲0;

(5)計算哈希值:將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖像的指紋。組合的次序並不重要,只要保證所有圖像都採用同樣次序就行了;

(6)得到指紋以後,就可以對比不同的圖像,看看64位中有多少位是不一樣的。在理論上,這等同於”漢明距離”(Hamming distance,在信息論中,兩個等長字符串之間的漢明距離是兩個字符串對應位置的不同字符的個數)。

 

小夥伴準備好了嗎?接下來正式開啓我們的旅程:感性哈希值-如何用Python打造你的第一個視頻搜索引擎。

 

 

 

一.構建視頻指紋庫:

 

(1)視頻截取

獲取視頻幀率FPS(即每秒鐘幀數),假設每5秒鐘截取視頻一幀,轉換爲視頻幀數爲5*FPS幀截取一張視頻圖像。

對於如下視頻:假設視頻爲20秒,幀率爲24,按照每5秒的間隔時長(24*5=120幀)進行切分,那麼可以得到如下4個視頻截圖:

接下來看一下我們準備的視頻樣本:

 

讀取視頻,每隔10s截取其靜態幀,對每一幀提取感知哈希值,並將提取到的所有哈希值進行拼接,然後將每個視頻的哈希值存入MYSQL數據庫中。

最終建立了視頻指紋庫,如下圖所示:

採用感知哈希值PHash算法,計算每一張圖像的圖像指紋,對所有視頻進行相同操作,按照相同時間間隔截取視頻幀,獲取指紋,最終保存起來。 

到此,建立了給定視頻的指紋庫。目前數據庫中包含了3個字段,即:id,videoId,PHash

 

二.相似視頻查詢

 

在上一步中,我們建立起來了給定視頻的指紋庫,即:一連串不同時間點下的哈希值。接下來,利用同樣的方式,輸入一個視頻,對該視頻提取哈希值,然後在構建的視頻指紋庫中進行查詢,從而判斷是否存在相似視頻。

視頻相似度比較中,衡量相似度的一般方式是計算兩個特徵之間的距離,常用方法有:歐式距離,餘弦距離,漢明距離等。此處我們採用計算漢明距離的方法,來比較兩個視頻的相似程度。

 

首先讀取某個視頻,並提取該視頻的PHash值,接下來,對數據庫中的所有視頻進行查詢,並計算分別計算輸入哈希值和數據庫中視頻哈希值的漢明距離,並對計距離進行排序,提取前20個相似視頻的結果,結果如下圖所示:

 

 

最終查詢到了這麼多個視頻,哪一個纔是我們想要找到的視頻呢?在此我們需要定義一個閾值,通過這個閾值對視頻相似度的距離進行篩選,只有符合要求的視頻纔會留下,不符合要求的視頻就直接過濾掉。

在此,我們先把距離小於10的視頻定義爲相同視頻,距離在10~20之間的定義爲相似視頻,一起來看看結果吧。

通過設置閾值,篩選出符合要求的視頻。

其中:

第一個字段:id

第二個字段:視頻的videoId

第三個字段:視頻之間的漢明距離

第四個字段:相似度文字描述

三.總結:

在本文中,我們探討了如何從頭到尾創建一個視頻搜索引擎。第一步是選擇圖像描述符——我們使用感性哈希值作爲視頻幀的特徵描述子,提取每一個視頻幀的指紋拼接起來,由此建立我們的視頻指紋庫。在此基礎上,利用漢明距離定義兩幅圖像之間的“相似性”。計算距離,篩選,最終獲得了符合我們預期要求的視頻信息。把以上所有的步驟連接在一起,創建了一個相似視頻的搜索引擎。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章