{"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":"import os\nimport shutil\n\nimport numpy as np\nimport pandas as pd\nimport torch\n\nfrom datasets import load_dataset\nfrom torchvision.transforms import Compose, RandomResizedCrop, GaussianBlur, RandomAdjustSharpness, RandomEqualize, ToTensor\n\nfrom transformers import TrainingArguments, Trainer\nfrom transformers import ConvNextV2ForImageClassification\nfrom transformers import AutoImageProcessor, AutoModelForImageClassification\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-25T09:03:39.693349Z","iopub.execute_input":"2023-10-25T09:03:39.693651Z","iopub.status.idle":"2023-10-25T09:03:54.209131Z","shell.execute_reply.started":"2023-10-25T09:03:39.693625Z","shell.execute_reply":"2023-10-25T09:03:54.208351Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/UBC-OCEAN/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/UBC-OCEAN/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:03:54.21059Z","iopub.execute_input":"2023-10-25T09:03:54.210871Z","iopub.status.idle":"2023-10-25T09:03:54.229683Z","shell.execute_reply.started":"2023-10-25T09:03:54.210844Z","shell.execute_reply":"2023-10-25T09:03:54.228971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"res_dir = \"../tmp/imgs\"\nfor i in train.iterrows():\n    id = i[1][\"image_id\"]\n    label = i[1][\"label\"]\n    #print(id,label)\n    os.makedirs(f\"{res_dir}/{label}\", exist_ok=True)\n    try:\n        shutil.copy(f\"/kaggle/input/UBC-OCEAN/train_thumbnails/{id}_thumbnail.png\", f\"{res_dir}/{label}/{id}.png\")\n    except Exception:\n        print(\"failed\")","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:03:54.230622Z","iopub.execute_input":"2023-10-25T09:03:54.230868Z","iopub.status.idle":"2023-10-25T09:04:45.619263Z","shell.execute_reply.started":"2023-10-25T09:03:54.230846Z","shell.execute_reply":"2023-10-25T09:04:45.618145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.makedirs(f\"{res_dir}/Other\", exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:04:45.621668Z","iopub.execute_input":"2023-10-25T09:04:45.621939Z","iopub.status.idle":"2023-10-25T09:04:45.626675Z","shell.execute_reply.started":"2023-10-25T09:04:45.621916Z","shell.execute_reply":"2023-10-25T09:04:45.625717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Load dataset\")\ndataset = load_dataset(\"imagefolder\", data_dir=\"../tmp/imgs\", split=\"train\")\ndataset = dataset.train_test_split(test_size=0.25)","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:04:45.62786Z","iopub.execute_input":"2023-10-25T09:04:45.628195Z","iopub.status.idle":"2023-10-25T09:05:17.103943Z","shell.execute_reply.started":"2023-10-25T09:04:45.628163Z","shell.execute_reply":"2023-10-25T09:05:17.102979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = dataset[\"train\"].features[\"label\"].names\nlabel2id, id2label = dict(), dict()\n\nfor i, label in enumerate(labels):\n    label2id[label] = i\n    id2label[i] = label","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:05:17.105344Z","iopub.execute_input":"2023-10-25T09:05:17.10565Z","iopub.status.idle":"2023-10-25T09:05:17.111638Z","shell.execute_reply.started":"2023-10-25T09:05:17.10562Z","shell.execute_reply":"2023-10-25T09:05:17.110664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pretrained = \"/kaggle/input/convnextv2/\"\nimage_processor = AutoImageProcessor.from_pretrained(pretrained, local_files_only=True)\nimage_processor","metadata":{"execution":{"iopub.status.busy":"2023-10-25T09:05:25.381234Z","iopub.execute_input":"2023-10-25T09:05:25.381599Z","iopub.status.idle":"2023-10-25T09:05:25.398489Z","shell.execute_reply.started":"2023-10-25T09:05:25.381566Z","shell.execute_reply":"2023-10-25T09:05:25.397521Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nSIZE = (\n    image_processor.size[\"shortest_edge\"]\n    if \"shortest_edge\" in image_processor.size\n    else (image_processor.size[\"height\"], image_processor.size[\"width\"])\n)\n\n_transforms = Compose([\n    RandomResizedCrop(size=SIZE, antialias=True),\n    RandomAdjustSharpness(sharpness_factor=2),\n    RandomEqualize(),\n    ToTensor()\n])","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:01.781238Z","iopub.execute_input":"2023-10-22T13:08:01.781663Z","iopub.status.idle":"2023-10-22T13:08:01.789358Z","shell.execute_reply.started":"2023-10-22T13:08:01.781622Z","shell.execute_reply":"2023-10-22T13:08:01.788248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transforms(examples):\n    examples[\"pixel_values\"] = [_transforms(img.convert(\"RGB\")) for img in examples[\"image\"]]\n    del examples[\"image\"]\n    return examples\n\n\ndataset = dataset.with_transform(transforms)","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:01.790975Z","iopub.execute_input":"2023-10-22T13:08:01.791353Z","iopub.status.idle":"2023-10-22T13:08:01.817325Z","shell.execute_reply.started":"2023-10-22T13:08:01.791323Z","shell.execute_reply":"2023-10-22T13:08:01.816011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Creating model\")\nmodel = ConvNextV2ForImageClassification.from_pretrained(\n    pretrained,\n    num_labels=5,\n    id2label=id2label,\n    label2id=label2id,\n    ignore_mismatched_sizes=True,\n)\n\nmodel.to(\"cuda\")\n\n","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:01.820872Z","iopub.execute_input":"2023-10-22T13:08:01.82129Z","iopub.status.idle":"2023-10-22T13:08:06.111388Z","shell.execute_reply.started":"2023-10-22T13:08:01.821256Z","shell.execute_reply":"2023-10-22T13:08:06.109449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import balanced_accuracy_score\n\n\ndef compute_metrics(pred):\n    labels = pred.label_ids\n    preds = pred.predictions.argmax(-1)\n    return {\"balanced_accuracy\": balanced_accuracy_score(labels, preds)}\n\ndef collate_fn(examples):\n    pixel_values = torch.stack([example[\"pixel_values\"] for example in examples])\n    labels = torch.tensor([example[\"label\"] for example in examples])\n    return {\"pixel_values\": pixel_values, \"labels\": labels}","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:06.11226Z","iopub.status.idle":"2023-10-22T13:08:06.11273Z","shell.execute_reply.started":"2023-10-22T13:08:06.112505Z","shell.execute_reply":"2023-10-22T13:08:06.112527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"train\")\nSTRATEGY = \"epoch\"\nOUTPUT_DIR = \"../tmp/convnextv2-tiny\"\n\ntraining_args = TrainingArguments(\n    output_dir=OUTPUT_DIR,\n    evaluation_strategy=STRATEGY,\n    save_strategy=STRATEGY,\n    logging_steps=10,\n    \n    remove_unused_columns=False,\n\n    learning_rate=1e-7,\n    per_device_train_batch_size=8,\n    gradient_accumulation_steps=4,\n    per_device_eval_batch_size=8,\n    num_train_epochs=30,\n    warmup_ratio=0.09,\n    \n    metric_for_best_model=\"balanced_accuracy\",\n    load_best_model_at_end=True,\n    \n    push_to_hub=False,\n    report_to=\"none\"\n)\n\ntrainer = Trainer(\n    model=model,\n    args=training_args,\n    data_collator=collate_fn,\n    train_dataset=dataset[\"train\"],\n    eval_dataset=dataset[\"test\"],\n    tokenizer=image_processor,\n    compute_metrics=compute_metrics,\n)\n\ntrainer.train()","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:06.114969Z","iopub.status.idle":"2023-10-22T13:08:06.115434Z","shell.execute_reply.started":"2023-10-22T13:08:06.115217Z","shell.execute_reply":"2023-10-22T13:08:06.115239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"save_dir = f\"/kaggle/working/convnextv2-tiny\"\ntrainer.save_model(save_dir)","metadata":{"execution":{"iopub.status.busy":"2023-10-22T13:08:06.116724Z","iopub.status.idle":"2023-10-22T13:08:06.117161Z","shell.execute_reply.started":"2023-10-22T13:08:06.116956Z","shell.execute_reply":"2023-10-22T13:08:06.116977Z"},"trusted":true},"execution_count":null,"outputs":[]}]}