Select Git revision
Decoder.hpp
print_pred_samples.py 2.13 KiB
import pandas as pd, numpy as np
import matplotlib.pyplot as plt
import librosa, mir_eval
from scipy import signal
from glob import glob
from metadata import species
algos = ['praat', 'pesto_ft', 'tcrepe_ftsp']
species_list = [
'wolves', 'spotted_hyenas', # 2 good salience & harmonicity
'bottlenose_dolphins', 'rodents', 'little_owls', # 3 good salience only
'hummingbirds', 'disk-winged_bats', 'Reunion_white_eyes', 'monk_parakeets', 'lions', 'orangutans', 'long_billed_hermits', # 7 good harmonicity only
'dolphins', 'la_Palma_chaffinches'] # 2 neither
fig, ax = plt.subplots(nrows=len(species_list), ncols=5, figsize=(12, 15), sharey='row')
for i, specie in enumerate(species_list):
wavpath, FS, nfft, downsample, step = species[specie].values()
thrs = pd.read_csv(f'scores/{specie}_scores.csv', index_col=0).threshold
files = pd.Series(glob(wavpath)).sample(5)
dt = nfft * step / FS # winsize / 8
for j, fn in enumerate(files):
# load signal and compute spetrogram
sig, fs = librosa.load(fn, sr=FS)
df = pd.read_csv(f'{fn[:-4]}_preds.csv')
df = df[df.annot>0]
freqs, times, S = signal.spectrogram(sig, fs=FS, nperseg=nfft, noverlap=int(nfft-dt*fs))
S = 10*np.log10(S+1e-10)
S -= np.median(S, axis=1, keepdims=True)
plt.autoscale(False)
ax[i, j].imshow(S, vmin=np.quantile(S, .2), vmax=np.quantile(S, .98), origin='lower', aspect='auto', extent=[0, len(sig)/fs, 0, fs/2/1000], cmap='Greys')
plt.autoscale(True)
ax[i, j].scatter(df.dropna(subset='annot').time, df.dropna(subset='annot').annot/1000, label='annot')
for algo in algos:
# if not df[algo+'_f0'].isna().all():
ax[i, j].scatter(df[df[algo+'_conf']>thrs[algo]].time, df[df[algo+'_conf']>thrs[algo]][algo+'_f0']/1000, label=algo, s=3)
ax[i, j].set_ylim(0, df.annot.max()*2/1000)
ax[i,j].set_xticks(np.arange(0, len(sig)/fs, 0.1), "")
if j == 0:
ax[i,j].set_ylabel(specie.replace('_', ' ').replace(' ', '\n', 1))
#plt.legend()
plt.tight_layout(pad=0.1, w_pad=0.1, h_pad=-0.05)
plt.savefig(f'figures/sample_spectrograms.pdf')