{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84969,"databundleVersionId":10033515,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q zarr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:09:51.600713Z","iopub.execute_input":"2024-12-03T01:09:51.601006Z","iopub.status.idle":"2024-12-03T01:10:03.791071Z","shell.execute_reply.started":"2024-12-03T01:09:51.600966Z","shell.execute_reply":"2024-12-03T01:10:03.790084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport zarr\nimport matplotlib.pyplot as plt\nfrom matplotlib import animation, rc\nimport cv2\nimport json\nimport seaborn as sns\nimport scipy\nfrom skimage import measure\nfrom tqdm import tqdm\nimport plotly.graph_objs as go\nfrom scipy.fft import ifftn, fftn\nfrom PIL import Image\nfrom scipy import misc\nimport gc\nfrom plotly.offline import init_notebook_mode, iplot, plot\nfrom mpl_toolkits.mplot3d.art3d import Poly3DCollection\nimport torch\nfrom torch import nn\ninit_notebook_mode(connected=True) \n\nrc('animation', html='jshtml')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:10:03.792712Z","iopub.execute_input":"2024-12-03T01:10:03.792998Z","iopub.status.idle":"2024-12-03T01:10:08.217624Z","shell.execute_reply.started":"2024-12-03T01:10:03.792969Z","shell.execute_reply":"2024-12-03T01:10:08.216783Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else 'cpu')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:10:19.803382Z","iopub.execute_input":"2024-12-03T01:10:19.804175Z","iopub.status.idle":"2024-12-03T01:10:19.861454Z","shell.execute_reply.started":"2024-12-03T01:10:19.804140Z","shell.execute_reply":"2024-12-03T01:10:19.860539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_5_4/VoxelSpacing10.000/denoised.zarr')\ndata1 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_69_2/VoxelSpacing10.000/denoised.zarr')\ndata2 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_6_4/VoxelSpacing10.000/denoised.zarr')\ndata3 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_6_6/VoxelSpacing10.000/denoised.zarr')\ndata4 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_73_6/VoxelSpacing10.000/denoised.zarr')\ndata5 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_86_3/VoxelSpacing10.000/denoised.zarr')\ndata6 = zarr.open('/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/TS_99_9/VoxelSpacing10.000/denoised.zarr')\nscale = dict(data.attrs)['multiscales'][0]['datasets'][0]['coordinateTransformations'][0]['scale']\ntrainX = [data5[0], data1[0], data2[0], data3[0], data4[0]]\ntestX = [data[0], data6[0]]\ntrainX = -np.array([np.array(i) for i in trainX])\nmean, std = trainX.mean(), trainX.std()\ntrainX = (trainX - mean) / std\ntrainX = trainX.clip(-4, 4)\ntrainX = (trainX - trainX.min()) / (trainX.max()- trainX.min())\n\ntestX = -np.array([np.array(i) for i in testX])\ntestX = (testX - mean) / std\ntestX = testX.clip(-4, 4)\ntestX = (testX - testX.min()) / (testX.max()- testX.min())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:10:21.186845Z","iopub.execute_input":"2024-12-03T01:10:21.187541Z","iopub.status.idle":"2024-12-03T01:10:46.003077Z","shell.execute_reply.started":"2024-12-03T01:10:21.187487Z","shell.execute_reply":"2024-12-03T01:10:46.002267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class imageLoader(torch.utils.data.Dataset):\n    def __init__(self, X, batch_size=64, patch_size=32, shuffle=True, inference=False):\n        self.X = X\n        self.patch_size = patch_size // 2\n        self.coordsX = np.arange(self.patch_size, 630 - self.patch_size)\n        self.coordsY = np.arange(self.patch_size, 630 - self.patch_size)\n        self.coordsZ = np.arange(self.patch_size, 184 - self.patch_size)\n        np.random.shuffle(self.coordsX)\n        np.random.shuffle(self.coordsY)\n        np.random.shuffle(self.coordsZ)\n        \n        self.batch_size = batch_size\n        self.shuffle = shuffle\n        self.inference = inference\n        self.onEpochEnd()\n    \n    def __len__(self):\n        return 12\n    \n    def dataLen(self):\n        return len(self.X)\n    \n    def onEpochEnd(self):\n        if self.shuffle:\n            np.random.shuffle(self.coordsX)\n            np.random.shuffle(self.coordsY)\n            np.random.shuffle(self.coordsZ)\n    \n    def getBatch(self, idx):\n        if idx >= self.__len__():\n            raise IndexError()\n\n        return self.coordsX[:self.batch_size], self.coordsY[:self.batch_size], self.coordsZ[:self.batch_size]\n    \n    def __getitem__(self, idx):\n        batch = self.getBatch(idx)\n        X = np.empty((0, 1, self.patch_size*2, self.patch_size*2, self.patch_size*2))\n        for x, y, z in zip(batch[0], batch[1], batch[2]):\n            X = np.concatenate((X, self.X[np.random.randint(len(self.X))][z-self.patch_size:z+self.patch_size, y-self.patch_size:y+self.patch_size, x-self.patch_size:x+self.patch_size][None, None, :]))\n\n        y = X[:, 0, self.patch_size, self.patch_size, self.patch_size].copy()\n        \n        X[:, 0, self.patch_size, self.patch_size, self.patch_size] = X[:, 0].mean(axis=(1,2,3)) - (X[:, 0, self.patch_size, self.patch_size, self.patch_size] / (8 * self.patch_size ** 3))\n        \n        if self.inference:\n            return torch.tensor(X, dtype=torch.float32).to(DEVICE)\n        else:\n            return torch.tensor(X, dtype=torch.float32).to(DEVICE), torch.tensor(y, dtype=torch.float32).to(DEVICE)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:10:57.395037Z","iopub.execute_input":"2024-12-03T01:10:57.395361Z","iopub.status.idle":"2024-12-03T01:10:57.406392Z","shell.execute_reply.started":"2024-12-03T01:10:57.395334Z","shell.execute_reply":"2024-12-03T01:10:57.405533Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class scoreGuesser(torch.nn.Module):\n    def __init__(self, size=16):\n        super().__init__()\n\n        self.Conv1 = torch.nn.Sequential(nn.Conv3d(1, 8, 3, padding='same'),\n                                         nn.BatchNorm3d(8),\n                                         nn.ReLU(),\n                                         nn.Conv3d(8, 8, 3, padding='same'),\n                                         nn.BatchNorm3d(8),\n                                         nn.ReLU()\n                                        )\n\n        self.Conv2 = torch.nn.Sequential(nn.MaxPool3d(2, stride=2),\n                                         nn.Conv3d(8, 16, 3, padding='same'),\n                                         nn.BatchNorm3d(16),\n                                         nn.ReLU()\n                                        )\n\n        self.Conv3 = torch.nn.Sequential(nn.MaxPool3d(2, stride=2),\n                                         nn.Conv3d(16, 32, 3, padding='same'),\n                                         nn.BatchNorm3d(32),\n                                         nn.ReLU(),\n                                         nn.Conv3d(32, 32, 3, padding='same'),\n                                         nn.BatchNorm3d(32),\n                                         nn.ReLU(),\n                                         nn.ConvTranspose3d(32, 16, 2, stride=2)\n                                        )\n\n        self.Conv4 = torch.nn.Sequential(nn.Conv3d(32, 16, 3, padding='same'),\n                                         nn.BatchNorm3d(16),\n                                         nn.ReLU(),\n                                         nn.ConvTranspose3d(16, 8, 2, stride=2)\n                                        )\n\n        self.Conv5 = torch.nn.Sequential(nn.Conv3d(16, 8, 3, padding='same'),\n                                         nn.BatchNorm3d(8),\n                                         nn.ReLU(),\n                                         nn.Conv3d(8, 1, 3, padding='same'),\n                                         nn.BatchNorm3d(1)\n                                        )\n        a = np.zeros((1, size, size, size))\n        a[:, size//2, size//2, size//2] = 1\n\n        self.mask = torch.tensor(a, dtype=torch.float32).to(DEVICE)\n        self.mask = nn.Parameter(self.mask, requires_grad=False)\n        \n        self.sigmoid = torch.nn.Sigmoid()\n\n    def forward(self, x):\n        x2 = self.Conv1(x)\n        \n        x3 = self.Conv2(x2)\n        \n        x4 = self.Conv3(x3)\n        \n        x3 = torch.concat((x3, x4), axis=1)\n        x3 = self.Conv4(x3)\n\n        x3 = torch.concat((x3, x2), axis=1)\n        x3 = self.Conv5(x3)\n\n        x = x3 + x\n        x = self.sigmoid(x)\n        x = x * self.mask\n        x = torch.sum(x, axis=(1, 2, 3, 4))\n        return x","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:10:59.471424Z","iopub.execute_input":"2024-12-03T01:10:59.471740Z","iopub.status.idle":"2024-12-03T01:10:59.483137Z","shell.execute_reply.started":"2024-12-03T01:10:59.471713Z","shell.execute_reply":"2024-12-03T01:10:59.482138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def trainLoop(model, lossFunct, optimizer, trainData, testData, scheduler, epoch=5):\n    for epochNum in range(epoch):\n        print(\"epoch:\",epochNum+1)\n        model.train()\n        totTrainLoss = 0\n        for train in tqdm(trainData):\n            X, y = train\n            optimizer.zero_grad()\n            out = model(X)\n            loss = lossFunct(out, y)\n            loss.backward()\n            optimizer.step()\n            totTrainLoss += loss.item() * len(X)\n\n        model.eval()\n        totTestLoss = 0\n        with torch.no_grad():\n            for test in tqdm(testData):\n                X, y = test\n                out = model(X)\n                loss = lossFunct(out, y)\n                totTestLoss += loss.item() * len(X)\n    \n        print(\"train-loss:\", totTrainLoss / trainData.dataLen(), \"test-loss:\", totTestLoss / testData.dataLen())\n        \n        scheduler.step()\n        print(scheduler.get_last_lr())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:11:01.338355Z","iopub.execute_input":"2024-12-03T01:11:01.339338Z","iopub.status.idle":"2024-12-03T01:11:01.345753Z","shell.execute_reply.started":"2024-12-03T01:11:01.339304Z","shell.execute_reply":"2024-12-03T01:11:01.344878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = scoreGuesser(8)\nmodel = nn.DataParallel(model)\nmodel = model.to(DEVICE)\n\nlossFunct = nn.MSELoss(reduction='mean')\n\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-3)\nscheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[15, 35], gamma=0.1, verbose=True)\n\ntrainData = imageLoader(trainX, patch_size=8, batch_size=64)\ntestData = imageLoader(testX, patch_size=8, shuffle=False, batch_size=64)\n\ntrainLoop(model, lossFunct, optimizer, trainData, testData, scheduler, epoch=25)\ntorch.cuda.empty_cache()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:11:07.590376Z","iopub.execute_input":"2024-12-03T01:11:07.590711Z","iopub.status.idle":"2024-12-03T01:11:18.610480Z","shell.execute_reply.started":"2024-12-03T01:11:07.590681Z","shell.execute_reply":"2024-12-03T01:11:18.609648Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"s = 4\npanels = np.empty((630 - s*2, 1, s*2, s*2, s*2))\nfinalImg = np.empty((184 - s*2, 630 - s*2, 630 - s*2))\nfor l in tqdm(range(184 - s*2)):\n    for j in range(630 - s*2):\n        for i in range(630 - s*2):\n            panels[i, 0] = testX[0][l+s-s:l+s+s, s+i-s:s+i+s, s+j-s:s+j+s]\n        panels[:, 0, s, s, s] = panels[:, 0].mean(axis=(1,2,3)) - panels[:, 0, s, s, s] / (8 * s ** 3)\n        model.eval()\n        out = model(torch.tensor(panels, dtype=torch.float32).to(DEVICE))\n        \n        finalImg[l, :, j] = out.cpu().detach().numpy()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T01:11:26.011244Z","iopub.execute_input":"2024-12-03T01:11:26.012289Z","iopub.status.idle":"2024-12-03T01:39:47.362226Z","shell.execute_reply.started":"2024-12-03T01:11:26.012252Z","shell.execute_reply":"2024-12-03T01:39:47.361272Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valArr = finalImg.copy()\nkernel = np.ones((5, 5, 5))\n\nfor i in range(len(kernel)):\n    for j in range(len(kernel[0])):\n        for k in range(len(kernel[0][0])):\n            kernel[i, j, k] = ((kernel.shape[0] / 2 - 0.5 - i)**2 + \\\n                                      (kernel.shape[1] / 2 - 0.5 - j)**2 + \\\n                                      (kernel.shape[2] / 2 - 0.5 - k)**2) / (0.5 ** 2)\nkernel = np.e**(-0.5 * kernel)/(np.sqrt(2 * np.pi) * 0.5) \n            \nfinal = np.zeros(valArr.shape)[:-len(kernel)+1, :-len(kernel[0])+1, :-len(kernel[0][0])+1]\nfor i in tqdm(range(len(kernel))):\n    for j in range(len(kernel[0])):\n        for k in range(len(kernel[0][0])):\n            x = i\n            y = j\n            z = k\n            ix = -len(kernel) + x + 1\n            iy = -len(kernel[0]) + y + 1\n            iz = -len(kernel[0][0]) + z + 1\n\n            if not ix:\n                ix = None\n            if not iy:\n                iy = None\n            if not iz:\n                iz = None\n                \n            final += valArr[i : ix, y:iy, z:iz] * kernel[i, j, k]\nfinal /= kernel.sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T02:31:14.446186Z","iopub.execute_input":"2024-12-03T02:31:14.446499Z","iopub.status.idle":"2024-12-03T02:31:57.776374Z","shell.execute_reply.started":"2024-12-03T02:31:14.446474Z","shell.execute_reply":"2024-12-03T02:31:57.775429Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def addingToArr(iZ, iY, iX, boolArr, alreadyCheck, queArr, queIdx, inQueArr):\n    if iZ >= 0 and iZ < len(boolArr) and iY >= 0 and iY < len(boolArr[0]) and iX >= 0 and iX < len(boolArr[0][0]):\n        if boolArr[iZ, iY, iX] == 1 and not alreadyCheck[iY, iX] and not inQueArr[iY, iX]:\n            queArr[queIdx] = [iY, iX]\n            inQueArr[iY, iX] = True\n            queIdx[0] = queIdx[0] + 1\n        \ntemp = final.copy()\ntemp[final > final.mean() + final.std() * 0.5] = 100\nboolArr = np.zeros(temp.shape)\nboolArr[temp > 10] = 1\ncheckedArr = boolArr.copy()\n\nqueArr = np.empty((temp.shape[1] * temp.shape[2], 2), dtype=int)\ninQueArr = np.zeros((temp.shape[1], temp.shape[2]), dtype=bool)\nalreadyCheck = np.zeros((temp.shape[1], temp.shape[2]), dtype=bool)\n\nfor i in tqdm(range(len(checkedArr))):\n    for j in range(len(checkedArr[0])):\n        for l in range(len(checkedArr[0][0])):\n            if checkedArr[i, j, l] == 1:\n                queIdx = [0]\n                queCheck = 0\n                checkAmnt = 0\n                queArr[queIdx] = [j, l]\n                queIdx[0] += 1\n                \n                \n                while queIdx[0] - queCheck:\n                    index = queArr[queCheck]\n                    inQueArr[index[0], index[1]] = False\n                    queCheck += 1\n                    \n                    alreadyCheck[index[0], index[1]] = 1\n                    checkAmnt += 1\n                    '''\n                    addingToArr(index[0], index[1] + 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1] - 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1], index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1], index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] + 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] + 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] - 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] - 1, index[2], boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n\n                    addingToArr(index[0], index[1] + 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1] - 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1], index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1], index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] + 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] + 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] - 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] - 1, index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n\n                    addingToArr(index[0], index[1] + 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1] - 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1], index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1], index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] + 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] + 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1] - 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] - 1, index[1] - 1, index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n\n                    addingToArr(index[0], index[1], index[2] + 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1], index[2] - 1, boolArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    '''\n                    addingToArr(i, index[0]+1, index[1]+1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0]+1, index[1]-1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0]-1, index[1]-1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0]-1, index[1]+1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0]+1, index[1], checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0]-1, index[1], checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0], index[1]+1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(i, index[0], index[1]-1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                \n                checkedArr[i][alreadyCheck] = 0\n                if checkAmnt < 10:\n                    boolArr[i][alreadyCheck] = 0\n                alreadyCheck[alreadyCheck] = 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T06:36:13.183510Z","iopub.execute_input":"2024-12-03T06:36:13.183809Z","iopub.status.idle":"2024-12-03T06:44:07.734816Z","shell.execute_reply.started":"2024-12-03T06:36:13.183782Z","shell.execute_reply":"2024-12-03T06:44:07.733974Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def addingToArr(iZ, iY, iX, boolArr, alreadyCheck, queArr, queIdx, inQueArr):\n    if iZ >= 0 and iZ < len(boolArr) and iY >= 0 and iY < len(boolArr[0]) and iX >= 0 and iX < len(boolArr[0][0]):\n        if boolArr[iZ, iY, iX] == 1 and not alreadyCheck[iZ, iY, iX] and not inQueArr[iZ, iY, iX]:\n            queArr[queIdx] = [iZ, iY, iX]\n            inQueArr[iZ, iY, iX] = True\n            queIdx[0] = queIdx[0] + 1\n\nboolArr2 = boolArr.copy()\ntotalSum = boolArr2.sum()\ntotalSum2 = 0\nlast = 0\narr2 = None\ncheckedArr = boolArr2.copy()\n\nqueArr = np.empty((temp.shape[0] * temp.shape[1] * temp.shape[2], 3), dtype=int)\ninQueArr = np.zeros((temp.shape[0], temp.shape[1], temp.shape[2]), dtype=bool)\nalreadyCheck = np.zeros((temp.shape[0], temp.shape[1], temp.shape[2]), dtype=bool)\nfor i in tqdm(range(len(checkedArr))):\n    for j in range(len(checkedArr[0])):\n        for l in range(len(checkedArr[0][0])):\n            if checkedArr[i, j, l] == 1:\n                queIdx = [0]\n                queCheck = 0\n                checkAmnt = 0\n                queArr[queIdx] = [i, j, l]\n                queIdx[0] += 1\n                minZ = 10000\n                maxZ = -1\n                minY = 10000\n                maxY = -1\n                minX = 10000\n                maxX = -1\n\n            \n                notCheck = True\n                while queIdx[0] - queCheck:\n                    index = queArr[queCheck]\n                    inQueArr[index[0], index[1], index[2]] = False\n                    queCheck += 1\n                    \n                    alreadyCheck[index[0], index[1], index[2]] = 1\n                    if index[0] < minZ:\n                        minZ = index[0]\n                    if index[0] + 1 > maxZ:\n                        maxZ = index[0] + 1\n\n                    if index[1] < minY:\n                        minY = index[1]\n                    if index[1] + 1 > maxY:\n                        maxY = index[1] + 1\n\n\n                    if index[2] < minX:\n                        minX = index[2]\n                    if index[2] + 1 > maxX:\n                        maxX = index[2] + 1\n                        \n                    checkAmnt += 1\n                    \n                    addingToArr(index[0], index[1] + 1, index[2], checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1] - 1, index[2], checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0] + 1, index[1], index[2], checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1], index[2] + 1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                    addingToArr(index[0], index[1], index[2] - 1, checkedArr, alreadyCheck, queArr, queIdx, inQueArr)\n                \n                checkedArr[minZ:maxZ, minY:maxY, minX:maxX][alreadyCheck[minZ:maxZ, minY:maxY, minX:maxX]] = 0\n                totalSum2 += checkAmnt\n                if totalSum2 / totalSum - last > 0.05:\n                    last = totalSum2 / totalSum\n                    print(totalSum2 / totalSum, end=\" \")\n                \n                if checkAmnt < 10000:\n                    boolArr2[minZ:maxZ, minY:maxY, minX:maxX][alreadyCheck[minZ:maxZ, minY:maxY, minX:maxX]] = 0\n                    \n                alreadyCheck[minZ:maxZ, minY:maxY, minX:maxX][alreadyCheck[minZ:maxZ, minY:maxY, minX:maxX]] = 0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T06:44:24.615609Z","iopub.execute_input":"2024-12-03T06:44:24.615978Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"verts, faces, normals, values = measure.marching_cubes(boolArr2[15:50, 200:300, 200:300])\nlen(verts)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T06:34:37.627208Z","iopub.execute_input":"2024-12-03T06:34:37.627940Z","iopub.status.idle":"2024-12-03T06:34:37.656986Z","shell.execute_reply.started":"2024-12-03T06:34:37.627880Z","shell.execute_reply":"2024-12-03T06:34:37.656176Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"thefile = open('test.obj', 'w')\nfaces = faces + 1\nfor item in verts:\n  thefile.write(\"v {0} {1} {2}\\n\".format(item[0],item[1],item[2]))\n\nfor item in normals:\n  thefile.write(\"vn {0} {1} {2}\\n\".format(item[0],item[1],item[2]))\n\nfor item in faces:\n  thefile.write(\"f {0}//{0} {1}//{1} {2}//{2}\\n\".format(item[0],item[1],item[2]))  \n\nthefile.close()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T06:34:38.635327Z","iopub.execute_input":"2024-12-03T06:34:38.635683Z","iopub.status.idle":"2024-12-03T06:34:38.960689Z","shell.execute_reply.started":"2024-12-03T06:34:38.635654Z","shell.execute_reply":"2024-12-03T06:34:38.959766Z"}},"outputs":[],"execution_count":null}]}