眾所周知,前端相關(guān)的業(yè)務(wù)相當(dāng)于整個(gè)業(yè)務(wù)的用戶體驗(yàn)前哨站。 除了在性能優(yōu)化、動(dòng)畫等傳統(tǒng)的體驗(yàn)上做努力,我們又如何在:目標(biāo)(手勢(shì)、肢體)識(shí)別、語音識(shí)別分析、無障礙、語音分析、增強(qiáng)現(xiàn)實(shí)、情緒識(shí)別、畫像細(xì)分等等,基于人工智能的交互體驗(yàn)上,盡自己的一份力呢? 本文分為 第三方接口、重頭訓(xùn)練一個(gè)模型、使用成熟模型、再次訓(xùn)練 4個(gè)部分來展開前端應(yīng)用人工智能的方法。 希望可以拋轉(zhuǎn)引玉,給大家?guī)硪恍┧伎?。如果能?duì)實(shí)際工作帶來幫助,那就更好不過了。 下面開始正文: 一:使用第三方應(yīng)用接口使用第三方接口就跟普通的業(yè)務(wù)沒太大區(qū)別,都是 【用戶輸入數(shù)據(jù) ->請(qǐng)求接口->解析接口內(nèi)容】,難點(diǎn)主要在于把解析后的數(shù)據(jù)玩出花樣。 比如之前刷爆朋友圈的你畫我猜,就是先讓用戶在canvas上畫出圖形后,把圖形上傳到自己的服務(wù)器,然后做出相應(yīng)的預(yù)測(cè),你畫我猜類似版本體驗(yàn):https://quickdraw./。 但是google并沒有開放類似的使用接口,tensorflow的團(tuán)隊(duì)也明確表示不打算做類似的服務(wù)(我所理解的,tensorflow的愿景現(xiàn)階段是盡可能的降低AI的使用門檻)。所以我收集了一些國內(nèi)比較專業(yè)的AI服務(wù)商,并且嘗試總結(jié)了他們的能力區(qū)別(只代表我本人的主觀判斷,如有錯(cuò)誤請(qǐng)聯(lián)系我改正):
雖然第三方門檻非常低、預(yù)測(cè)結(jié)果也基本上非常可靠,但是可定制程度低、不適合在前端對(duì)視頻做實(shí)時(shí)預(yù)測(cè)、收費(fèi)(如果要采購敏感的外部供應(yīng)商可能需要流程報(bào)備?)等等缺陷。 如果你覺得有些缺陷不能接受,跟我一起來看下第二種解決方案:重頭訓(xùn)練一個(gè)新的模型。 二:重頭訓(xùn)練一個(gè)新的模型 重頭訓(xùn)練一個(gè)模型需要大量的專業(yè)知識(shí),但是這并不影響我開始這部分的介紹 :p,我會(huì)以一個(gè)簡(jiǎn)單的例子開始,你可以測(cè)試一下你是否有興趣深入下去。 大家請(qǐng)看這個(gè)例子: x = [ y = [ 請(qǐng)用一點(diǎn)時(shí)間推導(dǎo)一下X和Y的關(guān)系公式: 3... 2... 1... 相信大家經(jīng)過試錯(cuò)和思考已經(jīng)找到答案了:【y=2x-1】。 這個(gè)就是神經(jīng)網(wǎng)絡(luò)的原理(我所理解的大白話):設(shè)計(jì)好神經(jīng)網(wǎng)絡(luò)之后,輸入的數(shù)據(jù)根據(jù)正確答案,經(jīng)過某些次數(shù)的訓(xùn)練(試錯(cuò))之后,擬合到一個(gè)最終的值(參數(shù))。把值(參數(shù))保存下來,以方便其他類似場(chǎng)景使用。 那么落地到tensorflow代碼中又是怎樣的呢?我們又如何設(shè)計(jì)這個(gè)神經(jīng)網(wǎng)絡(luò)呢?請(qǐng)看代碼(代碼基于tensorflow 1.9.0):
接下來,在模型調(diào)試成功之后,把keras模型轉(zhuǎn)為tfjs可以使用的模型就可以在網(wǎng)頁中預(yù)測(cè)了(在第4部分有講到具體操作方法)。 如果你是一個(gè)沒有接觸tensorflow的同學(xué),看完這段代碼應(yīng)該大概率懵逼了,沒錯(cuò),我也是懵逼的。 而這只是一個(gè)非常簡(jiǎn)單的只有一個(gè)全連接層的入門例子(人都可以短時(shí)間推導(dǎo)出來),但是人工智能往往需要做特別復(fù)雜的預(yù)測(cè),比如票房預(yù)測(cè)、無人機(jī)飛行控制,人類手動(dòng)計(jì)算各項(xiàng)輸入幾乎沒辦法完成。那網(wǎng)絡(luò)的設(shè)計(jì)將比這個(gè)復(fù)雜的多。(手動(dòng)狗頭) 初了完美的網(wǎng)絡(luò)設(shè)計(jì)以外,如果你還希望預(yù)測(cè)的準(zhǔn)確率高一些,很完善的數(shù)據(jù)集也是必不可少的。比如之前提到的快速涂鴉的例子,僅"飛機(jī)"一個(gè)分類的數(shù)據(jù)集就有高達(dá)13萬張圖片數(shù)據(jù)(https://quickdraw./data/airplane)。 所以重頭訓(xùn)練一個(gè)新的模型,是一個(gè)學(xué)習(xí)周期很長(zhǎng)、成本相當(dāng)高的方案。如果希望短時(shí)間內(nèi)用AI賦能你的業(yè)務(wù),最好先看下其他三種方案有沒有適合你的需求,或者問下AI部門的同事,他們有沒有興趣和你一起干。 如果你對(duì)此很有興趣想要深入學(xué)習(xí)下去,推薦你看吳恩達(dá)的最新課程(開始的例子也是出自這個(gè)課程):https://www./specializations/tensorflow-in-practice (旁聽免費(fèi)) 三:使用成熟模型除了很多限制的使用第三方接口和門檻很高的重頭訓(xùn)練以外,我們還可以選擇使用成熟的模型,tensorflow已經(jīng)有js版本了,并且已經(jīng)有成熟的開源模型和類庫(前端開源的相關(guān)應(yīng)用幾乎全是基于tfjs的)。 但是幾乎每個(gè)例子的demo為了展示能力,都預(yù)置了參數(shù)調(diào)整和復(fù)雜的交互邏輯,代碼晦澀難懂(至少我是這么認(rèn)為的)。 我把社區(qū)中開源的前端AI能力,又重新用直白的語言寫了一遍,每個(gè)DEMO下有原項(xiàng)目地址鏈接,有興趣應(yīng)用的可以研究更精確的參數(shù)。 為了照顧沒有攝像頭的用戶,我為每個(gè)例子都寫了上傳圖像的版本。 也為了保持demo的單獨(dú)性和便于理解,沒有抽離公用模塊,基本開箱即用:
除了在瀏覽器中支持以外,tfjs官方也推出了支持小程序的插件:https://mp.weixin.qq.com/wxopen/pluginbasicprofile?action=intro&appid=wx6afed118d9e81df9&token=612578398&lang=zh_CN。有興趣的同學(xué)可以學(xué)習(xí)公司同事 @xiaoxiwang 出品的TFJS小程序的視頻教程。 成熟模型帶來了免費(fèi)、視頻實(shí)時(shí)預(yù)測(cè)等等優(yōu)點(diǎn),同時(shí)也帶來了無法定制識(shí)別自己的分類等缺點(diǎn)。 接下來是最后一種方法:再次訓(xùn)練 四:再次訓(xùn)練有的時(shí)候你的需求,需要的AI能力僅僅只需要識(shí)別一個(gè)標(biāo)志物體或者目標(biāo)的坐標(biāo),比如某個(gè)LOGO、某幅畫。那么可以在前人的訓(xùn)練好的模型基礎(chǔ)上再次訓(xùn)練。 在沒有強(qiáng)大數(shù)據(jù)集和AI團(tuán)隊(duì)支持的情況下,使用前人訓(xùn)練好的參數(shù)和模型設(shè)計(jì)基礎(chǔ)上,再次訓(xùn)練不失為一種不錯(cuò)的選擇。(這種方法也稱為遷移學(xué)習(xí)) 下面以高度封裝的 1. clone 預(yù)訓(xùn)練源代碼
2. 下載測(cè)試數(shù)據(jù)集 (解壓到 http://download./example_images/flower_photos.tgz 3. 開始訓(xùn)練 基于tensorflow 1.15.x環(huán)境
mac下命令連接符是 \,win下是 ^ 4. 開始訓(xùn)練 基于tensorflow 1.15.x環(huán)境
5. 優(yōu)化PB文件
6. 優(yōu)化PB文件 基于tensorflow.js 1.15.x環(huán)境
7. 轉(zhuǎn)成PB文件到j(luò)son文件
到這里,全部步驟已經(jīng)完成了。我也使用剛才的tfjs-converter 和使用成熟模型最大的不同是,需要自己處理傳遞給模型的圖像參數(shù)。
因?yàn)槠年P(guān)系,就不仔細(xì)拆解目標(biāo)識(shí)別(帶物體具體的坐標(biāo)信息的預(yù)測(cè))的訓(xùn)練步驟了,如果有興趣,可以試著看下面這個(gè)項(xiàng)目: 到這里,有同學(xué)可能要問:為什么你一個(gè)小前端要選擇python而不是熟悉的nodejs或者瀏覽器中的js來訓(xùn)練模型呢? 在我看來語言只是一種實(shí)現(xiàn)需求的手段,而前端跟其他職位只是面對(duì)的業(yè)務(wù)需求不同,選擇的語言不同而已。畢竟大道至簡(jiǎn),語言相通。 而現(xiàn)階段如果要深入機(jī)器學(xué)習(xí),python有自己得天獨(dú)厚的優(yōu)勢(shì),比如社區(qū)豐富、有大規(guī)模訓(xùn)練的解決方案、圖像處理和數(shù)學(xué)計(jì)算等nodejs或js不能替代的模塊。所以本文中的一些示例用了python語言。 不過tf.js現(xiàn)在也在飛速發(fā)展,tensorflow官方除了開源社區(qū),也投入了數(shù)個(gè)全職人力開發(fā)。相信不久的將來,tf.js除了適合前端應(yīng)用以外,對(duì)訓(xùn)練、部署這些周邊支撐也會(huì)有高效的解決方案! 結(jié)語:
但是這些都是客觀原因,如何用現(xiàn)在的技術(shù)和自己本身的領(lǐng)域結(jié)合,做出更多花樣,才是前端同胞們需要一直思考的地方。 |
|