{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91844,"databundleVersionId":11361821,"sourceType":"competition"},{"sourceId":11423856,"sourceType":"datasetVersion","datasetId":7154344},{"sourceId":365383,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":284519,"modelId":305360}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"papermill":{"default_parameters":{},"duration":946.23388,"end_time":"2025-04-15T15:01:44.725480","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-04-15T14:45:58.491600","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### **Introduction**\nThis is a brief guideline notebook for how to use **OPENVINO** structure to **accelerate** your deep learning model inferencing.\nHere I take my **EfficientNet B4NS** model used in **BirdCLEF2025** as an example.","metadata":{}},{"cell_type":"code","source":"%%capture\n!pip install -U openvino-dev\n!pip install -U openvino-telemetry  --no-index --find-links /kaggle/input/openvino\n!pip install -U openvino  --no-index --find-links /kaggle/input/openvino","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-07-31T04:40:36.146459Z","iopub.execute_input":"2025-07-31T04:40:36.146907Z","iopub.status.idle":"2025-07-31T04:40:51.431065Z","shell.execute_reply.started":"2025-07-31T04:40:36.146871Z","shell.execute_reply":"2025-07-31T04:40:51.429819Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip list | grep openvino","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:51.432432Z","iopub.execute_input":"2025-07-31T04:40:51.432768Z","iopub.status.idle":"2025-07-31T04:40:53.534001Z","shell.execute_reply.started":"2025-07-31T04:40:51.432717Z","shell.execute_reply":"2025-07-31T04:40:53.532839Z"},"papermill":{"duration":2.206297,"end_time":"2025-04-15T14:46:22.839319","exception":false,"start_time":"2025-04-15T14:46:20.633022","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport timm\nimport pandas as pd","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.535522Z","iopub.execute_input":"2025-07-31T04:40:53.535926Z","iopub.status.idle":"2025-07-31T04:40:53.540947Z","shell.execute_reply.started":"2025-07-31T04:40:53.535880Z","shell.execute_reply":"2025-07-31T04:40:53.540142Z"},"papermill":{"duration":46.744743,"end_time":"2025-04-15T14:47:09.587488","exception":false,"start_time":"2025-04-15T14:46:22.842745","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Here we use the model from BirdCLEF2025 for example\n\n# Define the model architecture\nclass BirdCLEFModel(nn.Module):\n    def __init__(self, cfg, num_classes):\n        super().__init__()\n        self.cfg = cfg\n        self.backbone = timm.create_model(cfg['model_name'], pretrained=False, in_chans=cfg['in_channels'],drop_rate=0.2,drop_path_rate=0.2)\n\n        if 'efficientnet' in cfg['model_name']:\n            backbone_out = self.backbone.classifier.in_features\n            self.backbone.classifier = nn.Identity()\n        else:\n            backbone_out = self.backbone.get_classifier().in_features\n            self.backbone.reset_classifier(0, '')\n\n        self.pooling = nn.AdaptiveAvgPool2d(1)\n        self.classifier = nn.Linear(backbone_out, cfg['num_classes'])\n\n        self.mixup_enabled = hasattr(cfg, 'mixup_alpha') and cfg.mixup_alpha > 0\n        if self.mixup_enabled:\n            self.mixup_alpha = cfg.mixup_alpha\n\n    def forward(self, x, targets=None):\n    \n        if self.training and self.mixup_enabled and targets is not None:\n            mixed_x, targets_a, targets_b, lam = self.mixup_data(x, targets)\n            x = mixed_x\n        else:\n            targets_a, targets_b, lam = None, None, None\n        \n        features = self.backbone(x)\n        \n        if isinstance(features, dict):\n            features = features['features']\n            \n        if len(features.shape) == 4:\n            features = self.pooling(features)\n            features = features.view(features.size(0), -1)\n        \n        logits = self.classifier(features)\n        \n        if self.training and self.mixup_enabled and targets is not None:\n            loss = self.mixup_criterion(F.binary_cross_entropy_with_logits, \n                                       logits, targets_a, targets_b, lam)\n            return logits, loss\n            \n        return logits\n","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.543332Z","iopub.execute_input":"2025-07-31T04:40:53.543843Z","iopub.status.idle":"2025-07-31T04:40:53.565895Z","shell.execute_reply.started":"2025-07-31T04:40:53.543818Z","shell.execute_reply":"2025-07-31T04:40:53.564730Z"},"papermill":{"duration":0.015491,"end_time":"2025-04-15T14:47:43.756178","exception":false,"start_time":"2025-04-15T14:47:43.740687","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"taxonomy_csv = '/kaggle/input/birdclef-2025/taxonomy.csv'\ntaxonomy_df = pd.read_csv(taxonomy_csv)\nnum_classes = len(taxonomy_df)\nprint(num_classes)","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.567006Z","iopub.execute_input":"2025-07-31T04:40:53.567330Z","iopub.status.idle":"2025-07-31T04:40:53.597653Z","shell.execute_reply.started":"2025-07-31T04:40:53.567296Z","shell.execute_reply":"2025-07-31T04:40:53.596200Z"},"papermill":{"duration":0.026187,"end_time":"2025-04-15T14:47:43.786258","exception":false,"start_time":"2025-04-15T14:47:43.760071","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cfg = {\n    'model_name': 'tf_efficientnet_b4_ns',\n    'in_channels': 1,\n    'num_classes': 206  \n}","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.598913Z","iopub.execute_input":"2025-07-31T04:40:53.599288Z","iopub.status.idle":"2025-07-31T04:40:53.604501Z","shell.execute_reply.started":"2025-07-31T04:40:53.599255Z","shell.execute_reply":"2025-07-31T04:40:53.603436Z"},"papermill":{"duration":0.010101,"end_time":"2025-04-15T14:47:43.800568","exception":false,"start_time":"2025-04-15T14:47:43.790467","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CFG:\n    \"\"\"\n    Configuration class holding all paths and parameters required for the inference pipeline.\n    \"\"\"\n    test_soundscapes = '/kaggle/input/birdclef-2025/train_soundscapes'\n    submission_csv = '/kaggle/input/birdclef-2025/sample_submission.csv'\n    taxonomy_csv = '/kaggle/input/birdclef-2025/taxonomy.csv'\n    model_path = '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2'\n    \n    # Audio parameters\n    FS = 32000  \n    WINDOW_SIZE = 5  \n    \n    # Mel spectrogram parameters\n    N_FFT = 1024\n    HOP_LENGTH = 512#64\n    N_MELS = 148\n    FMIN = 50\n    FMAX = 14000\n    TARGET_SHAPE = (380, 380)\n    \n    model_name = 'tf_efficientnet_b4_ns'\n    in_channels = 1\n    device = \"cpu\" \n    \n    # Inference parameters\n    batch_size = 16\n    use_tta = False  \n    tta_count = 3   \n    threshold = 0.5\n    \n    use_specific_folds = False  # If False, use all found models\n    folds = [0, 1]  # Used only if use_specific_folds is True\n    \n    debug = False\n    debug_count = 3","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.605816Z","iopub.execute_input":"2025-07-31T04:40:53.606091Z","iopub.status.idle":"2025-07-31T04:40:53.629889Z","shell.execute_reply.started":"2025-07-31T04:40:53.606068Z","shell.execute_reply":"2025-07-31T04:40:53.628513Z"},"papermill":{"duration":0.011554,"end_time":"2025-04-15T14:47:43.816089","exception":false,"start_time":"2025-04-15T14:47:43.804535","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fold_paths = [\n    '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2/model_fold0.pth',\n    '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2/model_fold1.pth',\n    '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2/model_fold2.pth',\n    '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2/model_fold3.pth',\n    '/kaggle/input/efficient-net-b4-ns-normal/pytorch/default/2/model_fold4.pth',\n]\n\nfor i, path in enumerate(fold_paths):\n    model = BirdCLEFModel(cfg, num_classes=cfg['num_classes'])\n    checkpoint = torch.load(path, map_location='cpu',weights_only=False)\n    model.load_state_dict(checkpoint['model_state_dict'])\n    model.eval()\n    \n    dummy_input = torch.randn(1, 1, 380, 380)\n    onnx_path = f'effnet_b4_fold{i}.onnx'\n    \n    torch.onnx.export(model, dummy_input, onnx_path,\n                      input_names=['input'], output_names=['output'],\n                      opset_version=11, do_constant_folding=True)\n    \n    print(f\"[✓] Exported ONNX for fold {i}: {onnx_path}\")","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:40:53.631007Z","iopub.execute_input":"2025-07-31T04:40:53.631301Z","iopub.status.idle":"2025-07-31T04:41:19.090797Z","shell.execute_reply.started":"2025-07-31T04:40:53.631274Z","shell.execute_reply":"2025-07-31T04:41:19.089881Z"},"papermill":{"duration":27.513717,"end_time":"2025-04-15T14:48:11.333690","exception":false,"start_time":"2025-04-15T14:47:43.819973","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!python -m openvino.tools.mo --input_model effnet_b4_fold0.onnx --compress_to_fp16=False  --output_dir openvino_ir/fold0\n!python -m openvino.tools.mo --input_model effnet_b4_fold1.onnx --compress_to_fp16=False  --output_dir openvino_ir/fold1\n!python -m openvino.tools.mo --input_model effnet_b4_fold2.onnx --compress_to_fp16=False  --output_dir openvino_ir/fold2\n!python -m openvino.tools.mo --input_model effnet_b4_fold3.onnx --compress_to_fp16=False  --output_dir openvino_ir/fold3\n!python -m openvino.tools.mo --input_model effnet_b4_fold4.onnx --compress_to_fp16=False  --output_dir openvino_ir/fold4","metadata":{"execution":{"iopub.status.busy":"2025-07-31T04:41:19.093398Z","iopub.execute_input":"2025-07-31T04:41:19.093744Z","iopub.status.idle":"2025-07-31T04:41:40.833010Z","shell.execute_reply.started":"2025-07-31T04:41:19.093709Z","shell.execute_reply":"2025-07-31T04:41:40.831968Z"},"papermill":{"duration":811.053619,"end_time":"2025-04-15T15:01:42.391936","exception":false,"start_time":"2025-04-15T14:48:11.338317","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null}]}