{"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 numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n#import os\n#from IPython.display import Image\nfrom PIL import Image\nimport cv2\n\nfrom random import randint\nimport torch\nimport torch.nn as nn\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.optim.lr_scheduler import ReduceLROnPlateau\n\nimport json","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-07T10:29:35.452305Z","iopub.execute_input":"2021-07-07T10:29:35.452825Z","iopub.status.idle":"2021-07-07T10:29:35.458480Z","shell.execute_reply.started":"2021-07-07T10:29:35.452794Z","shell.execute_reply":"2021-07-07T10:29:35.457222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Image.open(\"../input/cassava-leaf-disease-classification/train_images/1000015157.jpg\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:46.649674Z","iopub.execute_input":"2021-07-07T10:28:46.649965Z","iopub.status.idle":"2021-07-07T10:28:46.878287Z","shell.execute_reply.started":"2021-07-07T10:28:46.649939Z","shell.execute_reply":"2021-07-07T10:28:46.875562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im = cv2.imread(\"../input/tiny-imagenet/tiny-imagenet-200/train/n01443537/images/n01443537_0.JPEG\")\n#im = cv2.imread(\"../input/cassava-leaf-disease-classification/train_images/1000015157.jpg\")\n\np = 0 #padding\ns = 1 #stride\nf = 3 #num of filter\n\nfinal_size = int((len(im) + 2 * p - f)/s + 1)\n\n#2 filters 3x3\nf1 = [[1,1,1], \n      [0,0,0], \n      [-1,-1,-1]]\nf2 = [[1,0,-1], \n      [1,0,-1], \n      [1,0,-1]]\n\n#2 filters of Sobel\nf_x = [[-1,0,1], \n      [-2,0,2], \n      [-1,0,1]]\n\nf_y = [[1,2,1], \n      [0,0,0], \n      [-1,-2,-1]]\n\nf_x_2 = [[1,0,0,0,-1], \n         [1,0,0,0,-1], \n         [1,0,0,0,-1],\n         [1,0,0,0,-1],\n         [1,0,0,0,-1]]\n\nEDGE_ENHANCE_MORE = [[-1, -1, -1],\n                     [-1,  9, -1],\n                     [-1, -1, -1]]","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:46.879931Z","iopub.execute_input":"2021-07-07T10:28:46.880291Z","iopub.status.idle":"2021-07-07T10:28:46.904704Z","shell.execute_reply.started":"2021-07-07T10:28:46.880259Z","shell.execute_reply":"2021-07-07T10:28:46.903296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"S1 = 1\nS2 = 2\n\nim = cv2.imread(\"../input/tiny-imagenet/tiny-imagenet-200/train/n01443537/images/n01443537_0.JPEG\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:29:08.859028Z","iopub.execute_input":"2021-07-07T10:29:08.859441Z","iopub.status.idle":"2021-07-07T10:29:08.868513Z","shell.execute_reply.started":"2021-07-07T10:29:08.859407Z","shell.execute_reply":"2021-07-07T10:29:08.867509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN:\n    def __init__(self):\n        #self.arr = []\n        self.u, self.g = 0, 0\n        \n    def ArrDefine(self, size):\n        n, m = size, size\n        arr = [[[0 for p in range(f)] for j in range(m)] for i in range(n)]\n        return arr\n    \n    def StrideCount(self, size, s):\n        self.g += s\n        if(self.g >= size):\n            self.u += s\n            self.g = 0\n            if(self.u >= size):\n                self.u = 0\n        return\n                    \n    def FilterImpos(self, i, im):\n        summ = 0\n        for k in range(f):\n                for l in range(f):\n                    summ += im[l + self.u][k + self.g][i] * f2[l][k]\n        return summ\n\n    def ConvLayer(self, size, s, im):\n        arr = self.ArrDefine(size)\n        #n, m = size, size\n        #arr = [[[0 for p in range(f)] for j in range(m)] for i in range(n)]\n        for i in range(size):\n            for j in range(size):\n                #R range\n                arr[i][j][0] = self.FilterImpos(0, im)\n                #G range\n                arr[i][j][1] = self.FilterImpos(1, im)\n                #B range\n                arr[i][j][2] = self.FilterImpos(2, im)\n        \n                self.StrideCount(size, s)\n        return arr\n    \n    def Pool(self, i, im):\n        best = 0\n        for k in range(f):\n                for l in range(f):\n                    if(im[l + self.u][k + self.g][i] > best): best = im[l + self.u][k + self.g][i]\n        return best\n\n    def PoolLayer(self, size, s, im):\n        arr = self.ArrDefine(size)\n        #n, m = size, size\n        #arr = [[[0 for p in range(f)] for j in range(m)] for i in range(n)]\n        for i in range(size):\n            for j in range(size):\n                #R range\n                arr[i][j][0] = self.Pool(0, im)\n                #G range\n                arr[i][j][1] = self.Pool(1, im)\n                #B range\n                arr[i][j][2] = self.Pool(2, im)\n        \n                self.StrideCount(size, s)\n        return arr\n    \n    def __del__(self):\n        self.u = 0\n        self.g = 0","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:29:11.449386Z","iopub.execute_input":"2021-07-07T10:29:11.450068Z","iopub.status.idle":"2021-07-07T10:29:11.471517Z","shell.execute_reply.started":"2021-07-07T10:29:11.450007Z","shell.execute_reply":"2021-07-07T10:29:11.469699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def Prepare(path):\n    \n    im = cv2.imread(path)\n    \n    cnn = CNN()\n\n    #layer 1\n    arr = cnn.ConvLayer(final_size, S1, im)\n    arr = cnn.PoolLayer(int((len(arr) + 2 * p - f)/s + 1), S1, im) \n\n    #layer 2\n    #arr = cnn.ConvLayer(int((len(arr) + 2 * p - f)/s + 1), S2)\n    #arr = cnn.PoolLayer(int((len(arr) + 2 * p - f)/s + 1), S2) \n\n    cv2.imwrite(f'{randint(1,20)}_test.jpg', np.array(arr))\n    \n    return\n    \nPrepare(\"../input/tiny-imagenet/tiny-imagenet-200/train/n01443537/images/n01443537_0.JPEG\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:30:44.345141Z","iopub.execute_input":"2021-07-07T10:30:44.345558Z","iopub.status.idle":"2021-07-07T10:30:45.123514Z","shell.execute_reply.started":"2021-07-07T10:30:44.345524Z","shell.execute_reply":"2021-07-07T10:30:45.122509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LABELS_MAP_PATH = '../input/cassava-leaf-disease-classification/label_num_to_disease_map.json'\nTRAIN_LABELS_PATH = '../input/cassava-leaf-disease-classification/train.csv'\nSAMPLE_SUBMISSION_PATH = '../input/cassava-leaf-disease-classification/sample_submission.csv'","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:31:45.607095Z","iopub.execute_input":"2021-07-07T10:31:45.607459Z","iopub.status.idle":"2021-07-07T10:31:45.611551Z","shell.execute_reply.started":"2021-07-07T10:31:45.607429Z","shell.execute_reply":"2021-07-07T10:31:45.610597Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open(LABELS_MAP_PATH, 'rb') as f:\n    labels_json_dict = json.load(f)\n\nlabels = {}\nfor key in labels_json_dict.keys():\n    labels[int(key)] = labels_json_dict[key]\nprint(labels)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:31:47.500948Z","iopub.execute_input":"2021-07-07T10:31:47.501464Z","iopub.status.idle":"2021-07-07T10:31:47.509492Z","shell.execute_reply.started":"2021-07-07T10:31:47.501431Z","shell.execute_reply":"2021-07-07T10:31:47.508741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_train = pd.read_csv(TRAIN_LABELS_PATH)\ndata_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:31:49.713455Z","iopub.execute_input":"2021-07-07T10:31:49.714056Z","iopub.status.idle":"2021-07-07T10:31:49.746201Z","shell.execute_reply.started":"2021-07-07T10:31:49.714023Z","shell.execute_reply":"2021-07-07T10:31:49.745247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_test = pd.read_csv(SAMPLE_SUBMISSION_PATH)\ndata_test.head()","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:31:51.715738Z","iopub.execute_input":"2021-07-07T10:31:51.716139Z","iopub.status.idle":"2021-07-07T10:31:51.728695Z","shell.execute_reply.started":"2021-07-07T10:31:51.716098Z","shell.execute_reply":"2021-07-07T10:31:51.727670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(data_test))\n#Prepare","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:32:47.535387Z","iopub.execute_input":"2021-07-07T10:32:47.535771Z","iopub.status.idle":"2021-07-07T10:32:47.541134Z","shell.execute_reply.started":"2021-07-07T10:32:47.535743Z","shell.execute_reply":"2021-07-07T10:32:47.539939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=LR)\nscheduler = ReduceLROnPlateau(optimizer, mode='min', verbose=True)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.666801Z","iopub.status.idle":"2021-07-07T10:28:47.667227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Image.open(\"test.jpg\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.668111Z","iopub.status.idle":"2021-07-07T10:28:47.668537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im = cv2.imread(\"test.jpg\")\nprint(im)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.669601Z","iopub.status.idle":"2021-07-07T10:28:47.670027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nfrom PIL import Image, ImageFilter\nimage = Image.open(\"../input/tiny-imagenet/tiny-imagenet-200/train/n01443537/images/n01443537_0.JPEG\")\nimage.filter(ImageFilter.FIND_EDGES)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.670894Z","iopub.status.idle":"2021-07-07T10:28:47.671329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image = Image.open(\"../input/cassava-leaf-disease-classification/train_images/1000015157.jpg\")\nimage = image.filter(ImageFilter.FIND_EDGES)\nimage.save(\"test.jpg\")\nImage.open(\"test.jpg\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.672290Z","iopub.status.idle":"2021-07-07T10:28:47.672698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im = cv2.imread(\"../input/cassava-leaf-disease-classification/train_images/1000015157.jpg\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.673724Z","iopub.status.idle":"2021-07-07T10:28:47.674138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x = cv2.Sobel(im,cv2.CV_16S,1,0)  \ny = cv2.Sobel(im,cv2.CV_16S,0,1)  \n  \nabsX = cv2.convertScaleAbs(x)   # Перенести обратно на uint8  \nabsY = cv2.convertScaleAbs(y)  \n  \ndst = cv2.addWeighted(absX,0.5,absY,0.5,0)  \n\ncv2.imwrite(\"test.jpg\", np.array(dst))","metadata":{"execution":{"iopub.status.busy":"2021-07-07T10:28:47.674974Z","iopub.status.idle":"2021-07-07T10:28:47.675403Z"},"trusted":true},"execution_count":null,"outputs":[]}]}