影片理解的取樣策略:不要每一幀都送
影片內容分析的成本主要來自幀數。取樣策略決定了成本與品質。
一支十分鐘、每秒 30 幀的影片有一萬八千幀。全部送進模型既不可能也沒必要——連續的幀之間資訊高度重複。
三種取樣策略
- 固定間隔:每 N 秒取一幀。最簡單,適合內容變化平緩的影片。
- 場景切換偵測:偵測畫面差異超過門檻時取幀。適合剪輯過的影片。
- 混合:以場景切換為主,並確保任兩幀之間不超過 N 秒。
import cv2
def sample_frames(path, max_gap=5.0, diff_thr=0.35):
cap = cv2.VideoCapture(path)
fps = cap.get(cv2.CAP_PROP_FPS) or 25
prev, last_t, out = None, -1e9, []
idx = 0
while True:
ok, frame = cap.read()
if not ok: break
t = idx / fps
small = cv2.resize(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), (64, 36))
changed = prev is None or (cv2.absdiff(small, prev).mean() / 255) > diff_thr
if changed or (t - last_t) >= max_gap:
out.append((t, frame)); last_t = t
prev = small; idx += 1
cap.release()
return out聲音軌不要忽略
很多影片的關鍵資訊在語音而非畫面。先做語音轉文字,再用視覺補畫面資訊,成本比純視覺低很多,效果往往更好——尤其是教學、簡報、會議錄影。
時間軸要對齊
把取樣的幀與逐字稿依時間戳合併成一份時間軸文件,再交給模型。這種結構比單獨給圖或單獨給文字都有效。
先用「每 10 秒一幀 + 逐字稿」跑一版當基準。多數影片理解任務用這個組合就能達到堪用水準,再視需要加密取樣。