天天看點

教會AI認識麻将牌之實踐篇

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

編者按:本文來自微信公衆号“曲奇泡芙”(ID:YummyCookiePuff),作者曲奇泡芙,36氪經授權釋出。

說起打麻将我一直是處于比較業餘并且不思進取的水準,各個地方的麻将規則不一,繁瑣的規則也懶得放腦袋裡記憶了,于是每次跟朋友打麻将都是現場臨時約定規則,怎麼簡單怎麼來,周邊也有不少年輕的小夥伴我一樣。

年前回家前跟朋友聚會又打了幾圈麻将,幾個人又經曆了一遍邊上網查算番規則邊打牌,生怕少算番多虧了五毛錢的過程,于是萌生做個麻将算番APP的想法,解決我們幾個懶人的打牌需求。

當時趁着那幾天想法熱乎,花了一周多撸了一個iOS App 取名叫【小番】就給弄上架了(第一次寫swift,發現居然有雙感歎号!!這樣的運算符,當時我就驚呆了)。小番使用國标規則來算番, 最大番數88番,當一副牌有多種胡法時取最大番數的胡法(基本牌劃分的動态規劃怎麼寫來着?),其中各種特殊規則wikipedia裡可以寫出滿滿幾屏,照着學了一遍。一開始我們就對【小番】的需求比較明确,把線上麻将遊戲的便捷性融入到線下朋友間社交打牌歡樂裡。是以【小番】剛誕生就帶了一副AI的眼睛,以便更快更好的服務好大家。

教會AI認識麻将牌之實踐篇

剛開始的【小番】認識麻将牌的能力一般,70%左右。基本上攝像頭識别完還需要手動再補上幾張牌,所謂人工+智能結合。AI模型準備上我隻是做完一次目标檢測深度學習模型的資料采集,标注,訓練,評估及移動端推理的實作流程。中間沒有太多優化,本着先看看有多少人願意為這項功能買單的想法,把App撸完就上架了😁。

App出來後碰上疫情期間大家也都家裡呆着了,App好久也沒實踐上,中間去江西朋友家呆了一段時間打牌用了一次,發現一些易用性的問題修正了一下,在統一算番規則方面【小番】發揮了實際作用起到了公平公正的效果(讓我當晚輸了100塊錢)。App上架後忙别的事情有段時間也沒多管了。最近各地疫情反複,周末看了一下App Store排行榜,發現在沒有任何推廣的情況下,小番最近還爬到過娛樂版前30名内,改變了我對目前的應用市場沒有推廣不會有人購買的看法。于是周末花了點時間再好好優化了一把模型,把【小番】識别牌的精準度提到98%以上。

教會AI認識麻将牌之實踐篇

優化後的【小番】,即使是帶有一定透視角度的,20多張不同牌同屏也可以一次輕松識别,做到快速認牌算番的效果。行文至此,好玩的東西就介紹完了。各位看官,目前【小番】新版本上線,特價2折優惠活動中,趕緊App Store搜尋下載下傳一個收藏起來,以備逢年過節打牌使用吧😁(近30層深度神經網絡,平均每層不到3毛錢哦)。

教會AI認識麻将牌之實踐篇
教會AI認識麻将牌之實踐篇

下面進入技術幹貨的部分,實踐中怎麼提高模型麻将牌識别的精确度和召回率?行業内的人清楚,AI模型是容易做出demo,但産品化過程中需要投入非常多精力打磨的一項技術。以前做個性化推薦和定向廣告推薦,深知資料的優化對效果的作用遠大于算法自身形式的優化作用。是以這次在模型效果打磨的過程中,我優先着重考慮資料方面的優化。

問題定義

麻将牌識别是一類目标檢測問題(Object Detection),目标檢測與隻輸出單一标簽的圖像分類問題(Image Classification)不同,目标檢測問題的輸出包含兩個資訊:圖檔中可能包含的多個物體的位置,以及各自的分類标簽。麻将牌識别在目标檢測問題裡屬于多個小目标(目标相對于完整圖像大小)的同時檢測,含34個分類(不計花牌),需要考慮不同燈光亮度,投影角度,桌面背景,麻将牌面樣式變化下的識别。類似的,自動駕駛的視覺感覺部分也包含了一些目标檢測(紅綠燈,車輛,雪糕筒等)問題。

目标檢測算法

解決目标檢測算法的常見模型主要分為兩類,以R-CNN/Fast R-CNN/Faster R-CNN為代表的兩步法:先用啟發式搜尋(R-CNN/Fast R-CNN)的算法或者特定的網絡(Faster R-CNN)找出圖檔中可能的物體區域(region proposals),然後用卷積神經網絡對各個物體區域做一次圖像分類。Faster R-CNN可以做到比較高的精确度檢測目标,但檢測延遲方面比較高,不适于需要視訊實時檢測的場景。

教會AI認識麻将牌之實踐篇
教會AI認識麻将牌之實踐篇

另一類算法是以SSD(Single Shot MultiBox Detector)和YOLO(You Only Look Once)為代表的一步檢測法,這類算法将位置檢測的外包矩形和分類機率統一編碼到一個卷積神經網絡預測輸出裡。具體的,圖像可以以一定的步長劃分成格子,每個格子關聯幾個(比如6個)不同比例的Anchor Box(比如1:1, 1:2, 2:1等),每個格子的每個Anchor Box可以預測一個中心點(x, y)和長寬(l, w)的偏移量以及對應區域是某個分類的機率p,訓練過程中通過梯度下降來調整模型參數最小化損失函數。目标檢測的損失函數由兩部分組成:分類損失函數及定位誤差,為減少過拟合的情況也會加入正則化損失,3者做一個權重線性組合。

教會AI認識麻将牌之實踐篇
教會AI認識麻将牌之實踐篇

SSD及YOLO算法在延時和精确度方面平衡比較好,可以滿足視訊實時檢測(30FPS)的需求。本質上SSD和YOLO這類目标檢測算法可以了解成一個架構,在這個架構裡有多個組成部分或決策算法,不同的選擇組成具體的目标檢測模型。比如架構中做為主幹的特征抽取網絡部分,ssd原始使用的vgg16,yolo使用的Darknet53,在平衡速度和精确度時,也可以選擇其他的特征抽取網絡,如為移動裝置優化的mobilenet v1,v2,或者inception等,不同的選擇可以組合出多種不同的具體模型。今年最新釋出的YOLO v4模型在COCO的資料集上速度和精确度都達到了不錯的提升。

教會AI認識麻将牌之實踐篇

麻将識别模型訓練

首先是訓練資料準備,嘗試在網上搜了一圈沒有找到現有的麻将牌目标檢測的标注資料,于是開始自己的資料采集和标注。

訓練資料分為兩部分,一部分人工真實資料,一部分生成資料(大量)。真實資料采集使用視訊錄制的方式,分兩種場景,單個麻将牌(34類),以及多張牌組合(14張)。擺好牌後移動手機拍攝不同角度下的成像,完了用腳本從視訊裡自動截取出來x張圖檔進行标注。标注工具使用labelimg工具,可以比較友善的框出麻将牌打上标簽,準備就緒後就是一頓狂标注,标注後的圖檔類似這個樣子,生成對應的PASCAL VOC格式的xml檔案。

教會AI認識麻将牌之實踐篇

第一部分資料接近真實使用場景(一次檢測大于14張牌,牌相對于圖像的大小也接近實際情況)。但由于隻有一副麻将牌,場景比較單一資料量也比較小,訓練過程種容易産生過拟合的情況于是引入第二部分資料。

第二部分資料是真正幫助提高模型泛化能力的生成資料,這部分資料使用了兩個資料源來合成,34張麻将牌的不同樣式的圖檔共600多張,以及4000多張紋理圖檔的資料集。随機合成生成的場景圖檔:每次挑兩張麻将進行一定的随機旋轉/縮放/亮度及對比度調整/投影變換後放在一張随機選的紋理圖上作為背景,生成合成圖檔以及對應的标注資料(麻将牌的外框作為最小外包矩形參與随機變換使得标注資訊需要的label&bounding box都是已知資訊,可以按模版生成标注xml檔案不需要人工标注)。

用這個辦法可以輕松生成數萬個标注圖檔,生成的資料長下面這個樣子。注意生成資料時直接生成模型輸入需要的分辨率,減少模型預處理的resize步驟和加載圖檔資料不必要的記憶體開銷。

教會AI認識麻将牌之實踐篇

像SSD和YOLO等算法都帶有一定的資料增強(Data Augmentation)預處理功能,比如随機的的對訓練資料進行垂直/水準翻轉或者随機截取區域放大等操作,一方面提升模型的通用能力,也減少對訓練資料overfitting的問題。由于我在自動化生成資料方面考慮了不同情況的圖像變換并且生成了大量的訓練資料,對模型自帶的資料增強功能并不太依賴。

資料集準備好後(80%資料做訓練,20%做測試),使用tensorflow進行模型訓練,基于一個預先訓練好的圖像特征抽取模型(比如ssd_mobilenet_v1_coco)進行遷移學習,減少從零開始訓練模型需要的學習圖像特征抽取(學習基本的圖像了解能力,比如邊緣檢測,基本形狀檢測等基礎功)的時間,也減少需要的訓練圖檔資料量。

由于生成的模型最終是在手機上做推理,我在手機上使用Tensorflow Lite架構,訓練後導出的模型需要轉成tflite格式。tflite相對于tensorflow模型少了不少運算符的支援,比如ssd模型的預處理步驟需要放到模型外來做,處理時需要注意根據模型輸入圖檔RGB資訊接受的浮點數範圍(有模型用[-1,1],也有模型用[0, 1])做相應的正則化,另外也需要檢測推理時輸入圖檔或者視訊的RGB通道順序和模型需求是一樣的,任何一個小地方的資料不一緻都會使你的模型效果大打折扣。

在麻将算番這個應用場景下,由于浮點類型的tflite模型在手機上的性能已經不錯,沒有進一步再對模型的浮點數進行int8離散化處理(quantization)。性能方面在iOS上可以進一步提升:可以使用Tensorflow Lite的CoreML delegate來做推理,利用手機内置AI晶片的并行處理能力來無損的提升推理速度。

AI模型性能的提升使得深度學習在手機及IOT裝置上的應用越來越多,Tensorflow Lite在嵌入式裝置甚至微控制器上也提供了運作時環境,為不同應用場景在速度與精确度方面的平衡提供了更多的選擇,相信後續會有越來越多便捷生活的AI應用産生。Life's getting better.

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/zhibo

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-19

本文作者:曲奇泡芙

本文來自:“

36kr

”,了解相關資訊可以關注“

繼續閱讀