0%

影片相似度 - 嘗試 videohash

今天的主題是影像相似度的比較,影像相似度可以分為圖片層級和影片層級。圖片層級通常是對 pixel 暴力計算或萃取出圖像的特徵結構再進行比較;而影片層級就複雜多了,影片可以萃取的特徵大方向就有 image 和 audio 兩種,細分下去有更多的特徵可以比對。
今天我主要嘗試 videohash 這個套件,在影片相似度上可以達到什麼樣的效果。

環境安裝

ffmpeg

我這邊的環境是在 Windows,預設各位都是建置環境的熟手,因此接下來會速速帶過安裝 ffmpeg 的方式。

  • 首先,到官網 下載 ffmpeg .7z 的壓縮檔。
  • C:\Program Files 中建立”ffmpeg”資料夾。
  • 將 .7z 的壓縮檔解壓縮並將 bin 資料夾複製到 C:\Program Files\ffmpeg
  • 開啟系統環境變數設置,將C:\Program Files\ffmpeg\bin 加入其中。
  • cmd 執行 ffmpeg -version,有顯示出版本就是成功啦。

videohash

這裡直接使用原作者建議地從 PyPi 下載

1
2
python3 -m pip install --upgrade pip
pip install videohash

Coding

大量讀取影片 path 及 threading 加速的方式相信大家都不陌生,我就不獻醜了,下面展示如何使用videohash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import ffmpeg
import pickle
from videohash import VideoHash

# index = video id
try:
videohash = VideoHash(path=video_path)
with open(f'./pkl/{index}.pkl', 'wb') as f:
pickle.dump(videohash, f)
#print(videohash.video_duration)
#print(videohash.hash)
#print(videohash.hash_hex)
#print(videohash.bits_in_hash)
#print(videohash.bitlist)
except Exception as error:
print(f'{index} failed at hash.')
print("An error occurred:", type(error).__name__, "–", error)

為了避免手殘不小心要重跑程式,我把所有的結果都存成 pkl;上方同時展示了 videohash 包含的一些資訊。
接下來則是讀取存成 .pkl 的 videohash obj,並進行兩部影片之間的比較。

1
2
3
4
5
6
7
8
9
def read_pkl(path):
with open(path, "rb") as f:
return pickle.load(f)

A_video_hash = read_pkl(A_pkl_path)
B_video_hash = read_pkl(B_pkl_path)

sim_result = A_video_hash.is_similar(B_video_hash) # True/False
diff_result = A_video_hash.is_diffrent(B_video_hash) # True/False

分析

這次的嘗試發現了幾個有趣的現象

  • 影片前幾秒有相似片段的(相同的開頭動畫、同一個主持人拿著字卡)會容易被視為相似的影片
  • 短影音有相同顏色、樣式模板的影片也容易被視為相似
  • 從原始影片剪輯出來的精華片段或是短影音並不會被視為相似的影片