{"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":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"!pip install noisereduce","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:25:13.662869Z","iopub.execute_input":"2022-03-04T18:25:13.663245Z","iopub.status.idle":"2022-03-04T18:25:24.283002Z","shell.execute_reply.started":"2022-03-04T18:25:13.663157Z","shell.execute_reply":"2022-03-04T18:25:24.282055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.express as px\n\nfrom scipy.fftpack import rfft, irfft, fftfreq, fft\nfrom scipy.signal import butter, sosfilt, sosfreqz, filtfilt\nfrom scipy.signal import hilbert\n\nimport librosa\nimport librosa.display\nimport IPython.display as ipd\nimport noisereduce as nr\n\nfrom sklearn.cluster import MiniBatchKMeans\nfrom sklearn.cluster import KMeans\n\nimport torch\nimport torchaudio\n\nfrom math import ceil\n\nimport os\nimport json\n\nimport warnings\nwarnings.simplefilter('ignore')","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:25:24.284446Z","iopub.execute_input":"2022-03-04T18:25:24.284686Z","iopub.status.idle":"2022-03-04T18:25:29.335735Z","shell.execute_reply.started":"2022-03-04T18:25:24.284660Z","shell.execute_reply":"2022-03-04T18:25:29.334662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Base","metadata":{}},{"cell_type":"code","source":"main_path = '/kaggle/input/birdclef-2022/'\nprint(f'[INFO] Archives:')\nos.listdir(main_path)","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:25:30.837249Z","iopub.execute_input":"2022-03-04T18:25:30.837558Z","iopub.status.idle":"2022-03-04T18:25:30.848167Z","shell.execute_reply.started":"2022-03-04T18:25:30.837526Z","shell.execute_reply":"2022-03-04T18:25:30.847344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta = pd.read_csv(main_path + 'train_metadata.csv')\ntest_data = pd.read_csv(main_path + 'test.csv')\nebird_data = pd.read_csv(main_path + 'eBird_Taxonomy_v2021.csv')\nsamp_subm = pd.read_csv(main_path + 'sample_submission.csv')\n\nwith open(main_path + 'scored_birds.json') as f:\n    scored_birds = json.load(f)\n\ntrain_meta_f = train_meta[train_meta.primary_label.isin(scored_birds)]\n    \nprint('[INFO] Informations:')\nprint('\\t-> Birds to be scored:', len(scored_birds))\nprint('\\t-> Train:', train_meta.shape)\nprint('\\t\\t-> Class:', len(train_meta.primary_label.unique()))\nprint('\\t-> Train Filtered:', train_meta_f.shape)\nprint('\\t\\t-> Class:', len(train_meta_f.primary_label.unique()))\nprint('\\t-> Test:',test_data.shape)","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:25:51.079048Z","iopub.execute_input":"2022-03-04T18:25:51.079694Z","iopub.status.idle":"2022-03-04T18:25:51.229100Z","shell.execute_reply.started":"2022-03-04T18:25:51.079653Z","shell.execute_reply":"2022-03-04T18:25:51.228132Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta_f.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:26:08.601365Z","iopub.execute_input":"2022-03-04T18:26:08.601670Z","iopub.status.idle":"2022-03-04T18:26:08.626211Z","shell.execute_reply.started":"2022-03-04T18:26:08.601637Z","shell.execute_reply":"2022-03-04T18:26:08.625348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:26:11.393834Z","iopub.execute_input":"2022-03-04T18:26:11.394339Z","iopub.status.idle":"2022-03-04T18:26:11.406241Z","shell.execute_reply.started":"2022-03-04T18:26:11.394301Z","shell.execute_reply":"2022-03-04T18:26:11.405264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Graphics","metadata":{}},{"cell_type":"code","source":"train_meta_f['count'] = 1\ng_00 = train_meta_f.groupby(['primary_label'])['count'].count()\\\n                   .reset_index()\\\n                   .sort_values('count',ascending=False)\n\ng_01 = train_meta_f.groupby(['secondary_labels'])['count'].count()\\\n                   .reset_index()\\\n                   .sort_values('count',ascending=False)\n                                           \nfig, (ax1,ax2) = plt.subplots(2, 1, figsize=(8,10))\nfig.suptitle('Graphics')\nax1 = sns.barplot(x ='count',y='primary_label', data = g_00.head(10), ax=ax1)\nax1.set_title('Primary Label')\nax1.set(xlabel ='Count', ylabel='Label')\n\nax2 = sns.barplot(x ='count',y='secondary_labels', data = g_01.head(10), ax=ax2)\nax2.set_title('Secondary Label')\nax2.set(xlabel ='Count', ylabel='Label')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:28:00.790647Z","iopub.execute_input":"2022-03-04T18:28:00.790964Z","iopub.status.idle":"2022-03-04T18:28:01.435422Z","shell.execute_reply.started":"2022-03-04T18:28:00.790927Z","shell.execute_reply":"2022-03-04T18:28:01.434774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label = 'skylar'\n\ndf_00 = train_meta_f[train_meta_f.primary_label == label][['primary_label','latitude','longitude']]\nfig = px.density_mapbox(data_frame=df_00, \n                        lat='latitude', \n                        lon='longitude',\n                        radius=5,\n                        center = dict(lat=10,lon=-2),\n                        zoom = 0.9,\n                        mapbox_style='stamen-terrain',\n                        title = f'Density map: {label} ')\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:29:18.439747Z","iopub.execute_input":"2022-03-04T18:29:18.440046Z","iopub.status.idle":"2022-03-04T18:29:19.463124Z","shell.execute_reply.started":"2022-03-04T18:29:18.440018Z","shell.execute_reply":"2022-03-04T18:29:19.462230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.scatter_geo(\n    train_meta_f,\n    lat=\"latitude\",\n    lon=\"longitude\",\n    color = 'primary_label',\n    width=900,\n    height=500,\n    title=\"Training Data (Filtered)\",\n    hover_name= 'primary_label'\n)\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:30:01.277076Z","iopub.execute_input":"2022-03-04T18:30:01.277386Z","iopub.status.idle":"2022-03-04T18:30:01.479440Z","shell.execute_reply.started":"2022-03-04T18:30:01.277352Z","shell.execute_reply":"2022-03-04T18:30:01.478353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Graphics (K means)","metadata":{}},{"cell_type":"code","source":"def KMeans_Clusters(data, n = 5):\n    \n    sum_of_squared_distances = []\n    models = []\n    K_groups = range(2, n + 1 , 1)\n    \n    for k in K_groups:\n        kmeans = KMeans(n_clusters = k,\n                       random_state = 42)\n        kmeans.fit(data)\n        \n        sum_of_squared_distances.append(kmeans.inertia_)\n        models.append(kmeans)\n    \n    x1, y1 = 2, sum_of_squared_distances[0]\n    x2, y2 = n, sum_of_squared_distances[-1]\n    \n    x_point = [x1, x2]\n    y_point = [y1, y2]\n    \n    distances = []\n    \n    for i in range(len(sum_of_squared_distances)):\n        x0 = i+2\n        y0 = sum_of_squared_distances[i]\n        a = abs((y2-y1)*x0 - (x2-x1)*y0 + x2*y1 - y2*x1)\n        b = np.sqrt((y2 - y1)**2 + (x2 - x1)**2)\n        distances.append(a/b)\n    \n    i_max = distances.index(max(distances))\n    k_best = i_max + 2\n    model_best = models[i_max]\n    print('[INFO] Best K = ', k_best)\n\n    plt.plot(K_groups, sum_of_squared_distances, 'rx-')\n    plt.plot(x_point, y_point, 'b--')\n    plt.xlabel('k')\n    plt.ylabel('Sum_of_squared_distances')\n    plt.title('Elbow Method For Optimal k')\n    plt.show()\n    \n    return model_best\n        \nkmeans = KMeans_Clusters(data = train_meta_f[['latitude','longitude']],\n                         n = 20)\ntrain_meta_f['Group'] = kmeans.labels_","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:30:43.126999Z","iopub.execute_input":"2022-03-04T18:30:43.127284Z","iopub.status.idle":"2022-03-04T18:31:08.227737Z","shell.execute_reply.started":"2022-03-04T18:30:43.127256Z","shell.execute_reply":"2022-03-04T18:31:08.227028Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.scatter_geo(\n    train_meta_f,\n    lat=\"latitude\",\n    lon=\"longitude\",\n    color=\"Group\",\n    width=900,\n    height=500,\n    title=\"Training Data (Filtered)\",\n    hover_name= 'primary_label'\n)\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:31:17.143967Z","iopub.execute_input":"2022-03-04T18:31:17.144290Z","iopub.status.idle":"2022-03-04T18:31:17.228141Z","shell.execute_reply.started":"2022-03-04T18:31:17.144257Z","shell.execute_reply":"2022-03-04T18:31:17.227319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Signal","metadata":{}},{"cell_type":"code","source":"def Get_Params(y_t, sr):\n    N = len(y_t)                                      \n    T = 1.0 / sr                                      \n    x_t = np.linspace(0.0, N*T, N)                    \n    x_f = np.linspace(0.0, 1.0/(2.0*T), int(N/2))      \n    return N, T, x_t, x_f\n\ndef Remove_Continuos(y_t):\n    mean_y = np.mean(y_t)\n    y_ = y_t - mean_y\n    return y_\n\ndef Normalization(y_t):\n    max_y = np.max(y_t)\n    y_ = y_t/max_y\n    return y_\n\ndef Noice_Reduce(y_t, sr, n_fft = 1024, win_length = 512, use_tqdm = False):\n    y_ = nr.reduce_noise(y = y_t,\n                        sr = sr,\n                        n_fft = n_fft,\n                        win_length = win_length,\n                        use_tqdm = use_tqdm,\n                        n_jobs = 2)\n    y_ = np.array(y_)\n    return y_\n\ndef Limit(y_t, sr, x_f, N , taxa = 1.5):\n    y_f = fft(y_t)\n    y_f = 2.0/N * np.abs(y_f[:N//2])\n    mean_yf = np.mean(y_f)\n    std_yf = np.std(y_f)\n    distances = np.power(y_f - mean_yf, 2) \n    index = distances.argmin()\n\n    if x_f[index]*taxa >= np.max(x_f):\n        freq_cut = np.max(x_f)*0.95\n    else:\n        freq_cut = x_f[index]*taxa \n        \n    return freq_cut\n\ndef Band_Pass_Filter(y_t, sr, lowcut, highcut, order=5):\n    nyq = 0.5 * sr\n    low = lowcut / nyq\n    high = highcut / nyq\n    b, a = butter(order, [low, high], btype='bandpass', analog=False, output='ba')\n    y_ = filtfilt(b, a, y_t)\n#     sos = butter(order, normal_cutoff , analog=False, btype='lowpass', output='sos')\n#     y = sosfilt(sos, data)\n    return y_\n\ndef Envelope(y_t):\n    analytical_signal = hilbert(y_t)\n    y_ = np.abs(analytical_signal)\n    hilbert_fft = fft(y_)\n    return y_, hilbert_fft\n\n\ndef Complete_Treatment(y_t, sr, n_fft = 1024, win_length = 512, use_tqdm = False, plot=True, nome=None):\n    N, T, x_t, x_f = Get_Params(y_t, sr)\n    y_f_0 = fft(y_t)\n    \n    y_1 = Remove_Continuos(y_t)\n    y_f_1 = fft(y_1)\n    \n    y_2 = Normalization(y_1)\n    y_f_2 = fft(y_2)   \n\n    y_3 = Noice_Reduce(y_2, \n                        sr, \n                        n_fft = n_fft, \n                        win_length = win_length, \n                        use_tqdm = use_tqdm)\n    y_f_3 = fft(y_3)\n    \n    freq_cut = Limit(y_3, sr, x_f, N, taxa = 1.2)\n    y_4 = Band_Pass_Filter(y_3, sr, lowcut = 100, highcut = freq_cut, order = 5)\n    y_f_4 = fft(y_4)\n    \n    y_5, y_f_5 = Envelope(y_4)\n    \n    \n    if plot:\n        fig, ax = plt.subplots(figsize =(15,12), nrows = 6, ncols = 2)\n        if nome == None:\n            fig.suptitle('Signal Treatment')\n        else:\n            fig.suptitle(f'Signal Treatment - bird: {nome}')\n            \n        ax[0, 0].plot(x_t, y_t)\n        ax[0, 0].set_title('Raw Data')\n        ax[0, 0].set_xlabel('t')   \n        ax[0, 1].plot(x_f, 2.0/N * np.abs(y_f_0[:N//2]))\n        ax[0, 1].set_title('Frequency')\n        ax[0, 1].set_xlabel('Hz')\n        \n        ax[1, 0].plot(x_t, y_1)\n        ax[1, 0].set_title('Data Without Continuous Component')\n        ax[1, 0].set_xlabel('t')   \n        ax[1, 1].plot(x_f, 2.0/N * np.abs(y_f_1[:N//2]))\n        ax[1, 1].set_title('Frequency')\n        ax[1, 1].set_xlabel('Hz')  \n        \n        ax[2, 0].plot(x_t, y_2)\n        ax[2, 0].set_title('Normalized Data')\n        ax[2, 0].set_xlabel('t')   \n        ax[2, 1].plot(x_f, 2.0/N * np.abs(y_f_2[:N//2]))\n        ax[2, 1].set_title('Frequency')\n        ax[2, 1].set_xlabel('Hz')  \n        \n        ax[3, 0].plot(x_t, y_3)\n        ax[3, 0].set_title('Data With Noise Reduce')\n        ax[3, 0].set_xlabel('t')   \n        ax[3, 1].plot(x_f, 2.0/N * np.abs(y_f_3[:N//2]))\n        ax[3, 1].set_title('Frequency')\n        ax[3, 1].set_xlabel('Hz')  \n        \n        ax[4, 0].plot(x_t, y_4)\n        ax[4, 0].set_title('Filtered Data')\n        ax[4, 0].set_xlabel('t')   \n        ax[4, 1].plot(x_f, 2.0/N * np.abs(y_f_4[:N//2]))\n        ax[4, 1].set_title('Frequency')\n        ax[4, 1].set_xlabel('Hz')\n        \n        # Envelope\n        ax[5, 0].plot(x_t, y_5)\n        ax[5, 0].set_title('Envelope')\n        ax[5, 0].set_xlabel('t')   \n        ax[5, 1].plot(x_f, 2.0/N * np.abs(y_f_5[:N//2]))\n        ax[5, 1].set_title('Frequency')\n        ax[5, 1].set_xlabel('Hz')\n        \n        plt.subplots_adjust(wspace = 0.2, hspace = 0.8)\n        plt.show()\n        \n    return y_5, y_4, x_t","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:39:30.279186Z","iopub.execute_input":"2022-03-04T18:39:30.279645Z","iopub.status.idle":"2022-03-04T18:39:30.315806Z","shell.execute_reply.started":"2022-03-04T18:39:30.279602Z","shell.execute_reply":"2022-03-04T18:39:30.314929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Criação do Espectograma","metadata":{}},{"cell_type":"code","source":"# Cria o Espectograma\ndef Criate_Spectrograms(file_name, \n                         frame_size = 10,\n                         frame_step = 2, \n                         channel = 0,\n                         signal_treatment = True, \n                         n_fft = 1800, \n                         win_length = 512,\n                         hilbert = True,\n                         device = 'cpu'):\n#     y_t, sr = torchaudio.load(file_name)\n    y_t, sr = librosa.load(file_name) \n    transform = torchaudio.transforms.Spectrogram(n_fft = n_fft, win_length = win_length).to(device)\n    if signal_treatment :\n        y_hilbert, y_, _ = Complete_Treatment(y_t, sr, win_length = transform.win_length, plot=False)\n        if hilbert:\n            y_t = torch.from_numpy(np.array(y_hilbert))\n        else:\n            y_t = torch.from_numpy(np.array(y_))\n#     print(y_t.size())\n    step = int(frame_step * sr)\n    size = int(frame_size * sr)\n    spectrograms = []\n    \n    for i in range(ceil((y_t.size()[-1] - size) / step)):\n        begin = i * step\n        frame = y_t[begin:begin + size]\n        if len(frame) < size:\n            if i == 0:\n                rep = round(float(size) / len(frame))\n                frame = frame.repeat(int(rep))\n            elif len(frame) < (size * 0.33):\n                continue\n            else:\n                frame = y_t[-size:]\n        sg = transform(frame.to(device))\n        spectrograms.append(np.nan_to_num(torch.log(sg).numpy()))\n        # spectrograms.append(np.nan_to_num(sg.numpy()))\n    return spectrograms  ","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:43:26.001841Z","iopub.execute_input":"2022-03-04T18:43:26.002151Z","iopub.status.idle":"2022-03-04T18:43:26.016932Z","shell.execute_reply.started":"2022-03-04T18:43:26.002120Z","shell.execute_reply":"2022-03-04T18:43:26.016016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test","metadata":{}},{"cell_type":"code","source":"for i in range(5):\n    path_audio = main_path + 'train_audio/'\n    n = np.random.randint(0, len(train_meta_f))\n    audio = train_meta_f.filename.values[n]\n    bird = train_meta_f.primary_label.values[n]\n\n    y_t, sr = librosa.load(path_audio+audio) \n\n\n    y_trat, _, x_t = Complete_Treatment(y_t, sr, plot=True, nome=bird)\n\n    sgs_h = Criate_Spectrograms(path_audio+audio,\n                              frame_size = int(x_t[-1]),\n                              frame_step = int(x_t[-1]))\n    sgs = Criate_Spectrograms(path_audio+audio,\n                              frame_size = int(x_t[-1]),\n                              frame_step = int(x_t[-1]),\n                              hilbert = False)\n    plt.figure(figsize=(15,5))\n    plt.imshow(sgs_h[0], interpolation='nearest', aspect='auto')\n    plt.title(f'Spectrogram (with Hilbert) - bird: {bird}')\n    plt.show()\n        \n    plt.figure(figsize=(15,5))        \n    plt.imshow(sgs[0], interpolation='nearest', aspect='auto')\n    plt.title(f'Spectrogram (without Hilbert) - bird: {bird}')\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-03-04T18:43:29.262022Z","iopub.execute_input":"2022-03-04T18:43:29.262524Z","iopub.status.idle":"2022-03-04T18:45:03.453596Z","shell.execute_reply.started":"2022-03-04T18:43:29.262488Z","shell.execute_reply":"2022-03-04T18:45:03.452634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}