{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","editable":false,"execution":{"iopub.status.busy":"2021-08-10T15:41:46.327571Z","iopub.execute_input":"2021-08-10T15:41:46.328125Z","iopub.status.idle":"2021-08-10T15:42:02.111122Z","shell.execute_reply.started":"2021-08-10T15:41:46.328078Z","shell.execute_reply":"2021-08-10T15:42:02.108140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Import things","metadata":{"editable":false}},{"cell_type":"code","source":"import tensorflow as tf\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nimport random\nimport pathlib\nimport PIL.Image as Image\nimport cv2\nimport pandas as pd\nimport os\nimport pickle\n\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import TensorDataset\nfrom torchvision import transforms\nfrom torchvision.datasets import MNIST\nfrom torchvision.io import read_image\nfrom torch.utils.data import Dataset\nfrom torchvision import datasets\nfrom torchvision.transforms import ToTensor, ToPILImage\n\nimport numpy as np\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport time\nimport random\nimport sys\n#import cython\n#cimport numpy\n","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.112324Z","iopub.status.idle":"2021-08-10T15:42:02.112782Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"I don't know, howabout building a neural network?","metadata":{"editable":false}},{"cell_type":"markdown","source":"B1: transform cái ảnh về cùng một size (theo tôi nghĩ là 1024x768 (cái size ngu quá thì sửa sau cũng được), sau đấy làm maxpool hay gì đấy tính sau OK)","metadata":{"editable":false}},{"cell_type":"code","source":"\"\"\"\nclass ImgDataset(Dataset):\n    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):\n        self.img_labels = pd.read_csv(annotations_file)\n        self.img_dir = img_dir\n        self.transform = transform\n        self.target_transform = target_transform\n        \n    def __len__(self):\n        return len(self.img_labels)\n\n    def __getitem__(self, idx):\n        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])\n        im = cv2.imread(img_path + '.PNG')\n        im = cv2.resize(im, dsize=(240,160), interpolation = cv2.INTER_AREA)\n        im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)\n        arr = np.array([im])\n        #image = read_image(img_path + '.PNG')\n        image = torch.from_numpy(arr)\n        label = self.img_labels.iloc[idx, 1]\n        if self.transform:\n            image = self.transform(image)\n        if self.target_transform:\n            label = self.target_transform(label)\n        return image, label\n        \nTrain = pathlib.Path('/kaggle/input/hsgshackathon2021/train_data/Train/').glob('*');\nTrain = [x for x in Train]\nTrain.sort()\ntrain_labels = pathlib.Path('/kaggle/input/hsgshackathon2021/train_data/Train_labels/').glob('*.csv');\ntrain_labels = [x for x in train_labels]\ntrain_labels.sort()\narr1, arr2 = list(), list()\nfor (i, j) in zip(Train, train_labels):\n    print(i)\n    trainset = ImgDataset(j, i)\n    for n in range(trainset.__len__()):\n        #print(n)\n        image, label = trainset.__getitem__(n)\n        arr1.append(image)\n        arr2.append(label)\n        #print(type(image), type(label))\ntorch.save(arr1, './images.pt')\nfilehandler = open(\"./label.txt\",\"wb\")\npickle.dump(arr2,filehandler)\nfilehandler.close()\n\"\"\"\nimg = torch.load('../input/outputs/images.pt')\n#print(type(img[0]))\nfile = open(\"../input/outputs/label.txt\",'rb')\nlabel = pickle.load(file)\nfile.close()\n#print(label[0])","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.113704Z","iopub.status.idle":"2021-08-10T15:42:02.114099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"temp = img[24006].numpy()\ntemp = np.squeeze(temp)\n#print(temp)\nplt.imshow(temp)","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.115015Z","iopub.status.idle":"2021-08-10T15:42:02.115414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"B2: Neural network (ông muốn thay đổi cái gì thì thay đổi ở bước này)","metadata":{"editable":false}},{"cell_type":"markdown","source":"- neural network things\n    + Conv2D(number of layer in, number of layer out, kernal_size = , stride = , padding = )\n    + MaxPool2D(width, height) (width = height)\n    + .relu -> non-linear\n    + dropout (optional)\n    + .view -> turn 3D into 1D\n    + .linear -> neural network","metadata":{}},{"cell_type":"code","source":"#bool testing = 1\n#arr = []","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.116170Z","iopub.status.idle":"2021-08-10T15:42:02.116586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Net(nn.Module):\n  \"\"\"\n  Define the structure of model\n  \"\"\"\n  def __init__(self):\n    super(Net, self).__init__()\n    self.conv1 = nn.Conv2d(3, 4, kernel_size = (3, 5), stride = 1, padding = (1, 2)) # 160x240x3 (if we have colored image then x3) -> 160x240x64\n    self.conv2 = nn.Conv2d(4, 4, kernel_size = (3, 5), stride = 1, padding = (1, 2)) #160x240x64\n    #80x120x128\n    self.conv3 = nn.Conv2d(4, 8, kernel_size = (3, 5), stride = 1, padding = (1, 2))\n    #40x60x256\n    self.conv6 = nn.Conv2d(8, 16, kernel_size = (3, 5), stride = 1, padding = (1, 2))\n    #20x30x512\n    self.conv9 = nn.Conv2d(16, 32, kernel_size = (3, 5), stride = 1, padding = (1, 2))\n    #10x15x512\n    self.conv12 = nn.Conv2d(32, 32, kernel_size = (3, 5), stride = 1, padding = (1, 2))\n    \n    self.fc1 = nn.Linear(10 * 15 * 32, 8192)\n    self.fc2 = nn.Linear(8192, 4096);\n    self.fc3 = nn.Linear(4096, 1024);\n    self.fc4 = nn.Linear(1024, 2);\n    self.pool = nn.MaxPool2d(2, 2) \n    self.dropout = nn.Dropout(0)\n\n    #nn.linear: y = xA^T + b (^T here is matrix transpose of matrix A)\n    # and another one\n    #self.fc2 = nn.Linear(128, args.num_labels)\n    #self.num_labels = args.num_labels\n\n  def forward(self, inputs, outputs):\n    \"\"\"\n    The forward process of a model from input to output\n\n    :type inputs: Tensor[float]\n    :type labels: Tensor[float]\n    :rtype loss: float\n    :rtype preds: Tensor[int]\n    \"\"\"\n    #batch x W x H x C\n    #batch x 1\n    x = F.relu(self.conv1(inputs)) #\n    x = F.relu(self.conv2(x)) #batchx5x5x64\n    x = self.dropout(x) #batchx5x5x64\n    x = self.pool(F.relu(self.conv3(x)))\n    #print(x.shape)\n    x = self.dropout(x)\n    x = self.pool(F.relu(self.conv6(x)))\n    #print(x.shape)\n    x = self.dropout(x)\n    x = self.pool(F.relu(self.conv9(x)))\n    x = self.dropout(x)\n    x = self.pool(F.relu(self.conv12(x)))\n    x = self.dropout(x)\n    #print(x.shape)\n   # print(type(x))\n    x = x.view(-1, 10 * 15 * 32)\n    x = F.relu(self.fc1(x));\n    x = F.relu(self.fc2(x));\n    x = F.relu(self.fc3(x));\n    x = self.fc4(x)\n    #x = x.view(-1, 5*5*64) #batch x (5*5*64)\n    #x = F.relu(self.fc1(x))\n    #x = self.dropout(x)\n    #x = self.fc2(x)\n    print(x)\n    for i in range(0, 16):\n        temp = x[i, 0]\n        if(temp > x[i, 1]): temp = x[i, 1]\n        x[i, 0] -= (temp - 2)\n        x[i, 1] -= (temp - 2)\n        temp2 = x[i, 0] + x[i, 1]\n        x[i, 0] /= temp2\n        x[i, 1] /= temp2\n        #if(testing == 1):\n            #if(x[i, 0] < 0.5): arr.append(1)\n            #else: arr.append(0)\n    #print(x)\n    #preds = nn.Softmax(dim=1)(x)\n    #print(preds)\n    print(outputs)\n    ##print(x.shape)\n    ##print(outputs.shape)\n    loss_fct = nn.MSELoss()\n    loss = loss_fct(x, outputs)\n    print(x)\n    return loss","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.117463Z","iopub.status.idle":"2021-08-10T15:42:02.117910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"B3: Execute (ở bước này chỉ execute thôi, muốn in ra accuracy / loss thì làm ơn in ra ở chỗ B4) (lưu lại loss và accuracy sau mỗi bước thì được","metadata":{"editable":false}},{"cell_type":"code","source":"loss = nn.NLLLoss()\na = torch.tensor(([0.88, 0.12], [0.51, 0.49]), dtype = torch.float)\ntarget = torch.tensor([1, 0])\nprint(type(a))\nprint(type(target))\nprint(a.shape)\nprint(target.shape)\noutput = loss(a, target)\nprint(type(output))\nprint(output.grad_fn)","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.118683Z","iopub.status.idle":"2021-08-10T15:42:02.119081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"epoch = 10\nNetwork = Net()\nprint(Network)\noptimizer = torch.optim.SGD(Network.parameters(), lr=0.0001, momentum=0.95)\n\n#img contains tensor\n#label contains labels\n\naccu = []\n\nimg2 = img\n\nrandom.shuffle(img)\n\nfor i in range(1, 15):\n    loss = 0\n    cnt = 0\n    turns = 0\n    x = torch.empty([1, 3, 160, 240])\n    y = torch.empty([1, 2])\n    tmp1 = [[0, 1]]\n    tmp0 = [[1, 0]]\n    tmp0 = torch.FloatTensor(tmp0)\n    tmp1 = torch.FloatTensor(tmp1)\n    chk = 0\n    #arr = []\n    print(i)\n    for j in range(len(img)):\n        if(label[j] == 0):\n            cnt += 1\n            if(cnt == 1):\n                cnt = 0\n            else: continue\n        k = img[j]\n        k = torch.transpose(k, 1, 3)\n        #print(k.shape)\n        k = torch.transpose(k, 2, 3)\n        #print(k.shape)\n        k = k.float()\n        if (x.shape[0] % 16 == 0 or chk == 0):\n            #print(\"OK\\n\")\n            chk = 1\n            x = k\n            if(label[j] == 1): y = tmp0\n            else: y = tmp1\n        else:\n            x = torch.cat((x, k), 0)\n            if(label[j] == 1): y = torch.cat((y, tmp1), 0)\n            else: y = torch.cat((y, tmp0), 0)\n        #arr.append(label[j])\n        #print(y.shape)\n        if (x.shape[0] != 16): continue\n        #print(x[0])\n        #print(x[1])\n        #turns += 1\n        #if(turns == 10): break\n        #debug stuff\n        ##print(j)\n        #end of debug stuff\n        #temp = Network(x)\n        #print(temp)\n        temp = Network(x, y)\n        print(temp)\n        temp.backward()\n        optimizer.step()\n        Network.zero_grad()\n        #print(temp)\n        turns += 1\n        print(turns)\n        accu.append(temp)\n        if(turns == 10): break\n        #arr2 = preds.squeeze().tolist()\n        '''\n        arr3 = y\n        arr4 = torch.FloatTensor(temp)\n        print(arr3.shape)\n        print(arr4.shape)\n        loss = loss_fct(arr4, arr3)\n        print(loss.shape)\n        print(loss.grad_fn)\n        Network.zero_grad()\n        loss.backward()\n        '''\n       # arr.clear()\nimg = img2\nplt.plot(accu, label = \"accuracy\")\nplt.title('Model loss')\nplt.ylabel('Loss')\nplt.xlabel('Turn')\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.120040Z","iopub.status.idle":"2021-08-10T15:42:02.120428Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"B4: In ra mọi thứ ở trong này để check","metadata":{"editable":false}},{"cell_type":"code","source":"","metadata":{"editable":false},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"B5: Output part:\n- Với mỗi cái train2, áp nó vào cái neural network, sau đấy vứt vào train3\n- Đừng làm gì khác","metadata":{"editable":false}},{"cell_type":"code","source":"class ImgDataset(Dataset):\n    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):\n        self.img_labels = pd.read_csv(annotations_file)\n        self.img_dir = img_dir\n        self.transform = transform\n        self.target_transform = target_transform\n        \n    def __len__(self):\n        return len(self.img_labels)\n\n    def __getitem__(self, idx):\n        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])\n        im = cv2.imread(img_path + '.PNG')\n        im = cv2.resize(im, dsize=(240,160), interpolation = cv2.INTER_AREA)\n        im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)\n        arr = np.array([im])\n        #image = read_image(img_path + '.PNG')\n        image = torch.from_numpy(arr)\n        label = self.img_labels.iloc[idx, 1]\n        if self.transform:\n            image = self.transform(image)\n        if self.target_transform:\n            label = self.target_transform(label)\n        return image, label\n        \nTrain = pathlib.Path('/kaggle/input/hsgshackathon2021/Test_data/Test/').glob('*');\nTrain = [x for x in Train]\nTrain.sort()\n#train_labels = pathlib.Path('/kaggle/input/hsgshackathon2021/Test_data/Train_labels/').glob('*.csv');\n#train_labels = [x for x in train_labels]\n#train_labels.sort()\narr1 = list()\nfor (i) in zip(Train):\n    print(i)\n    trainset = ImgDataset(i)\n    for n in range(trainset.__len__()):\n        #print(n)\n        image = trainset.__getitem__(n)\n        arr1.append(image)\n        #arr2.append(label)\n        #print(type(image), type(label))\ntorch.save(arr1, './images2.pt')\n#filehandler = open(\"./label.txt\",\"wb\")\n#pickle.dump(arr2,filehandler)\n#filehandler.close()","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:02.121260Z","iopub.status.idle":"2021-08-10T15:42:02.121687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pathlib.Path('/kaggle/input/hsgshackathon2021/Test_data/Test/').glob('*/*.PNG');\n#print(type(train))\ntrain2 = sorted([x for x in train])\n#print(len(train2))\ntrain3 = []\ntem = time.time()\ncounter = 0\nfor i in range(0, 6000):\n    #print(str(train2[i].resolve()))\n    if(i % 10 == 0): print(i)\n    image = cv2.imread(str(train2[i].resolve()))\n    #print(type(image))\n    t: tuple = (np.int64(image.shape[1] / 6), np.int64(image.shape[0] / 6))\n    #image.resize((np.int64(image.shape[0] / 3), np.int64(image.shape[1] / 3), 3))\n    image = cv2.resize(src = image, dsize = t, interpolation=cv2.INTER_LINEAR)\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    #print(type(temp))\n   # display(temp)\n    #cv2.imshow(\"image\", image)\n    #print(image.shape)\n    #print(image)\n    #print(type(temp))\n    #temp = cv2.cvtColor(temp, cv2.COLOR_BGR2RGB)\n    #print(type(temp))\n    #temp.save(\"temp.png\")\n    #display(temp)\n    cnt = 0\n    #print(time.time() - tem)\n    prefix = np.zeros((image.shape[0], image.shape[1]))\n    for j in range (0, image.shape[0]):\n        for k in range(0, image.shape[1]):\n            if(image[j][k][0] <= 120 and image[j][k][1] <= 120 and image[j][k][2] <= 120):\n                prefix[j, k] = 1\n                #300 470\n                #if(j >= 400 and j < 450 and k >= 500 and k < 660):\n                    #continue\n                #print(\"OK\")\n                #print(img3[j][k])\n            #if(j >= 199 and j <= 269 and k >= 599 and k <= 669): continue\n            #if(image[j][k][0] >= 200 and image[j][k][1] >= 200): continue\n                #print('OK')\n            #if(image.)\n    #sys.exit(0)\n    #print(time.time() - tem)\n    for j in range(1, image.shape[1]): prefix[0][j] += prefix[0][j - 1]\n    for j in range(1, image.shape[0]): prefix[j][0] += prefix[j - 1][0]\n    for j in range(1, image.shape[0]):\n        for k in range(1, image.shape[1]):\n            prefix[j][k] += prefix[j - 1][k] + prefix[j][k - 1] - prefix[j - 1][k - 1]\n   # print(time.time() - tem)\n    cnt = 0\n    sidex = 12\n    sidey = 12\n    boardx = 3\n    boardy = 3\n    for j in range(0, image.shape[0] - sidex + 1, 3):\n        for k in range(0, image.shape[1] - sidey + 1, 3):\n            temp = prefix[j + sidex - 1][k + sidey - 1]\n            if(j >= 1): temp -= prefix[j - 1][k + sidey - 1] \n            if(k >= 1): temp -= prefix[j + sidex - 1][k - 1]\n            if(j >= 1 and k >= 1): temp += prefix[j - 1][k - 1]\n            temp2 = prefix[j + sidex - boardx - 1][k + sidey - boardy - 1] - prefix[j + boardx - 1][k + sidey - boardy - 1] - prefix[j + sidex - boardx - 1][k + boardy - 1] + prefix[j + boardx - 1][k + boardy - 1]\n            #if (j >= 400 and k >= 500): print(j, k, temp, temp2)\n            if(temp <= 11): continue\n            #if(i == 30): print(j, k, temp, temp2)\n            if(temp != temp2): continue\n            cnt = 1\n            break\n        if(cnt > 0): break\n            #print(j, k)\n    #temp = Image.fromarray(image, 'RGB')\n    #print(cnt)\n    #print(type(img3))\n    #img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)\n    #temp = Image.fromarray(img3, 'RGB')\n    #print(type(temp))\n    #temp = cv2.cvtColor(temp, cv2.COLOR_BGR2RGB)\n    #print(type(temp))\n    #temp.save(\"temp.png\")\n    #display(temp)\n    #print(cnt)\n    if(cnt == 0): train3.append(1)\n    else: train3.append(0)\n    #print(train3[i], train3[i - 1])\n    if(train3[i] == 0 and train3[i - 1] == 1):\n        #print(\"OK\")\n        counter += 6\n    #\n    if(i % 100 == 0): print(time.time() - tem)\n#sys.exit(0)\nfor i in range(6000, len(train2)): train3.append(0)\ntrain4 = []\nfor i in range(0, len(train2)):\n    #print(type(train2[i]))\n    t = str(train2[i].resolve())\n    #print(t)\n    s = ''\n    lst2 = lst = 0\n    #print(len(t))\n    for j in range(0, len(t)):\n        if(t[j] == '/'):\n            lst2 = lst\n            lst = j\n    #print(lst2)\n    #print(lst)\n    s += t[lst2 + 1: lst]\n    s += '_'\n    s += t[lst + 1:len(t) - 4]\n    #print(s)\n    train4.append(s)\n    #print(type(t))\n    #t = to_str(train2[i])\n    #t = train2[i]\n    #lst = -1\n    #for j in range(0, len(train2[i])):\n        #print(\"OK\")\n#print(len(train3))\n#print(len(train4))\n\ndata = {'Frame': train4, \n        'Label': train3}\ndf = pd.DataFrame(data)\nprint(df)\ndf.to_csv('submission.csv', index=False)\n#for i in range(1, len(train2)): \n#for i in range(10) print(train2[i])","metadata":{"execution":{"iopub.status.busy":"2021-08-10T15:42:26.993160Z","iopub.execute_input":"2021-08-10T15:42:26.993526Z","iopub.status.idle":"2021-08-10T15:58:26.266757Z","shell.execute_reply.started":"2021-08-10T15:42:26.993490Z","shell.execute_reply":"2021-08-10T15:58:26.265586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{"editable":false}}]}