Stiller 智慧劇照挑選系統
Stiller: A Smart Way to Extract Attractive Stills.
前言
Stiller 是我在 KKStream 內部開發的一款劇照挑選系統。能對於給定的輸入影片從中挑選出適當的 Frame 作為 Still,下圖是一些範例:
去年中,實驗室與 KKStream 展開了合作計畫,起初以 Video Summarization 作為目標進行研究。目的是給定一部影片,如何從中擷取精彩段落,從而產生簡短扼要的精華版,類似谷阿莫快速講電影一樣(下稱 Video Summary,或簡稱 Summary)。
本以為可以在暑假內速戰速決結束專案,所以在加入 Data Team 實習前,我已透過 Visual Features 初步產生 Keyframe-Based 的 Video Summary(可參考 VSUMM)。影片雖然產生了,豈料有個大問題橫亙在眼前:
怎麼評估產生出的 Video Summary 好壞呢?
啊,所幸有編輯部的姊姊們可以諮詢。畢竟閱片無數的她們對評估 Video Summary 顯然比我專業多了!
不過趣事就在這一來一往的討論中慢慢浮現了。過程中我除了獲得不少寶貴的意見(並再次體會到 evaluation 的難處),但更重要的是,討論過程中我們意外發現:比起產生 Summary,公司對於 Still(影片縮覽圖)有更迫切需求。進一步了解後,對於 Still 的需求包括兩個方面:
1. 改善產品頁面
觀察現行產品後可以發現, 現行的 Still 自動產生系統存在改進空間。我們都知道美觀的界面,對使用者體驗有相當程度的影響,甚至包括是否想看片的心情,而 Still 當然是介面美觀的要素之一。
2. 大量減輕人工編輯負擔
編輯也意識到 Still 的重要性,因此對於新推出的強檔劇,會精心手動挑選、替換掉系統自動生成的 Still。這裡讓我引用某位編輯在會議中的發言:
最近在做 T生 T世 X里桃花有 50 幾集,但是我換到 20 集的時候就想放棄了。
在漫長的影片中挑選合適的 Still、再經歷一連串的剪輯操作才能完成替換工作。無疑對編輯是頗為繁重並且耗時的負擔。
至此,我們確認了新的方向:「以自動生成 Still 為新課題,開始打造 Stiller」 作為我的專案目標。
組隊打怪
剛開始時,我以為這應該是很簡單的工作。
太天真了。
首先會遇到的問題就是「怎麼定義 Still 的好壞」?暫且不提 Evaluation,以單集長約 1 小時的劇為例,Stiller 要做到的事其實就是從每部影片約 10 萬個 Frames(影格)挑出 1 或多張作為 Still,有點類似 Retrieval 問題,而既然要算分數、總是要有一些 Criteria 嘛。經歷一段時間的摸索,我發現這個問題難以回應並不是因為沒有答案,而是可能的答案太多了。構圖、顏色、光線、角色、場景、互動、跟故事的關聯……
顯然我有點難一次達成這一切,畢竟飯也要一口一口吃。其實現在回頭來看,打造 Stiller 的過程像組隊打怪,單挑失敗後就找隊友,兩個人不夠嗎?觀察缺陷、再找新隊友,直到組成一個夠完整的團隊,大概就能有些成果。
進入細節前,先看一張圖大致理解 Stiller:
從圖中可見,Stilller 內分成好幾個步驟,而整個打造過程,其實也大致是照上圖由左至右、逐步發展而成。
第一步:技術性品質
什麼都還沒開始時,有那麼多方向,該怎麼切入?猶豫不決的時候,就從最有把握的部分開始吧!
於是,我決定先從技術性的品質出發,畢竟這些品質的衡量似乎比較客觀,例如銳利、明亮、色彩飽合的圖片通常比較好。但是,越亮、越飽和就一定越好嗎?顯然不見得。進一步觀察後,我決定不直接用技術性品質來排序圖片優劣。而是設定基本的閾值,用來篩去特別差的 Frames,縮小候選名單。
我們來談談閾值該怎麼設定?我先對影片進行 Downsampling,並從時間較長的 Shots 中抽取候選者(發現這些 Shots 通常相對穩定,取樣出的圖也就會比較銳利)。接著,請編輯從中挑選出她們認為好的 Still,若姑且假設沒被編輯挑到的都算是不好的 Still,我便能憑藉編輯的挑選,觀察出各項指標與 Still 品質好壞的關聯性,並以此來設定閾值。而有些似乎無法區分的指標就被捨棄了(例如色彩的豐富度)。
過程中得到一個有趣的發現:編輯有自己獨特的喜好,每個人認為的好 Still 也南轅北轍。意料之外、情理之中,畢竟一集當中能拿來當 Still 的 Frame 的確往往有很多,因此,也許轉而標註壞的 Still 會更有鑑別度呢。
第二步:人臉的用途
前面提及,技術性品質僅協助淘汰了最差的那些候選者,顯然路還很長。
研讀相關的文獻會發現,過去的類似工作探討的對象通常是五花八門的圖片,可能是風景、物體、動植物等等,也發展出各式各樣的方法。然而,既然我要處理的對象是電視劇,有個至關重要的元素無法忽略:
人臉。
在電視劇裡,最重要的關鍵之一就是臉了。而電視劇由專業人士拍攝而成,顯然會存在一些套路,例如下圖中,簡單地將所有被標註為好 Still 的圖疊合,可以發現人臉集中於鏡頭的中央部位(見下圖)。
更仔細地觀察分析後,就可以利用臉的位置與大小等資訊定義一些分數來協助挑選 Stills。其實這樣的概念也類似利用 Attention 的 Summarization(可參考此文)。當然、除此之外,表情、主角與否也都是可供利用的資訊。
第三步:排序
在第二步已經定義出一些計算分數的方式,所以可以排序出一個列表來挑選Still 了。並且因為是列表,想挑幾張都可以(甚至可以把 Stills 做成 GIF)。
但是,如果僅此而已,排序出來的圖有可能長得都很像(如下圖上排)。因此我透過色彩分佈以及時間資訊導入圖像間相似度的計算,避免相似的 Still 重複出現。考慮到在該集影片中出現較長時間的畫面應當比較重要,我還會給予較大的 Cluster 更高的分數。重新排序後,得出新結果(下圖下排)。
第四步:再提煉
進行排序時,有個問題一直縈繞在我心頭:
總覺得排序時也該考慮銳利度阿。
殘酷的是,對於內容差異大的圖片,銳利度往往很難正確比較。不妨想像一張圖是萬里無雲的天空,另一張則是台北的街景,就算前者清晰銳利、後者充滿走動中的行人,若真去計算銳利度,前者會得到的數值無疑較高。
但是,對於內容相似的圖片,銳利度的比較就有意義多了。因此,既然沒辦法在排序時考慮,我決定等排序完、再去比較候選圖片在影片中的左鄰右舍,從中挑選最銳利的圖片當作最終結果。
結果與測試
做出結果之後就該好好衡量了。我們請編輯們從日劇、韓劇、中劇這三個主要類別中挑選了 10 部劇,共 50 部影片,供我測試 Stiller 的能耐。
我們透過問卷進行主觀測試。問卷中,每題會根據一部影片呈現兩張 Stills,請填答者勾選喜歡的那張,也可以兩張都選(因為不時會感覺兩張難分軒輊)。兩張 Stills 中,其一來自現行產品,另一張則由 Stiller 產生,為避免觀影印象產生的偏差,答題前會詢問是否曾觀看該影集。
回收了近兩百份問卷後,結果如何呢?
當然是 Stiller 獲勝。
只講勝敗就太無趣了。分享測試結果替我們帶來了哪些耐人尋味的啟發:
1. 人們對於 Still 可能蘊含的意義比技術性品質更為重視,對包含互動(擁抱、親吻)或者不尋常的表情、地點等內容的 Still,就算較暗或模糊也可能被挑選。
2. 角色的存在是必備要件,而且,就算沒看過該部戲劇的人,其實某種程度上似乎也能猜出誰是主角。
3. 看過與未看過該部戲劇的人,對於 Still 的偏好幾乎沒有差異。
從測試的結果,可以發現 Stiller 還有一些改進空間,而這也將是我繼續努力的方向。
雜記
在 KKStream 實習的幾個月,非常感謝經凱以及其他同事的指導,給我很大的自由與信任去摸索方向、在我需要協助時也總是慷慨大方、並不吝於分享各種經驗與建議。此外,經凱有一句話,我印象特別深刻:
我們跟在實驗室不同的地方在於,RD 除了 Research 外還要 Development。
所以在公司時絕不只是埋頭苦幹,也需要時時將應用層面納入考慮。Stiller 的誕生就是從實際應用出發,去探索有什麼能幫助到產品或者其他同事之工作,重新定義值得解決的問題。並且,在開發過程中,我也從編輯、行銷得到許多不同的意見啟發、跳脫工程師的思考窠臼。
至此,Stiller 到達一個階段,也將在未來納入產品,我從暑假一片茫然,到能確切感受到自己做的事派上用場,這一切是很寶貴的經驗。再次感謝 KKStream 提供的環境與我厲害又溫柔的同事們。