2019 Kaggle Freesound 音頻標註挑戰賽結果出爐,這是一份排名前 2 %的解決方案
雷鋒網 AI 科技評論按:日前,2019 年 Kaggle Freesound 音頻標註挑戰賽宣告完結,比賽結果也終於出爐。參賽者之一 Eric BOUTEILLON 是全球無縫支付解決方案提供商銀捷尼科集團(Ingenico Group)的一位產品負責人,他提交的解決方案在本次比賽中進入前 2% 排名,取得了第 8 名的成績,日前,他將解決方案分享在了 Github 上,詳細地介紹了該方案的復現步驟。
挑戰賽排名結果查看地址:https://www.kaggle.com/c/freesound-audio-tagging-2019/leaderboard
本開源庫的出發點
本開源庫提供了一個用於創建高效音頻標註系統的半監督預熱管道,以及面向作者命名為 SpecMix 的多標籤音頻標註的一種新的數據增強技術。
在提交給 2019 年 Kaggle freesound 音頻標註挑戰賽的音頻標註系統中,我們應用了這些新技術。該挑戰賽是聲學場景和事件檢測和分類挑戰(DCASE 2019)的第二項任務挑戰,目標包括使用在少量可靠、手動標註的數據以及擁有大規模辭彙設置的多標籤音頻標註任務中的大量雜訊網路音頻數據上訓練的機器學習技術,來為每一測試幀預測音頻標籤。
TL;DR – 給我代碼!在挑戰賽的公共排行榜上,該解決方案通過 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)
推理內核(https://github.com/ebouteillon/freesound-audio-tagging-2019/blob/master/code/inference-kernel.ipynb)
你還可以在公開的 Kaggle 數據集中找到 CNN-model-1 和 VGG-16 訓練的權重結果。需要注意的是,因為配額原因,作者沒有使用 git-lfs 將這些權重結果存儲下來。
安裝該挑戰賽要求參賽者在 Kaggle 內核中執行推理而不改變其配置。因此,參賽者在比賽期間使用與 Kaggle 內核配置相同版本的 pytorch 和 fastai 來載入本地生成的 CNN 權重是非常重要的。因此,參賽者選擇使用 pytorch 1.0.1 和 fastai 1.0.51 非常重要。
安裝方法 1:使用原作者的方法
要獲得與我的本地系統相同的配置,需在 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
現在你已經準備好了!
注意:我的配置已經安裝了 CUDA 10,所以你可能必須根據自己在 spec-file.txt 中的配置調整 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
注意:
我的配置已經安裝了 CUDA 10,所以你可能需要根據自己的配置調整 pytorch 和 cudatoolkit 的版本
你獲得的提醒可能不一致,因為我們使用的是 libjpeg-turbo
硬體/軟體
在挑戰賽期間,我使用了如下硬體/軟體配置:
英特爾酷睿 i7 4790k
英偉達 RTX 2080 ti
24 GB RAM
Ubuntu 18.04.2 LTS
安裝的 python 軟體包的詳細列表,另外在 requirements.txt 和 spec-file.txt 中可以獲取 conda(非常必要)。
英偉達驅動程序 418.67, CUDA 10.1, CuDNN 7.3.1
復現結果
1、從 Kaggle 下載數據集(https://www.kaggle.com/c/freesound-audio-tagging-2019/data)
2、(選擇項)從 Kaggle 下載我的權重數據集(https://www.kaggle.com/ebouteillon/freesoundaudiotagging2019ebouteillonsolution)
3、解壓 input 文件夾解壓數據集,使你的環境如下:
── 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
打開網頁瀏覽器,然後選擇要執行的內容。推薦順序如下:
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 模型訓練中,將創建一個 work 文件夾和一個 PREPROCESSED 文件夾,你可能想要更改它們的位置:這與更新 work 和 PREPROCESSED 變數一樣簡單。
如果你想在本地設置中與推理筆記一同使用給定的(或你自己得到的)權重,只需更新 models_list 所指向的文件夾路徑。我保留了在本次挑戰賽中 Kaggle 內核所使用的路徑。
使用了 Kaggle 數據集和我的權重數據集的推理內核可以直接在 Kaggle 上獲取:
https://www.kaggle.com/ebouteillon/12th-public-lb-inference-kernel-using-fastai
解決方案概述
音頻數據預處理
首先對音頻片段進行前端和末端靜音(閾值為 60 dB)的裁剪,然後以 44.1 kHz 的採樣速率、連續幀之間樣本的 347 的躍點長度、2560 個 FFT 組件及 20 Hz - 22050 Hz 範圍內的頻率將音頻片段轉換成 128 波段的梅爾頻譜(mel-spectrogram)。最後是預處理,包括對得到的圖像進行正則化(均值=0,方差=1)處理,並將其複製到 3 個通道中。
模型概述
在本節中,我們將所使用的神經網路架構描述為:
版本 1 由表 1 中自定義 CNN「CNN-model-1」和批量歸一化的 VGG-16 組成。兩者都以同樣的方式接受訓練。
版本 2 只包含我們自定義的 CNN「CNN-model-1」,定義見表 1。
版本 3 用於評估判別的獎勵,該版本的模型與版本 2 相同。
表 1:CNN-model-1。BN 指批量歸一化(Batch Normalisation),ReLU 指線性整流函數(Rectified Linear Unit)
數據增強
利用小型訓練集的一種重要技術是使用數據增強來擴充該訓練集。為此,我們開發了一個名為 SpecMix 的新的數據增強方法。它是對 SpecAugment(見參考文獻 1)的擴展,靈感來源於 mixup(見參考文獻 2)。
SpecAugment 應用 3 種轉換來增強訓練樣本:時間規整、頻率掩蔽和時間掩蔽。
mixup 通過計算兩個樣本輸入與目標的加權平均值來創建虛擬訓練示例。
SpecMix
SpecMix 從 SpecAugment 的兩個最有效的轉換中受到啟發,並對它們進行擴展以創建虛擬多標註訓練示例:
1、使用頻率替換(Frequency replacement)的方法,讓 f 連續的梅爾頻率通道 [f0, f0+f) 由另一個訓練樣本代替,後者其中的 f 首先從頻率掩膜參數 F 的最小化值到最大化值的均勻分布中選取,而 f0 從 [0, ν?f) 中選取,v 表示梅爾頻率通道的數量。
2、使用時間替換(Time replacement)的方法,t 連續的時間步長 [t0, t0+t) 由另一個訓練樣本代替,後者期期中的 t 首先從 0 到時間掩膜參數 T 的均勻分布中選取,而 t0 則從[0, τ?t) 中選取,τ 表示時間樣本的數量。
3、計算新訓練樣本的目標(Target)用作每個原始樣本的加權平均權重。每個原始樣本的權重與該樣本的像素數量成正比。我們在頻率替換和時間替換中所採用的替換樣本是相同的,這給了我們新的計算目標如下:
圖 1:mixup, SpecAugment 及 SpecMix 對比
其他的數據增強
我們添加了其他的數據增強技術。
SpecMix 之前使用 mixup 這一數據增強方法,得到一個小的改進(lwlrap 增加了+0.001)。首先將 mixup 應用於當前的批量處理,從而生成新樣本,然後將 SpecMix 應用於這些新創建的樣本。最後,將 mixup 和 SpecMix 結合應用到四個樣本上,最終生成單個樣本。
縮放和裁剪:在 1 到最大值 105 之間的隨機縮放,使用 75% 的概率,可以得到一個小的改善(lwlrap 增加了+0.001)。
亮度:使用 75% 的概率來控制隨機亮度和對比度的變化。
訓練---預熱管道
在訓練時,我們將隨機抽取的樣本梅爾頻譜中 128 個增強的片段提供給網路批量,並使用 十折交叉驗證設置和 fastai 庫(見參考文獻 4)。
訓練分 4 個階段進行,每個階段生成一個模型用於以下 3 件事:
為下一階段的模型訓練做 預熱
幫助對雜訊因素進行半監督選擇
參與測試預測(模型 1 除外)
本次比賽很重要的一點是不允許使用外部數據或預先訓練的模型。因此,我們下面展示的是本次比賽中僅使用的策展和雜訊集:
第 1 階段:僅使用雜訊集從零開始訓練模型(model1),然後在雜訊集(lwlrap1)上計算交叉驗證的 lwlrap。
第 2 階段:僅在策展集上訓練模型(模型 2),但使用模型 1 作為預訓練模型。然後在雜訊集(lwlrap2)上計算交叉驗證的 lwlrap。
第 3 階段:讓我們開始半監督學習:我們的演算法從雜訊集中選擇樣本,模型 1 和模型 2 對該雜訊集進行的分類(基本)正確。該演算法避免樣本受雜訊的干擾,並使幾何平均值(lwlrap1,lwlrap2)大於或等於 0.5。每個文件和每個標註最多選擇 5 個樣本。然後在選定的雜訊樣本上訓練模型(模型 3),並使用模型 2 作為預訓練模型。然後在雜訊集(lwlrap3)上計算交叉驗證的 lwlrap。
第 4 階段:讓我們繼續半監督學習:我們的演算法再次從模型 3 嚴格正確分類的雜訊集中選擇樣本。該演算法避免樣本受雜訊的干擾,並使 lwlrap3 = 1。然後在選定的雜訊樣本上訓練模型(模型 4),並使用模型 3 作為預訓練模型。
最後一個階段:模型 2、模型 3 和模型 4 對測試集的集成預測。
圖 2:預熱管道
推理
為了進行推理,我們將 128 個時間樣本(2 秒)窗口中的測試音頻片段進行分割,其中的窗口是重疊的。然後將這些樣本輸入到我們的模型,以獲得預測結果。將所有鏈接到音頻片段的預測結果進行平均,以獲得最終預測結果。
這次競賽對測試預測推斷存在很大的限制:必須通過 Kaggle 內核進行提交,並且有時間限制。由於我們的解決方案需要 GPU,對於完全未見過的測試集的推斷需要在不到一個小時內完成。
為了適應這個硬性約束條件,我們做了如下決定:
對所有模型使用相同的預處理和輸入;
將最終的集成限制為 2 個模型;
限制窗口的重疊;
組織者所提供的未見過的測試集是公開測試集的三倍多,所以我們確保在 1000 秒之內推斷出公開測試集,這樣的話,就應該讓內核在大約為 3000 秒的時間內推斷出未見過的測試集,並確保時間波動的範圍在 20% 上下。
結果
為了評估系統的性能,我們在表 2 中展示了結果。結果包括,系統在經過十折交叉驗證過的雜訊集和策展集上的性能評估,以及在公共排行榜上進行公告的測試集預測的評估值,使用的度量標準是 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 進行實證分析的結果
在試驗過程中,預熱管道各階段均生成了具有良好預測性能的模型。如圖 3 所示,每個模型都在公共排行榜上排名第 25 位,能夠讓我們獲得銀牌。此外,這些預熱模型本身帶來了足夠的多樣性,因為它們預測值的簡單平均值(lwlrap 0.733)在公共排行榜上排名第 16 位。
最終排名第 8 名的預測結果是由版本 1 產生,這是 CNN-model-1 和 VGG-16 給出的預測平均值,它們都以相同的方式訓練。
圖 3:排行榜
結論本 git 開源庫提供了一個用於創建高效音頻標註系統的半監督預熱管道,以及面向作者命名為 SpecMix 的多標籤音頻標註的一種新的數據增強技術。這些技術同時利用乾淨的和有雜訊的數據集,並顯示出良好的效果。
上述這些結果是可復現的,它的需求描述、復現的步驟和源代碼都可以在 GitHub1 上獲得。源代碼是在開放源碼許可(MIT)下發布的。
致謝感謝我 5 歲兒子,他的大力支持才使這些成績有了可能。當我看著排行榜時,他說:「爸爸,你是最棒的,你會成為最棒的。」
我也感謝整個 kaggle 社區分享知識、想法和代碼。特別感謝 daisuke 在比賽中提供了內核程序,特別感謝 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雷鋒網雷鋒網
※「高空拋物」問題後續,AI 安防能做些什麼?
※DeepMind 在多智能體強化學習方面又有了新進展,最新成果登上 Science 雜誌
TAG:雷鋒網 |