天天看點

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

作者 | 行書

項目背景

根據經驗,休閑好玩易上手的互動小遊戲能夠顯著提高使用者活躍度,這也是使用者參與雙十一非常重要的一種形式,然而傳統小遊戲由于使用者互動性不強、商家參與度不高,并沒有對品牌做到很好的宣傳和轉化。與此同時我們注意到,随着近些年深度學習的興起,基于計算機視覺的AI技術得到了長足的發展,這些技術可以為傳統遊戲插上智能的翅膀,進而為使用者提供更自然、更新奇、更有趣的互動方式。

為此,我們聯合十五大品牌在雙十一前的預熱活動期間上線了“與明星一起猜拳”的互動遊戲。該遊戲脫胎于人民群衆喜聞樂見的“石頭、剪刀、布”,利用手機前置攝像頭實時識别使用者目前所做的手勢動作,同時産品互動上加入為品牌代言的明星元素,讓使用者與自己喜愛的明星進行比賽互動,極大地增加了遊戲的趣味性和可玩性。在遊戲結束的時候,通過發放優惠券等形式将使用者導流到商家店鋪内以促成成交。

一方面,這種新型的遊戲形式能夠極大地引起使用者的參與熱情,另一方面,商家可以借此更加充分地利用代言明星資源,将其更直接地轉化為品牌背書和産品銷量。據統計,整個活動期間的PV達到了1600w+,UV達到了1000w+,得到了使用者和商家的一緻好評。

值得一提的是,藍月亮在看到線上超預期的效果後主動聯系我們幫助支援他們線下的快閃活動,現場使用者的參與熱情非常高。

藍月亮線下快閃活動

問題定義

猜拳遊戲中我們需要實時識别出使用者目前所做的手勢動作,這在計算機視覺中叫做手勢識别。對于手勢識别,有些方法将其看作是分類問題,也就是隻給出一個結果,因為其輸入圖檔中隻有一隻手,可是這樣用在猜拳遊戲中會有兩個問題:

  • 手的個數是不确定的,比如有些使用者可能會通過同時做出多種不同的手勢來作弊,這是分類無法解決的。
  • 手的位置和大小是不确定的,使用者在用前置攝像頭玩遊戲的時候圖像中大部分都是臉和背景,手并不是圖像中的主要物體,如果看成分類問題算法會很難進行學習。

為了解決這兩個問題,很自然地,我們應該先從圖中找到手的位置,然後再對其進行分類,這也就是目标檢測要做的事情。

困難挑戰

作為人民群衆喜聞樂見的一種遊戲形式,猜拳可以說是真正做到了跨國家、跨文化、跨種族,基于其公平簡單易上手的特性開發的“終端分歧機”甚至都讓我們敬愛的大忽悠葛優同學獲得了200萬英鎊的風投(見《非誠勿擾》),是以将其開發為互動遊戲對于使用者來說幾乎沒有學習成本。

這對産品來說是好事,但對算法來說卻不是那麼友好。因為偉大作家莎士比亞曾說過,一千個人裡有一千種剪刀石頭布,每個人在玩遊戲時候的動作姿勢都不盡相同。如果是一個大家不曾見過或不熟悉的新手勢,那我們可以定義其标準,隻要跟标準手勢不符合的都可以判别為錯,使用者在模仿這種手勢的時候也會有意按照标準去做,但是對于大家從小玩到大的猜拳,我們無法做這種标準定義,因為每個人都會覺得自己的動作渾然天成毫無瑕疵最為标準。另外,除了目标手勢,我們還需要識别出不屬于目标的其他手勢,而這些手勢更加沒有标準,唯一的标準就是不屬于目标手勢(石頭、剪刀、布)。

沒有明确的标準定義除了會導緻上面的問題外,還會引發其他嚴重的問題。由于手是非剛體,形變極大,同一個手勢會表現出很多形态,再加上角度等問題,使得我們幾乎不可能窮舉所有可能的情況。

另外,使用者在切換手勢的過程中會出現很多中間形态,這些形态的類别也很難确定。其他的諸如“同樣的手在不同位置時的手勢是否相同(比如同樣是張開的手,放在面前的時候是“布”,放在腿上的時候還是”布“嗎)”,“不同的手勢由于角度問題導緻呈現出相似的形态”,“不同标注人員對同一手勢圖檔的不同了解”等等,都是實際開發過程中遇到的問題。

猜拳遊戲的手勢識别其實是一個動态的過程,使用者在遊戲準備階段一般會先握緊拳頭,等提示說出“石頭剪刀布”的時候才會做出最終的手勢類型。因為每個人的反應時間不一樣,是以我們在明星說出“布”的前後時間段内會設定一個區間,隻有在該時間區間内的手勢才會被算法識别,過早或過晚都不行。因為是時間區間,是以會有多幀圖檔産生,而最終的結果則是取識别次數最多的手勢。

但是該時間段不能設定得太長也不能設定得太短,時間太長容易讓人作弊,而且會将準備階段識别為石頭,時間太短使用者則會反應不過來。考慮到要識别多張圖檔(一般十幾到幾十張),為了給使用者提供如絲般順滑的體驗,我們要求整個檢測識别的過程能夠在手機上實時運作,但是不同手機的性能差距很大,尤其是安卓機器,這就需要我們的算法模型對資源的要求不能太高且運作速度要夠快。除此以外,因為我們的算法模型是動态下發的,使用者在第一次玩的時候需要下載下傳模型,是以模型不能夠太大,也就是說我們的算法既要小又要快還要好。

總結起來,猜拳遊戲在技術上主要有兩個難點:

  • 目标手勢沒有明确定義
  • 模型既要小又要快還要好

算法解析

目标檢測

相比于分類任務隻給出整張圖像的一個描述,檢測更多的是關注局部特定的物體目标,其要求同時給出圖像中所有目标的類别資訊和位置資訊,是以檢測模型的輸出是一個清單,清單的每一項給出了檢出目标的類别和位置(常用矩形檢測框的坐标表示)。

分類與檢測的差別

現代的檢測模型整體上由主幹網絡(Backbone Network)和頭部網絡(Head Network)兩部分構成,前者作為特征提取器,給出圖像不同大小、不同抽象層次的表示,後者則依據這些表示和監督資訊進行類别和位置學習,其中頭部網絡負責的類别預測和位置回歸兩個任務常常是并行的,進而構成多任務聯合訓練。

目前主流的目标檢測方法可以大緻分為兩類:one-stage和two-stage。One-stage的代表算法是YOLO系列1[3]、SSD[4]、RetinaNet[5]等,當然今年也湧現了很多AnchorFree的方法,比如CornerNet[15]、CenterNet[16]等。Two-stage的代表算法則是RCNN系列,如Faster-RCNN[7]、RFCN[8]、Mask-RCNN[9]等。

Two-stage模型對檢測任務進行了分解,即先用主幹網絡做前背景的分類,再用頭部網絡做物體的細粒度分類,是以其主幹網絡和頭部網絡是串行連接配接的,主幹網絡完成前背景分類和回歸後,把預測結果作為頭部網絡的輸入再進行細粒度分類和位置回歸。這種設計使得監督資訊可以在不同階段對網絡參數的學習進行針對性的指導,同時前背景的預測結果為頭部網絡提供了良好的先驗知識,減輕了頭部網絡的學習負擔。然而這種串行設計使得大量中間結果的存在拖累了模型的推斷速度,而且還存在網絡重複計算的弊端。

Two-stage代表算法Faster RCNN流程圖

與此相反,one-stage模型隻做一次類别預測和位置回歸,卷積運算的共享程度更高,是以擁有更快的速度和更小的記憶體占用。考慮到我們的模型要在移動端實時運作,是以選用one-stage模型更加合适。

SSD簡介

SSD(Single-Shot Multibox Detector)是one-stage模型中的代表算法,其速度快、效果好、易擴充,在各方面的表現都比較均衡,是以成為移動端目标檢測應用的首選。SSD主要有三個特點:

  • 多尺度特征圖預測

所謂多尺度指的是同時采用網絡中不同大小的特征圖。CNN網絡一般前面的特征圖比較大,後面會逐漸采用stride=2的卷積或者pooling來降低特征圖大小,如下圖所示,一個比較大的特征圖和一個比較小的特征圖都被用來做檢測,大特征圖因為保留了更多的細節資訊是以可以用來檢測相對較小的物體,而小特征圖因為感受野更大特征更抽象是以可以用來檢測大的物體。

多尺度預測

  • 多尺寸多比例先驗框

SSD借鑒了Faster RCNN中錨框(anchor)的概念,每個單元設定尺度和長寬比不同的先驗框,預測的邊界框是以這些先驗框為基準的,這樣可以在一定程度上降低訓練難度。通常來說,每個單元會設定多個先驗框,其尺度和長寬比存在差異,如下圖所示,可以看到每個單元使用了4個不同的先驗框,圖檔中貓和狗分别采用最适合它們形狀的先驗框來進行訓練學習。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

anchor示例

  • 全卷積

SSD整個網絡架構中全部使用卷積方式進行特征抽取,沒有用到全連結,是以運算更高效、更省記憶體。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

SSD網絡架構

主幹網絡

在目前計算機視覺的研究中,無論是分類、檢測、分割還是其他任務,隻要采用了深度學習架構,主幹網絡的選擇幾乎都是決定算法速度和效果的最主要因素。但天下沒有免費的午餐又決定了速度和效果是很難兼得的,一般來說,模型越深越複雜效果越好,但速度也會越慢,反之亦是如此。如上圖中所示的原始SSD使用的主幹網絡是VGG,先不論效果和速度,單是模型大小就有幾百M,這是根本不可能用在移動端上的。

為了能夠在資源受限的裝置上取得更好更快的效果,業界相繼提出了SqueezeNet[10]、ShuffleNet[11]、MobileNet12、MNasNet[14]等經典結構,其中MNasNet是Google釋出的專為移動裝置打造的網絡架構,其建構過程采用了強化學習的思路,同時将模型運作速度顯示地結合到優化目标中,這樣模型在學習過程中就可以取得準确性和實時性的最佳平衡,而且由于其直接在手機平台(Pixel phones等)上運作模型,得到的結果具有很高的參考價值和實用價值。

MNasNet與其他模型對比

但無論是哪種網絡,要想直接拿過來大規模地用在各種機型上都是難以滿足要求的,為此我們在SSD的基礎上對主幹網絡進行了大量優化,使其能夠在大部分裝置上都能夠達到遊戲運作要求。

特征融合

上面講到SSD是多尺度進行學習預測,是以其會用到淺層的網絡特征,然而淺層特征雖然細節内容豐富但是語義資訊卻很少,導緻SSD對小目标的檢測效果不是很好。為了解決小目标檢測的問題,人們提出了很多方法,但基本思想都是特征融合,即将深層特征與淺層特征進行融合以達到兼顧高層語義和底層細節的目的。融合方法有很多,比如FPN[6]、DSSD[17]、RFBNet[18]等等,每種方法都有自己的優缺點,這裡重點介紹下大家最常用的特征金字塔網絡FPN。

如下圖所示,FPN包含三部分:自底向上,自頂向下,橫向連接配接(lateral connection)。自底向上其實就是主幹網絡的前向過程,在前向過程中,特征圖的大小在經過某些層後會改變,而在經過其他層的時候不會改變,我們将不改變特征圖大小的層歸為一個stage,抽取的特征是每個stage最後一層的輸出,這樣就能構成特征金字塔。自頂向下的過程采用上采樣(upsampling)進行,而橫向連接配接則是将上采樣的結果和自底向上生成的相同尺寸大小的特征圖進行融合。在融合之後還會再采用3x3的卷積核對每個融合結果進行卷積,目的是消除上采樣的混疊效應。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

特征融合FPN

損失函數

目标檢測的損失函數可以分為兩部分,即定位損失(loc loss)加分類損失(cls loss),總損失為兩者的權重和。SSD中定位損失采用了常用的smooth L1 loss,分類損失采用了softmax loss。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

對于猜拳來說,我們的目标手勢類别有三種:剪刀、石頭、布,但除此以外我們還需要将其他手勢跟這三種手勢區分開來,再加上背景類,其實是一個五分類問題(剪刀、石頭、布、其他、背景)。對于上面提到的softmax loss,這個損失函數隐含要求了必須從候選類裡選一個作為目标類别,因為所有候選類的預測機率和要等于1。

如果是一般的分類問題用這種loss沒有任何問題,但是當遇到了我們之前提到的問題——手勢沒有明确的定義,則會衍生出來一個非常嚴重的問題:手是非剛體,其形變幾乎是無窮的,但我們的資料卻是有限的,永遠無法覆寫所有情況,而“其他手勢”這個類别的存在會使得模型非常容易将沒有見過的“剪刀石頭布”錯分為“其他”!

如下圖所示,紫色的大圓圈代表的是所有手勢的分布,内部三個中等尺寸大小的圓圈分别代表真實的剪刀、石頭、布手勢的分布,這三個手勢互有重疊,代表有部分手勢無法判斷類别。三個小尺寸的圓圈代表采集到的資料分布,其與真實的資料分布是有差異的。如果我們保留其他手勢,則模型容易将真實資料分布與采集資料分布之間的差異區域判别為其他手勢。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

資料分布

為此,我們選擇了sigmoid loss作為目标損失,也就是變成多個二分類問題,同時将“其他”類别去掉,隻保留“剪刀、石頭、布、背景”四個類别。對于一個目标框,我們隻要一個類别一個類别地單獨判斷就可以了,即判斷其“是否是剪刀”、“是否是石頭”等等,是以對于其他手勢,其不屬于任何一個類别,對任何一個類别來說都是負樣本。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

此外為了解決類别不平衡問題,[5]在sigmoid loss基礎上提出了改進版的focal loss。Focal loss的意圖非常簡單直覺,即在學習過程中不斷減小易分類樣本的權重,進而使模型更加關注困難樣本,實驗表明其可大幅提高性能而對速度沒有任何影響。我們在訓練過程中也借鑒了focal loss。

如何在家跟愛豆玩“石頭剪刀布”?拍立淘幫你實作項目背景問題定義困難挑戰算法解析資料解析總結

總結來說,算法方面我們主要做了以下幾個工作:

  • 采用高效的目标檢測架構,同時對模型進行深度優化以提高速度、減小參數
  • 通過特征融合方式改善小目标的檢測效果
  • 采用合适的損失函數,降低手勢無定義帶來的影響

最終我們的模型大小達到了1.9M,雙十一手淘的線上環境下ios裝置的平均耗時做到了17ms,滿足了遊戲實時性的要求。此外在我們自己的測試資料上AP(0.5)達到了0.984,遊戲效果也得到了保證。

資料解析

在資源受限的情況下,模型算法能夠施展的空間是有限的,尤其是在資料驅動的深度學習面前,真正的壁壘不是算法而是資料,模型見到的corner case越多效果就越好。然而手勢識别相關的資料集并不多,且這些資料跟實際應用的場景差别太大,是以我們需要從頭開始采集資料。另外,除了數量,資料的品質也非常關鍵,如果噪聲很大,模型的學習效果也不會好。

資料采集

我們通過衆包的方式采集了幾百個小視訊,每個視訊20s,視訊的内容就是讓采集人員對着手機做剪刀石頭布。但這種方式采集的資料跟真實的線上資料還是有差異的,因為使用者在采集過程中并沒有互動,隻是幹巴巴地做動作,另外因為有視訊品質考核的顧慮,使用者會下意識地對着demo視訊的動作來做,而不是像真正猜拳遊戲那樣随心所欲。是以雖然20s的視訊可以解析出幾百張圖檔,但是真正有價值的圖檔并沒有多少。

資料标注

标注檢測資料和分類資料的成本是不一樣的,前者需要先标出矩形框再對框選擇類别,後者隻需要選擇類别即可,是以前者的成本要比後者高很多。為了盡量降低标注成本,我們将将标注分為了兩步。首先我們用網絡上收集的公開資料訓練了一個手部檢測模型,然後用該模型将采集資料中的手部摳出來,最後隻需要标注摳出來的手部圖檔的類别即可。

資料的标注也是通過衆包平台來進行的,跟一般的标注規則差不多,但前面我們提過,有些手勢是很難判斷其類别的,為此我們添加了“不确定”的選項,具體的:

  • 如果手勢清晰可辨且類别為“石頭”,則标注為“石頭”。
  • 如果手勢清晰可辨且類别為“剪刀”,則标注為“剪刀”。
  • 如果手勢清晰可辨且類别為“布”,則标注為“布”。
  • 如果手勢清晰可辨且類别明确不是“石頭、剪刀、布”中的任何一種,則标注為“其他”。
  • 如果手勢不清晰或無法判斷屬于“石頭、剪刀、布”中的哪個類别,則标注為“不确定”。

然而,即使定義了上述規則,實際标注的時候仍然有很多情況難以判斷。另外由于我們是做目标檢測,是以理論上手的位置不應該影響其類别選擇,比如拳頭無論放在什麼位置都應該标注為“石頭”,張開的手掌無論放在什麼位置也應該都标注為“布”,然而衆包人員由于沒有經過教育訓練,其往往容易标注錯誤,導緻标注品質較低。大家可以看下圖,思考下應該選擇什麼類别。

困難樣本

資料使用

我們在上面提到過,在實際使用的時候是将“其他手勢”這個類别去掉的,但這些類别的樣本仍然是有價值的,我們會将其作為每個類别的負樣本加入到訓練中。除此以外,最困難的是“不确定”樣本的使用,這些樣本如果處理不好會非常影響模型的性能,但如果隻是将其簡單地丢棄不用則會非常浪費,為此我們在訓練過程中将這些标注為“不确定”的樣本的類别設為-1或者weight設為0,意思是這些樣本是困難樣本或難以判斷的樣本,至于其究竟屬于哪個類别,可以由模型自己學習決定,這些樣本對loss的計算并不會作出實際的貢獻。

總結

猜拳遊戲本質上是一個目标檢測的問題,而目标檢測相對來說已經是一個比較成熟的領域,但是具體到我們的業務層面還是會遇到很多難題,如之前提到的“端上實時運作所需的模型大小和速度”以及“手勢沒有明确定義”的問題及其一系列衍生問題,這都需要我們針對業務思考解決方法。

目前猜拳遊戲已基本達到了線上産品化的要求,且在雙十一活動中得到了驗證,但如果将其運用線上下我們還有很多問題需要解決,比如:

  • 線下場景比較複雜,當背景中出現很多人很多手時如何解決
  • 線下場景拍攝的一般是全身照,手部所占的面積會很小,如何進一步提高現有模型對小目标的檢測性能
  • 線下裝置的處理器性能一般較弱,如何在保證效果的前提下進一步地提高模型運作速度

注:文中圖檔來源于網絡。

參考資料:

[1] Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788.

[2] Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint, 2017.

[3] Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018.

[4] Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.

[5] Lin T Y, Goyal P, Girshick R, et al. Focal loss for dense object detection[J]. IEEE transactions on pattern analysis and machine intelligence, 2018.

[6] Lin T Y, Dollár P, Girshick R B, et al. Feature Pyramid Networks for Object Detection[C]//CVPR. 2017, 1(2): 4.

[7] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[C]//Advances in neural information processing systems. 2015: 91-99.

[8] Dai J, Li Y, He K, et al. R-fcn: Object detection via region-based fully convolutional networks[C]//Advances in neural information processing systems. 2016: 379-387.

[9] He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969.

[10] Iandola F N, Han S, Moskewicz M W, et al. Squeezenet: Alexnet-level accuracy with 50x fewer parameters and< 0.5 mb model size[J]. arXiv preprint arXiv:1602.07360, 2016.

[11] Zhang, X.; Zhou, X.; Lin, M.; and Sun, J. 2018. Shufflenet:

An extremely efficient convolutional neural network for mobile

  1. arXiv preprint arXiv:1707.01083.

    [12] Howard, A. G.; Zhu, M.; Chen, B.; Kalenichenko, D.; Wang, W.; Weyand, T.; Andreetto, M.; and Adam, H. 2017. Mobilenets: Efficient convolutional neural networks for mobile vision applications. arXiv preprint arXiv:1704.04861.

[13] Sandler, M.; Howard, A.; Zhu, M.; Zhmoginov, A.; and Chen, L.-C. 2018. Mobilenetv2: Inverted residuals and linear bottlenecks. CVPR.

[14] Tan M, Chen B, Pang R, et al. Mnasnet: Platform-aware neural architecture search for mobile[J]. arXiv preprint arXiv:1807.11626, 2018.

[15] Law H, Deng J. Cornernet: Detecting objects as paired keypoints[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 734-750.

[16] Duan K, Bai S, Xie L, et al. Centernet: Keypoint triplets for object detection[C]//Proceedings of the IEEE International Conference on Computer Vision. 2019: 6569-6578.

[17] Fu C Y, Liu W, Ranga A, et al. Dssd: Deconvolutional single shot detector[J]. arXiv preprint arXiv:1701.06659, 2017.

[18] Liu S, Huang D. Receptive field block net for accurate and fast object detection[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 385-400.

繼續閱讀