文章出處:AVA: The Art and Science of Image Discovery at Netflix
在Netflix中,Content Platform Engineering 以及 Global Product Creative 團隊了解縮圖在使用者尋找新影集、電影時佔有舉足輕重的地位,Netflix一向以挑選優質影集,大量分析使用者觀影喜好,甚至自己製作影集內容而聲名遠播,而在發展個性化推薦的這一塊,Netflix鎖定了影集縮圖,他們的做法是直接從影集本身收集靜態圖片,以提供更靈活的縮圖選項。
商業目的
過往的縮圖通常由製片團隊或是製片編輯提供,而這樣的縮圖也是從製片團隊的專業知識中選出來,然而,這些縮圖是最能刺激使用者點擊觀看該影集的縮圖嗎? Netflix在早期率先挑戰了這個觀點,在不同於製片團隊選出的縮圖中,更多形式的縮圖有沒有可能提高使用者點擊以及觀看次數?
在Netflix的這項A/B Test: Selecting the best artwork for videos through A/B testing中,他們確實驗證了這個觀點,這彷彿打開了潘朵拉的盒子,使得挖掘出更多影集中的精美縮圖,變得富有商業價值,例如:
- 各群使用者們在縮圖點擊上是否有偏好的角色表情?
- 各群使用者們在縮圖點擊上是否有偏好的色調?
- 縮圖是否能夠涵蓋更多表示(例如 帥氣、美麗、聰明等),進而對具有特定喜好的使用者進行縮圖顯示?
AVA
為了回答上述這樣的問題,Netflix打算建立一個演算法,作為高質量縮圖的候選名單,或許在現階段還做不到全自動選縮圖,最後還是必須透過人工篩選,但試想,一季10集的怪奇物語就有約86,0000張圖片,如果有一套算法可以將這些圖片縮減到 1%,也僅剩860張,這時候還要人工篩選就容易得多了,以下4張是Netflix AVA選出的Best moments:
這件事怎麼做呢? 首先必須先為每張圖片上各式各樣的標籤,接著用一個監督式排序算法,以人類認知的美感(aesthetic)作為特徵,將圖片排序,接著再挑出前N張作為候選圖(creative/editorial candidates),以下兩張圖是Netflix AVA挑選出畫片符合聰明的畫面,以及AVA演算法的架構圖:
Frame Annotation
Data Engineering
在資料工程上,Netflix主要使用Archer來進行分散式運算,讓整個算法工作能夠規模化:
圖片貼標上,Netflix團隊設計成3種主要的Metadata,分別是Visual Metadata, Contextual Metadata以及Composition Metadata,除此之外,還必須對不適當的畫面進行過濾(Filters for Maturity)。
Visual Metadata
這類的標籤主要集中在pixel level的貼標,例如從像素中計算出平均亮度,對比程度,代表色(Dominant Color)以及是否有運動模糊(Motion blur),透過這樣的特徵我們能夠得知該畫面是否是對比強烈的,亮色系畫面還是暗色系畫面,運動模糊也是捕捉Best moments的重要特徵,觀眾們總不會希望縮圖糊糊的不專業吧XD,這裡作者也進行的一些研究,試圖拆解出各個步驟可能的做法
- 亮度 : 我們能夠將pixel從RGB空間轉換到HSV空間,並以平均值/中位數,來做為代表。
- 對比程度 : 根據對比度其中一項的定義,我們能夠將圖片先轉為灰階,接著取出灰階圖片的標準差做為代表。
- 運動模糊 : 能夠先透過將圖片做快速傅立葉轉換來進行模糊偵測,再以光流分析的方法,分析一段影片序列,並貼出移動方向,又或者透過人工標注的方式,訓練一個偵測運動模糊的CNN模型直接對當個畫面進行運動模糊偵測。
- 代表色 : 對整張圖做Kmans的運算來得到代表色。
Contextual Metadata
這類的標籤主要描述了上下文的語境,主要包含了在一段影片中演員的動作,表情,物件的位置移動,以及導演的運鏡特徵,透過這一類特徵,我們能夠了解演員的表情變化,導演/編劇對這個畫面的安排以及想傳遞的內容,一些例子如下:
人臉偵測
透過人臉辨識,能夠知道目前畫面中有誰,這些人是第一男女主角還是第二男女主角,或是其他配角,總共有幾個人?在畫面中,人臉佔比多大? 是正臉還是側臉? — 人臉辨識我們透過透過Facenet在少量圖片的情況下達成,傳統的Adaboost也能夠進行facial landmark detection,而且大概只抓的準正臉,結合兩者我們可以同時貼標是否是正臉,是誰,畫面中幾個人,是否是男女主角等訊息。
表情偵測
把表情偵測運用在這樣的場景下,作者覺得很有意思,由於影片的特性和實際場景不同,根據導演的運鏡手法可以有臉部特寫,半身特寫,這種時候捕捉臉部表情變得相對容易而有意義:
運動偵測、攝影機運鏡類型辨識
透過光流分析,我們可以建立出一個運動向量場(motion vector fields),這個運動向量場就是一個絕佳的特徵來辨識運鏡類型,筆者自己私心猜測,best moment應該都是相對靜止的,前後可能存在些許的zoom in及zoom out,或是場景切換(scene changed)
- 物件偵測 : 在許多影集中,會有所謂象徵物,這些物件不是主角,但卻是影集內的重要象徵,例如西劇紙房子中的達利面具,韓劇今生是第一次的貓咪
Composition Metadata
這類標籤描述了構圖上的特徵,既然要選出Best moments,當然就要選出要好看的畫面,好看的畫面就是導演/劇組的know how了,想必在Netflix內部關於構圖有更多的特徵,這裡Netflix倒是說明了幾項:
- 也就是3分法(rule-of-third),好看的畫面通常人會在三分線上,或是中間線上,這裡也順便附上筆者自己的Netflix畫面,是不是看到很多縮圖主角都在三分線附近?
- 是否使用了景深(depth of field),也就是所謂的人像模式,導演通常喜歡透過聚焦的方式領導觀眾的視線,實作上我們可以透過Personlab對畫面中的人做segmentation切割出人與背景,接著在對人與背景做傅立葉轉換的模糊偵測,來得知目前畫面中是否有聚焦的情況發生。
- 畫面是否具有對稱性。
Filters for Maturity
不適當畫面的過濾,包含了裸露程度,18禁畫面,暴力畫面,犯罪畫面等等,針對這些畫面作為負樣本進行訓練,若仔細看Netflix提供的這張圖,確實有一個算法正在計算目前每個畫面的裸露程度。
實作上若以裸露程度來進行思考的話,同樣地我們能夠透過facial landmark先取得臉部輪廓位置,接著透過kmeans取得臉部顯色(Dominate color)作為該人物主要膚色,接著再以personlab的segmentation切出整個人的輪廓,最後拿整個人在畫面上的像素質和該人物的主要膚色進行比較,來推估裸露程度
以目前我們所描述到的來說,單個畫面可能產生的標記可以用以下json表示:
{
'frame_idx': 36,
'visual_brightness' : ,
'visual_constrast' : ,
'visual_motion_blur' : ,
'visual_dominate_color' : ,'context_actor_1' :
{'name' : ,
'emotion' : ,
'face_ratio_by_frame' : ,
'is_leading_man': ,
'is_leading_male': ,
'skintone' : ,
'maturity_probability':
},'context_actor_2' :
{'name' : ,
'emotion' : ,
'face_ratio_by_frame': ,
'is_leading_man': ,
'is_leading_male': ,
'skintone' : ,
'maturity_probability':
'}
'context_shot_type' : ,'context_obj_1':,
{
'name' : ,
'obj_ratio_by_frame' :
}
'composition_nearby' :
'composition_is_depth_of_field' :}
Image Ranking
針對每個畫面進行標注之後,接下來就是排序算法的訓練了,關於排序訓練的細節這裡就不細究,以下是Netflix的兩張展示結果:
Actors
演員在Best moments這樣的目標下扮演著相當關鍵的角色,Netflix這裡採用的做法是,對候選畫面(有人臉,而且不模糊的)註,畫面進行人臉分群,這樣的做法下,能夠在未知演員陣容的情況下,得知相對重要的畫面。
另一方面則是透過監督式學習的方式進行人臉辨識,進行識別出演員,接著比對是否是男一,女一,還是男二,女二,在畫面中目前出現了什麼樣的組合?是否是主要主角都在的畫面等等,下圖也顯示出部分的訓練結果,下圖三個畫面因為人物表情欠佳,運動模糊,而無法排進Best moments:
Frame Diversity
創意以及視覺多樣性是一種非常主觀的感受,在這方面的描述上,首先要先了解編劇團隊的畫面安排約略有哪些方式,接著想辦法透過影像出來的方式捕捉到這些手法,這裡提到,像是camera shot types,與上面的運鏡手法不同的是,這樣的做法是看單個畫面中的人物是近全身,半身,或是只有臉部特寫,若這些圖是所謂的Best moments,則可以將其進行貼標,變成全身的best moments,半身的best moments,以及特寫的best moments,作為縮圖的標籤。
結論
在此篇文章中,我們對Netflix如何處理自家的影片資料有了一個大概的認識,透過影像處理,深度學習,以及畫面美學,拍攝手法領域的結合,能夠挑選出更多的Best moments,提供了對不同使用者顯示不同縮圖的彈性,並且有AB Test的支持,工程團隊也能夠得知這些功夫能夠為公司帶來多少收益,從這樣的案例分析我們也能夠發現,影像辨識,深度學習,能夠作為一種自動化判斷的手段,但是具體來說要做什麼樣的目標,要怎麼做,非常需要領域知識,不然你怎麼知道一個臉部辨識的深度學習算法,還能夠推測出導演對這個畫面的安排呢,作為一個相關領域的從業人員,作者帶著大家再次體驗到了結合領域知識的威力。
寫在最後
本篇是作者的<案例分析系列>,第一篇分析,說真的把工作所學到的技巧用來分析生活中的日常,各大龍頭的演算法設計,還真的挺有趣的,如果你喜歡這個系列,也請多拍幾次手,鼓勵作者寫更多喔!
下班每天從忠孝新生搭著捷運回家,腦袋一片空白,赫然想到,Google相簿的Best moments回顧,裡面似乎一定也有類似本篇文章的技術含在其中啊!
Reference
- AVA: The Art and Science of Image Discovery at Netflix
- HSV
- Contrast
- OpenCV Fast Fourier Transform (FFT) for blur detection in images and video streams
6. Introduction to Motion Estimation with Optical Flow
7. MotionBlur-detection-by-CNN
8. Learning a Convolutional Neural Network for Non-uniform Motion Blur Removal
9. Most dominant color in RGB image — OpenCV / NumPy / Python
10. Face Recognition using Tensorflow
11. dlib/python_examples/face_landmark_detection.py
13. A Robust Method for Camera Motion Estimation in
Movies Based on Optical Flow