{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"!pip uninstall fastai torch torchaudio fastcore torchvision -y ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install ../input/packages/packages/packages/colorednoise-1.1.1/colorednoise-1.1.1 --find-links ../input/packages/packages --no-index --use-feature=2020-resolver","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install ../input/packages/fastaudio-0.0.post0.dev143gc7a2b85.dirty-py2.py3-none-any.whl --find-links ../input/packages/packages/packages --no-index --verbose --upgrade --use-feature=2020-resolver","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import fastaudio","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\n\nimport pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport matplotlib.image as mpimg\nfrom matplotlib.offsetbox import AnnotationBbox, OffsetImage\n\n# Map 1 library\nimport plotly.express as px\n\n# Map 2 libraries\nimport descartes\nimport geopandas as gpd\nfrom shapely.geometry import Point, Polygon\n\n# Librosa Libraries\nimport librosa\nimport librosa.display\nimport IPython.display as ipd\n\nimport sklearn\n\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import soundfile as sf","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### resample all audio files to 32 khz"},{"metadata":{"trusted":true},"cell_type":"code","source":"#import ffmpy","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#new_path = Path(\"data/train_audio_resample\")\n#old_path = Path(\"data/train_audio\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#new_path.mkdir()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#for subfolder in old_path.ls():\n#    Path(str(subfolder).replace(\"/train_audio/\", \"/train_audio_resample/\")).mkdir()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#audio_files = get_files(old_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#from fastprogress import progress_bar","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#for file in progress_bar(audio_files):\n#    new_file = Path(str(file).replace(\"/train_audio/\", \"/train_audio_resample/\").replace(\".mp3\", \".wav\"))\n#    new_file.parent.mkdir(exist_ok=True)\n#    ff = ffmpy.FFmpeg(inputs={str(file):None}, outputs={str(new_file): \"-ar 32000 -ac 1\"})\n#    ff.run()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#resampled_audio_files = get_files(new_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#len(resampled_audio_files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#len(audio_files)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Import data\ntrain_csv = pd.read_csv(\"../input/birdsong-recognition/train.csv\")\ntest_csv = pd.read_csv(\"../input/birdsong-recognition/test.csv\")\n\n# Create some time features\ntrain_csv['year'] = train_csv['date'].apply(lambda x: x.split('-')[0])\ntrain_csv['month'] = train_csv['date'].apply(lambda x: x.split('-')[1])\ntrain_csv['day_of_month'] = train_csv['date'].apply(lambda x: x.split('-')[2])\n\nprint(\"There are {:,} unique bird species in the dataset.\".format(len(train_csv['species'].unique())))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_csv[\"file_path\"] = train_csv[[\"ebird_code\", \"filename\"]].agg(\"/\".join, axis=1)\ntrain_csv[\"file_path\"] = train_csv[\"file_path\"]#.apply(lambda x: x.split(\".\")[0] + \".wav\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from fastai.vision.all import *\nfrom fastaudio.core.all import *\nfrom fastaudio.augment.all import *","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cfg = AudioConfig.BasicMelSpectrogram(n_fft=512)\na2s = AudioToSpec.from_cfg(cfg)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path = Path(\"../input/birdsong-recognition\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"auds = DataBlock(blocks=(partial(AudioBlock, crop_signal_to=5000), MultiCategoryBlock),  \n                 get_x=ColReader(\"file_path\", pref=path/\"train_audio\"), \n                 batch_tfms = [a2s],\n                 get_y=lambda x: [ColReader(\"ebird_code\")(x)])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dbunch = auds.dataloaders(train_csv, bs=64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x,y = dbunch.one_batch()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dbunch.show_batch(figsize=(10, 5))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = cnn_learner(dbunch, \n            xresnet50, \n            config=cnn_config(n_in=1), #<- Only audio specific modification here\n            pretrained=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#learn.lr_find()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from fastai.callback.training import ShortEpochCallback","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.fit_one_cycle(1, slice(1e-2), cbs=[ShortEpochCallback()])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#learn.save(\"xresnet18-10epoch\") ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# inference code"},{"metadata":{},"cell_type":"markdown","source":"## split files"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_csv = pd.read_csv(\"../input/birdcall-check/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_csv.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"out_dir = Path(\"test_audio_splitted\")\nout_dir.mkdir()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"row_ids_splitted = []\nfilenames_splitted = []\n\nfor audio_id in progress_bar(list(test_csv[\"audio_id\"].unique())):\n\n    audio, orig_sr = librosa.load(f\"../input/birdcall-check/test_audio/{audio_id}.mp3\")\n    sr = 32_000\n    audio = librosa.resample(audio, orig_sr, sr)\n    duration = len(audio) / sr\n\n    segment_df = test_csv[test_csv[\"audio_id\"] == audio_id]\n    site = segment_df[\"site\"].iloc[0]\n    \n    \n    if (site == \"site_1\") or (site == \"site_2\"):\n        for row_id, end_second in zip(segment_df[\"row_id\"], segment_df[\"seconds\"]):\n            end_idx = math.floor(end_second * sr)\n            start_idx = math.floor(end_idx - (5 * sr))\n            audio_slice = audio[start_idx:end_idx]\n            filename = f\"{row_id}.wav\"\n            sf.write(out_dir/f\"{filename}\", audio_slice, sr)\n            row_ids_splitted.append(row_id)\n            filenames_splitted.append(filename)\n\n    if site == \"site_3\":\n        row_id = segment_df[\"row_id\"].iloc[0]\n        end_second = 5\n        while end_second < duration:\n            end_idx = math.floor(end_second * sr)\n            start_idx = math.floor(end_idx - (5 * sr))\n            audio_slice = audio[start_idx:end_idx]\n            filename = f\"{row_id}_{end_second}.wav\"\n            sf.write(out_dir/f\"{filename}\", audio_slice, sr)\n            row_ids_splitted.append(row_id)\n            filenames_splitted.append(filename)\n            end_second += 5\n\ntest_df_splitted = pd.DataFrame(data = {\"row_id\": row_ids_splitted, \"filename\": filenames_splitted})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df_splitted","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_datablock = DataBlock(blocks=(partial(AudioBlock, crop_signal_to=5000), MultiCategoryBlock),  \n                     get_x=ColReader(\"filename\", pref=out_dir), \n                     batch_tfms = [a2s],\n                     get_y=lambda x: [ColReader(\"row_id\")(x)])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"fake_dls = test_datablock.dataloaders(test_df_splitted)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dl = fake_dls.test_dl(test_df_splitted)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sd = torch.load(\"../input/birdstrainedmodels/xresnet50-unfreeze-5.pth\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.model.load_state_dict(sd[\"model\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds = learn.get_preds(dl = test_dl, )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(test_df_splitted)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x= next(iter(test_dl))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"pred = learn.model(x[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"F.sigmoid(pred).max()","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}