教会AI认识麻将牌之实践篇
本文為我愛計算機視覺粉絲曲奇泡芙投稿。
開頭視頻先認識下今天的主角 -【小番】App
(謝謝周董的新歌《Mojito》)
說起打麻將我一直是處于比較業余并且不思進取的水平,各個地方的麻將規則不一,繁瑣的規則也懶得放腦袋里記憶了,于是每次跟朋友打麻將都是現場臨時約定規則,怎么簡單怎么來,周邊也有不少年輕的小伙伴我一樣。
年前回家前跟朋友聚會又打了幾圈麻將,幾個人又經歷了一遍邊上網查算番規則邊打牌,生怕少算番多虧了五毛錢的過程,于是萌生做個麻將算番APP的想法,解決我們幾個懶人的打牌需求。
當時趁著那幾天想法熱乎,花了一周多擼了一個iOS App 取名叫【小番】就給弄上架了(第一次寫swift,發現居然有雙感嘆號!!這樣的運算符,當時我就驚呆了)。
小番使用國標規則來算番, 最大番數88番,當一副牌有多種胡法時取最大番數的胡法(基本牌劃分的動態規劃怎么寫來著?),其中各種特殊規則wikipedia里可以寫出滿滿幾屏,照著學了一遍。一開始我們就對【小番】的需求比較明確,把在線麻將游戲的便捷性融入到線下朋友間社交打牌歡樂里。
所以【小番】剛誕生就帶了一副AI的眼睛,以便更快更好的服務好大家。
剛開始的【小番】認識麻將牌的能力一般,70%左右。基本上攝像頭識別完還需要手動再補上幾張牌,所謂人工+智能結合。
AI模型準備上我只是做完一次目標檢測深度學習模型的數據采集,標注,訓練,評估及移動端推理的實現流程。中間沒有太多優化,本著先看看有多少人愿意為這項功能買單的想法,把App擼完就上架了????。
App出來后碰上疫情期間大家也都家里呆著了,App好久也沒實踐上,中間去江西朋友家呆了一段時間打牌用了一次,發現一些易用性的問題修正了一下,在統一算番規則方面【小番】發揮了實際作用起到了公平公正的效果(讓我當晚輸了100塊錢)。
App上架后忙別的事情有段時間也沒多管了。最近各地疫情反復,周末看了一下App Store排行榜,發現在沒有任何推廣的情況下,小番最近還爬到過娛樂版前50名內,改變了我對目前的應用市場沒有推廣不會有人購買的看法。
于是周末花了點時間再好好優化了一把模型,把【小番】識別牌的精準度提到98%以上。
優化后的【小番】,即使是帶有一定透視角度的,20多張不同牌同屏也可以一次輕松識別,做到快速認牌算番的效果。行文至此,好玩的東西就介紹完了。
各位看官,目前【小番】新版本上線,特價2折優惠活動中,趕緊App Store搜索下載一個收藏起來,以備逢年過節打牌使用吧????(近30層深度神經網絡,平均每層不到3毛錢哦)。
下面進入技術干貨的部分,實踐中怎么提高模型麻將牌識別的精確度和召回率?行業內的人清楚,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可以做到比較高的精確度檢測目標,但檢測延遲方面比較高,不適于需要視頻實時檢測的場景。
另一類算法是以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者做一個加權線性組合。
SSD及YOLO算法在延時和精確度方面平衡比較好,可以滿足視頻實時檢測(30FPS)的需求。
本質上SSD和YOLO這類目標檢測算法可以理解成一個框架,在這個框架里有多個組成部分或決策算法,不同的選擇組成具體的目標檢測模型。
比如框架中做為主干的特征抽取網絡部分,ssd原始使用的vgg16,yolo使用的Darknet53,在平衡速度和精確度時,也可以選擇其他的特征抽取網絡,如為移動設備優化的mobilenet v1,v2,或者inception等,不同的選擇可以組合出多種不同的具體模型。
今年最新發布的YOLO v4模型在COCO的數據集上速度和精確度都達到了不錯的提升。
麻將識別模型訓練
首先是訓練數據準備,嘗試在網上搜了一圈沒有找到現有的麻將牌目標檢測的標注數據,于是開始自己的數據采集和標注。
訓練數據分為兩部分,一部分人工真實數據,一部分生成數據(大量)。真實數據采集使用視頻錄制的方式,分兩種場景,單個麻將牌(34類),以及多張牌組合(14張)。擺好牌后移動手機拍攝不同角度下的成像,完了用腳本從視頻里自動截取出來x張圖片進行標注。
標注工具使用labelimg工具,可以比較方便的框出麻將牌打上標簽,準備就緒后就是一頓狂標注,標注后的圖片類似這個樣子,生成對應的PASCAL VOC格式的xml文件。
第一部分數據接近真實使用場景(一次檢測大于14張牌,牌相對于圖像的大小也接近實際情況)。但由于只有一副麻將牌,場景比較單一數據量也比較小,訓練過程種容易產生過擬合的情況于是引入第二部分數據。
第二部分數據是真正幫助提高模型泛化能力的生成數據,這部分數據使用了兩個數據源來合成,34張麻將牌的不同樣式的圖片共600多張,以及4000多張紋理圖片的數據集。
隨機合成生成的場景圖片:每次挑兩張麻將進行一定的隨機旋轉/縮放/亮度及對比度調整/投影變換后放在一張隨機選的紋理圖上作為背景,生成合成圖片以及對應的標注數據(麻將牌的外框作為最小外包矩形參與隨機變換使得標注信息需要的label&bounding box都是已知信息,可以按模版生成標注xml文件不需要人工標注)。用這個辦法可以輕松生成數萬個標注圖片,生成的數據長下面這個樣子。
注意生成數據時直接生成模型輸入需要的分辨率,減少模型預處理的resize步驟和加載圖片數據不必要的內存開銷。
像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.
備注:目標檢測
目標檢測交流群
2D、3D目標檢測等最新資訊,若已為CV君其他賬號好友請直接私信。
我愛計算機視覺
微信號:aicvml
QQ群:805388940
微博知乎:@我愛計算機視覺
投稿:amos@52cv.net
網站:www.52cv.net
在看,讓更多人看到 ?
總結
以上是生活随笔為你收集整理的教会AI认识麻将牌之实践篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机打印机提示无法打印,打印机无法打印
- 下一篇: STM32学习之DS18B20数字温度传