{"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":"markdown","source":"# Βιβλιοθήκες","metadata":{}},{"cell_type":"code","source":"import math\nimport matplotlib.pyplot as plt\n\nimport numpy as np\nfrom PIL import Image, UnidentifiedImageError\nfrom pathlib import Path\nimport torch\nimport glob\nimport pytorch_lightning as pl\nfrom huggingface_hub import HfApi, Repository\nfrom torch.utils.data import DataLoader\nfrom torchvision.datasets import ImageFolder\nfrom torchmetrics import Accuracy\nfrom transformers import ViTFeatureExtractor, ViTForImageClassification\nfrom pytorch_lightning.callbacks import ModelCheckpoint\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-04-10T03:41:33.448198Z","iopub.execute_input":"2022-04-10T03:41:33.448608Z","iopub.status.idle":"2022-04-10T03:41:35.592793Z","shell.execute_reply.started":"2022-04-10T03:41:33.448508Z","shell.execute_reply":"2022-04-10T03:41:35.59196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.600086Z","iopub.execute_input":"2022-04-10T03:41:35.600443Z","iopub.status.idle":"2022-04-10T03:41:35.626174Z","shell.execute_reply.started":"2022-04-10T03:41:35.600408Z","shell.execute_reply":"2022-04-10T03:41:35.625464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_dir = Path(\"../input/eestech-challenge-task-2/train/train\")","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.627996Z","iopub.execute_input":"2022-04-10T03:41:35.628194Z","iopub.status.idle":"2022-04-10T03:41:35.636676Z","shell.execute_reply.started":"2022-04-10T03:41:35.628169Z","shell.execute_reply":"2022-04-10T03:41:35.635923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds=ImageFolder(data_dir)\nindices = torch. randperm(len(ds)).tolist()\nn_val = math.floor(len(indices) * .20)\ntrain_ds = torch.utils.data.Subset(ds, indices[:-n_val])\nval_ds = torch.utils.data.Subset(ds, indices[-n_val:])","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.639941Z","iopub.execute_input":"2022-04-10T03:41:35.640405Z","iopub.status.idle":"2022-04-10T03:41:35.666163Z","shell.execute_reply.started":"2022-04-10T03:41:35.640365Z","shell.execute_reply":"2022-04-10T03:41:35.665528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label2id = {}\nid2label = {}\n\nfor i, class_name in enumerate(ds.classes):\n    label2id[class_name] = str(i)\n    id2label[str(i)] = class_name","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.668616Z","iopub.execute_input":"2022-04-10T03:41:35.668814Z","iopub.status.idle":"2022-04-10T03:41:35.674661Z","shell.execute_reply.started":"2022-04-10T03:41:35.668792Z","shell.execute_reply":"2022-04-10T03:41:35.67396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageClassificationCollator:\n    def __init__(self, feature_extractor):\n        self.feature_extractor = feature_extractor\n \n    def __call__(self, batch):\n        encodings = self.feature_extractor([x[0] for x in batch], return_tensors='pt')\n        encodings['labels'] = torch.tensor([x[1] for x in batch], dtype=torch.long)\n        return encodings","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.675922Z","iopub.execute_input":"2022-04-10T03:41:35.676162Z","iopub.status.idle":"2022-04-10T03:41:35.683964Z","shell.execute_reply.started":"2022-04-10T03:41:35.676128Z","shell.execute_reply":"2022-04-10T03:41:35.683246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k')\n\ncollator = ImageClassificationCollator(feature_extractor)\n\ntrain_loader = DataLoader(train_ds, batch_size=16, collate_fn=collator, num_workers=2, shuffle=True)\nval_loader = DataLoader(val_ds, batch_size=16, collate_fn=collator, num_workers=2)\n\nmodel = ViTForImageClassification.from_pretrained(\n    'google/vit-base-patch16-224-in21k',\n    num_labels=len(label2id),\n    label2id=label2id,\n    id2label=id2label\n)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:35.685236Z","iopub.execute_input":"2022-04-10T03:41:35.685535Z","iopub.status.idle":"2022-04-10T03:41:37.714058Z","shell.execute_reply.started":"2022-04-10T03:41:35.685499Z","shell.execute_reply":"2022-04-10T03:41:37.713343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Classifier(pl.LightningModule):\n\n\n    def __init__(self, model, lr: float = 2e-5, **kwargs):\n        super().__init__()\n        self.save_hyperparameters('lr', *list(kwargs))\n        self.model = model\n        self.forward = self.model.forward\n        self.val_acc = Accuracy()\n        self.train_acc= Accuracy()\n\n    def training_step(self, batch, batch_idx):\n        outputs = self(**batch)\n        self.log(f\"train_loss\", outputs.loss)\n        acc1 = self.train_acc(outputs.logits.argmax(1), batch['labels'])\n        self.log(f\"train_acc\", acc1, prog_bar=True)\n        return outputs.loss\n\n    def validation_step(self, batch, batch_idx):\n        outputs = self(**batch)\n        self.log(f\"val_loss\", outputs.loss)\n        acc = self.val_acc(outputs.logits.argmax(1), batch['labels'])\n        self.log(f\"val_acc\", acc, prog_bar=True)\n        return outputs.loss\n\n    def configure_optimizers(self):\n        return torch.optim.Adam(self.parameters(), lr=self.hparams.lr,weight_decay=0.0025)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:37.715496Z","iopub.execute_input":"2022-04-10T03:41:37.715803Z","iopub.status.idle":"2022-04-10T03:41:37.738665Z","shell.execute_reply.started":"2022-04-10T03:41:37.715765Z","shell.execute_reply":"2022-04-10T03:41:37.737828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pl.seed_everything(42)\nclassifier = Classifier(model, lr=2e-5)\ntrainer = pl.Trainer(gpus=1, precision=16, max_epochs=6)\ntrainer.fit(classifier, train_loader, val_loader)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T03:41:37.739887Z","iopub.execute_input":"2022-04-10T03:41:37.740888Z","iopub.status.idle":"2022-04-10T04:00:24.781201Z","shell.execute_reply.started":"2022-04-10T03:41:37.740775Z","shell.execute_reply":"2022-04-10T04:00:24.780402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data_path ='../input/eestech-challenge-task-2/test/test'\n# image_path1= '/content/asl_alphabet_test/asl_alphabet_test/O_test.jpg'\nimages_path=glob.glob(test_data_path+'/*.jpg')","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:00:24.783001Z","iopub.execute_input":"2022-04-10T04:00:24.783268Z","iopub.status.idle":"2022-04-10T04:00:24.875908Z","shell.execute_reply.started":"2022-04-10T04:00:24.783232Z","shell.execute_reply":"2022-04-10T04:00:24.875143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prediction(img_path):\n  im=Image.open(img_path)\n  encoding = feature_extractor(images=im, return_tensors=\"pt\")\n  encoding.keys()\n\n  pixel_values = encoding['pixel_values']\n\n  outputs = model(pixel_values)\n  result = outputs.logits.softmax(1).argmax(1)\n  new_result = result.tolist()\n  for i in new_result:\n    return(i)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:00:24.877306Z","iopub.execute_input":"2022-04-10T04:00:24.877606Z","iopub.status.idle":"2022-04-10T04:00:24.884341Z","shell.execute_reply.started":"2022-04-10T04:00:24.877545Z","shell.execute_reply":"2022-04-10T04:00:24.883539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm\ntest_data_path = '../input/eestech-challenge-task-2/test/test'\nimages_path=glob.glob(test_data_path+'/*.jpg')\npreds = [prediction(im) for im in tqdm(images_path)]","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:00:24.88587Z","iopub.execute_input":"2022-04-10T04:00:24.886747Z","iopub.status.idle":"2022-04-10T04:05:05.212326Z","shell.execute_reply.started":"2022-04-10T04:00:24.886711Z","shell.execute_reply":"2022-04-10T04:05:05.211625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Visualization της εκπαίδευσης","metadata":{}},{"cell_type":"markdown","source":"# Πρόβλεψη","metadata":{}},{"cell_type":"code","source":"def get_images(path):\n    f = str(path).rsplit('/', 1)\n    return f[1]\n    \nimg_filenames = list(map(get_images, list(images_path)))","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:05:05.225056Z","iopub.execute_input":"2022-04-10T04:05:05.225365Z","iopub.status.idle":"2022-04-10T04:05:05.234636Z","shell.execute_reply.started":"2022-04-10T04:05:05.225328Z","shell.execute_reply":"2022-04-10T04:05:05.233949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:05:05.236131Z","iopub.execute_input":"2022-04-10T04:05:05.236466Z","iopub.status.idle":"2022-04-10T04:05:05.243239Z","shell.execute_reply.started":"2022-04-10T04:05:05.236431Z","shell.execute_reply":"2022-04-10T04:05:05.242402Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = list(zip(img_filenames,preds))\nsubmission_df = pd.DataFrame(predictions, columns=['image','class'])\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-04-10T04:05:05.244354Z","iopub.execute_input":"2022-04-10T04:05:05.244914Z","iopub.status.idle":"2022-04-10T04:05:05.271646Z","shell.execute_reply.started":"2022-04-10T04:05:05.244876Z","shell.execute_reply":"2022-04-10T04:05:05.271006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}