[數(shù)據(jù)分析實踐]-音頻分析-BirdCLE-3

[數(shù)據(jù)分析實踐]-音頻分析-BirdCLE-3

https://www.kaggle.com/code/utcarshagrawal/birdclef-audio-pytorch-tutorial

數(shù)據(jù)背景

作為“世界滅絕之都”弥激,夏威夷已經(jīng)失去了68%的鳥類物種厚满,其后果可能會損害整個食物鏈。研究人員利用種群監(jiān)測來了解本地鳥類對環(huán)境變化和保護措施的反應(yīng)。但島上的許多鳥類都被隔離在難以接近的高海拔棲息地。由于身體監(jiān)測困難,科學(xué)家們轉(zhuǎn)向了聲音記錄。這種被稱為生物聲學(xué)監(jiān)測的方法可以為研究瀕危鳥類種群提供一種被動的、低成本的焚廊、經(jīng)濟的策略冶匹。
目前處理大型生物聲學(xué)數(shù)據(jù)集的方法涉及對每個記錄的手工注釋。這需要專門的訓(xùn)練和大量的時間咆瘟。因此使用機器學(xué)習(xí)技能嚼隘,通過聲音來識別鳥類的種類,可以節(jié)約大量成本袒餐。具體來說飞蛹,開發(fā)一個模型,可以處理連續(xù)的音頻數(shù)據(jù)灸眼,然后從聲音上識別物種卧檐。最好的條目將能夠用有限的訓(xùn)練數(shù)據(jù)訓(xùn)練可靠的分類器。

image.png

數(shù)據(jù)介紹

數(shù)據(jù)集來源:https://www.kaggle.com/competitions/birdclef-2022/data

下載方式:https://github.com/Kaggle/kaggle-api
kaggle competitions download -c birdclef-2022

  • train_metadata.csv:為訓(xùn)練數(shù)據(jù)提供了廣泛的元數(shù)據(jù)

    • primary_label -鳥類的編碼焰宣∶骨簦可以通過將代碼附加到https://ebird.org/species/來查看有關(guān)鳥類代碼的詳細信息,例如美國烏鴉的代碼添加到https://ebird.org/species/amecro
    • secondary_labels: 記錄員標注的背景物種匕积,空列表并不意味著沒有背景鳥的聲音盈罐。
    • author - 提供錄音的eBird用戶
    • Filename:關(guān)聯(lián)音頻文件。
    • rating: 浮動值在0.0到5.0之間闪唆,作為Xeno-canto的質(zhì)量等級和背景物種數(shù)量的指標盅粪,其中5.0是最高的,1.0是最低的悄蕾。0.0表示此記錄還沒有用戶評級票顾。
  • train_audio:大量的訓(xùn)練數(shù)據(jù)由xenocanto.org的用戶慷慨上傳的單個鳥類叫聲的短錄音組成。這些文件已被下采樣到32khz帆调,適用于匹配測試集的音頻奠骄,并轉(zhuǎn)換為ogg格式。

  • test_soundscapes:當您提交一個筆記本時贷帮,test_soundscapes目錄將填充大約5500段錄音戚揭,用于評分。每一個都是1分鐘幾毫秒的ogg音頻格式撵枢,并只有一個音景可供下載。

  • test.csv:測試數(shù)據(jù)

    • row_id:行的唯一標識符精居。
    • file_id:音頻文件的唯一標識符锄禽。
    • bird :一行的ebird代碼。每個音頻文件每5秒窗口有一排為每個得分物種靴姿。
    • end_time:5秒時間窗口(5沃但、10、15等)的最后一秒佛吓。

<h1 style = "font-size:45px;font-family: Comic Sans MS;text-align: center;background-color:#800080;color:#FFFFFF">音頻特征提取</h1>

<h3 style="font-family:Comic Sans MS">特征提取是突出信號中最具辨別力和影響力的特征的過程宵晚。本文將引導(dǎo)完成音頻處理中的一些重要特征提取垂攘,你可以將其擴展到適合的問題域的許多其他類型的特征。本文的其余部分只是一個生物技術(shù)學(xué)生的嘗試淤刃,向你解釋ta在過去幾天能夠理解的任何信號處理晒他。

import os
import gc
import ast
import random
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from tqdm import tqdm
import torchaudio
import IPython.display as ipd
from collections import Counter
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import f1_score

import torch
import torch.nn as nn
from torch.optim import Adam
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
from torchvision import models

import warnings
warnings.filterwarnings('ignore')
class config:
    seed=2022
    num_fold = 5
    sample_rate= 32_000
    n_fft=1024
    hop_length=512
    n_mels=64
    duration=7
    num_classes = 152
    train_batch_size = 32
    valid_batch_size = 64
    model_name = 'resnet50'
    epochs = 2
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    learning_rate = 1e-4

def seed_everything(seed):
    random.seed(seed)
    os.environ['PYTHONHASHSEED'] = str(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
seed_everything(config.seed)
#讀取數(shù)據(jù)
df = pd.read_csv('../input/birdclef-2022/train_metadata.csv')
df.head()
image.png
df.info()
image.png
df.describe()
image.png

分析Train_Metadata

plt.figure(figsize=(20, 6))

sns.countplot(df['primary_label'])
plt.xticks(rotation=90)
plt.title("Distribution of Primary Labels", fontsize=20)

plt.show()
image.png
plt.figure(figsize=(20, 6))

sns.countplot(df['rating'])
plt.title("Distribution of Ratings", fontsize=20)

plt.show()
image.png
df['type'] = df['type'].apply(lambda x : ast.literal_eval(x))

top = Counter([typ.lower() for lst in df['type'] for typ in lst])

top = dict(top.most_common(10))

plt.figure(figsize=(20, 6))

sns.barplot(x=list(top.keys()), y=list(top.values()), palette='hls')
plt.title("Top 10 song types")

plt.show()
image.png

分析音頻文件

使用 Torchaudio(這是一個 PyTorch 的音頻庫)來處理音頻數(shù)據(jù)

fig, ax = plt.subplots(2, 1, figsize=(20, 10))
fig.suptitle("Sound Waves", fontsize=15)

signal_1, sr = torchaudio.load(f"../input/birdclef-2022/train_audio/{filename_1}")
# The audio data consist of two things-
# Sound: sequence of vibrations in varying pressure strengths (y)
# Sample Rate: (sr) is the number of samples of audio carried per second, measured in Hz or kHz

sns.lineplot(x=np.arange(len(signal_1[0,:].detach().numpy())), y=signal_1[0,:].detach().numpy(), ax=ax[0], color='#4400FF')
ax[0].set_title("Audio 1")

signal_2, sr = torchaudio.load(f"../input/birdclef-2022/train_audio/{filename_2}")
sns.lineplot(x=np.arange(len(signal_2[0,:].detach().numpy())), y=signal_2[0,:].detach().numpy(), ax=ax[1], color='#4400FF')
ax[1].set_title("Audio 2")

plt.show()
image.png

數(shù)據(jù)預(yù)處理

由于我們的目標變量是字符串格式,因此將其轉(zhuǎn)換為整數(shù)逸贾,這里我使用了 LabelEncoder 來執(zhí)行

encoder = LabelEncoder()
df['primary_label_encoded'] = encoder.fit_transform(df['primary_label'])

skf = StratifiedKFold(n_splits=config.num_fold)
for k, (_, val_ind) in enumerate(skf.split(X=df, y=df['primary_label_encoded'])):
    df.loc[val_ind, 'fold'] = k

模型輸入是音頻文件陨仅,但模型無法直接理解這些音頻。 因此為了使用它們铝侵,我通過執(zhí)行某種類型的特征提取技術(shù)將其轉(zhuǎn)換為可理解的格式

特征提取

通常情況下提取的特征是圖像的形式灼伤,然后使用它們來訓(xùn)練我們的模型,這里使用MelSpectrogram咪鲜,這是一種將頻率轉(zhuǎn)換為梅爾標度的頻譜圖

fig, ax = plt.subplots(1, 2, figsize=(20, 7))
fig.suptitle("Mel Spectrogram", fontsize=15)

mel_spectrogram = torchaudio.transforms.MelSpectrogram(sample_rate=config.sample_rate, 
                                                      n_fft=config.n_fft, 
                                                      hop_length=config.hop_length, 
                                                      n_mels=config.n_mels)

mel_1 = mel_spectrogram(signal_1)
ax[0].imshow(mel_1.log2()[0,:,:].detach().numpy(), aspect='auto', cmap='cool')
ax[0].set_title("Audio 1")

mel_2 = mel_spectrogram(signal_2)
ax[1].imshow(mel_2.log2()[0,:,:].detach().numpy(), aspect='auto', cmap='cool')
ax[1].set_title("Audio 2")

plt.show()
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狐赡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疟丙,更是在濱河造成了極大的恐慌颖侄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆敢,死亡現(xiàn)場離奇詭異发皿,居然都是意外死亡,警方通過查閱死者的電腦和手機拂蝎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門穴墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温自,你說我怎么就攤上這事玄货。” “怎么了悼泌?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵松捉,是天一觀的道長。 經(jīng)常有香客問我馆里,道長隘世,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任鸠踪,我火速辦了婚禮丙者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘营密。我一直安慰自己械媒,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纷捞,像睡著了一般痢虹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上主儡,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天奖唯,我揣著相機與錄音,去河邊找鬼缀辩。 笑死臭埋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的臀玄。 我是一名探鬼主播瓢阴,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼健无!你這毒婦竟也來了荣恐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤累贤,失蹤者是張志新(化名)和其女友劉穎叠穆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼膏,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡硼被,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渗磅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷硫。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖始鱼,靈堂內(nèi)的尸體忽然破棺而出仔掸,到底是詐尸還是另有隱情,我是刑警寧澤医清,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布起暮,位于F島的核電站,受9級特大地震影響会烙,放射性物質(zhì)發(fā)生泄漏负懦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一柏腻、第九天 我趴在偏房一處隱蔽的房頂上張望密似。 院中可真熱鬧,春花似錦葫盼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抛猫。三九已至,卻和暖如春孩灯,著一層夾襖步出監(jiān)牢的瞬間闺金,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工峰档, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留败匹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓讥巡,卻偏偏與公主長得像掀亩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欢顷,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容