0
雷鋒網(wǎng) AI 科技評論按:日前,2019 年 Kaggle Freesound 音頻標注挑戰(zhàn)賽宣告完結(jié),比賽結(jié)果也終于出爐。參賽者之一 Eric BOUTEILLON 是全球無縫支付解決方案提供商銀捷尼科集團(Ingenico Group)的一位產(chǎn)品負責人,他提交的解決方案在本次比賽中進入前 2% 排名,取得了第 8 名的成績,日前,他將解決方案分享在了 Github 上,詳細地介紹了該方案的復現(xiàn)步驟。
挑戰(zhàn)賽排名結(jié)果查看地址:https://www.kaggle.com/c/freesound-audio-tagging-2019/leaderboard
本開源庫提供了一個用于創(chuàng)建高效音頻標注系統(tǒng)的半監(jiān)督預熱管道,以及面向作者命名為 SpecMix 的多標簽音頻標注的一種新的數(shù)據(jù)增強技術。
在提交給 2019 年 Kaggle freesound 音頻標注挑戰(zhàn)賽的音頻標注系統(tǒng)中,我們應用了這些新技術。該挑戰(zhàn)賽是聲學場景和事件檢測和分類挑戰(zhàn)(DCASE 2019)的第二項任務挑戰(zhàn),目標包括使用在少量可靠、手動標注的數(shù)據(jù)以及擁有大規(guī)模詞匯設置的多標簽音頻標注任務中的大量噪聲網(wǎng)絡音頻數(shù)據(jù)上訓練的機器學習技術,來為每一測試幀預測音頻標簽。
在挑戰(zhàn)賽的公共排行榜上,該解決方案通過 Jupyter notebooks 運行得到的 lwlrap 值為 0.738,也就是說在本次比賽中排名第 8。
訓練 CNN 模型 1(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/training-cnn-model1.ipynb)
訓練 VGG16 模型(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/training-vgg16.ipynb)
推理內(nèi)核(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/inference-kernel.ipynb)
你還可以在公開的 Kaggle 數(shù)據(jù)集中找到 CNN-model-1 和 VGG-16 訓練的權重結(jié)果。需要注意的是,因為配額原因,作者沒有使用 git-lfs 將這些權重結(jié)果存儲下來。
該挑戰(zhàn)賽要求參賽者在 Kaggle 內(nèi)核中執(zhí)行推理而不改變其配置。因此,參賽者在比賽期間使用與 Kaggle 內(nèi)核配置相同版本的 pytorch 和 fastai 來加載本地生成的 CNN 權重是非常重要的。因此,參賽者選擇使用 pytorch 1.0.1 和 fastai 1.0.51 非常重要。
安裝方法 1:使用原作者的方法
要獲得與我的本地系統(tǒng)相同的配置,需在 GNU Linux Ubuntu 18.04.2 LTS 上測試以下步驟:
1、克隆這個開源庫:
git clone https://github.com/ebouteillon/freesound-audio-tagging-2019.git
2、安裝 anaconda3:https://docs.anaconda.com/anaconda/install/
3、輸入 linux 終端:
conda create --name freesound --file spec-file.txt
現(xiàn)在你已經(jīng)準備好了!
注意:我的配置已經(jīng)安裝了 CUDA 10,所以你可能必須根據(jù)自己在 spec-file.txt 中的配置調(diào)整 pytorch 和 cudatoolkit 的版本。
安裝方法 2 :使用 conda 推薦的軟件包
這個方法不能保證獲得與作者相同的配置,因為 conda 可能會更新安裝包。
1、克隆這個開源庫:
git clone https://github.com/ebouteillon/freesound-audio-tagging-2019.git
2、安裝 anaconda3
3、輸入 linux 終端:
conda update conda
conda create -n freesound python=3.7 anaconda
conda activate freesound
conda install numpy pandas scipy scikit-learn matplotlib tqdm seaborn pytorch==1.0.1 torchvision cudatoolkit=10.0 fastai==1.0.51 -c pytorch -c fastai
conda uninstall --force jpeg libtiff -y
conda install -c conda-forge libjpeg-turbo
CC="cc -mavx2" pip install --no-cache-dir -U --force-reinstall --no-binary :all: --compile pillow-simd
conda install -c conda-forge librosa
注意:
我的配置已經(jīng)安裝了 CUDA 10,所以你可能需要根據(jù)自己的配置調(diào)整 pytorch 和 cudatoolkit 的版本
你獲得的提醒可能不一致,因為我們使用的是 libjpeg-turbo
硬件/軟件
在挑戰(zhàn)賽期間,我使用了如下硬件/軟件配置:
英特爾酷睿 i7 4790k
英偉達 RTX 2080 ti
24 GB RAM
Ubuntu 18.04.2 LTS
安裝的 python 軟件包的詳細列表,另外在 requirements.txt 和 spec-file.txt 中可以獲取 conda(非常必要)。
英偉達驅(qū)動程序 418.67, CUDA 10.1, CuDNN 7.3.1
1、從 Kaggle 下載數(shù)據(jù)集(https://www.kaggle.com/c/freesound-audio-tagging-2019/data)
2、(選擇項)從 Kaggle 下載我的權重數(shù)據(jù)集(https://www.kaggle.com/ebouteillon/freesoundaudiotagging2019ebouteillonsolution)
3、解壓 input 文件夾解壓數(shù)據(jù)集,使你的環(huán)境如下:
── code
│ ├── inference-kernel.ipynb
│ ├── training-cnn-model1.ipynb
│ └── training-vgg16.ipynb
├── images
│ ├── all_augmentations.png
│ └── model-explained.png
├── input
│ ├── test│ │ └── ...
│ ├── train_curated
│ │ └── ...
│ ├── train_noisy
│ │ └── ...
│ ├── sample_submission.csv
│ ├── train_curated.csv
│ ├── train_noisy.csv
│ └── keep.txt
├── LICENSE
├── README.md
├── requirements.txt
├── spec-file.txt
└── weights
├── cnn-model-1
│ └── work
│ ├── models
│ │ └── keep.txt
│ ├── stage-10_fold-0.pkl
│ ├── ...
│ └── stage-2_fold-9.pkl
└── vgg16
└── work
├── models
│ └── keep.txt
├── stage-10_fold-0.pkl
├── ...
└── stage-2_fold-9.pkl
3、輸入命令行:
conda activate freesound
jupyter notebook
打開網(wǎng)頁瀏覽器,然后選擇要執(zhí)行的內(nèi)容。推薦順序如下:
training-cnn-model1.ipynb(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/training-cnn-model1.ipynb)
training-vgg16.ipynb(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/training-vgg16.ipynb)
inference-kernel.ipynb(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/inference-kernel.ipynb)
祝你愉快!
注意:
首先運行 training-*.ipynb,訓練其中一個模型。?
在 CNN 模型訓練中,將創(chuàng)建一個 work 文件夾和一個 PREPROCESSED 文件夾,你可能想要更改它們的位置:這與更新 work 和 PREPROCESSED 變量一樣簡單。
如果你想在本地設置中與推理筆記一同使用給定的(或你自己得到的)權重,只需更新 models_list 所指向的文件夾路徑。我保留了在本次挑戰(zhàn)賽中 Kaggle 內(nèi)核所使用的路徑。
使用了 Kaggle 數(shù)據(jù)集和我的權重數(shù)據(jù)集的推理內(nèi)核可以直接在 Kaggle 上獲?。?/span>
https://www.kaggle.com/ebouteillon/12th-public-lb-inference-kernel-using-fastai
音頻數(shù)據(jù)預處理
首先對音頻片段進行前端和末端靜音(閾值為 60 dB)的裁剪,然后以 44.1 kHz 的采樣速率、連續(xù)幀之間樣本的 347 的躍點長度、2560 個 FFT 組件及 20 Hz - 22050 Hz 范圍內(nèi)的頻率將音頻片段轉(zhuǎn)換成 128 波段的梅爾頻譜(mel-spectrogram)。最后是預處理,包括對得到的圖像進行正則化(均值=0,方差=1)處理,并將其復制到 3 個通道中。
模型概述
在本節(jié)中,我們將所使用的神經(jīng)網(wǎng)絡架構描述為:
版本 1 由表 1 中自定義 CNN「CNN-model-1」和批量歸一化的 VGG-16 組成。兩者都以同樣的方式接受訓練。
版本 2 只包含我們自定義的 CNN「CNN-model-1」,定義見表 1。
版本 3 用于評估判別的獎勵,該版本的模型與版本 2 相同。
表 1:CNN-model-1。BN 指批量歸一化(Batch Normalisation),ReLU 指線性整流函數(shù)(Rectified Linear Unit)
數(shù)據(jù)增強
利用小型訓練集的一種重要技術是使用數(shù)據(jù)增強來擴充該訓練集。為此,我們開發(fā)了一個名為 SpecMix 的新的數(shù)據(jù)增強方法。它是對 SpecAugment(見參考文獻 1)的擴展,靈感來源于 mixup(見參考文獻 2)。
SpecAugment 應用 3 種轉(zhuǎn)換來增強訓練樣本:時間規(guī)整、頻率掩蔽和時間掩蔽。
mixup 通過計算兩個樣本輸入與目標的加權平均值來創(chuàng)建虛擬訓練示例。
SpecMix
SpecMix 從 SpecAugment 的兩個最有效的轉(zhuǎn)換中受到啟發(fā),并對它們進行擴展以創(chuàng)建虛擬多標注訓練示例:
1、使用頻率替換(Frequency replacement)的方法,讓 f 連續(xù)的梅爾頻率通道 [f0, f0+f) 由另一個訓練樣本代替,后者其中的 f 首先從頻率掩膜參數(shù) F 的最小化值到最大化值的均勻分布中選取,而 f0 從 [0, ν?f) 中選取,v 表示梅爾頻率通道的數(shù)量。
2、使用時間替換(Time replacement)的方法,t 連續(xù)的時間步長 [t0, t0+t) 由另一個訓練樣本代替,后者期期中的 t 首先從 0 到時間掩膜參數(shù) T 的均勻分布中選取,而 t0 則從[0, τ?t) 中選取,τ 表示時間樣本的數(shù)量。
3、計算新訓練樣本的目標(Target)用作每個原始樣本的加權平均權重。每個原始樣本的權重與該樣本的像素數(shù)量成正比。我們在頻率替換和時間替換中所采用的替換樣本是相同的,這給了我們新的計算目標如下:
圖 1:mixup, SpecAugment 及 SpecMix 對比
其他的數(shù)據(jù)增強
我們添加了其他的數(shù)據(jù)增強技術。
SpecMix 之前使用 mixup 這一數(shù)據(jù)增強方法,得到一個小的改進(lwlrap 增加了+0.001)。首先將 mixup 應用于當前的批量處理,從而生成新樣本,然后將 SpecMix 應用于這些新創(chuàng)建的樣本。最后,將 mixup 和 SpecMix 結(jié)合應用到四個樣本上,最終生成單個樣本。
縮放和裁剪:在 1 到最大值 105 之間的隨機縮放,使用 75% 的概率,可以得到一個小的改善(lwlrap 增加了+0.001)。
亮度:使用 75% 的概率來控制隨機亮度和對比度的變化。
訓練---預熱管道
在訓練時,我們將隨機抽取的樣本梅爾頻譜中 128 個增強的片段提供給網(wǎng)絡批量,并使用 十折交叉驗證設置和 fastai 庫(見參考文獻 4)。
訓練分 4 個階段進行,每個階段生成一個模型用于以下 3 件事:
為下一階段的模型訓練做 預熱
幫助對噪聲因素進行半監(jiān)督選擇
參與測試預測(模型 1 除外)
本次比賽很重要的一點是不允許使用外部數(shù)據(jù)或預先訓練的模型。因此,我們下面展示的是本次比賽中僅使用的策展和噪聲集:
第 1 階段:僅使用噪聲集從零開始訓練模型(model1),然后在噪聲集(lwlrap1)上計算交叉驗證的 lwlrap。
第 2 階段:僅在策展集上訓練模型(模型 2),但使用模型 1 作為預訓練模型。然后在噪聲集(lwlrap2)上計算交叉驗證的 lwlrap。
第 3 階段:讓我們開始半監(jiān)督學習:我們的算法從噪聲集中選擇樣本,模型 1 和模型 2 對該噪聲集進行的分類(基本)正確。該算法避免樣本受噪聲的干擾,并使幾何平均值(lwlrap1,lwlrap2)大于或等于 0.5。每個文件和每個標注最多選擇 5 個樣本。然后在選定的噪聲樣本上訓練模型(模型 3),并使用模型 2 作為預訓練模型。然后在噪聲集(lwlrap3)上計算交叉驗證的 lwlrap。
第 4 階段:讓我們繼續(xù)半監(jiān)督學習:我們的算法再次從模型 3 嚴格正確分類的噪聲集中選擇樣本。該算法避免樣本受噪聲的干擾,并使 lwlrap3 = 1。然后在選定的噪聲樣本上訓練模型(模型 4),并使用模型 3 作為預訓練模型。
最后一個階段:模型 2、模型 3 和模型 4 對測試集的集成預測。
圖 2:預熱管道
推理
為了進行推理,我們將 128 個時間樣本(2 秒)窗口中的測試音頻片段進行分割,其中的窗口是重疊的。然后將這些樣本輸入到我們的模型,以獲得預測結(jié)果。將所有鏈接到音頻片段的預測結(jié)果進行平均,以獲得最終預測結(jié)果。
這次競賽對測試預測推斷存在很大的限制:必須通過 Kaggle 內(nèi)核進行提交,并且有時間限制。由于我們的解決方案需要 GPU,對于完全未見過的測試集的推斷需要在不到一個小時內(nèi)完成。
為了適應這個硬性約束條件,我們做了如下決定:
對所有模型使用相同的預處理和輸入;
將最終的集成限制為 2 個模型;
限制窗口的重疊;
組織者所提供的未見過的測試集是公開測試集的三倍多,所以我們確保在 1000 秒之內(nèi)推斷出公開測試集,這樣的話,就應該讓內(nèi)核在大約為 3000 秒的時間內(nèi)推斷出未見過的測試集,并確保時間波動的范圍在 20% 上下。
結(jié)果
為了評估系統(tǒng)的性能,我們在表 2 中展示了結(jié)果。結(jié)果包括,系統(tǒng)在經(jīng)過十折交叉驗證過的噪聲集和策展集上的性能評估,以及在公共排行榜上進行公告的測試集預測的評估值,使用的度量標準是 lwlrap(標注權重與標注排序的平均精度)
Model | lwlrap noisy | lwlrap curated | leaderboard |
model1 | 0.65057 | 0.41096 | N/A |
model2 | 0.38142 | 0.86222 | 0.723 |
model3 | 0.56716 | 0.87930 | 0.724 |
model4 | 0.57590 | 0.87718 | 0.724 |
ensemble | N/A | N/A | 0.733 |
表 2:使用預熱管道對 CNN-model-1 進行實證分析的結(jié)果
在試驗過程中,預熱管道各階段均生成了具有良好預測性能的模型。如圖 3 所示,每個模型都在公共排行榜上排名第 25 位,能夠讓我們獲得銀牌。此外,這些預熱模型本身帶來了足夠的多樣性,因為它們預測值的簡單平均值(lwlrap 0.733)在公共排行榜上排名第 16 位。
最終排名第 8 名的預測結(jié)果是由版本 1 產(chǎn)生,這是 CNN-model-1 和 VGG-16 給出的預測平均值,它們都以相同的方式訓練。
圖 3:排行榜
本 git 開源庫提供了一個用于創(chuàng)建高效音頻標注系統(tǒng)的半監(jiān)督預熱管道,以及面向作者命名為 SpecMix 的多標簽音頻標注的一種新的數(shù)據(jù)增強技術。這些技術同時利用干凈的和有噪聲的數(shù)據(jù)集,并顯示出良好的效果。
上述這些結(jié)果是可復現(xiàn)的,它的需求描述、復現(xiàn)的步驟和源代碼都可以在 GitHub1 上獲得。源代碼是在開放源碼許可(MIT)下發(fā)布的。
感謝我 5 歲兒子,他的大力支持才使這些成績有了可能。當我看著排行榜時,他說:「爸爸,你是最棒的,你會成為最棒的?!?/p>
我也感謝整個 kaggle 社區(qū)分享知識、想法和代碼。特別感謝 daisuke 在比賽中提供了內(nèi)核程序,特別感謝 mhiro2 提供了簡單 CNN 模型,并對所有的比賽組織者提出感謝。
參考文獻
[1] Daniel S. Park, William Chan, Yu Zhang, Chung-Cheng Chiu, Barret Zoph, Ekin D. Cubuk, Quoc V. Le, "SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition", arXiv:1904.08779, 2019.
[2] Hongyi Zhang, Moustapha Cisse, Yann N. Dauphin, and David Lopez-Paz. "mixup: Beyondempirical risk minimization". arXiv preprint arXiv:1710.09412, 2017.
[3] Eduardo Fonseca, Manoj Plakal, Frederic Font, Daniel P. W. Ellis, and Xavier Serra. "Audio tagging with noisy labels and minimal supervision". Submitted to DCASE2019 Workshop, 2019. URL: https://arxiv.org/abs/1906.02975
[4] fastai, Howard, Jeremy and others, 2018, URL: https://github.com/fastai/fastai
via https://github.com/ebouteillon/freesound-audio-tagging-2019#kaggle-freesound-audio-tagging-2019-competition 雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。