From aa4cae89ada08370a3a82105ce2f6ae828e7372c Mon Sep 17 00:00:00 2001 From: Manuel Paez <79882298+mannypaeza@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:22:15 -0500 Subject: [PATCH 01/14] Add files via upload --- examples/config.yaml | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 examples/config.yaml diff --git a/examples/config.yaml b/examples/config.yaml new file mode 100644 index 0000000..5b010d5 --- /dev/null +++ b/examples/config.yaml @@ -0,0 +1,62 @@ +system: + cpus: 1 + gpus: 1 + seed: 1 + +dataset: + training: + s3vol01700: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_01700/img.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_01700/label_v3.h5" + s3vol02299: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_02299/img.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_02299/label_v3.h5" + s3vol02400: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_02400/img_zyx_2400-2656_5700-5956_2770-3026.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_02400/label_v1_diane.h5" + # s3vol02684: + # images: ["~/dropbox/40_gt/13_wasp_sample3/vol_02284/img_zyx_2400-2656_5700-5956_2770-3026.h5",] + # label: "~/dropbox/40_gt/13_wasp_sample3/vol_0684/label_v1_diane.h5" + s3vol02794: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_02794/img_zyx_2794-3050_5811-6067_8757-9013.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_02794/seg_v1_cropped.h5" + s3vol03290: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_03290/img_zyx_3290-3546_2375-2631_8450-8706.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_03290/label_v1.h5" + s3vol03700: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_03700/img_zyx_3700-3956_5000-5256_4250-4506.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_03700/label_v3.h5" + s3vol03998: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_03998/img.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_03998/label_v1.h5" + s3vol04900: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_04900/img.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_04900/label_v1.h5" + s3vol05250: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_05250/img_zyx_5250-5506_4600-4856_5500-5756.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_05250/label_v3_remove_contact.h5" + s3vol05450: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_05450/img_zyx_5450-5706_5350-5606_7000-7256.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_05450/label_v4_chiyip.h5" + validation: + s3vol04000: + images: ["~/dropbox/40_gt/13_wasp_sample3/vol_04000/img_zyx_4000-4256_3400-3656_8150-8406.h5",] + label: "~/dropbox/40_gt/13_wasp_sample3/vol_04000/label_v3.h5" +model: + in_channels: 1 + out_channels: 3 + +train: + iter_start: 0 + iter_stop: 1000000 + class_rebalance: false + # batch size per GPU + # The dataprovider should provide nGPU*batch_size batches! + batch_size: 1 + output_dir: "./" + patch_size: [128, 128, 128] + learning_rate: 0.001 + #training_interval: 200 + #validation_interval: 2000 + training_interval: 2 + validation_interval: 4 \ No newline at end of file From c8076850f6b28dd6201ba447c44a2bdfda79198d Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 27 Feb 2023 19:52:59 -0500 Subject: [PATCH 02/14] boundary augmentation --- neutorch/train/affinity_map.py | 3 ++- neutorch/train/boundary_aug.py | 36 ++++++++++++++++++++++++++++++++++ setup.py | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 neutorch/train/boundary_aug.py diff --git a/neutorch/train/affinity_map.py b/neutorch/train/affinity_map.py index b2a9daf..54b22e9 100644 --- a/neutorch/train/affinity_map.py +++ b/neutorch/train/affinity_map.py @@ -3,9 +3,10 @@ import click from yacs.config import CfgNode -from .base import TrainerBase from neutorch.data.dataset import AffinityMapDataset +from .base import TrainerBase + class AffinityMapTrainer(TrainerBase): def __init__(self, cfg: CfgNode) -> None: diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py new file mode 100644 index 0000000..b8a552d --- /dev/null +++ b/neutorch/train/boundary_aug.py @@ -0,0 +1,36 @@ +from functools import cached_property + +import click +from yacs.config import CfgNode + +from neutorch.data.dataset import AffinityMapDataset + +from .base import TrainerBase + + +class BoundaryAugTrainer(TrainerBase): + def __init__(self, cfg: CfgNode) -> None: + assert isinstance(cfg, CfgNode) + super().__init__(cfg) + self.cfg = cfg + breakpoint() + + @cached_property + def training_dataset(self): + return AffinityMapDataset.from_config(self.cfg, is_train=True) + + @cached_property + def validation_dataset(self): + return AffinityMapDataset.from_config(self.cfg, is_train=False) + +@click.command() +@click.option('--config-file', '-c', + type=click.Path(exists=True, dir_okay=False, file_okay=True, readable=True, resolve_path=True), + default='./config.yaml', + help = 'configuration file containing all the parameters.' +) +def main(config_file: str): + from neutorch.data.dataset import load_cfg + cfg = load_cfg(config_file) + trainer = BoundaryAugTrainer(cfg) + trainer() \ No newline at end of file diff --git a/setup.py b/setup.py index 4e9aff2..070a46a 100755 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ neutrain-denoise=neutorch.train.denoise:main neutrain-post=neutorch.train.post_synapses:main neutrain-affs=neutorch.train.affinity_map:main + neutrain-ba=neutorch.train.boundary_aug:main ''', classifiers=[ 'Development Status :: 4 - Beta', From 0754d9cda152b22df6f007a88ad6652684838f75 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 13 Mar 2023 14:26:47 -0400 Subject: [PATCH 03/14] commented reneu --- neutorch/data/dataset.py | 38 +++++++++++++++++++++++++++++++++----- neutorch/data/transform.py | 19 ++++++++++--------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/neutorch/data/dataset.py b/neutorch/data/dataset.py index a2883a9..389c0b9 100644 --- a/neutorch/data/dataset.py +++ b/neutorch/data/dataset.py @@ -1,15 +1,14 @@ +import math import random from functools import cached_property -import math import numpy as np import torch -from yacs.config import CfgNode - from chunkflow.lib.cartesian_coordinate import Cartesian +from yacs.config import CfgNode -from neutorch.data.transform import * from neutorch.data.sample import SemanticSample +from neutorch.data.transform import * DEFAULT_PATCH_SIZE = Cartesian(128, 128, 128) @@ -273,6 +272,34 @@ def transform(self): Label2AffinityMap(probability=1.), ]) +class BoundaryAugmentationDataset(SemanticDataset): + def __initi__(self, samples: list): + super.__init__(samples) + + @cached_property + def transform(self): + return Compose([ + NormalizeTo01(probability=1.), + AdjustBrightness(), + AdjustContrast(), + Gamma(), + OneOf([ + Noise(), + GaussianBlur2D(), + ]), + MaskBox(), + Perspective2D(), + # RotateScale(probability=1.), + # DropSection(), + Flip(), + Transpose(), + MissAlignment(), + # Tranform to affinity map + # there is a shrinking, so we put this transformation here + # rather than the label2target function. + Label2AffinityMap(probability=1.), + ]) + if __name__ == '__main__': from yacs.config import CfgNode @@ -288,4 +315,5 @@ def transform(self): patch_size=Cartesian(128, 128, 128), ) - # print(sd.samples) \ No newline at end of file + # print(sd.samples) + \ No newline at end of file diff --git a/neutorch/data/transform.py b/neutorch/data/transform.py index 945c275..c88a5a7 100644 --- a/neutorch/data/transform.py +++ b/neutorch/data/transform.py @@ -1,24 +1,25 @@ -from abc import ABC, abstractmethod import random +from abc import ABC, abstractmethod from functools import cached_property - +import cv2 +import numpy as np from chunkflow.lib.cartesian_coordinate import Cartesian +# from reneu.lib.segmentation import seg_to_affs +from scipy.ndimage.filters import gaussian_filter +from skimage.transform import swirl +from skimage.util import random_noise + +from .patch import Patch + # from copy import deepcopy -import numpy as np -from scipy.ndimage.filters import gaussian_filter # from scipy.ndimage import affine_transform -import cv2 -from skimage.util import random_noise -from skimage.transform import swirl -from reneu.lib.segmentation import seg_to_affs -from .patch import Patch DEFAULT_PROBABILITY = .5 From 4a8f876216ef611dda5d7641c9733b5de4c30493 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 13 Mar 2023 14:29:46 -0400 Subject: [PATCH 04/14] commentted reneu --- neutorch/data/transform.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/neutorch/data/transform.py b/neutorch/data/transform.py index c88a5a7..3caa248 100644 --- a/neutorch/data/transform.py +++ b/neutorch/data/transform.py @@ -17,11 +17,6 @@ # from scipy.ndimage import affine_transform - - - - - DEFAULT_PROBABILITY = .5 DEFAULT_SHRINK_SIZE = (0, 0, 0, 0, 0, 0) From 5d659a58e7cce8ec854b934a7940f41baded6c04 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 13 Mar 2023 14:59:39 -0400 Subject: [PATCH 05/14] added --- examples/config.yaml | 2 +- neutorch/data/patch.py | 3 ++- neutorch/train/boundary_aug.py | 15 +++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/config.yaml b/examples/config.yaml index 5b010d5..e4259d0 100644 --- a/examples/config.yaml +++ b/examples/config.yaml @@ -43,7 +43,7 @@ dataset: images: ["~/dropbox/40_gt/13_wasp_sample3/vol_04000/img_zyx_4000-4256_3400-3656_8150-8406.h5",] label: "~/dropbox/40_gt/13_wasp_sample3/vol_04000/label_v3.h5" model: - in_channels: 1 + in_channels: 3 out_channels: 3 train: diff --git a/neutorch/data/patch.py b/neutorch/data/patch.py index 1d3554f..8d6c829 100644 --- a/neutorch/data/patch.py +++ b/neutorch/data/patch.py @@ -1,8 +1,9 @@ from functools import cached_property -import numpy as np +import numpy as np # from torch import tensor, device import torch + # torch.multiprocessing.set_start_method('spawn') # from chunkflow.lib.cartesian_coordinate import Cartesian diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index b8a552d..a41fb2a 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -1,9 +1,11 @@ from functools import cached_property import click +import numpy as np +import tensorflow as tf from yacs.config import CfgNode -from neutorch.data.dataset import AffinityMapDataset +from neutorch.data.dataset import BoundaryAugmentationDataset from .base import TrainerBase @@ -17,11 +19,11 @@ def __init__(self, cfg: CfgNode) -> None: @cached_property def training_dataset(self): - return AffinityMapDataset.from_config(self.cfg, is_train=True) + return BoundaryAugmentationDataset.from_config(self.cfg, is_train=True) @cached_property def validation_dataset(self): - return AffinityMapDataset.from_config(self.cfg, is_train=False) + return BoundaryAugmentationDataset.from_config(self.cfg, is_train=False) @click.command() @click.option('--config-file', '-c', @@ -29,8 +31,13 @@ def validation_dataset(self): default='./config.yaml', help = 'configuration file containing all the parameters.' ) + def main(config_file: str): from neutorch.data.dataset import load_cfg cfg = load_cfg(config_file) trainer = BoundaryAugTrainer(cfg) - trainer() \ No newline at end of file + trainer() + + #Tensorboard configuration + #maybe not + From eb6da3ff094ea72162ebba400b7e1463c22e279c Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 13 Mar 2023 16:00:57 -0400 Subject: [PATCH 06/14] stuff --- neutorch/train/boundary_aug.py | 1 - requirements.txt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index a41fb2a..4285ed6 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -2,7 +2,6 @@ import click import numpy as np -import tensorflow as tf from yacs.config import CfgNode from neutorch.data.dataset import BoundaryAugmentationDataset diff --git a/requirements.txt b/requirements.txt index 3269f25..bb52fe1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ torch torchvision yacs h5py +tensorflow tensorboard opencv-python scikit-image From dfb2500c5b1bf380e4e1bf55993a82ce343fb638 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Mon, 13 Mar 2023 16:11:03 -0400 Subject: [PATCH 07/14] made change --- neutorch/train/base.py | 21 +++++++++------------ requirements.txt | 1 - 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/neutorch/train/base.py b/neutorch/train/base.py index cbae7a8..bad344c 100644 --- a/neutorch/train/base.py +++ b/neutorch/train/base.py @@ -1,25 +1,22 @@ +import os +import random from abc import ABC, abstractproperty from functools import cached_property from glob import glob - -import random -import os from time import time -from yacs.config import CfgNode import numpy as np - -from chunkflow.lib.cartesian_coordinate import Cartesian - import torch -from torch.utils.tensorboard import SummaryWriter +from chunkflow.lib.cartesian_coordinate import Cartesian from torch.utils.data import DataLoader -from neutorch.data.patch import collate_batch +from torch.utils.tensorboard import SummaryWriter +from yacs.config import CfgNode -from neutorch.model.IsoRSUNet import Model -from neutorch.model.io import save_chkpt, load_chkpt, log_tensor -from neutorch.loss import BinomialCrossEntropyWithLogits from neutorch.data.dataset import worker_init_fn +from neutorch.data.patch import collate_batch +from neutorch.loss import BinomialCrossEntropyWithLogits +from neutorch.model.io import load_chkpt, log_tensor, save_chkpt +from neutorch.model.IsoRSUNet import Model class TrainerBase(ABC): diff --git a/requirements.txt b/requirements.txt index bb52fe1..3269f25 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,6 @@ torch torchvision yacs h5py -tensorflow tensorboard opencv-python scikit-image From f59b2faa09ab880f24b422cbcb6aab715ebc69a2 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 14 Mar 2023 11:40:37 -0400 Subject: [PATCH 08/14] tensorboard --- neutorch/data/dataset.py | 4 +- neutorch/train/boundary_aug.py | 72 +++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/neutorch/data/dataset.py b/neutorch/data/dataset.py index 389c0b9..ea2859e 100644 --- a/neutorch/data/dataset.py +++ b/neutorch/data/dataset.py @@ -272,7 +272,7 @@ def transform(self): Label2AffinityMap(probability=1.), ]) -class BoundaryAugmentationDataset(SemanticDataset): +class BoundaryAugmentationDataset(SemanticDataset): #for now def __initi__(self, samples: list): super.__init__(samples) @@ -309,7 +309,7 @@ def transform(self): cfg = CfgNode.load_cfg(file) cfg.freeze() - sd = AffinityMapDataset( + sd = BoundaryAugmentationDataset( path_list=['/mnt/ceph/users/neuro/wasp_em/jwu/40_gt/13_wasp_sample3/vol_01700/rna_v1.h5'], sample_name_to_image_versions=cfg.dataset.sample_name_to_image_versions, patch_size=Cartesian(128, 128, 128), diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index 4285ed6..87e30a8 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -2,14 +2,18 @@ import click import numpy as np +import torch from yacs.config import CfgNode +from torch.utils.tensorboard import SummaryWriter +from .base import SemanticTrainer from neutorch.data.dataset import BoundaryAugmentationDataset +from neutorch.model.io import log_tensor from .base import TrainerBase -class BoundaryAugTrainer(TrainerBase): +class BoundaryAugTrainer(SemanticTrainer): def __init__(self, cfg: CfgNode) -> None: assert isinstance(cfg, CfgNode) super().__init__(cfg) @@ -24,6 +28,72 @@ def training_dataset(self): def validation_dataset(self): return BoundaryAugmentationDataset.from_config(self.cfg, is_train=False) + # def label_to_target(self, label: torch.Tensor): + # return (label > 0).float + +""" + @catch_property + def loss(self): + #loss module for the training +""" +""" + def call(self): + writer = SummaryWriter(log_dir=self.cfg.train.output_dir) + accumulated_loss = 0. #floating point + + for image, label in self.training_data_loader: + itder_idx += 1 + if iter_idx> self.cfg.train.iter_stop: + print('exeeds maximum iteration:', self.cfg.train.iter_stop) + return + + pint = time() + predict = self.model(image) + loss = self.loss_module(predict, label) + assert not torch.isnan(loss), 'loss is NaN.' + + self.optimizer #fix + loss.backward() + self.optimizer.step() + accumulated_loss += loss.tolist() + + if iter_idx % self.cfg.train.training_interval == 0 and iter_idx > 0: + per_voxel_loss = accumulated_loss / \ + self.cfg.train.training_interval / \ + self.voxel_num + + print(f'iteration {iter_idx} takes {round(time()-ping, 3)} seconds with loss: {per_voxel_loss}') + #print(f'training loss {round(per_voxel_loss, 3)}') + accumulated_loss = 0. + predict = self.post_processing(predict) + writer.add_scalar('loss/train', per_voxel_loss, iter_idx) + log_tensor(writer, 'train/image', image, 'image', iter_idx) + log_tensor(writer, 'train/prediction', predict.detach(), 'image', iter_idx) + log_tensor(writer, 'train/label', label, 'segmentation', iter_idx) + + if iter_idx % self.cfg.train.validation_interval == 0 and iter_idx > 0: + fname = os.path.join(self.cfg.train.output_dir, f'model_{iter_idx}.chkpt') + print(f'save model to {fname}') + save_chkpt(self.model, self.cfg.train.output_dir, iter_idx, self.optimizer) + + print('evaluate prediction: ') + validation_image, validation_label = next(self.validation_data_iter) + + with torch.no_grad(): + validation_predict = self.model(validation_image) + validation_loss = self.loss_module(validation_predict, validation_label) + validation_predict = self.post_processing(validation_predict) + per_voxel_loss = validation_loss.tolist() / self.voxel_num + print(f'iteration {iter_idx} takes {round(time()-ping, 3)} seconds with loss: {per_voxel_loss}') + # print(f'iter {iter_idx}: validation loss: {round(per_voxel_loss, 3)}') + writer.add_scalar('loss/validation', per_voxel_loss, iter_idx) + log_tensor(writer, 'validation/image', validation_image, 'image', iter_idx) + log_tensor(writer, 'validation/prediction', validation_predict, 'image', iter_idx) + log_tensor(writer, 'validation/label', validation_label, 'segmentation', iter_idx) + + writer.close() +""" + @click.command() @click.option('--config-file', '-c', type=click.Path(exists=True, dir_okay=False, file_okay=True, readable=True, resolve_path=True), From 11a2e15aa39797a4bcb3eafeb890f48a33576fd5 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 14 Mar 2023 12:27:16 -0400 Subject: [PATCH 09/14] here --- neutorch/train/boundary_aug.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index 87e30a8..60e8aef 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -3,14 +3,13 @@ import click import numpy as np import torch +from torch.utils.tensorboard import SummaryWriter from yacs.config import CfgNode -from torch.utils.tensorboard import SummaryWriter -from .base import SemanticTrainer from neutorch.data.dataset import BoundaryAugmentationDataset - from neutorch.model.io import log_tensor -from .base import TrainerBase + +from .base import SemanticTrainer, TrainerBase class BoundaryAugTrainer(SemanticTrainer): From b96d84cb96a27ad64eeb08ce847b4e4c96f69c1b Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 21 Mar 2023 13:33:04 -0400 Subject: [PATCH 10/14] changes --- neutorch/data/dataset.py | 16 +++++++--------- neutorch/data/sample.py | 7 ++++++- neutorch/train/boundary_aug.py | 27 ++++++++++----------------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/neutorch/data/dataset.py b/neutorch/data/dataset.py index ea2859e..4a553cb 100644 --- a/neutorch/data/dataset.py +++ b/neutorch/data/dataset.py @@ -266,12 +266,10 @@ def transform(self): Flip(), Transpose(), MissAlignment(), - # Tranform to affinity map - # there is a shrinking, so we put this transformation here - # rather than the label2target function. Label2AffinityMap(probability=1.), ]) + class BoundaryAugmentationDataset(SemanticDataset): #for now def __initi__(self, samples: list): super.__init__(samples) @@ -294,11 +292,13 @@ def transform(self): Flip(), Transpose(), MissAlignment(), - # Tranform to affinity map - # there is a shrinking, so we put this transformation here - # rather than the label2target function. - Label2AffinityMap(probability=1.), + # Label2AffinityMap(probability=1.), ]) + + """ binarization of the dataset + + + """ if __name__ == '__main__': @@ -314,6 +314,4 @@ def transform(self): sample_name_to_image_versions=cfg.dataset.sample_name_to_image_versions, patch_size=Cartesian(128, 128, 128), ) - - # print(sd.samples) \ No newline at end of file diff --git a/neutorch/data/sample.py b/neutorch/data/sample.py index 00692b4..3e11835 100644 --- a/neutorch/data/sample.py +++ b/neutorch/data/sample.py @@ -7,7 +7,12 @@ from chunkflow.lib.cartesian_coordinate import BoundingBox, Cartesian from chunkflow.chunk import Chunk -from chunkflow.chunk.utils import load_chunk_or_volume +try: + import chunkflow.chunk.utils + has_chunkflowchunkutils = True +except ImportError: + has_chunkflowchunkutils = False + from chunkflow.lib.synapses import Synapses from neutorch.data.patch import Patch diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index 60e8aef..dfc81a6 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -5,9 +5,10 @@ import torch from torch.utils.tensorboard import SummaryWriter from yacs.config import CfgNode +from time import time from neutorch.data.dataset import BoundaryAugmentationDataset -from neutorch.model.io import log_tensor +from neutorch.model.io import save_chkpt, log_tensor from .base import SemanticTrainer, TrainerBase @@ -27,22 +28,17 @@ def training_dataset(self): def validation_dataset(self): return BoundaryAugmentationDataset.from_config(self.cfg, is_train=False) - # def label_to_target(self, label: torch.Tensor): - # return (label > 0).float + """ -> binarization/skeletonization + def label_to_target(self, label: torch.Tensor): + return (label > 0).float -""" - @catch_property - def loss(self): - #loss module for the training -""" -""" def call(self): writer = SummaryWriter(log_dir=self.cfg.train.output_dir) accumulated_loss = 0. #floating point for image, label in self.training_data_loader: - itder_idx += 1 - if iter_idx> self.cfg.train.iter_stop: + iter_idx += 1 + if iter_idx > self.cfg.train.iter_stop: print('exeeds maximum iteration:', self.cfg.train.iter_stop) return @@ -51,18 +47,18 @@ def call(self): loss = self.loss_module(predict, label) assert not torch.isnan(loss), 'loss is NaN.' - self.optimizer #fix + self.optimizer # loss.backward() self.optimizer.step() accumulated_loss += loss.tolist() + #fix if iter_idx % self.cfg.train.training_interval == 0 and iter_idx > 0: per_voxel_loss = accumulated_loss / \ self.cfg.train.training_interval / \ self.voxel_num print(f'iteration {iter_idx} takes {round(time()-ping, 3)} seconds with loss: {per_voxel_loss}') - #print(f'training loss {round(per_voxel_loss, 3)}') accumulated_loss = 0. predict = self.post_processing(predict) writer.add_scalar('loss/train', per_voxel_loss, iter_idx) @@ -84,14 +80,13 @@ def call(self): validation_predict = self.post_processing(validation_predict) per_voxel_loss = validation_loss.tolist() / self.voxel_num print(f'iteration {iter_idx} takes {round(time()-ping, 3)} seconds with loss: {per_voxel_loss}') - # print(f'iter {iter_idx}: validation loss: {round(per_voxel_loss, 3)}') writer.add_scalar('loss/validation', per_voxel_loss, iter_idx) log_tensor(writer, 'validation/image', validation_image, 'image', iter_idx) log_tensor(writer, 'validation/prediction', validation_predict, 'image', iter_idx) log_tensor(writer, 'validation/label', validation_label, 'segmentation', iter_idx) writer.close() -""" + """ @click.command() @click.option('--config-file', '-c', @@ -106,6 +101,4 @@ def main(config_file: str): trainer = BoundaryAugTrainer(cfg) trainer() - #Tensorboard configuration - #maybe not From 9831eadb8a37972bcd2d4b7f64d0cf41a3235dc6 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 21 Mar 2023 14:05:07 -0400 Subject: [PATCH 11/14] changes --- neutorch/data/dataset.py | 7 ------- neutorch/data/sample.py | 1 + neutorch/train/boundary_aug.py | 11 +++-------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/neutorch/data/dataset.py b/neutorch/data/dataset.py index 4a553cb..6f81900 100644 --- a/neutorch/data/dataset.py +++ b/neutorch/data/dataset.py @@ -245,7 +245,6 @@ def __next__(self): class AffinityMapDataset(SemanticDataset): def __init__(self, samples: list): - #patch_size: Cartesian = DEFAULT_PATCH_SIZE): super().__init__(samples) @cached_property @@ -292,13 +291,7 @@ def transform(self): Flip(), Transpose(), MissAlignment(), - # Label2AffinityMap(probability=1.), ]) - - """ binarization of the dataset - - - """ if __name__ == '__main__': diff --git a/neutorch/data/sample.py b/neutorch/data/sample.py index 3e11835..40c09ca 100644 --- a/neutorch/data/sample.py +++ b/neutorch/data/sample.py @@ -7,6 +7,7 @@ from chunkflow.lib.cartesian_coordinate import BoundingBox, Cartesian from chunkflow.chunk import Chunk + try: import chunkflow.chunk.utils has_chunkflowchunkutils = True diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index dfc81a6..27764be 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -1,14 +1,15 @@ +import os from functools import cached_property +from time import time import click import numpy as np import torch from torch.utils.tensorboard import SummaryWriter from yacs.config import CfgNode -from time import time from neutorch.data.dataset import BoundaryAugmentationDataset -from neutorch.model.io import save_chkpt, log_tensor +from neutorch.model.io import log_tensor, save_chkpt from .base import SemanticTrainer, TrainerBase @@ -28,10 +29,6 @@ def training_dataset(self): def validation_dataset(self): return BoundaryAugmentationDataset.from_config(self.cfg, is_train=False) - """ -> binarization/skeletonization - def label_to_target(self, label: torch.Tensor): - return (label > 0).float - def call(self): writer = SummaryWriter(log_dir=self.cfg.train.output_dir) accumulated_loss = 0. #floating point @@ -52,7 +49,6 @@ def call(self): self.optimizer.step() accumulated_loss += loss.tolist() - #fix if iter_idx % self.cfg.train.training_interval == 0 and iter_idx > 0: per_voxel_loss = accumulated_loss / \ self.cfg.train.training_interval / \ @@ -86,7 +82,6 @@ def call(self): log_tensor(writer, 'validation/label', validation_label, 'segmentation', iter_idx) writer.close() - """ @click.command() @click.option('--config-file', '-c', From 4687fe258be332bd9550a008efb903d847954156 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 21 Mar 2023 14:17:11 -0400 Subject: [PATCH 12/14] change --- neutorch/data/sample.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/neutorch/data/sample.py b/neutorch/data/sample.py index 40c09ca..3ba5614 100644 --- a/neutorch/data/sample.py +++ b/neutorch/data/sample.py @@ -8,12 +8,7 @@ from chunkflow.lib.cartesian_coordinate import BoundingBox, Cartesian from chunkflow.chunk import Chunk -try: - import chunkflow.chunk.utils - has_chunkflowchunkutils = True -except ImportError: - has_chunkflowchunkutils = False - +from chunkflow.chunk.utils import load_chunk_or_volume from chunkflow.lib.synapses import Synapses from neutorch.data.patch import Patch From 0feb0b44ded7977a16ea579ea796dbdcc2b2cf1a Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 21 Mar 2023 14:21:22 -0400 Subject: [PATCH 13/14] yes --- neutorch/data/sample.py | 1 - neutorch/train/boundary_aug.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/neutorch/data/sample.py b/neutorch/data/sample.py index 3ba5614..00692b4 100644 --- a/neutorch/data/sample.py +++ b/neutorch/data/sample.py @@ -7,7 +7,6 @@ from chunkflow.lib.cartesian_coordinate import BoundingBox, Cartesian from chunkflow.chunk import Chunk - from chunkflow.chunk.utils import load_chunk_or_volume from chunkflow.lib.synapses import Synapses diff --git a/neutorch/train/boundary_aug.py b/neutorch/train/boundary_aug.py index 27764be..76c8450 100644 --- a/neutorch/train/boundary_aug.py +++ b/neutorch/train/boundary_aug.py @@ -13,7 +13,6 @@ from .base import SemanticTrainer, TrainerBase - class BoundaryAugTrainer(SemanticTrainer): def __init__(self, cfg: CfgNode) -> None: assert isinstance(cfg, CfgNode) @@ -29,6 +28,7 @@ def training_dataset(self): def validation_dataset(self): return BoundaryAugmentationDataset.from_config(self.cfg, is_train=False) + """ def call(self): writer = SummaryWriter(log_dir=self.cfg.train.output_dir) accumulated_loss = 0. #floating point @@ -82,6 +82,7 @@ def call(self): log_tensor(writer, 'validation/label', validation_label, 'segmentation', iter_idx) writer.close() + """ @click.command() @click.option('--config-file', '-c', From 56d2c69576b365ffc82ce6931bea9325ff986466 Mon Sep 17 00:00:00 2001 From: Manuel Paez Date: Tue, 21 Mar 2023 14:35:31 -0400 Subject: [PATCH 14/14] changes --- neutorch/data/dataset.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/neutorch/data/dataset.py b/neutorch/data/dataset.py index 6f81900..0c3f795 100644 --- a/neutorch/data/dataset.py +++ b/neutorch/data/dataset.py @@ -268,8 +268,7 @@ def transform(self): Label2AffinityMap(probability=1.), ]) - -class BoundaryAugmentationDataset(SemanticDataset): #for now +class BoundaryAugmentationDataset(SemanticDataset): def __initi__(self, samples: list): super.__init__(samples)