不再人心隔肚皮!R語言實作人臉情感辨識

最近美國總統大選前Donald Trump和Hillary Clinton各自發表自己的政見,雙方針鋒相對,精彩的辯論內容成為全世界的焦點。在選民們仔細評估兩位候選人的政見之餘,這樣的辯論會同時也是不同領域可以應用的題材,從服裝設計領域評點兩位的服裝、心理學分析兩位在政見發過程的表情語言、再到政治、法律、公共事務等等,從頭到腳都可以被大肆的討論一番。

當然少不了資料科學囉!

在偶然機會下看到一位叫Ben Heubl的資料科學家實作針對兩位候選人辯論內容的情感分析,這樣有趣的分析內容激發筆者想嘗試類似題材的慾望,於是試著利用R語言實作了人臉辨識的情感分析。因應最近火紅的美國總統大選議題,筆者分別使用Donald TrumpHillary Clinton的官方網站上的肖像來當作這次實作的題材。實作需要用到的library有httr, XML, stringr與ggplot2

先從人臉偵測和情感辨識開始

Microsoft提供了免費而強大的認知服務應用程式介面(Cognitive service APIs),裏頭提供了許多關於智慧辨識的API,此篇實作會用的API有兩個:人臉偵測和情感辨識。只要到Microsoft的API頁面申請帳號並取得一組金鑰(Key)就可以接下去開始分析的過程了!

 

# Define image source
img.url = 'https://a.hrc.onl/secretary/img/soc/bio/bio-intro.jpg'

# Define Microsoft API URL to request data
URL.emoface = 'https://api.projectoxford.ai/emotion/v1.0/recognize'

#  access key is available via: https://www.microsoft.com/cognitive-services/en-us/emotion-api
emotionKEY = 'Put your key here'

#Define Microsoft API URL to request data
faceURL = "https://api.projectoxford.ai/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=true&returnFaceAttributes=age"

# access key is available via: https://www.microsoft.com/cognitive-services/en-us/face-api
faceKEY = 'Put your key here'

但在接著分析之前,讓我們試著了解兩種API裏頭的概念吧!

人臉偵測(Face Detection)

Microsoft的人臉偵測API會根據圖片先定義出一個人臉的方形(Face rectangle),至於這樣的方形要如何被定義出來呢?

目前最被廣泛使用的人臉特徵偵測方法即為維奧拉-瓊斯目標檢測框架(Viola–Jones object detection framework)這個分類器(Classifier)從2001年發表至今十多個年頭仍然被廣為使用的原因有三個:首先,這個檢測方法用的概念是每個矩形相鄰像素(pixel)和之差,當這個差值很大且符合此方法定義出的幾個矩形特徵時,我們可以便可以產生出一個定義人臉的框架,如下圖範例所示,這樣的方法使得矩陣特徵的計算速度相當快速。第二,這樣的分類器是一個自適應增強的分類器(AdaBoost)也就是每次分類後被分錯的樣本都會被用來訓練下一個分類器,當訓練夠多的資料後最終會從一個弱分類器(Weak Classifier)產生出一個強分類器(Strong Classifier)。最後,這樣的方法是可以即時(real time)產生的,且OpenCV(跨平台電腦視覺庫)上也有既定的函式可以利用。

haar_feature_that_looks_similar_to_the_bridge_of_the_nose_is_applied_onto_the_face

而透過這樣的方法,這個API最後會去抓去27個預先定義好的臉部標示(Landmark point)如下圖:

landmarks-1

產生像這樣的結果:

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-29-%e4%b8%8b%e5%8d%882-49-49

情感辨識(Emotion Recognition)

偵測到人臉之後,接著就是如何辨識臉部表情的情感。相信大家對於前陣子Google的Alpha Go打敗韓國棋王李世乭的新聞應該不陌生,其實目前被廣泛使用的情感辨識方法跟Alpha Go的原理有非常相似的地方喔!

卷積神經網絡(Convolutional Neural Network,CNN)就是鼎鼎大名,兩者非常相關的演算法之一。

等等,先不要把滑鼠移到左上角按上一頁或乾脆關閉分頁!

接下來會試著將這個聽起來很難實際上也真的不簡單的方法用比較平易近人的方式介紹!

其實一張簡單的圖片,都是由非常多不同的點結合而成的,在圖片上我們稱之為像素(pixel)。想像當我們人眼要看一張照片上其中一個人的情緒時,我們會把目光放在哪?相信眼睛和嘴巴應該是最容易簡單辨認出一個人情緒的焦點吧!那我們自然而然會忽略人背後的風景景物。也就是說在這樣的概念下,圖片是某種程度上有區域性關聯的,假設我們讓圖片中每個像素都跟5×5區域的像素產生連結,也就是下圖input neurons中比較黑的5×5個點,那我們一方面可以降低運算的負擔(因為我們不再需要一個像素一個像素運算),一方面又能夠在後續過程強化聚焦在關連性較高的特徵上,我們稱之為局部感知域(local receptive fields)。

0C5mMi01.jpeg

接著,當一張圖片被上下左右移動的時候,我們仍然能辨別出圖片上的人的表情吧!也就是說我們並不是分辨圖片上的絕對位置來判斷表情的,在電腦的演算中,我們將剛剛透過局部感知域找出來的各個局部用卷積核產生出一個權重,也就是上圖hidden neuron的點,而這些權重,就會被當成電腦訓練的特徵。

下圖就是CNN產出的範例,每個方格的顏色深淺代表該格的權重高低。

0c5mmi05

接著,再引用池化(pooling)或局部取樣(subsampling)將剛剛卷積層的結果進一步選擇一個一個小區域彙總,找出區域內最重要的特徵,以避免過度學習(Over sampling)的狀況。透過足夠大量的圖片樣本訓練作多階段的卷積層和池化層,最後就能產生出抽象的特徵定義了,也就是辨別出喜怒哀樂的情緒!0005

以上就是兩個會被應用的API裡面的演算意涵。講到這邊,大概已經殺死筆者十億個腦細胞了…其實真的要呼叫這些API不用真的去理解這些艱深的概念,接著就來看看實作的結果吧!

bio-intro.jpghillarys-emotion

Microsoft的API將臉部情緒分為七種,如上圖右邊所示,而每種情緒都會被計算出各自的比重。(我承認我看不出來這張照片竟然隱含這麼高比例的難過情緒…)

about_body_img_2.jpgtrumps-emotion

這是Trump的情緒分析結果,好吧,看起來真的是臉滿臭的。

以上就是情感辨識的實作,筆者對於生物辨識與深度學習的領域學習還非常粗淺,如果以上的內容有任何偏誤或更多內容可以和筆者分享,歡迎來信:pwhuang81@gmail.com

 

如果對程式內容有興趣,我將詳細的code操作內容放在Github上供參考:https://github.com/poweihuang/emtion-recognition

 

 

參考資料:

廣告

One thought on “不再人心隔肚皮!R語言實作人臉情感辨識

Add yours

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

Create a website or blog at WordPress.com

向上 ↑

%d 位部落客按了讚: