{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os \nimport math\nimport numpy as np\n\n#mapping:\nimport geopandas as gpd \nimport pandas as pd \nimport folium\nfrom folium import Marker\nfrom folium.plugins import HeatMap\nfrom folium.plugins import MarkerCluster\n\n#plotting\nimport matplotlib.pyplot as plt \nimport seaborn as sns \n\n#Audio\nimport librosa\nimport librosa.display as ld\nfrom IPython.display import Audio","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_metadata=pd.read_csv('../input/birdclef-2021/train_metadata.csv')\n\ntrain_metadata.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f'Number of species in the data {train_metadata.primary_label.nunique()}')\n\n#plot of ratings of audio data :\n\nplt.figure(figsize=(16,8))\nsns.countplot(x=train_metadata.rating,data=train_metadata)\nplt.title('Recordings Ratings')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**highest and least recorded 20 birds in the recordings**","metadata":{}},{"cell_type":"code","source":"highest_recorded=train_metadata['common_name'].value_counts().sort_values(ascending=False)[:20]\nleast_recorded=train_metadata['common_name'].value_counts().sort_values()[:20]\n\nplt.subplots(2,1,figsize=(16,16))\n\nplt.subplot(2,1,1)\nplt.bar(x=highest_recorded.index,height=highest_recorded.values)\nplt.xticks(rotation=45)\nplt.ylabel('Count')\nplt.title('Most Recorded birds')\n\nplt.subplot(2,1,2)\nplt.bar(x=least_recorded.index,height=least_recorded.values)\nplt.xticks(rotation=45)\nplt.ylabel('Count')\nplt.title('Least Recorded birds')\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Heatmap of the recording locations**","metadata":{}},{"cell_type":"code","source":"\nfrom folium.plugins import HeatMap\n\nstart_loc=(train_metadata['latitude'].mean(),train_metadata['longitude'].mean())\n\n#map\nm_1=folium.Map(location=start_loc,\n              tiles='Open Street Map',\n              zoom_start=2,\n              min_zoom=1.5)\n\n#heatmap:\nHeatMap(data=train_metadata[['latitude','longitude']],\n        radius=7,opacity=.1).add_to(m_1)\nprint('Recordings Heatmap')\nm_1","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**This Heatmap shows that most of the recordings come from the Americas(North and South)\nand Western Europe and Scandinavia.There are also recordings around South Africa, Russia, Japan, Western India, China and New Zealand.**","metadata":{}},{"cell_type":"markdown","source":"**Most Common birds**\n\nThis is is plot of the most represented birds in the data. The marker colors for all except 2 birds will be unique.","metadata":{}},{"cell_type":"code","source":"colors = [\n    'red',\n    'blue',\n    'gray',\n    'darkred',\n    'lightred',\n    'orange',\n    'beige',\n    'green',\n    'darkgreen',\n    'lightgreen',\n    'darkblue',\n    'lightblue',\n    'purple',\n    'darkpurple',\n    'pink',\n    'cadetblue',\n    'lightgray',\n    'black',\n    'red',\n    'blue']","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"most_common=train_metadata[train_metadata['common_name'].isin(highest_recorded.index)]\n\n#adding diffrent color marker to each species:\ncolor_dict=dict(zip(highest_recorded.index,colors))\n\nm_2=folium.Map(location=start_loc,\n              tiles='Open Street Map',\n              zoom_start=2,\n              min_zoom=1.5)\n\nmc=MarkerCluster()\n\nfor idx,row in most_common.iterrows():\n    \n    location=(row['latitude'],row['longitude'])\n    bird_name=row['common_name']\n    fill_color=color_dict[bird_name]\n    \n    if not math.isnan(location[0]) and not math.isnan(location[1]):\n        mc.add_child(Marker(location,tooltip=f'<b>{bird_name}</b>',\n                    icon=folium.Icon(color=fill_color)))\n    \nm_2.add_child(mc)    ","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Most common birds seem to be the birds that have a long range.**","metadata":{}},{"cell_type":"markdown","source":"**Least Common birds**\n\nThe location of Least recorded birds in the data set. Marker colors are unique.","metadata":{}},{"cell_type":"code","source":"least_common=train_metadata[train_metadata['common_name'].isin(least_recorded.index)]\n\n#adding diffrent color marker to each species:\ncolor_dict=dict(zip(least_recorded.index,colors))\n\nm_2=folium.Map(location=start_loc,\n              tiles='Open Street Map',\n              zoom_start=2,\n              min_zoom=1.5)\n\nmc=MarkerCluster()\n\nfor idx,row in least_common.iterrows():\n    \n    location=(row['latitude'],row['longitude'])\n    bird_name=row['common_name']\n    fill_color=color_dict[bird_name]\n    \n    if not math.isnan(location[0]) and not math.isnan(location[1]):\n        mc.add_child(Marker(location,tooltip=f'<b>{bird_name}</b>',\n                           icon=folium.Icon(color=fill_color)))\n    \nm_2.add_child(mc)    ","metadata":{"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**The least recorded birds seem to be endemic to thier specific locations.**","metadata":{}},{"cell_type":"markdown","source":"# Audio EDA","metadata":{}},{"cell_type":"code","source":"#lets see some audio samples:\n# 1)Amepip\npath_1='../input/birdclef-2021/train_short_audio/amepip/XC111040.ogg'\nAudio(path_1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 2) bcnfly\npath_2='../input/birdclef-2021/train_short_audio/bncfly/XC113984.ogg'\nAudio(path_2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Plot waveplot and power spectrum**","metadata":{}},{"cell_type":"code","source":"def plot_waveplot(path,sr=None):\n    '''plot waveplot and power spectrograms'''\n    \n    #loading audio\n    signal,sr=librosa.load(path,sr=sr)\n    \n    plt.figure(figsize=(16,10))\n\n    #waveplot:\n    plt.subplot(2,1,1)\n    ld.waveplot(signal,sr)\n    plt.ylabel('Magnitude')\n    plt.title('Waveplot')\n\n    #fast fourier transform:\n\n    fft=np.fft.fft(signal)\n    mag=np.abs(fft)\n    freq=np.linspace(0,sr,len(mag))\n    plt.subplot(2,1,2)\n    plt.plot(freq,mag)\n    plt.xlabel('Frequency')\n    plt.ylabel('Magnitude')\n    plt.title('Power Spectrum')\n    \n    \n    plt.tight_layout()\n    plt.show()\n\nplot_waveplot(path='../input/birdclef-2021/train_short_audio/blbthr1/XC119226.ogg')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Short time fourier transform(STFT) and Mel spectrograms**","metadata":{}},{"cell_type":"code","source":"def plot_stft(path,sr):\n    '''Plot STFT '''\n    \n    #loading audio\n    signal,sr=librosa.load(path,sr=sr)\n    \n    #short time fourier transform:\n    stft=librosa.core.stft(signal,hop_length=hop_len,n_fft=n_fft)\n    spectrogram=librosa.amplitude_to_db(np.abs(stft),ref=np.max)\n\n    #display_spectrogram:\n    plt.figure(figsize=(16,4))\n\n    img=ld.specshow(spectrogram,sr=sr,hop_length=hop_len,x_axis='time',y_axis='log')\n    plt.xlabel('Time')\n    plt.ylabel('Freq')\n    plt.colorbar(img)\n    plt.title('STFT')\n    plt.show()\n\n\ndef plot_spectrogram(path,sr=None):\n    \n    #loading audio\n    signal,sr=librosa.load(path,sr=sr)\n\n    fig,ax=plt.subplots(figsize=(16,4))\n    M = librosa.feature.melspectrogram(y=signal, sr=sr)\n    M_db = librosa.power_to_db(M, ref=np.max)\n    img = ld.specshow(M_db, y_axis='mel', x_axis='time', ax=ax)\n    plt.colorbar(img)\n    ax.set(title='Mel spectrogram display')\n    plt.show()\n\nhop_len=512\nn_fft=2048\nplot_stft(path='../input/birdclef-2021/train_short_audio/blbthr1/XC119226.ogg',sr=None)\nplot_spectrogram(path='../input/birdclef-2021/train_short_audio/blbthr1/XC119226.ogg',sr=None)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Lets compare spectrograms of same species**","metadata":{}},{"cell_type":"code","source":"def compare_specs(path):\n    for paths in os.listdir(path)[:2]:\n        print('bird :{}'.format(path.split('/')[-1]))\n        plot_spectrogram(path=os.path.join(path,paths))\n        \ncompare_specs(path='../input/birdclef-2021/train_short_audio/amecro')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"compare_specs('../input/birdclef-2021/train_short_audio/casfin')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"compare_specs('../input/birdclef-2021/train_short_audio/houspa')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"compare_specs('../input/birdclef-2021/train_short_audio/macwar')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**There are similar patterns in spectrograms of same species. There could be diffrences as the quality of recordings is not uniform and may consist of lots of noise**","metadata":{}},{"cell_type":"markdown","source":"**Thats it for this notebook. I will do the modelling and prediction in a notebook listed below.** \n[ https://www.kaggle.com/virajkadam/birdclef-bird-sound-classification ]","metadata":{}}]}