{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport sys\nimport pathlib \nimport time\nimport warnings\nimport multiprocessing\nfrom timeit import default_timer as timer\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport cv2\nimport librosa\n\nimport tensorflow.keras as keras","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"start_timer = timer()\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_SIZE = 224\nSR  = 12000 #sampling rate\nLEN = 5 # 5 sec window\nprob_thr = 0.045\nMELSPECTRUM = {\n    'n_mels': 128,\n    'fmin'  :  20,\n    'fmax'  : 16000,\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_tar = \"../input/birdsong/best_model.tar\"\nmodel_tar = \"../input/birdsong/mel_reg_0.68512_best_model.ckp/\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!tar -xvf $model_tar","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.models.load_model(model_tar)\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('\\tcpu_count = %d' % multiprocessing.cpu_count())\nprint('\\tram = %d MB' % (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES') /(1024.**3)))\nprint('')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# https://www.kaggle.com/shonenkov/sample-submission-using-custom-check\n# https://www.kaggle.com/c/birdsong-recognition/discussion/159993\n\nif 0: #local\n    ADD_DIR    = os.path.dirname(__file__)\n    checkpoint = '/root/share1/kaggle/2020/birdsong/result/reference/resnet50/best_model.pth'\n    TEST_CSV   = '/root/share1/kaggle/2020/birdsong/data/other/sample_test/test.csv'\n    TEST_AUDIO_DIR = '/root/share1/kaggle/2020/birdsong/data/other/sample_test/audio'\n\nif 1:# kaggle\n   \n    ADD_DIR  = '../input/bird00'\n    TEST_AUDIO_DIR = '../input/birdsong-recognition/test_audio'\n    TEST_CSV = '../input/birdsong-recognition/test.csv'\n\n    if not os.path.exists('../input/birdsong-recognition/test_audio'):\n        print(TEST_AUDIO_DIR, \"not exist\",)\n        TEST_AUDIO_DIR = '../input/birdcall-check/test_audio'\n        TEST_CSV = '../input/birdcall-check/test.csv'\n\n#-------------------------\nsys.path.append(ADD_DIR)\nprint('sys.path.append(ADD_DIR) OK!')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"NAME_TO_LABEL = {\n    'aldfly': 0, 'ameavo': 1, 'amebit': 2, 'amecro': 3, 'amegfi': 4,\n    'amekes': 5, 'amepip': 6, 'amered': 7, 'amerob': 8, 'amewig': 9,\n    'amewoo': 10, 'amtspa': 11, 'annhum': 12, 'astfly': 13, 'baisan': 14,\n    'baleag': 15, 'balori': 16, 'banswa': 17, 'barswa': 18, 'bawwar': 19,\n    'belkin1': 20, 'belspa2': 21, 'bewwre': 22, 'bkbcuc': 23, 'bkbmag1': 24,\n    'bkbwar': 25, 'bkcchi': 26, 'bkchum': 27, 'bkhgro': 28, 'bkpwar': 29,\n    'bktspa': 30, 'blkpho': 31, 'blugrb1': 32, 'blujay': 33, 'bnhcow': 34,\n    'boboli': 35, 'bongul': 36, 'brdowl': 37, 'brebla': 38, 'brespa': 39,\n    'brncre': 40, 'brnthr': 41, 'brthum': 42, 'brwhaw': 43, 'btbwar': 44,\n    'btnwar': 45, 'btywar': 46, 'buffle': 47, 'buggna': 48, 'buhvir': 49,\n    'bulori': 50, 'bushti': 51, 'buwtea': 52, 'buwwar': 53, 'cacwre': 54,\n    'calgul': 55, 'calqua': 56, 'camwar': 57, 'cangoo': 58, 'canwar': 59,\n    'canwre': 60, 'carwre': 61, 'casfin': 62, 'caster1': 63, 'casvir': 64,\n    'cedwax': 65, 'chispa': 66, 'chiswi': 67, 'chswar': 68, 'chukar': 69,\n    'clanut': 70, 'cliswa': 71, 'comgol': 72, 'comgra': 73, 'comloo': 74,\n    'commer': 75, 'comnig': 76, 'comrav': 77, 'comred': 78, 'comter': 79,\n    'comyel': 80, 'coohaw': 81, 'coshum': 82, 'cowscj1': 83, 'daejun': 84,\n    'doccor': 85, 'dowwoo': 86, 'dusfly': 87, 'eargre': 88, 'easblu': 89,\n    'easkin': 90, 'easmea': 91, 'easpho': 92, 'eastow': 93, 'eawpew': 94,\n    'eucdov': 95, 'eursta': 96, 'evegro': 97, 'fiespa': 98, 'fiscro': 99,\n    'foxspa': 100, 'gadwal': 101, 'gcrfin': 102, 'gnttow': 103, 'gnwtea': 104,\n    'gockin': 105, 'gocspa': 106, 'goleag': 107, 'grbher3': 108, 'grcfly': 109,\n    'greegr': 110, 'greroa': 111, 'greyel': 112, 'grhowl': 113, 'grnher': 114,\n    'grtgra': 115, 'grycat': 116, 'gryfly': 117, 'haiwoo': 118, 'hamfly': 119,\n    'hergul': 120, 'herthr': 121, 'hoomer': 122, 'hoowar': 123, 'horgre': 124,\n    'horlar': 125, 'houfin': 126, 'houspa': 127, 'houwre': 128, 'indbun': 129,\n    'juntit1': 130, 'killde': 131, 'labwoo': 132, 'larspa': 133, 'lazbun': 134,\n    'leabit': 135, 'leafly': 136, 'leasan': 137, 'lecthr': 138, 'lesgol': 139,\n    'lesnig': 140, 'lesyel': 141, 'lewwoo': 142, 'linspa': 143, 'lobcur': 144,\n    'lobdow': 145, 'logshr': 146, 'lotduc': 147, 'louwat': 148, 'macwar': 149,\n    'magwar': 150, 'mallar3': 151, 'marwre': 152, 'merlin': 153, 'moublu': 154,\n    'mouchi': 155, 'moudov': 156, 'norcar': 157, 'norfli': 158, 'norhar2': 159,\n    'normoc': 160, 'norpar': 161, 'norpin': 162, 'norsho': 163, 'norwat': 164,\n    'nrwswa': 165, 'nutwoo': 166, 'olsfly': 167, 'orcwar': 168, 'osprey': 169,\n    'ovenbi1': 170, 'palwar': 171, 'pasfly': 172, 'pecsan': 173, 'perfal': 174,\n    'phaino': 175, 'pibgre': 176, 'pilwoo': 177, 'pingro': 178, 'pinjay': 179,\n    'pinsis': 180, 'pinwar': 181, 'plsvir': 182, 'prawar': 183, 'purfin': 184,\n    'pygnut': 185, 'rebmer': 186, 'rebnut': 187, 'rebsap': 188, 'rebwoo': 189,\n    'redcro': 190, 'redhea': 191, 'reevir1': 192, 'renpha': 193, 'reshaw': 194,\n    'rethaw': 195, 'rewbla': 196, 'ribgul': 197, 'rinduc': 198, 'robgro': 199,\n    'rocpig': 200, 'rocwre': 201, 'rthhum': 202, 'ruckin': 203, 'rudduc': 204,\n    'rufgro': 205, 'rufhum': 206, 'rusbla': 207, 'sagspa1': 208, 'sagthr': 209,\n    'savspa': 210, 'saypho': 211, 'scatan': 212, 'scoori': 213, 'semplo': 214,\n    'semsan': 215, 'sheowl': 216, 'shshaw': 217, 'snobun': 218, 'snogoo': 219,\n    'solsan': 220, 'sonspa': 221, 'sora': 222, 'sposan': 223, 'spotow': 224,\n    'stejay': 225, 'swahaw': 226, 'swaspa': 227, 'swathr': 228, 'treswa': 229,\n    'truswa': 230, 'tuftit': 231, 'tunswa': 232, 'veery': 233, 'vesspa': 234,\n    'vigswa': 235, 'warvir': 236, 'wesblu': 237, 'wesgre': 238, 'weskin': 239,\n    'wesmea': 240, 'wessan': 241, 'westan': 242, 'wewpew': 243, 'whbnut': 244,\n    'whcspa': 245, 'whfibi': 246, 'whtspa': 247, 'whtswi': 248, 'wilfly': 249,\n    'wilsni1': 250, 'wiltur': 251, 'winwre3': 252, 'wlswar': 253, 'wooduc': 254,\n    'wooscj2': 255, 'woothr': 256, 'y00475': 257, 'yebfly': 258, 'yebsap': 259,\n    'yehbla': 260, 'yelwar': 261, 'yerwar': 262, 'yetvir': 263\n}\nLABEL_TO_NAME = {v: k for k, v in NAME_TO_LABEL.items()}\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def make_batch(wave, second):\n    Xs = []\n    for s in second:\n        t0 = (s-5)*SR\n        t1 = s*SR\n        x = wave[t0:t1]\n        Xs.append(x)\n    X = np.expand_dims(np.stack(Xs), 2)\n    return X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def time_to_str(t, mode='min'):\n    if mode=='min':\n        t  = int(t)/60\n        hr = t//60\n        min = t%60\n        return '%2d hr %02d min'%(hr,min)\n\n    elif mode=='sec':\n        t   = int(t)\n        min = t//60\n        sec = t%60\n        return '%2d min %02d sec'%(min,sec)\n\n    else:\n        raise NotImplementedError\n\n#------------------------------\ndef melspec_norm_value(m):\n    eps = 1e-6\n    mean = m.mean()\n    std  = m.std()\n    m = (m-mean) / (std + eps)\n    min, max = m.min(), m.max()\n    if (max - min) > eps:\n        m = (m - min) / (max - min)\n    else:\n        m = np.zeros_like(m)\n    return m\n\n\ndef melspec_norm_size(m):\n    height, width = m.shape\n    m = cv2.resize(m, dsize=(int(width * IMAGE_SIZE / height), IMAGE_SIZE))\n    return m\n\ndef calc_mel_spectrum(wave_arr):\n    m = librosa.feature.melspectrogram(wave_arr, sr=SR, **MELSPECTRUM)\n    m = librosa.power_to_db(m)\n    m = m.astype(np.float32)\n    m = melspec_norm_value(m)\n    m = melspec_norm_size(m)\n    return m","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit = pd.DataFrame(columns=('row_id','birds'))\ndf_test = pd.read_csv(TEST_CSV)\n\nprobabilities = []\nfor audio_id in df_test.audio_id.unique():\n    df = df_test[df_test.audio_id == audio_id].reset_index(drop=True).sort_values('seconds')\n    wave, _ = librosa.load( TEST_AUDIO_DIR + '/%s.mp3'%audio_id, sr=SR, mono=True)\n    wave = wave.astype(np.float32)\n\n    L = len(wave)\n    site = df.site.values[0]\n    if site == 'site_3':\n        second = (np.arange(L//(SR*LEN))+1)*5\n    else:\n        second = df.seconds.values.astype(np.int32)\n\n    print(audio_id, site, time_to_str(timer() - start_timer, 'min'))\n    print('\\tlen = %0.2f, num_sec = %d '%(L/SR, len(second)), second[:5], '...',)\n    X_test = make_batch(wave, second)\n    print(\"\")\n    \n    probability = []\n    L = len(X_test)\n    batch_size = 16\n\n    for m in np.array_split(X_test, int(np.ceil(L/batch_size))):\n        #print('\\tmelspec:', m.shape, '%0.2f mb'%(m.nbytes/1024/1024))\n        m=np.apply_along_axis(calc_mel_spectrum, arr=np.squeeze(m,2), axis=1)\n        \n        #print('\\tmelspec:', m.shape, '%0.2f mb'%(m.nbytes/1024/1024))\n\n        p = model.predict(m)\n        probability.append(p)\n\n    probability = np.concatenate(probability)\n    probabilities.append(probability)\n    \n    predict = probability>=prob_thr #0.65\n    if site == 'site_3':\n        predict = predict.max(0, keepdims=True)\n        print('\\tpredict site 3:', predict.shape)\n\n    if audio_id=='41e6fe6504a34bf6846938ba78d13df1' or audio_id=='07ab324c602e4afab65ddbcc746c31b5': #debug\n        print(probability.reshape(-1)[:50], '\\n')\n\n    for b,row_id in enumerate(df.row_id.values):\n        bird = np.where(predict[b])[0]\n        if len(bird)==0:\n            bird = 'nocall'\n        else:\n            bird = list(map(lambda i: LABEL_TO_NAME[i], bird))\n            bird = ' '.join(bird)\n\n        df_submit = df_submit.append({'row_id': row_id, 'birds': bird}, ignore_index=True)\n    print('')\n    \n    #break","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#debuging\n\nhist = np.histogram(np.concatenate(probabilities).reshape(-1), bins=1240)\nhist[0][-60:], hist[1][-60:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#debuging\n\nplt.hist(np.concatenate(probabilities).reshape(-1), bins=200);\nplt.yscale(\"log\")\nplt.vlines([prob_thr],0,100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#debuging\n\nX_test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#debuging\n\nmodel.predict(m).shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit.to_csv('submission.csv', index=False)\nprint('submission.csv')\nprint(df_submit)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_submit.birds.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# test score","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# df = pd.read_csv(\"../input/birdsong-recognition/example_test_audio_metadata.csv\") # for validation\n# df = pd.read_csv(\"../input/birdsong-recognition/example_test_audio_summary.csv\") # for validation\ndf = pd.read_csv(\"../input/birdcall-check/test.csv\") # for validation","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df","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}