wechat号:浩波的笔记
数据背景
作为“世界灭绝之都”,夏威夷已经失去了68%的鸟类物种,其后果可能会损害整个食物链。研究人员利用种群监测来了解本地鸟类对环境变化和保护措施的反应。但岛上的许多鸟类都被隔离在难以接近的高海拔栖息地。由于身体监测困难,科学家们转向了声音记录。这种被称为生物声学监测的方法可以为研究濒危鸟类种群提供一种被动的、低成本的、经济的策略。 目前处理大型生物声学数据集的方法涉及对每个记录的手工注释。这需要专门的训练和大量的时间。因此使用机器学习技能,通过声音来识别鸟类的种类,可以节约大量成本。具体来说,开发一个模型,可以处理连续的音频数据,然后从声音上识别物种。最好的条目将能够用有限的训练数据训练可靠的分类器。
[图片上传失败...(image-5fa849-1652358817849)]
数据介绍
数据集来源:https://www.kaggle.com/competitions/birdclef-2022/data
下载方式:https://github.com/Kaggle/kaggle-api kaggle competitions download -c birdclef-2022
-
train_metadata.csv
:为训练数据提供了广泛的元数据- primary_label -鸟类的编码。可以通过将代码附加到https://ebird.org/species/来查看有关鸟类代码的详细信息,例如美国乌鸦的代码添加到https://ebird.org/species/amecro
- secondary_labels: 记录员标注的背景物种,空列表并不意味着没有背景鸟的声音。
- author - 提供录音的eBird用户
- Filename:关联音频文件。
- rating: 浮动值在0.0到5.0之间,作为Xeno-canto的质量等级和背景物种数量的指标,其中5.0是最高的,1.0是最低的。0.0表示此记录还没有用户评级。
train_audio
:大量的训练数据由xenocanto.org的用户慷慨上传的单个鸟类叫声的短录音组成。这些文件已被下采样到32khz,适用于匹配测试集的音频,并转换为ogg格式。test_soundscapes
:当您提交一个笔记本时,test_soundscapes目录将填充大约5500段录音,用于评分。每一个都是1分钟几毫秒的ogg音频格式,并只有一个音景可供下载。-
test.csv
:测试数据- row_id:行的唯一标识符。
- file_id:音频文件的唯一标识符。
- bird :一行的ebird代码。每个音频文件每5秒窗口有一排为每个得分物种。
- end_time:5秒时间窗口(5、10、15等)的最后一秒。
数据分析
`#相关库安装
import pkg_resourcesdef placeholder(x):
raise pkg_resources.DistributionNotFound
pkg_resources.get_distribution = placeholder!pip uninstall fastai fastcore torchaudio -y
!pip install torch==1.8.1 torchaudio==0.8.1 fastcore==1.3.20
!pip install torch==1.9.0 torchaudio==0.9.0
!pip install fastaudiotry:
import pycaret
except:
!pip install pycaret-nightly`
文章从以下几个方面展开
- 了解每个数据集,使用简单模型检查哪些特征是重要特征。
- 了解音频数据
- 转换音频数据并设计数据加载器来处理它们
- 设计一个模型并通过引入各种方法来训练它以提高性能
`import os
import librosa
from tqdm import tqdmimport pandas as pd
from fastaudio.all import *
from fastai.vision.all import *import torch
import torchaudio
import fastcore
import fastai
import fastaudio
import torchaudio
torchaudio.set_audio_backend("sox_io")import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
import plotly.express as pxfrom sklearn.preprocessing import LabelEncoder
import warnings
warnings.filterwarnings(action='ignore')sns.set(style="ticks", context="talk",font_scale = 1.2)
plt.style.use("seaborn-paper")
plt.subplots_adjust(wspace=1)`
加载数据
`# CONFIGURATIONS
DATA_DIR = Path('../input/birdclef-2022/train_audio')
audio_fns = get_audio_files(DATA_DIR)
print(f'No. of audio files: {len(audio_fns)}')to save time, I subset training data
meta_df = pd.read_csv('../input/birdclef-2022/train_metadata.csv')
test_df = pd.read_csv('../input/birdclef-2022/test.csv')`
简要分析
meta_df.head().T.style.set_properties(**{'background-color': 'black', 'color': 'white', 'border-color': 'white'})
[图片上传失败...(image-c49613-1652358817849)]
test_df.head().T.style.set_properties(**{'background-color': 'black', 'color': 'white', 'border-color': 'white'})
[图片上传失败...(image-830d-1652358817849)]
`train_df = meta_df.drop(['url','filename','scientific_name','license','time','common_name','secondary_labels']
,axis=1
,errors='ignore')
train_df = train_df.sample(1000)enc_list = ['primary_label','author','type']
for feature in enc_list:
le = LabelEncoder()
le = le.fit(train_df[feature])
train_df[feature] = le.transform(train_df[feature])`
从简单模型中理解元数据
`from pycaret.classification import *setup(data = train_df,
target = 'primary_label',
preprocess = True,
silent = True
)`
[图片上传失败...(image-33f47e-1652358817849)]
dt = create_model('dt',verbose = False) plot_model(dt, plot='feature')
[图片上传失败...(image-a44a08-1652358817849)]
观察可以发现
- latitue和longitude是重要的特征
- rating的重要性相对较低。
fig = px.scatter_geo( meta_df, lat="latitude", lon="longitude", color="primary_label", width=1000, height=500, title="Bird Distribution", ) fig.show()
[图片上传失败...(image-c7de22-1652358817849)]
了解训练集
train data是一个音频文件,我们想一下有什么策略可以解决这个问题
`def show_bird(audios):
for fn in audios:
audio = AudioTensor.create(fn)
audio.show()normoc_fns = get_audio_files( '../input/birdclef-2022/train_audio/normoc')
show_bird(normoc_fns[:3])`
[图片上传失败...(image-3c73fe-1652358817849)]
[图片上传失败...(image-ee91e5-1652358817849)]
观察发现
- 它们属于同一鸟类,但听起来不同
- 似乎有可以听到噪音的音频文件
- 即使你看波形,也没有相似之处
fig = px.scatter_geo( meta_df[meta_df['primary_label'] == 'norcar'], lat="latitude", lon="longitude", color="primary_label", width=1000, height=500, title="Bird Distribution", ) fig.show()
[图片上传失败...(image-86554b-1652358817848)]
norcar_fns = get_audio_files( '../input/birdclef-2022/train_audio/norcar') show_bird(norcar_fns[:3])
[图片上传失败...(image-ce73e7-1652358817848)]
[图片上传失败...(image-878e5f-1652358817848)]