From 27482d8358a284fe25130ecbd8f13d5b0effe12a Mon Sep 17 00:00:00 2001 From: Reza Asakereh Date: Mon, 11 Mar 2024 17:47:20 -0400 Subject: [PATCH] Boundary selection bug and peogress check setup fixed --- MedSAM/MedSAMLite/MedSAMLite.py | 9 ++++----- server/server.py | 6 +++--- server_essentials.zip | Bin 36888334 -> 36888345 bytes 3 files changed, 7 insertions(+), 8 deletions(-) mode change 100644 => 100755 MedSAM/MedSAMLite/MedSAMLite.py mode change 100644 => 100755 server/server.py diff --git a/MedSAM/MedSAMLite/MedSAMLite.py b/MedSAM/MedSAMLite/MedSAMLite.py old mode 100644 new mode 100755 index f048495..264fb2a --- a/MedSAM/MedSAMLite/MedSAMLite.py +++ b/MedSAM/MedSAMLite/MedSAMLite.py @@ -280,7 +280,7 @@ def setup(self) -> None: # Buttons self.ui.pbUpgrade.connect('clicked(bool)', lambda: self.logic.run_on_background(self.logic.upgrade, (True,), 'Checking for updates...')) - self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage()) + self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False)) self.ui.pbSegment.connect('clicked(bool)', lambda: self.logic.applySegmentation()) self.ui.pbCTprep.setIcon(QIcon(os.path.join(self.logic.server_dir, 'CT.jpg'))) @@ -744,9 +744,8 @@ def sendImage(self, partial=False, serverUrl='http://127.0.0.1:5555', numpyServe ########################### # Timer - if self.timer is None: - self.timer = QTimer() - self.timer.timeout.connect(lambda: self.progressCheck(partial)) + self.timer = QTimer() + self.timer.timeout.connect(lambda: self.progressCheck(partial)) ########################### self.progressbar = slicer.util.createProgressDialog(autoClose=False) self.progressbar.minimum = 0 @@ -805,7 +804,7 @@ def singleSegmentation(self, serverUrl): def applySegmentation(self, serverUrl='http://127.0.0.1:5555'): if self.widget.ui.pbSegment.text == 'Single Segmentation': - continueSingle = QMessageBox.question(None,'', "You are using single segmentation option which is faster but is not advised if you want multiple regions be segmented in one image. In that case click 'Send Image' button. Do you wish to continue with single segmentation?", QMessageBox.Yes | QMessageBox.No) + continueSingle = QMessageBox.question(None,'', "You are using single segmentation option which is faster but is not advised if you want large or multiple regions be segmented in one image. In that case click 'Send Image' button. Do you wish to continue with single segmentation?", QMessageBox.Yes | QMessageBox.No) if continueSingle == QMessageBox.No: return self.singleSegmentation(serverUrl) diff --git a/server/server.py b/server/server.py old mode 100644 new mode 100755 index 9b67774..07afa5b --- a/server/server.py +++ b/server/server.py @@ -251,7 +251,7 @@ def get_image(wmin: int, wmax: int, zmin: int, zmax: int): img_1024_tensor = ( torch.tensor(img_1024).float().permute(2, 0, 1).unsqueeze(0).to(device) ) - if (zmax == -1) or (zmin <= slice_idx <= zmax): + if (zmax == -1) or ((zmin-1) <= slice_idx <= (zmax+1)): with torch.no_grad(): embedding = medsam_model.image_encoder(img_1024_tensor) # (1, 256, 64, 64) else: @@ -312,8 +312,8 @@ class InferenceParams(BaseModel): def infer(params: InferenceParams): print(params.slice_idx, params.bbox, params.zrange) zmin, zmax = params.zrange - zmax += 1 - zmin -= 1 + zmax = min(zmax+1, len(embeddings)) + zmin = max(zmin-1, 0) bbox_1024_prev = np.array([params.bbox]) / np.array([W, H, W, H]) * 256 res = {} diff --git a/server_essentials.zip b/server_essentials.zip index 0737fab484b9292c6cd90ecb888c2acca6025633..f4a8d237dfd3a818ceeadc80d59cfdaf5c80812d 100644 GIT binary patch delta 9785 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%0At@_HhDD#|d$7F5N*ActGjLq~*4AJ`cD)$NU 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 Oh=h4w!A~s?j{gA|dPLj+ delta 9932 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