Skip to content
Snippets Groups Projects
Select Git revision
  • fc714356abfaabf0a8934ed46039ee43356465eb
  • main default protected
2 results

PyAVA.py

Blame
  • 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')