Tomofun AI 落地實例分享 — Furbo AI 聲音警報 (下)
上一篇文章,我們與大家分享:Furbo AI 聲音警報功能 -「居家警報通知」:偵測煙霧偵測警報器和玻璃破碎聲音、「進階狗狗吠叫通知」:偵測狗狗叫聲,分類為吠叫、哭哭或嗷嗚。也跟大家分享 Furbo AI 聲音警報的運作原理,以及如何將聲音模型應用到產品中。
這篇文章,我們會跟大家分享,在真實世界建立一個可用的 AI 功能並不是那麼容易,以下列出 4 個我們遇到的挑戰,及解決方法。
- 罕見事件之聲音分類問題 (Sound classification on rare event)
- 收音元件的差異 (Sound quality on different hardware device)
- 邊緣計算的有效運用 (Edge AI computing)
- 混音造成模型辨識度下降 (Performance dropping due to mixed sound)
挑戰一:罕見事件之聲音分類問題
問題定義
典型的 AI 分類問題可以使用公開的大型資料集來訓練模型,並且通常每個類別的數量是平衡的。這樣的訓練過程相對較簡單,只需要使用設計好的演算法就能輕易辨別這些問題。
然而,在現實中 AI 分類往往涉及罕見事件的發生,例如 Furbo Dog Nanny 中玻璃破碎聲及煙霧警報聲等聲音偵測功能中的事件。這些事件通常發生得很少,我們只能取得有限的資料。若是模型判斷錯誤,用戶收到頻繁的罕見事件通知也會讓他們對產品的信心產生動搖。
因此,AI 分類在罕見事件的分類問題是極具挑戰性的,這些挑戰包括:
- 資料量稀少 (Lack of Labeled Data) — 訓練 AI 模型會變得困難
- 類別失衡 (Imbalanced Classes) — 不平衡的類別分佈,降低 AI 模型準度
- 資料變異性較高 (High Variability) — AI 模型會較難辨識罕見事件的特徵
解決方法
這些問題使得在訓練罕見事件的分類問題時變得十分困難且準確度不高。為了解決這些問題,我們使用了以下的方法:
- 資料擴增 (Data Augmentation) [1]
對於聲音分類問題,可以使用資料擴增的方法對聲音進行拉伸、壓縮、降噪等操作,讓模型能夠更好地處理不同的環境和場景。除此之外,解決資料量稀少問題時尤其重要,因為通過資料擴增可以產生更多的資料,並且增加資料的多樣性,有助於提高模型的準確度和穩定性,例如 time shift, pitch shift 等。
當然,如果能直接利用產品將實際事件的發生的聲音錄下來,是最直接有效的方式,儘管耗費成本較高,但對於模型開發來說,這些 golden set 是不可或缺的,我們也有使用 Furbo 來直接對罕見事件的聲音錄音 (想當然爾就要犧牲幾塊玻璃了)。
- 半監督式學習 (Semi-supervised Learning)
我們可以利用少量的標籤資料進行監督式學習,並利用大量的非標籤資料進行半監督式學習,從而提高模型的準確度和穩定性,例如利用偽標籤 (pseudo-label) [2] 的技術。
- 遷移學習 (Transfer Learning)
我們可以利用從其他聲音分類問題中學習到的知識,來幫助模型更好地識別罕見事件。例如 Fine-tuning 微調,是將從其他識別問題中學習到的知識應用到目標問題中,然後使用目標問題的標籤資料進行微調,使得模型能夠更好地適應目標問題,我們的模型使用 AudioSet 預訓練的模型,根據我們的資料集進行 Fine-tuning。
- 標籤校正 (Label Correction)
在現實環境中,罕見事件的標籤可能不夠精確,因此需要進行標籤校正,通過標籤校正,可以使得模型更加準確地識別罕見事件,從而提高模型的表現。而我們有使用了半自動化校正,利用模型選出大量非標籤資料中信心程度較高的資料,再利用人工對資料進行標籤校正,這種方法可以節省人力成本以及提高效率,同時保持較高的標籤準確度。
挑戰二:收音元件的差異
問題定義
Furbo 的產品有很多代,它們之間存在硬體和降躁算法的差異,例如:Furbo 第二代和第三代產品的麥克風是不一樣的,因此收音結果也會不同。
這樣帶來一個問題:原本的 AI 模型,是用第二代麥克風的聲音進行訓練,因此在第三代產品上的表現並不理想,因為兩者收音效果差異太大。
舉例來說:同樣的玻璃破碎聲,第二代麥克風和第三代麥克風在頻域上的表現會有很大的差異 !
如上圖所示,左圖是第二代產品的收音效果,右圖是第三代產品的收音效果。可以看出兩代產品,在高頻 5KHz ~ 6KHz的收音品質存在不小的差別。
解決方法
收音元件差異的問題可以由下列幾個方式解決:
- 增加訓練資料
可以透過增加跨設備的聲音樣本,提高模型的泛化能力。以我們的產品來說,從 Furbo 第二代和第三代兩項產品收進來的聲音會因為麥克風的選用、晶片降噪的演算法等等的不同而有所差異,將不同產品的聲音都加入訓練集能提高模型的泛化能力。
- 遷移學習技術
在預訓練的模型上進行 fine-tune,提高模型的適應性,和罕見事件的解決方式一樣,我們都有使用 AudioSet 的預訓練模型來針對資料及進行微調。
- 自監督學習 (Self-supervised Learning) [3]
從大量無標籤的聲音中自動學習有用的特徵,提高模型的泛化能力,可以分為下列兩種訓練方式:
- 生成擾動的聲音信號 — 使用擾動的聲音信號作為自監督學習的輸入,可以讓模型學習到更多的特徵。
- 聲音時間序列預測 — 這種方法的目的是讓模型根據過去的聲音時間序列來預測未來的聲音時間序列。
這些方法可以提高模型的泛化能力,從而提高模型在跨設備的聲音辨識問題中的表現。更多細節可以參考 self-supervised 相關的論文。得到高泛化能力的模型後,我們還是會針對我們的資料集去進行 fine-tune 微調。
- 數據擴增
增加訓練數據的多樣性,提高模型對不同設備上聲音的辨識能力,例如調整音調、增加噪聲、模擬距離變化等方式。
挑戰三:邊緣計算的有效運用
問題定義
現在許多的 IoT 裝置都配有 IPU, NPU 等加速器,讓裝置的運算效率提升。 我們的 Furbo 也不例外,在 Furbo 的硬體上面也配有一個 AI chip,上面有很多資源可以使用,如何有效運用這個 AI chip,讓整個系統 pipeline 計算更有效率,成為一個重要課題。
解決方法
這裡我們根據論文 [4][5],做了一個小的 AI 模型,約莫 100KB,放在 AI chip 上,作為聲音辨識的前處理,運用邊緣計算,減少雲端運算資源的消耗。
這個模型是 Binary Classification,負責辨識一段聲音,是否為狗叫聲。如果是,就會上傳給雲端上的模型做第二次的分類,辨別是吠叫、哭哭、嗷嗚,或者不是狗叫聲。這個模型,作為一個過濾器,濾掉很多不是狗叫的聲音,有效節省雲端模型的計算資源。
挑戰四:混音造成模型辨識度下降
問題定義
這裡以狗狗吠叫通知為例:我們發現,當輸入的聲音只包含狗叫聲時,AI 模型可以輕易識別它。但是,當輸入的聲音包含狗叫聲和其他聲音時,AI 模型就無法判斷出是否包含狗叫聲。
例如:當輸入的聲音包含狗叫聲和電視聲時,AI 模型可能會判定這不是狗叫聲。這導致狗的主人可能無法知道他們的寵物發生了什麼事情!
解決方法
這裡我們借助 Sound Event Detection [6] 來解決我們的問題。
原本的做法是把一段音檔,做分類任務,去分類這段聲音是否為狗叫聲。一開始我們採用的訓練資料,和對應的結果,有兩種如下表:
無論哪一種方法,都會有所缺失,實驗(1) 造成混音難以辨識;實驗(2) 造成 Precision 下降。我們運用 Sound Event Detection 的概念來訓練,使用 Multi-label training。
首先是資料處理: one-hot encoding 的方式來標註
- 原本的訓練方式是 ⇒ 吠叫標記成0, 嗷嗚標記成 1, 哭哭標記成 2, 其他類型聲音標記成 3
- 新的訓練方式是 ⇒ 吠叫標記成 [1,0,0,0], 嗷嗚標記成 [0,1,0,0], 哭哭聲標記成 [0,0,1,0], 其他類型聲音標記成 [0,0,0,1]
新的資料標記方式,在訓練的時候,可以把混音的資訊告訴 AI 模型,例如:吠叫+電視聲音
- 以原本的訓練方式,若標記成 0,就代表告訴 AI 模型這是吠叫聲,但模型可能會學錯,學成電視聲;若標記成 3,我們就會浪費掉這筆有吠叫聲的珍貴資料。
- 新的訓練方式,就可以標記成 [1,0,0,1] 進行訓練,代表告訴 AI 模型,這筆聲音有吠叫聲和一筆其他的聲音,這樣 AI 模型就能學到混音中的狗吠叫聲。
再來是 Loss function 的調整:Binary Cross Entropy & Asymmetric Loss Functions [7]。
由於一般的 Cross Entropy Loss 無法使用 one-hot encoding 的方式來訓練,所以這裡將 Loss function 調整成 Binary Cross Entropy,就可以了 !
透過新的訓練方式,“狗叫聲+其他聲音的混音” 可以有效的被辨識出來,而且 AI 模型可以維持在一個好的 Precision !
前面我們分享了 AI 聲音模型訓練上會遇到的四個挑戰。但除了模型訓練之外,要將 AI 服務落地的另一大關鍵,則是整體 pipeline 的建立。該如何透過 Furbo 將聲音上傳至雲端、在雲端進行預測、送出模型預測結果並即時通知用戶等等,也是 Tomofun 將 AI 服務落地的一大重點。
AI 服務落地 — Tomofun 狗音辨識 AI 百萬挑戰賽
為了讓大家更了解該如何建立出 pipeline,Tomofun 於 2021 的上半年,在 AWS 與趨勢科技的共同協助下舉辦了「Tomofun 狗音辨識 AI 百萬挑戰賽」,兩個月的賽程中吸引了 301 個參賽隊伍,共同角逐總獎金 100 萬元。
有別於以往單純將資料集提供給參賽者並請參賽者上傳辨識結果的比賽形式,此次比賽過程主打模擬 AI 服務落地的實作,主辦單位會發送 HTTP request 送出音檔,以每 2 秒送出一筆音檔的速度進行比賽,參賽隊伍需事先利用 AWS 提供之服務建立好 pipeline 並即時送出模型預測結果,也可以讓參賽者更能深入了解 Tomofun 在將 AI 服務落地時的過程。
結語
Tomofun 致力於讓 Furbo 提供更好的 AI 服務品質,開發了「居家警報通知」以及「進階狗狗吠叫通知」,而在開發 AI 聲音警報的過程中,我們也了解到 AI 服務的落地,不僅是訓練模型,同時得考慮實務上會碰到的問題,包括運算資源、硬體系統、pipeline 的建立、客戶的使用情境等等。兩篇文章,跟大家分享,建立 Furbo AI 聲音警報的過程,以及其中遇到的難題,希望對大家能有所幫助 !
Tomofun AI 落地實例分享 — Furbo AI 聲音警報,這系列文章是由 Hu-Cheng, Russell Chen 和 Henry Cheng 三位 AI Engineer 共同完成,如果大家有所收穫,歡迎追蹤 Tomofun Tech ,在這裡會有更多的文章帶你了解一個偉大產品開發的過程 !
參考資料
[1] Audio Data Augmentation — Torchaudio 2.0.1 documentation
[2] Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks
[3] Audio Self-supervised Learning: A Survey
[4] Learning from Between-class Examples for Deep Sound Recognition
[5] Learning environmental sounds with an end-to-end convolutional neural network
[6] Sound Event Detection: A Tutorial
[7] Asymmetric Loss Functions for Learning with Noisy Labels
[8] GitHub — aws-samples/incremental-training-mlops
[10] Tomofun在台舉辦狗音辨識AI百萬挑戰賽 趨勢科技與AWS加持幫助AI落地,教開發人員從頭打造世界級AI服務