跨出前端智能化的第一步-tensorflow的應(yīng)用

第一部分、引言
一、閱讀本篇文章你能得到什么
1、了解tensorflow及關(guān)鍵社區(qū)資源;2、能夠自主訓(xùn)練和應(yīng)用自己想要的模型(主要);3、開闊前端智能化的思考與認(rèn)知;
二、什么是對象識別
簡單來說,在圖片或視頻識別出你關(guān)注的對象類別、坐標(biāo)就是對象識別,你可以通過以下視頻加深認(rèn)知:1、Ai采摘機(jī)器人:www.bilibili.com/video/BV1YE… 2、英雄聯(lián)盟血條識別:www.bilibili.com/s/video/BV1… 3、車輛識別:www.bilibili.com/video/BV1si… 4、人物識別:www.bilibili.com/video/BV1Es… 5、衛(wèi)星船舶檢測 www.bilibili.com/s/video/BV1…
三、前端為什么需要對象識別能力

1、通過對象識別可以做到D2C,也就是設(shè)計(jì)稿識別產(chǎn)出代碼;2、他帶給了前端更多可能性、效率提升、可控能力;
四、帶著目標(biāo)看流程

我簡單訓(xùn)練了一個(gè)antd ui識別模型,可以將圖片中的ui組件坐標(biāo)和類別識別出來,同時(shí)附帶識別的分?jǐn)?shù),下面將詳細(xì)為大家介紹如何訓(xùn)練一個(gè)自己的object_detection模型。
第二部分、object_detection完整實(shí)踐
分為以下幾個(gè)環(huán)節(jié):1、搭建環(huán)境;2、創(chuàng)建數(shù)據(jù)集;3、選擇預(yù)訓(xùn)練算法模型;4、調(diào)整參數(shù)開始訓(xùn)練;5、驗(yàn)證訓(xùn)練成果;6、導(dǎo)出并轉(zhuǎn)換模型給前端使用(瀏覽器/node環(huán)境);
一、搭建環(huán)境
參考:www.tensorflow.org/install
準(zhǔn)備最新python環(huán)境; 安裝tensorflow2; 通過pip安裝tensorflowjs(這個(gè)主要用于轉(zhuǎn)換最終導(dǎo)出的模型供js環(huán)境使用); 注意Python Package Installation這一步:github.com/tensorflow/… 可通過conda做環(huán)境管理(可選);
注意:直接使用tensorflow2就行了,沒有太多必要使用tensorflow1;安裝和使用過程中應(yīng)該會遇到一些pip包缺失的問題,這個(gè)需要自己看提示解決,其實(shí)跟npm類似。建議用主機(jī)進(jìn)行環(huán)境搭建及訓(xùn)練,配置當(dāng)然越高越好。
二、創(chuàng)建數(shù)據(jù)集
tensorflow對象識別需要使用tfrecord格式數(shù)據(jù)集 推薦的標(biāo)注平臺:app.labelbox.com/ 推薦的制作導(dǎo)出平臺:app.roboflow.com/ 創(chuàng)建數(shù)據(jù)集的方式有很多種,可以通過python語言創(chuàng)建自定義tfrecords數(shù)據(jù)集,也可以通過各類數(shù)據(jù)集標(biāo)注平臺;
注:
tfrecords是tensorflow定義的一種數(shù)據(jù)格式,直接用于數(shù)據(jù)訓(xùn)練; 通過收集大量訓(xùn)練圖片進(jìn)行人工標(biāo)注(也有半自動標(biāo)注、自動標(biāo)注,如通過UI組件生產(chǎn)頁面進(jìn)行自動標(biāo)注); 標(biāo)注的分類數(shù)量需要盡可能均勻一些,減少準(zhǔn)確性偏差;
這里簡單介紹一下通過平臺標(biāo)注流程(labelbox+roboflow):labelbox 部分
準(zhǔn)備一些含ui的圖片,尺寸和名稱沒有特別要求,可以直接截圖保存;
在labelbox新建項(xiàng)目并批量上傳圖片;
編輯分類


4.開始標(biāo)注(start labeling)


5、完成所有標(biāo)注,導(dǎo)出JSON文件

roboflow 部分
創(chuàng)建數(shù)據(jù)集

2.按提示上傳剛剛導(dǎo)出的json文件,根據(jù)提示繼續(xù)操作
3.在導(dǎo)入數(shù)據(jù)集基礎(chǔ)上,進(jìn)行自定義圖片處理

注意:這里可能包含旋轉(zhuǎn)、模糊、翻轉(zhuǎn)等操作,你可以通過最終模型識別目標(biāo)來判斷是否有必要加入某一步驟;比如:如果你識別的全部都是方方正正的UI設(shè)計(jì)稿,則旋轉(zhuǎn)就沒有太多必要了。他的作用在于幫你自動處理擴(kuò)充數(shù)據(jù)集,以便適應(yīng)各類識別場景。
點(diǎn)擊generate、查看健康檢查

注意:上文提到過,盡量不要讓標(biāo)注的分類數(shù)量相差太多。
下載數(shù)據(jù)集

注意:這里選擇tensorflow tfrecord格式下載即可。
三、選擇預(yù)訓(xùn)練算法模型
tensorflow擁有很完善的文檔,大家直接在對應(yīng)的官網(wǎng)或github尋找即可 github.com/tensorflow/…
目前使用的是(訓(xùn)練容易/導(dǎo)出的文件不算太大):SSD MobileNet V2 FPNLite 640x640
選擇模型的時(shí)候需要考慮以下幾點(diǎn):
識別速度;
識別準(zhǔn)確率;
訓(xùn)練難度(尺寸越大訓(xùn)練難度越大,主要體現(xiàn)在對機(jī)器性能上);
前端解析識別數(shù)據(jù)(重要);
注意:多數(shù)模型都提供了入?yún)ⅲㄌ幚砗蟮膱D片)和出參(一個(gè)tensor格式的數(shù)組),不同模型最終產(chǎn)出的結(jié)果是不一樣的,但一般都包含對象分?jǐn)?shù)score、對象尺寸及位置boxes、數(shù)量等,這些需要自行判斷。
四、調(diào)整參數(shù)開始訓(xùn)練

github.com/tensorflow/…

主要有以下幾個(gè)參數(shù)需要調(diào)整:
num_classes 代表數(shù)據(jù)集的分類數(shù)量; fine_tune_checkpoint 指向下載預(yù)訓(xùn)練模型中的checkpoint(根據(jù)這個(gè)文件的model_checkpoint_path來就行); fine_tune_checkpoint_type 改成detection(實(shí)際分類模型tf2也有提供,如不改容易出現(xiàn)內(nèi)存問題中斷訓(xùn)練); label_map_path 都指向?qū)С鰐frecords里面生成的就行(其實(shí)就是標(biāo)注的分類); tf_record_input_reader 分別對應(yīng)train/test目錄的tfrecord文件; 關(guān)鍵點(diǎn)train_config配置,batch_size訓(xùn)練批次(即一次訓(xùn)練所抓取的數(shù)據(jù)樣本數(shù)量)、total_steps、num_steps調(diào)整,這部分既要考慮機(jī)器性能又要考慮數(shù)據(jù)量,需要根據(jù)自己的實(shí)際情況而定(位數(shù)的調(diào)整可能引起成倍的訓(xùn)練時(shí)間);
注意:
建議找個(gè)性能不錯(cuò)的主機(jī)進(jìn)行訓(xùn)練,用自己的mac大概率會失?。ㄏ乱徊津?yàn)證訓(xùn)練結(jié)果會提及)。 批次大小機(jī)器允許的情況可以設(shè)置大一些,但也不是越大越好哈,可以自己另外了解一下; total step根據(jù)loss曲線做調(diào)整; 二次訓(xùn)練場景(有了一個(gè)訓(xùn)練好的優(yōu)質(zhì)模型,里面已經(jīng)儲備了大量知識,當(dāng)前訓(xùn)練的數(shù)據(jù)比較少,可以嘗試在已有模型基礎(chǔ)上二次訓(xùn)練),如果不確定建議都從0開始; 訓(xùn)練時(shí)長受數(shù)據(jù)、算法模型、批次、step、機(jī)器效率等影響,可以通過本地編譯、使用gpu加速等方式減少訓(xùn)練時(shí)間;
五、驗(yàn)證訓(xùn)練成果
執(zhí)行:tensorboard --logdir model_dir 打開啟動的地址:http://localhost:6006/
觀察loss曲線,判斷step設(shè)置是否合理

2.查看圖片驗(yàn)證結(jié)果

注意:通過以上2點(diǎn)基本可以確定模型是否可用,大家也可以學(xué)習(xí)一下其他分析技巧,互相分享。
六、導(dǎo)出并轉(zhuǎn)換模型給前端使用(瀏覽器/node環(huán)境)
exporter_main_v2.py 導(dǎo)出saved_model; 記得pip install tensorflowjs,然后使用tensorflowjs_converter轉(zhuǎn)換成前端可用模型 參考coco-ssd的模型導(dǎo)入與識別:github.com/tensorflow/…
注意:后面其實(shí)就是通過@tensorflow/tfjs-core等庫進(jìn)行模型加載和圖片識別了,也可以參考我這個(gè)庫github.com/aisriver/tf…,里面包括了一些訓(xùn)練代碼和使用示例。

第三部分、結(jié)合tensorflow的其他前端實(shí)踐
可直接投入前端使用的模型和演示:github.com/tensorflow/… 其他能力:圖像分類、文本識別、語音識別、視頻識別,并可以直接在社區(qū)找到對應(yīng)資源;
前端應(yīng)用:
組件識別/D2C(如imgcook:www.imgcook.com/)、 圖表庫識別(大屏設(shè)計(jì)稿識別)、搜圖(antd的圖表搜索)、 手勢識別(大屏手勢交互:www.bilibili.com/video/BV1ET…)、語言指令、惡意評論檢測、敏感圖片/視頻識別、智能家居、物聯(lián)領(lǐng)域的環(huán)境安全檢測等
大屏通過手勢進(jìn)行互動,想想都覺得很酷,而且實(shí)現(xiàn)起來也沒有那么難。
推薦一個(gè)直接可用的文本ocr識別 ocr識別比訓(xùn)練一個(gè)對象識別模型更加復(fù)雜,需要考慮語言、字體等因素,所以我沒有選擇自己訓(xùn)練,太麻煩。推薦使用:www.npmjs.com/package/tes… 支持多國家語言

智能化讓前端擁有更多可能性!
最后,幫大家整合一下社區(qū)資源
官網(wǎng):tensorflow.google.cn/ 模型庫可數(shù)據(jù)集(重要):www.tensorflow.org/resources/m… 對象識別github(核心):github.com/tensorflow/… 訓(xùn)練和評估(重要):github.com/tensorflow/… js相關(guān)已有模型庫及應(yīng)用(參考):github.com/tensorflow/… 數(shù)據(jù)標(biāo)注平臺(重要):app.labelbox.com/ 數(shù)據(jù)集訂制與導(dǎo)出平臺(重要):app.roboflow.com/ 模型分析工具(了解就行):github.com/lutzroeder/… 文本OCR識別(推薦):www.npmjs.com/package/tes…
github
github.com/aisriver
最后
歡迎加我微信(winty230),拉你進(jìn)技術(shù)群,長期交流學(xué)習(xí)...
歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個(gè)專業(yè)的技術(shù)人...


