{"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":"!pip install \"/kaggle/input/torchlibrosa/torchlibrosa-0.0.5-py3-none-any.whl\"\n!pip install /kaggle/input/pip-intel-extension-for-pytorch/intel_extension_for_pytorch-1.13.100-cp37-cp37m-manylinux2014_x86_64.whl","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:38:11.741651Z","iopub.execute_input":"2023-05-21T03:38:11.742145Z","iopub.status.idle":"2023-05-21T03:39:24.531463Z","shell.execute_reply.started":"2023-05-21T03:38:11.742089Z","shell.execute_reply":"2023-05-21T03:39:24.530112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import os\n# os.environ['LD_PRELOAD'] = \"/opt/conda/pkgs/llvm-openmp-15.0.7-h0cdce71_0/lib/libiomp5.so\"\nimport intel_extension_for_pytorch as ipex","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:24.534124Z","iopub.execute_input":"2023-05-21T03:39:24.534516Z","iopub.status.idle":"2023-05-21T03:39:29.585073Z","shell.execute_reply.started":"2023-05-21T03:39:24.534479Z","shell.execute_reply":"2023-05-21T03:39:29.583312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os,sys,re,glob,random\nimport pandas as pd\nimport librosa as lb\nimport IPython.display as ipd\nimport soundfile as sf\nimport numpy as np\nimport cv2\nimport ast, joblib\nfrom pathlib import Path\nimport torchaudio\nimport torch.nn.utils.prune as prune\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport librosa.display\nfrom sklearn import preprocessing\n\n#Deep learning from pytorch\nimport torch\nimport torchvision\nfrom torch.utils.data import DataLoader, Dataset\nimport torch.optim as optim\nfrom torchvision import transforms\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom albumentations.core.transforms_interface import ImageOnlyTransform\nfrom tqdm import tqdm\nfrom torch.nn.parameter import Parameter\nimport copy, codecs\nimport sklearn.metrics\n\n#timmのdirpathを設定\ntimm_path = \"/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master\"\n\nimport sys\nsys.path.append(timm_path)\nimport timm\n\nimport concurrent.futures\n\nimport warnings\nwarnings.simplefilter('ignore')\n\n\nfrom sklearn.model_selection import KFold, StratifiedKFold\nRANDOM_STATE = 35\n\ndef set_seed(seed: int = 42):\n    random.seed(seed)\n    np.random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)  # type: ignore\n    torch.backends.cudnn.deterministic = True  # type: ignore\n    torch.backends.cudnn.benchmark = True  # type: ignore\n\nset_seed(RANDOM_STATE)","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:29.588595Z","iopub.execute_input":"2023-05-21T03:39:29.590149Z","iopub.status.idle":"2023-05-21T03:39:33.822599Z","shell.execute_reply.started":"2023-05-21T03:39:29.590083Z","shell.execute_reply":"2023-05-21T03:39:33.821123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:33.825810Z","iopub.execute_input":"2023-05-21T03:39:33.826871Z","iopub.status.idle":"2023-05-21T03:39:33.833723Z","shell.execute_reply.started":"2023-05-21T03:39:33.826824Z","shell.execute_reply":"2023-05-21T03:39:33.832716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"/kaggle/input/birdclef-2023/sample_submission.csv\")\nunique_key = list(submission.columns[1:])\nlabel2id = {label: label_id for label_id, label in enumerate(sorted(unique_key))}\nid2label = {val: key for key,val in label2id.items()}","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:33.835408Z","iopub.execute_input":"2023-05-21T03:39:33.835791Z","iopub.status.idle":"2023-05-21T03:39:34.279349Z","shell.execute_reply.started":"2023-05-21T03:39:33.835752Z","shell.execute_reply":"2023-05-21T03:39:34.278192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"commit_name = \"exp\"\nbranch = \"mainaddpp64att0517\"\nmodel_suffix = \"model_all_35_last\"\n\nclass CFG:\n    #クラス数\n    CLASS_NUM = len(unique_key)\n    #model name\n    model_name = 'eca_nfnet_l0'\n\n    #重みを保存するディレクトリ\n    #weight_path = f\"/kaggle/input/{branch}/{commit_name}/{model_suffix}.bin\"\n    weight_path = \"/kaggle/input/4a57randseed/7bdb2fe282e76e6f74352411350555f2725d73df/model_all_3711_last.bin\"\n    \n    #切り取る時間(validationが5秒なので5秒)\n    period = 5\n    \n    #切り取るサンプリング周波数 (最大周波数×2を目安として取る場合が多い。)\n    sr = 32000\n    \n    #メル周波数\n    n_mel = 128\n    \n    #最小周波数\n    fmin = 50\n    \n    #最大周波数\n    fmax = 14000\n    \n    power = 2\n    \n    top_db = None\n    \n    n_fft = 1024\n    \n    hop_len = 320","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:34.281044Z","iopub.execute_input":"2023-05-21T03:39:34.281655Z","iopub.status.idle":"2023-05-21T03:39:34.288635Z","shell.execute_reply.started":"2023-05-21T03:39:34.281616Z","shell.execute_reply":"2023-05-21T03:39:34.287714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# secondaryはラベル付けが雑になっている可能性大 → validationから抜くべき？\n# df = pd.read_csv(\"/kaggle/input/birdclef-2023/train_metadata.csv\")\n# df.loc[:,\"label_id\"] = df.loc[:,\"primary_label\"].map(label2id)\n# rrdf =  df[\"primary_label\"].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:39:34.290272Z","iopub.execute_input":"2023-05-21T03:39:34.290641Z","iopub.status.idle":"2023-05-21T03:39:34.302404Z","shell.execute_reply.started":"2023-05-21T03:39:34.290602Z","shell.execute_reply":"2023-05-21T03:39:34.301324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class WaveformDataset:\n    def __init__(self,\n                 cfg\n                 ):        \n        #make Melspectrum\n        self.cfg = cfg\n        self.sr = cfg.sr\n        self.period = cfg.period\n        \n        #wav to image helper\n        self.mel = torchaudio.transforms.MelSpectrogram(\n            n_mels = cfg.n_mel, \n            sample_rate= cfg.sr, \n            f_min = cfg.fmin, \n            f_max = cfg.fmax, \n            n_fft = cfg.n_fft, \n            hop_length=cfg.hop_len,\n            norm = None,\n            power = cfg.power,\n            mel_scale = 'htk')\n        \n        self.ptodb = torchaudio.transforms.AmplitudeToDB(top_db=cfg.top_db)\n    \n    def make_melspec(self, wav):\n        melimg= self.mel(wav)\n        dbimg = self.ptodb(melimg)\n        img = (dbimg.to(torch.float32) + 80)/80\n        return img\n    \n    def mono_to_color(self, X, eps=1e-6, mean=None, std=None):\n        mean = mean or X.mean()\n        std = std or X.std()\n        X = (X - mean) / (std + eps)\n\n        _min, _max = X.min(), X.max()\n\n        if (_max - _min) > eps:\n            V = np.clip(X, _min, _max)\n            V = 255 * (V - _min) / (_max - _min)\n            V = V.astype(np.uint8)\n        else:\n            V = np.zeros_like(X, dtype=np.uint8)\n\n        return V\n\n    def crop_or_pad(self, y, length, is_train=False, start=None):\n        if len(y) < length:\n            y = np.concatenate([y, np.zeros(length - len(y))])\n\n            n_repeats = length // len(y)\n            epsilon = length % len(y)\n\n            y = np.concatenate([y]*n_repeats + [y[:epsilon]])\n\n        elif len(y) > length:\n            if not is_train:\n                start = start or 0\n            else:\n                start = start or np.random.randint(len(y) - length)\n\n            y = y[start:start + length]\n\n        return y\n\n    def __call__(self, path):\n        #データ読み込み\n        data, sr = librosa.load(path, sr=self.sr)\n\n        #test datasetの最大長\n        max_sec = len(data)//sr\n\n        #データを5秒間隔でかつ7秒幅を取って区切る\n        datas = [data[int(i * sr):int(min(max_sec, i + self.period) * sr)] for i in range(0, max_sec, self.period)]\n\n        if len(datas[0]) < sr*self.period:\n            datas[0] = self.crop_or_pad(datas[0] , length=sr*self.period)\n        if len(datas[-1]) < sr*self.period:\n            datas[-1] = self.crop_or_pad(datas[-1] , length=sr*self.period)\n            \n        audio = torch.tensor(np.stack(datas),dtype=torch.float32)\n\n        #データをメル周波数によって画像化\n        images = self.make_melspec(audio)\n\n        #保存\n        filename = path.split(\"/\")[-1]\n        path = f\"/kaggle/audio_images/{filename}.pt\"\n        torch.save(images, path)\n        \ndef get_audios_as_images(paths):\n    pool = joblib.Parallel(4)\n    \n    converter = WaveformDataset(\n        cfg= CFG\n    )\n    #converter(paths[0])\n    mapper = joblib.delayed(converter)\n    tasks = [mapper(path) for path in tqdm(paths)]\n    pool(tqdm(tasks))","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:43:03.180385Z","iopub.execute_input":"2023-05-21T03:43:03.180917Z","iopub.status.idle":"2023-05-21T03:43:03.224365Z","shell.execute_reply.started":"2023-05-21T03:43:03.180856Z","shell.execute_reply":"2023-05-21T03:43:03.222601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir /kaggle/audio_images\n\npaths = glob.glob(\"/kaggle/input/birdclef-2023/test_soundscapes/*.ogg\")\n#paths = glob.glob(\"/kaggle/input/birdclef-2023-test/test_soundscapes/soundscape_*.ogg\")\nget_audios_as_images(paths)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pdf = pd.DataFrame(glob.glob(\"/kaggle/audio_images/*\"),columns=[\"path\"])\npdf[\"row_id\"] = pdf.path.apply(lambda x: x.split(\"/\")[-1].replace(\".ogg.pt\",\"\"))\n#pdf[\"row_id\"] = pdf[\"row_id\"] + \"_\" + pdf.index.astype(str)\npdf","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:36.657956Z","iopub.execute_input":"2023-05-21T03:33:36.659520Z","iopub.status.idle":"2023-05-21T03:33:36.694133Z","shell.execute_reply.started":"2023-05-21T03:33:36.659461Z","shell.execute_reply":"2023-05-21T03:33:36.692324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class GeM(nn.Module):\n    def __init__(self, p=3, eps=1e-6):\n        super(GeM, self).__init__()\n        self.p = Parameter(torch.ones(1) * p)\n        self.eps = eps\n\n    def forward(self, x):\n        ret = self.gem(x, p=self.p, eps=self.eps)\n        return ret\n    \n    def gem(self, x, p=3, eps=1e-6):\n        return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(1.0 / p)\n\n    def __repr__(self):\n        return (\n            self.__class__.__name__\n            + \"(\"\n            + \"p=\"\n            + \"{:.4f}\".format(self.p.data.tolist()[0])\n            + \", \"\n            + \"eps=\"\n            + str(self.eps)\n            + \")\"\n        )\n\nfrom timm.models.nfnet import ScaledStdConv2d\nclass Model(nn.Module):\n    def __init__(self,CFG,pretrained=True,path=None,training=True):\n        super(Model, self).__init__()\n        self.model = timm.create_model(\n            CFG.model_name,\n            pretrained=pretrained, \n            drop_rate=0, \n            drop_path_rate=0, \n            in_chans=1,\n            global_pool=\"\",\n            num_classes=0\n        )\n        in_features = self.model.num_features\n        self.fc = nn.Linear(in_features, CFG.CLASS_NUM)\n        self.gem = GeM()\n        \n    def forward(self, x, y=None, w=None):\n        x = self.model(x)\n        x = self.gem(x)[:,:,0,0]\n        x = self.fc(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:37.361113Z","iopub.execute_input":"2023-05-21T03:33:37.361620Z","iopub.status.idle":"2023-05-21T03:33:37.382912Z","shell.execute_reply.started":"2023-05-21T03:33:37.361583Z","shell.execute_reply":"2023-05-21T03:33:37.381571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class attModel(nn.Module):\n    def __init__(self,CFG,pretrained=True,path=None,training=True):\n        super(attModel, self).__init__()\n        self.model = timm.create_model(\n            CFG.model_name,\n            pretrained=pretrained, \n            drop_rate=0, \n            drop_path_rate=0, \n            in_chans=1,\n            global_pool=\"\",\n            num_classes=0\n        )\n        in_features = self.model.num_features\n        self.fc = nn.Linear(in_features, CFG.CLASS_NUM)\n        self.attention = nn.Sequential(nn.Linear(in_features, 512), nn.ReLU(), nn.Linear(512, 1))\n        \n    def forward(self, x, y=None, w=None):\n        x = self.model(x)\n        x = x.mean(dim=2)\n        x = x.permute(0, 2, 1)\n        attn_weights = torch.softmax(self.attention(x), dim=1)\n        x = (x * attn_weights).sum(dim=1)\n        x = self.fc(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:37.959546Z","iopub.execute_input":"2023-05-21T03:33:37.960653Z","iopub.status.idle":"2023-05-21T03:33:37.974635Z","shell.execute_reply.started":"2023-05-21T03:33:37.960597Z","shell.execute_reply":"2023-05-21T03:33:37.973430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Trainer:\n    def __init__(self, model, pdf, splitsize):\n        \"\"\"\n        Constructor for Trainer class\n        \"\"\"\n        self.model = model\n        self.pdf = pdf\n        self.pred_df = {}\n        self.splitsize = splitsize\n    \n    @torch.no_grad()\n    def test_one_batch(self, x):\n        p = self.model(x).sigmoid().detach()\n        return p\n        \n    @torch.no_grad()\n    def test_one_process(self, row):\n        #row = row[1]\n        xtest = torch.load(row.path)[:,None,:,:].to(memory_format=torch.channels_last)\n        b, c, f, t = xtest.shape\n        xb = xtest.reshape(b//self.splitsize, self.splitsize, c, f, t)\n        xb = [x.to(memory_format=torch.channels_last) for x in xb]\n        with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:\n            preds = list(executor.map(self.test_one_batch, xb))\n        preds = torch.cat(preds).numpy()\n        for idx, pred in enumerate(preds):\n            self.pred_df[f\"{row.row_id}_{(idx+1)*5}\"] = pred\n            \n    def test_one_cycle(self):\n        pbar = tqdm(self.pdf.iterrows(),total=len(pdf))\n        for idx, row in pbar:\n            self.test_one_process(row)\n        \n        return pd.DataFrame(self.pred_df).T.rename(columns=id2label).reset_index().rename(columns={\"index\":\"row_id\"})","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:38.133447Z","iopub.execute_input":"2023-05-21T03:33:38.134795Z","iopub.status.idle":"2023-05-21T03:33:38.152714Z","shell.execute_reply.started":"2023-05-21T03:33:38.134741Z","shell.execute_reply":"2023-05-21T03:33:38.150791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def run(pdf):\n    splitsize = 8\n    device = \"cpu\"\n    model = attModel(CFG=CFG,path = None, pretrained=False)\n    model.load_state_dict(torch.load(CFG.weight_path, map_location=torch.device('cpu')),strict=False)\n\n    model.eval()\n    model_opt = ipex.optimize(\n        model,\n        sample_input=torch.randn(splitsize,1,CFG.n_mel,501),\n        auto_kernel_selection=True\n    ).to(memory_format=torch.channels_last)\n        \n    trainer = Trainer(\n        model=model_opt,\n        pdf = pdf,\n        splitsize = splitsize\n    )\n    submission = trainer.test_one_cycle()\n    return submission","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:38.451917Z","iopub.execute_input":"2023-05-21T03:33:38.452418Z","iopub.status.idle":"2023-05-21T03:33:38.463300Z","shell.execute_reply.started":"2023-05-21T03:33:38.452378Z","shell.execute_reply":"2023-05-21T03:33:38.461269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nsubmission = run(pdf)","metadata":{"execution":{"iopub.status.busy":"2023-05-21T03:33:38.820851Z","iopub.execute_input":"2023-05-21T03:33:38.821330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CFG.weight_path = f\"/kaggle/input/wavemodel-weight-src-0325/aa9ea78019dd2c83f3274b55dc5f01f3da253378/model_all_last.bin\"\n# submission2 = run(pdf)\n\n# pred_cols = submission.columns[1:]\n# submission = submission1.copy()\n# for pred_col in pred_cols:\n#     submission[pred_col] = 0.5*submission1[pred_col] + 0.5*submission2[pred_col]","metadata":{"execution":{"iopub.status.busy":"2023-05-21T02:06:43.480002Z","iopub.execute_input":"2023-05-21T02:06:43.480738Z","iopub.status.idle":"2023-05-21T02:06:43.486904Z","shell.execute_reply.started":"2023-05-21T02:06:43.480680Z","shell.execute_reply":"2023-05-21T02:06:43.485163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission","metadata":{"execution":{"iopub.status.busy":"2023-05-21T02:08:10.144936Z","iopub.execute_input":"2023-05-21T02:08:10.145592Z","iopub.status.idle":"2023-05-21T02:08:10.201694Z","shell.execute_reply.started":"2023-05-21T02:08:10.145530Z","shell.execute_reply":"2023-05-21T02:08:10.200308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\",index=False)","metadata":{"execution":{"iopub.status.busy":"2023-05-21T02:06:43.535859Z","iopub.execute_input":"2023-05-21T02:06:43.536407Z","iopub.status.idle":"2023-05-21T02:06:43.554935Z","shell.execute_reply.started":"2023-05-21T02:06:43.536361Z","shell.execute_reply":"2023-05-21T02:06:43.553445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#submission[list(rrdf[rrdf > 10].index)].describe()","metadata":{"execution":{"iopub.status.busy":"2023-05-21T02:06:43.556650Z","iopub.execute_input":"2023-05-21T02:06:43.557068Z","iopub.status.idle":"2023-05-21T02:06:43.563946Z","shell.execute_reply.started":"2023-05-21T02:06:43.557025Z","shell.execute_reply":"2023-05-21T02:06:43.562616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}