0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用TensorFlow.js構(gòu)建這一系統(tǒng)

DPVg_AI_era ? 來源:未知 ? 作者:李倩 ? 2018-08-19 08:55 ? 次閱讀

如果聲音才是計算交互的未來,那么那些聾啞人怎么辦?帶著這個問題,本文作者構(gòu)建了一套系統(tǒng),讓亞馬遜的Alexa智能小助手學(xué)會了識別手語。本文介紹了如何使用TensorFlow.js來構(gòu)建這一系統(tǒng),全部代碼和演示已上傳至Github。

幾個月前,有一天晚上我躺在床上,一個念頭閃過我的腦海:“如果聲音才是計算交互的未來,那么那些聾啞人怎么辦?”我不知道究竟為何會產(chǎn)生這個想法,我自己可以正常說話、聽覺也正常,我周圍認識的人也沒有聾啞人,我也不使用語音助手。這個問題總是縈繞在我的腦子里,于是我知道自己需要好好研究一下了。

最終結(jié)果就是現(xiàn)在這個項目的誕生,我讓一臺Amazon Echo智能揚聲器對手語做出了響應(yīng)。確切的說是對美國手語(ASL)做出了響應(yīng),因為手語種類有很多。

本文將介紹如何使用TensorFlow.js構(gòu)建這一系統(tǒng)。讀者可以用自己的單詞和手語/手勢組合來對模型進行訓(xùn)練。此外,我希望這種方法有助于讓人們將焦點從項目的技術(shù)元素上轉(zhuǎn)移出來,而更多關(guān)注人文元素。這個項目更多的不是關(guān)于底層技術(shù)的討論,而是該技術(shù)能為人類提供的能力。

前期研究與系統(tǒng)需求

構(gòu)建系統(tǒng)需要:

用于解釋符號的神經(jīng)網(wǎng)絡(luò)(將視頻轉(zhuǎn)換為文本)。

一個文本到語音的轉(zhuǎn)換系統(tǒng),向Alexa說出需要解釋的手勢。

語音到文本的轉(zhuǎn)換系統(tǒng),用于轉(zhuǎn)錄Alexa對用戶的響應(yīng)。

運行此系統(tǒng)的設(shè)備(筆記本電腦/平板電腦)和與之交互的Echo智能揚聲器。

將上述部分聯(lián)系在一起的交互界面。

我可能花了很多時間來確定采用哪種類型的神經(jīng)網(wǎng)絡(luò)架構(gòu)。為此我提出了幾個選項:

1.由于符號有視覺和時間兩個方面的屬性,我一開始想選擇CNN與RNN的組合,其中將最后一個卷積層的輸出(在分類之前)作為序列輸入RNN。我后來發(fā)現(xiàn)這種網(wǎng)絡(luò)學(xué)名叫長期循環(huán)卷積網(wǎng)絡(luò)(LRCN)。

2.使用3D卷積網(wǎng)絡(luò),其中卷積將以三維方式應(yīng)用,前兩個維度是圖像,第三維度是時間。然而,這些網(wǎng)絡(luò)需要大量的內(nèi)存,我的macbook pro吃不消。

3.不再對視頻流中的各幀都進行CNN訓(xùn)練,而是僅在光流表示上進行訓(xùn)練,該光流表示將表示兩個連續(xù)幀之間的視在運動的模式。也就是說,它會對動作進行編碼,這將產(chǎn)生更為通用化的手語模型。

4.使用雙流CNN,其中空間流將是單幀(RGB)的,時間流將使用光流表示。

我通過閱讀論文發(fā)現(xiàn),這些論文至少使用了上述一些視頻活動識別方法。然而,我很快就意識到,由于我的計算力有限,而且我需要從頭開始研究和實施這些論文中的方法,時間和硬件條件都不夠。我最終確定的方法與上面完全不同。

為什么選擇TensorFlow.js

TensorFlow.js團隊一直在進行有趣的基于瀏覽器的實驗,以使人們熟悉機器學(xué)習(xí)的概念,并鼓勵他們將其用作您自己項目的構(gòu)建塊。對于那些不熟悉的人來說,TensorFlow.js是一個開源庫,允許用戶使用Javascript直接在瀏覽器中定義、訓(xùn)練和運行機器學(xué)習(xí)模型。特別是兩個演示似乎是有趣的起點 - Pacman網(wǎng)絡(luò)攝像頭控制器和可教學(xué)機器(Teachable Machine)。

雖然它們都從網(wǎng)絡(luò)攝像頭獲取輸入圖像并根據(jù)訓(xùn)練數(shù)據(jù)輸出預(yù)測結(jié)果,但其內(nèi)部每個操作都不同:

1)“吃豆人”(Pacman)網(wǎng)絡(luò)攝像頭。它使用卷積神經(jīng)網(wǎng)絡(luò)(CNN),采用來自網(wǎng)絡(luò)攝像頭的輸入圖像,通過一系列卷積和最大池化層進行傳遞。它可以提取圖像的主要特征,并根據(jù)已經(jīng)訓(xùn)練過的例子預(yù)測其標簽。由于訓(xùn)練是一個代價昂貴的過程,使用名為MobileNet的預(yù)訓(xùn)練模型進行遷移學(xué)習(xí)。該模型在1000個ImageNet類上進行了訓(xùn)練,但經(jīng)過優(yōu)化,可以在瀏覽器和移動應(yīng)用程序中運行。

2)可教學(xué)的機器。使用kNN(k-Nearest-Neighbors)模型,它非常簡單,從技術(shù)上講,它根本不執(zhí)行任何“學(xué)習(xí)”。它采用輸入圖像(來自網(wǎng)絡(luò)攝像頭)并通過使用相似度函數(shù)或距離度量找到最接近該輸入圖像的訓(xùn)練樣本的標簽來對其進行分類。

不過,在圖像輸入kNN之前,首先要通過名為SqueezeNet的小型神經(jīng)網(wǎng)絡(luò),然后將該網(wǎng)絡(luò)倒數(shù)第二層的輸出作為輸入進入kNN,這樣讀者就可以訓(xùn)練自己的模型。這樣做的好處是,我們可以使用SqueezeNet已經(jīng)學(xué)過的高級抽象內(nèi)容,而不是直接從網(wǎng)絡(luò)攝像頭向kNN提供原始像素信息,從而訓(xùn)練表現(xiàn)更好的分類器。

選擇使用TensorFlow.js也有其他原因:

1.進行原型設(shè)計時,無需編寫任何代碼。一開始通過簡單地在瀏覽器中運行原始示例,進行早期原型設(shè)計,對我打算使用的手勢進行訓(xùn)練,并查看系統(tǒng)如何執(zhí)行。即使輸出意味著pac-man在屏幕上移動。

2.可以使用TensorFlow.js直接在瀏覽器中運行模型。從可移植性,開發(fā)速度和Web界面交互的能力的角度來看,這都是巨大的優(yōu)勢。此外,模型可以完全在瀏覽器中運行,無需將數(shù)據(jù)發(fā)送到服務(wù)器。

3.由于可以在瀏覽器中運行,因此可以很好地與現(xiàn)代瀏覽器支持的語音到文本和文本到語音API進行交互。

4.測試、訓(xùn)練和調(diào)整速度更快,而這在機器學(xué)習(xí)任務(wù)中通常是一個挑戰(zhàn)。

5.由于我沒有手語數(shù)據(jù)集,并且訓(xùn)練示例基本上是我反復(fù)執(zhí)行手勢,因此使用網(wǎng)絡(luò)攝像頭來收集訓(xùn)練數(shù)據(jù)非常方便。

在徹底測試了這兩種方法,并發(fā)現(xiàn)兩個系統(tǒng)在測試中表現(xiàn)相當之后,我決定使用后者作為我的系統(tǒng)的基礎(chǔ),因為:

在較小的數(shù)據(jù)集上,kNN實際上可以比CNN更快/更好地執(zhí)行。 當使用越來越多的示例進行訓(xùn)練時,這種模型會變得很吃內(nèi)存,造成性能下降。但是因為我使用的數(shù)據(jù)集很小,所以這不是問題。

由于kNN并未真正從示例中學(xué)習(xí),因此在泛化方面表現(xiàn)很差。 因此,完全由一個人進行的實例訓(xùn)練的模型的預(yù)測,在另一個人身上的適用度不高。不過,這對我來說仍然不是問題,因為訓(xùn)練和測試模型的只有我一個人。

工作原理

1.在瀏覽器中啟動站點時,第一步是提供訓(xùn)練示例。使用網(wǎng)絡(luò)攝像頭反復(fù)捕捉自己的手勢。這是個相對較快的過程,因為按住特定的捕獲按鈕會連續(xù)捕獲幀數(shù),直到釋放按鈕,使用適當?shù)氖謩輼擞洸东@的圖像。我訓(xùn)練的系統(tǒng)包含14個單詞,這些單詞在各種組合中允許我對Alexa發(fā)出各種請求。

2.訓(xùn)練完成后,進入預(yù)測模式。使用來自網(wǎng)絡(luò)攝像頭的輸入圖像并通過分類器運行,根據(jù)上一步驟中提供的訓(xùn)練示例和標簽手勢找到其最近的答案。

3.如果結(jié)果超過某個預(yù)測閾值,就將將手勢顯示到屏幕的左側(cè)。

4.接下來,使用Web Speech API進行語音合成,說出檢測到的手勢。

5.如果說出的單詞是Alexa,它會喚醒附近的Echo揚聲器并開始收聽查詢請求。另外值得注意的是,我設(shè)定了一個任意手勢(在空中揮右拳)來表示Alexa這個詞,因為美國手語中沒有Alexa這個單詞,反復(fù)拼寫A-L-E-X-A會很煩人。

6 一旦整個手勢短語完成后,我再次使用WebSpeech API來轉(zhuǎn)錄Echo揚聲器的響應(yīng),這個揚聲器響應(yīng)的請求,并不知道該請求來自另一臺機器。轉(zhuǎn)錄的響應(yīng)顯示在屏幕的右側(cè),供用戶閱讀。

7 再次做出喚醒手勢,清除屏幕并重新開始重復(fù)查詢的過程。

我在Github上傳了所有代碼(https://github.com/shekit/alexa-sign-language-translator)。讀者可以隨意使用和修改。

一些尚待完善之處

雖然系統(tǒng)運行情況相對較好,但確實需要一些粗略的改進,來幫助獲得理想的結(jié)果并提高準確性,如:

確保沒有檢測到任何符號,除非出現(xiàn)喚醒詞Alexa。

添加一個包含完整的全部類別的訓(xùn)練樣例,將其歸類為“其他”用于表示系統(tǒng)空閑狀態(tài)(無手勢的空白背景,人手臂自然下垂站立)。這可以防止錯誤地檢測到單詞。

在接受輸出之前設(shè)置高閾值,以減少預(yù)測錯誤。

降低預(yù)測速度??刂泼棵氲念A(yù)測量有助于減少錯誤的預(yù)測。

確保已在該短語中檢測到的單詞不再被視為新的預(yù)測。

另一個挑戰(zhàn)是準確預(yù)測用戶何時完成查詢簽名。這對于準確轉(zhuǎn)錄是必要的。如果轉(zhuǎn)錄提前觸發(fā)(在用戶完成簽名之前觸發(fā)),系統(tǒng)就會開始轉(zhuǎn)錄它自己的語音。否則,如果轉(zhuǎn)錄較晚觸發(fā)??赡軙?dǎo)致系統(tǒng)錯過轉(zhuǎn)錄Alexa的部分回答。為了克服這個問題,我實施了兩種獨立的技術(shù),每種技術(shù)都有各自的優(yōu)缺點:

第一個選項是在添加訓(xùn)練用的特定單詞時將它們標記為終端單詞(terminal words)。這里所說的terminal words是指用戶只會在短語的末尾簽名的詞。例如,如果查詢是“Alexa,what’sthe weather?”那么,通過將“weather”標記為一個terminal word,當檢測到這個詞時,就可以正確地觸發(fā)轉(zhuǎn)錄。雖然這種方法很有效,但這意味著用戶必須記住在訓(xùn)練期間將單詞標記為terminal words,并且還要假設(shè)這個詞只出現(xiàn)在查詢末尾。這意味著要重新調(diào)整你的查詢,如果問“Alexa,what’sthe weatherin New York?”,這種方法就不管用了。我們在視頻演示里使用了這種方法。

第二個選項是讓用戶簽署一個停止詞(stop-word),以便讓系統(tǒng)知道用戶已經(jīng)完成了查詢。一旦識別出這個停止詞,系統(tǒng)就會觸發(fā)轉(zhuǎn)錄。因此,用戶將簽署Wakeword >Query> Stopword。這種方法存在用戶忘記簽署停止詞的風(fēng)險,從而導(dǎo)致轉(zhuǎn)錄根本沒有被觸發(fā)。我在一個單獨的github branch中實現(xiàn)了這種方法,你可以在其中使用喚醒詞“Alexa”作為查詢的bookend,比如問“Alexa, what’s the weather in New York(Alexa)?”

當然,如果有一種方法能準確區(qū)分來自內(nèi)部源(筆記本電腦)的語音和來自外部源(附近的Echo)的語音,這整個問題就能解決,但這是另外一個挑戰(zhàn)了。

接下來,我認為還有很多其他的方法能處理這個問題,你可以試著用來創(chuàng)建自己的項目:

Tensorflow.js也發(fā)布了PoseNet,使用它可能是一種有趣的方法。從機器的角度來看,跟蹤手腕、肘部和肩膀在視頻幀中的位置應(yīng)該足以預(yù)測大多數(shù)單詞。在拼寫時,手指的位置通常最重要。

使用基于CNN的方法可能能夠提高準確性,并使模型更能抵抗平移不變性。CNN還有助于更好地推廣到不同的人,還可以包括保存模型或加載預(yù)訓(xùn)練的Keras模型的能力。這將不再需要每次重啟瀏覽器都對系統(tǒng)進行訓(xùn)練。

考慮時間特征的一些CNN+RNN或PoseNet+RNN的組合可以提高準確率。

使用tensorflow.js中包含的更新的可重用kNN分類器。

從我第一次發(fā)布這個項目以來,就在社交媒體上獲得廣泛分享和報道,甚至Amazon還在Echo Show上為說話障礙的人實現(xiàn)了一個輔助功能(Tap to Alexa)。這實在太酷了。希望在未來, Amazon Show或其他基于攝像頭和屏幕的語音助理都能加入這一功能。對我來說,可能這就是這個原型展示的最終用例了,同時也希望能夠為數(shù)百萬新用戶開放這些設(shè)備的能力。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:【GitHub熱門】用TensorFlow.js讓智能音箱“聽懂”手語(代碼開源)

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    TensorFlow XLA加速線性代數(shù)編譯器

    依賴項對GPU版本,需要NVIDIA軟件包以支持TensorFlow配置安裝。在這一步中,需要選擇不同的選項,如 XLA、Cuda 支持、Verbs 等:./configure
    發(fā)表于 07-28 14:31

    TensorFlow發(fā)表推文正式發(fā)布TensorFlow v1.9

    是前所未有的。之前人工智能頭條也為大家介紹了個在瀏覽器中通過TensorFlow.js 進行多人人臉識別與特征檢測的項目,也受到大家的廣泛關(guān)注。此外 TensorFlow 還給那些想了解、學(xué)習(xí)相關(guān)項目技術(shù)的關(guān)注者們推出了系列官
    的頭像 發(fā)表于 07-16 10:23 ?3023次閱讀

    利用TensorFlow.js,D3.js 和 Web 的力量使訓(xùn)練模型的過程可視化

    TensorFlow.js 將機器學(xué)習(xí)引入 JavaScript 和 Web。 我們將利用這個很棒的框架來構(gòu)建個深度神經(jīng)網(wǎng)絡(luò)模型。這個模型將能夠按大聯(lián)盟裁判的精準度來稱呼好球和壞球。
    的頭像 發(fā)表于 08-08 14:24 ?6841次閱讀

    基于tensorflow.js設(shè)計、訓(xùn)練面向web的神經(jīng)網(wǎng)絡(luò)模型的經(jīng)驗

    NVIDIA顯卡。tensorflow.js在底層使用了WebGL加速,所以在瀏覽器中訓(xùn)練模型的個好處是可以利用AMD顯卡。另外,在瀏覽器中訓(xùn)練模型,可以更好地保護用戶隱私,更容易讓用戶信任。
    的頭像 發(fā)表于 10-18 09:43 ?4001次閱讀

    Shadow Art: 頌揚中國皮影戲藝術(shù)的 AI 實驗

    在本文中,我們將探討我們?nèi)绾卫?TensorFlow.js 構(gòu)建 Shadow Art。
    的頭像 發(fā)表于 03-15 16:21 ?5312次閱讀

    谷歌正式發(fā)布了2.0 Alpha版本

    TensorFlow產(chǎn)品生態(tài)系統(tǒng)的核心組件,如TensorBoard、TensorFlow Hub、TensorFlow Lite和TensorFl
    的頭像 發(fā)表于 06-15 10:30 ?2742次閱讀

    TensorFlow.js制作了個僅用 200 余行代碼的項目

    我們先來看下運行的效果。下圖中,上半部分是原始視頻,下半部分是使用 TensorFlow.js 對人像進行消除后的視頻。可以看到,除了偶爾會在邊緣處留有殘影之外,整體效果還是很不錯的。
    的頭像 發(fā)表于 05-11 18:08 ?5524次閱讀

    CNN是什么?美國有線電視新聞網(wǎng)嗎?

    它用TensorFlow.js加載了個10層的預(yù)訓(xùn)練模型,相當于在你的瀏覽器上跑個CNN模型,只需要打開電腦,就能了解CNN究竟是怎么回事。
    的頭像 發(fā)表于 09-03 10:58 ?5966次閱讀
    CNN是什么?美國有線電視新聞網(wǎng)嗎?

    Danfo.js提供高性能、直觀易用的數(shù)據(jù)結(jié)構(gòu),支持結(jié)構(gòu)化數(shù)據(jù)的操作和處理

    我們的愿景致,本質(zhì)上也符合 TensorFlow.js 團隊向 Web 引入 ML 的目標。Numpy 和 Pandas 等開源庫全面革新了 Python 中數(shù)據(jù)操作的便利性。因此很多工具都圍繞它們構(gòu)
    的頭像 發(fā)表于 09-23 18:21 ?5122次閱讀

    重大性能更新:Wasm 后端將利用 SIMD指令和 XNNPACK多線程

    3 月,我們?yōu)?TensorFlow.js 推出了個新的 WebAssembly(Wasm) 加速后端(繼續(xù)閱讀以進步了解 Wasm 及其重要性)。今天,我們很高興宣布項重大性能
    的頭像 發(fā)表于 09-30 15:15 ?9207次閱讀
    重大性能更新:Wasm 后端將利用 SIMD指令和 XNNPACK多線程

    如何通過開源的 TensorFlow.js BERT 模型來構(gòu)建應(yīng)用

    文 / 創(chuàng)意技術(shù)專家 Philip Bayer;軟件工程師 Ping Yu 和開發(fā)技術(shù)推廣工程師 Jason Mayes 在探索 BERT 針對語言的有益用例時,我們發(fā)現(xiàn)了許多令人興奮的研究。我們想知道:如果我們可以讓您更方便地在網(wǎng)絡(luò)瀏覽器中使用 BERT,將會怎么樣?這將實現(xiàn)哪些可能的有趣用例? 在 Google 中搜索提出類似于自由女神像有多高?的問題,并從網(wǎng)絡(luò)中得到答案(305 英尺)很容易。但是,還沒有辦法可以輕松針對具體內(nèi)容(例如,新聞報道、研究論文或文章)用自然語言提
    的頭像 發(fā)表于 10-21 10:59 ?1989次閱讀

    如何基于 ES6 的 JavaScript 進行 TensorFlow.js 的開發(fā)

    TensorFlow.jsTensorFlow 的 JavaScript 版本,支持 GPU 硬件加速,可以運行在 Node.js 或瀏覽器環(huán)境中。它不但支持完全基于 JavaScript
    的頭像 發(fā)表于 10-31 11:16 ?3011次閱讀

    tensorflow構(gòu)建流程

    本文主要闡述了tensorflow構(gòu)建流程。
    的頭像 發(fā)表于 12-04 15:01 ?1853次閱讀
    <b class='flag-5'>tensorflow</b>的<b class='flag-5'>構(gòu)建</b>流程

    使用TensorFlow和Artemis構(gòu)建解決農(nóng)村面臨的問題設(shè)備

    電子發(fā)燒友網(wǎng)站提供《使用TensorFlow和Artemis構(gòu)建解決農(nóng)村面臨的問題設(shè)備.zip》資料免費下載
    發(fā)表于 12-01 14:32 ?0次下載
    使用<b class='flag-5'>TensorFlow</b>和Artemis<b class='flag-5'>構(gòu)建</b>解決農(nóng)村面臨的問題設(shè)備

    CNN到底是怎么回事?

    它用TensorFlow.js加載了個10層的預(yù)訓(xùn)練模型,相當于在你的瀏覽器上跑個CNN模型,只需要打開電腦,就能了解CNN究竟是怎么回事。
    的頭像 發(fā)表于 06-28 14:47 ?3846次閱讀
    CNN到底是怎么回事?