diff --git a/PrediccionesFCN/201966_sat.jpg b/PrediccionesFCN/201966_sat.jpg new file mode 100644 index 0000000000..e82059aab7 Binary files /dev/null and b/PrediccionesFCN/201966_sat.jpg differ diff --git a/PrediccionesFCN/298983_sat.jpg b/PrediccionesFCN/298983_sat.jpg new file mode 100644 index 0000000000..19ee794d1e Binary files /dev/null and b/PrediccionesFCN/298983_sat.jpg differ diff --git a/PrediccionesFCN/650673_sat.jpg b/PrediccionesFCN/650673_sat.jpg new file mode 100644 index 0000000000..b7a73a7214 Binary files /dev/null and b/PrediccionesFCN/650673_sat.jpg differ diff --git a/PrediccionesFCN/802551_sat.jpg b/PrediccionesFCN/802551_sat.jpg new file mode 100644 index 0000000000..8932360a03 Binary files /dev/null and b/PrediccionesFCN/802551_sat.jpg differ diff --git a/PrediccionesFCN/896504_sat.jpg b/PrediccionesFCN/896504_sat.jpg new file mode 100644 index 0000000000..2dfb189ea6 Binary files /dev/null and b/PrediccionesFCN/896504_sat.jpg differ diff --git a/Test_model.zip b/Test_model.zip new file mode 100644 index 0000000000..015adb366d Binary files /dev/null and b/Test_model.zip differ diff --git a/Test_model/201966_sat.jpg b/Test_model/201966_sat.jpg new file mode 100644 index 0000000000..f56da1d8ef Binary files /dev/null and b/Test_model/201966_sat.jpg differ diff --git a/Test_model/298983_sat.jpg b/Test_model/298983_sat.jpg new file mode 100644 index 0000000000..58c5be9e20 Binary files /dev/null and b/Test_model/298983_sat.jpg differ diff --git a/Test_model/650673_sat.jpg b/Test_model/650673_sat.jpg new file mode 100644 index 0000000000..1bd97a8cd8 Binary files /dev/null and b/Test_model/650673_sat.jpg differ diff --git a/Test_model/802551_sat.jpg b/Test_model/802551_sat.jpg new file mode 100644 index 0000000000..2e7cb73e16 Binary files /dev/null and b/Test_model/802551_sat.jpg differ diff --git a/Test_model/896504_sat.jpg b/Test_model/896504_sat.jpg new file mode 100644 index 0000000000..bf7c8a0d44 Binary files /dev/null and b/Test_model/896504_sat.jpg differ diff --git a/configs/_base_/datasets/deepGlobe.py b/configs/_base_/datasets/deepGlobe.py new file mode 100644 index 0000000000..4e6f44bdf5 --- /dev/null +++ b/configs/_base_/datasets/deepGlobe.py @@ -0,0 +1,69 @@ +#configs/_base_/datasets/deepGlobe.py +#mmseseg/configs/_base_/datasets/deepGlobe.py +# dataset settings +dataset_type = 'DeepGlobeDataset' +data_root = 'data/deepglobe_ds/' +crop_size = (256, 256) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations'), + dict( + type='RandomResize', + scale=(512, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75), + dict(type='RandomFlip', prob=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='PackSegInputs') +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', scale=(512, 512), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type='LoadAnnotations'), + dict(type='PackSegInputs') +] +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type='LoadImageFromFile', backend_args=None), + dict( + type='TestTimeAug', + transforms=[ + [ + dict(type='Resize', scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type='RandomFlip', prob=0., direction='horizontal'), + dict(type='RandomFlip', prob=1., direction='horizontal') + ], [dict(type='LoadAnnotations')], [dict(type='PackSegInputs')] + ]) +] +train_dataloader = dict( + batch_size=32, + num_workers=4, + persistent_workers=True, + sampler=dict(type='InfiniteSampler', shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train_sat', seg_map_path='ann_dir/train_mask_grayscale'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=16, + num_workers=4, + persistent_workers=True, + sampler=dict(type='DefaultSampler', shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/val_sat', seg_map_path='ann_dir/val_mask_grayscale'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type='IoUMetric', iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py index 272b4d2467..96aa87149a 100644 --- a/configs/_base_/default_runtime.py +++ b/configs/_base_/default_runtime.py @@ -4,7 +4,9 @@ mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), dist_cfg=dict(backend='nccl'), ) -vis_backends = [dict(type='LocalVisBackend')] +vis_backends = [dict(type='LocalVisBackend'), + dict(type='TensorboardVisBackend')] + visualizer = dict( type='SegLocalVisualizer', vis_backends=vis_backends, name='visualizer') log_processor = dict(by_epoch=False) diff --git a/configs/_base_/models/ccnet_r50-d8.py b/configs/_base_/models/ccnet_r50-d8_deepglobe_5.py similarity index 92% rename from configs/_base_/models/ccnet_r50-d8.py rename to configs/_base_/models/ccnet_r50-d8_deepglobe_5.py index 575d8eb459..e8909c99a6 100644 --- a/configs/_base_/models/ccnet_r50-d8.py +++ b/configs/_base_/models/ccnet_r50-d8_deepglobe_5.py @@ -2,8 +2,8 @@ norm_cfg = dict(type='SyncBN', requires_grad=True) data_preprocessor = dict( type='SegDataPreProcessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], + mean=[0.4082, 0.3791, 0.2815], + std=[0.1451, 0.1116, 0.1013], bgr_to_rgb=True, pad_val=0, seg_pad_val=255) @@ -29,7 +29,7 @@ channels=512, recurrence=2, dropout_ratio=0.1, - num_classes=19, + num_classes=7, norm_cfg=norm_cfg, align_corners=False, loss_decode=dict( @@ -42,7 +42,7 @@ num_convs=1, concat_input=False, dropout_ratio=0.1, - num_classes=19, + num_classes=7, norm_cfg=norm_cfg, align_corners=False, loss_decode=dict( diff --git a/configs/_base_/models/deeplabv3_r50-d8.py b/configs/_base_/models/deeplabv3_r50-d8.py index 22efe9a6ca..caa74a096b 100644 --- a/configs/_base_/models/deeplabv3_r50-d8.py +++ b/configs/_base_/models/deeplabv3_r50-d8.py @@ -1,9 +1,10 @@ +#configs/_base_/models/deeplabv3_r50-d8.py # model settings norm_cfg = dict(type='SyncBN', requires_grad=True) data_preprocessor = dict( type='SegDataPreProcessor', - mean=[123.675, 116.28, 103.53], - std=[58.395, 57.12, 57.375], + mean=[0.4082, 0.3791, 0.2815], + std=[ 0.1451, 0.1116, 0.1013], bgr_to_rgb=True, pad_val=0, seg_pad_val=255) @@ -29,7 +30,7 @@ channels=512, dilations=(1, 12, 24, 36), dropout_ratio=0.1, - num_classes=19, + num_classes=7, norm_cfg=norm_cfg, align_corners=False, loss_decode=dict( @@ -42,7 +43,7 @@ num_convs=1, concat_input=False, dropout_ratio=0.1, - num_classes=19, + num_classes=7, norm_cfg=norm_cfg, align_corners=False, loss_decode=dict( diff --git a/configs/_base_/models/deeplabv3plus_r50-d8_deepglobe.py b/configs/_base_/models/deeplabv3plus_r50-d8_deepglobe.py new file mode 100644 index 0000000000..2451ce45a3 --- /dev/null +++ b/configs/_base_/models/deeplabv3plus_r50-d8_deepglobe.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[0.4082, 0.3791, 0.2815], + std=[ 0.1451, 0.1116, 0.1013], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='DepthwiseSeparableASPPHead', + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_hr18_deepGlobe.py b/configs/_base_/models/fcn_hr18_deepGlobe.py new file mode 100644 index 0000000000..0faaa1e567 --- /dev/null +++ b/configs/_base_/models/fcn_hr18_deepGlobe.py @@ -0,0 +1,60 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[0.4082, 0.3791, 0.2815], + std=[ 0.1351, 0.1022, 0.0931], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://msra/hrnetv2_w18', + backbone=dict( + type='HRNet', + norm_cfg=norm_cfg, + norm_eval=False, + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(18, 36)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(18, 36, 72)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(18, 36, 72, 144)))), + decode_head=dict( + type='FCNHead', + in_channels=[18, 36, 72, 144], + in_index=(0, 1, 2, 3), + channels=sum([18, 36, 72, 144]), + input_transform='resize_concat', + kernel_size=1, + num_convs=1, + concat_input=False, + dropout_ratio=-1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/fcn_r50-d8deepglobe.py b/configs/_base_/models/fcn_r50-d8deepglobe.py new file mode 100644 index 0000000000..3e033fe47d --- /dev/null +++ b/configs/_base_/models/fcn_r50-d8deepglobe.py @@ -0,0 +1,53 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[0.4082, 0.3791, 0.2815], + std=[0.1351, 0.1022, 0.0931], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='FCNHead', + in_channels=2048, + in_index=3, + channels=512, + num_convs=2, + concat_input=True, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/gcnet_r50-d8_deepGlobe.py b/configs/_base_/models/gcnet_r50-d8_deepGlobe.py new file mode 100644 index 0000000000..e7e509f5e4 --- /dev/null +++ b/configs/_base_/models/gcnet_r50-d8_deepGlobe.py @@ -0,0 +1,54 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[0.4082, 0.3791, 0.2815], + std=[ 0.1451, 0.1116, 0.1013], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained='open-mmlab://resnet50_v1c', + backbone=dict( + type='ResNetV1c', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type='GCHead', + in_channels=2048, + in_index=3, + channels=512, + ratio=1 / 4., + pooling_type='att', + fusion_types=('channel_add', ), + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=1024, + in_index=2, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='whole')) diff --git a/configs/_base_/models/pspnet_unet_deepglobe_s5-d16.py b/configs/_base_/models/pspnet_unet_deepglobe_s5-d16.py new file mode 100644 index 0000000000..8cefb930fe --- /dev/null +++ b/configs/_base_/models/pspnet_unet_deepglobe_s5-d16.py @@ -0,0 +1,58 @@ +# model settings +norm_cfg = dict(type='SyncBN', requires_grad=True) +data_preprocessor = dict( + type='SegDataPreProcessor', + mean=[0.4082, 0.3791, 0.2815], + std=[0.1351, 0.1022, 0.0931], + bgr_to_rgb=True, + pad_val=0, + seg_pad_val=255) +model = dict( + type='EncoderDecoder', + data_preprocessor=data_preprocessor, + pretrained=None, + backbone=dict( + type='UNet', + in_channels=3, + base_channels=64, + num_stages=5, + strides=(1, 1, 1, 1, 1), + enc_num_convs=(2, 2, 2, 2, 2), + dec_num_convs=(2, 2, 2, 2), + downsamples=(True, True, True, True), + enc_dilations=(1, 1, 1, 1, 1), + dec_dilations=(1, 1, 1, 1), + with_cp=False, + conv_cfg=None, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU'), + upsample_cfg=dict(type='InterpConv'), + norm_eval=False), + decode_head=dict( + type='PSPHead', + in_channels=64, + in_index=4, + channels=16, + pool_scales=(1, 2, 3, 6), + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)), + auxiliary_head=dict( + type='FCNHead', + in_channels=128, + in_index=3, + channels=256, + num_convs=1, + concat_input=False, + dropout_ratio=0.1, + num_classes=7, + norm_cfg=norm_cfg, + align_corners=False, + loss_decode=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)), + # model training and testing settings + train_cfg=dict(), + test_cfg=dict(mode='slide', crop_size=256, stride=170)) diff --git a/configs/_base_/schedules/schedule_40k.py b/configs/_base_/schedules/schedule_40k.py index 4b823339a2..5512eb4e60 100644 --- a/configs/_base_/schedules/schedule_40k.py +++ b/configs/_base_/schedules/schedule_40k.py @@ -8,11 +8,11 @@ eta_min=1e-4, power=0.9, begin=0, - end=40000, + end=10000, by_epoch=False) ] # training schedule for 40k -train_cfg = dict(type='IterBasedTrainLoop', max_iters=40000, val_interval=4000) +train_cfg = dict(type='IterBasedTrainLoop', max_iters=10000, val_interval=1000) val_cfg = dict(type='ValLoop') test_cfg = dict(type='TestLoop') default_hooks = dict( diff --git a/configs/ccnet/ccnet_r50-d8_4xb2-40k_deepglobe-256x256.py b/configs/ccnet/ccnet_r50-d8_4xb2-40k_deepglobe-256x256.py new file mode 100644 index 0000000000..55ee6208d0 --- /dev/null +++ b/configs/ccnet/ccnet_r50-d8_4xb2-40k_deepglobe-256x256.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/ccnet_r50-d8_deepglobe_5.py', '../_base_/datasets/deepGlobe.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_deepglobe-512x1024.py b/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_deepglobe-512x1024.py new file mode 100644 index 0000000000..ed3da73684 --- /dev/null +++ b/configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_deepglobe-512x1024.py @@ -0,0 +1,8 @@ +#configs/deeplabv3/deeplabv3_r50-d8_4xb2-40k_deepglobe-512x1024.py +_base_ = [ + '../_base_/models/deeplabv3_r50-d8_deepGlobe.py', '../_base_/datasets/deepGlobe.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_deepglobe-512x1024.py b/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_deepglobe-512x1024.py new file mode 100644 index 0000000000..bbd63a3be1 --- /dev/null +++ b/configs/deeplabv3plus/deeplabv3plus_r50-d8_4xb2-40k_deepglobe-512x1024.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/deeplabv3plus_r50-d8_deepglobe.py', + '../_base_/datasets/deepglobe.py', '../_base_/default_runtime.py', + '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/fcn/fcn_r18-d8_4xb2-80k_deepglobe-512x1024.py b/configs/fcn/fcn_r18-d8_4xb2-80k_deepglobe-512x1024.py new file mode 100644 index 0000000000..23f642087f --- /dev/null +++ b/configs/fcn/fcn_r18-d8_4xb2-80k_deepglobe-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_r50-d8deepglobe.py', '../_base_/datasets/deepGlobe.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py b/configs/gcnet/gcnet_r50-d8_4xb2-40k_deepGlobe-512x1024.py similarity index 64% rename from configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py rename to configs/gcnet/gcnet_r50-d8_4xb2-40k_deepGlobe-512x1024.py index 84fc51a6b3..c359f534ba 100644 --- a/configs/ccnet/ccnet_r50-d8_4xb2-40k_cityscapes-512x1024.py +++ b/configs/gcnet/gcnet_r50-d8_4xb2-40k_deepGlobe-512x1024.py @@ -1,7 +1,7 @@ _base_ = [ - '../_base_/models/ccnet_r50-d8.py', '../_base_/datasets/cityscapes.py', + '../_base_/models/gcnet_r50-d8.py', '../_base_/datasets/deepGlobe.py', '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' ] -crop_size = (512, 1024) +crop_size = (256, 256) data_preprocessor = dict(size=crop_size) model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/hrnet/fcn_hr18_4xb2-40k_deepglobe-512x1024.py b/configs/hrnet/fcn_hr18_4xb2-40k_deepglobe-512x1024.py new file mode 100644 index 0000000000..e5f8eecd63 --- /dev/null +++ b/configs/hrnet/fcn_hr18_4xb2-40k_deepglobe-512x1024.py @@ -0,0 +1,7 @@ +_base_ = [ + '../_base_/models/fcn_hr18_deepGlobe.py', '../_base_/datasets/deepGlobe.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict(data_preprocessor=data_preprocessor) diff --git a/configs/unet/unet-s5-d16_pspnet_4xb4-40k_deepglobe-256x256.py b/configs/unet/unet-s5-d16_pspnet_4xb4-40k_deepglobe-256x256.py new file mode 100644 index 0000000000..a37534cd09 --- /dev/null +++ b/configs/unet/unet-s5-d16_pspnet_4xb4-40k_deepglobe-256x256.py @@ -0,0 +1,9 @@ +_base_ = [ + '../_base_/models/pspnet_unet_deepglobe_s5-d16.py', '../_base_/datasets/deepGlobe.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_40k.py' +] +crop_size = (256, 256) +data_preprocessor = dict(size=crop_size) +model = dict( + data_preprocessor=data_preprocessor, + test_cfg=dict(crop_size=(256, 256), stride=(85, 85))) diff --git a/docs/en/stat.py b/docs/en/stat.py old mode 100755 new mode 100644 diff --git a/docs/zh_cn/stat.py b/docs/zh_cn/stat.py old mode 100755 new mode 100644 diff --git a/mmseg/configs/_base_/schedules/schedule_40k.py b/mmseg/configs/_base_/schedules/schedule_40k.py index b4b2ea42b5..f007a5d280 100644 --- a/mmseg/configs/_base_/schedules/schedule_40k.py +++ b/mmseg/configs/_base_/schedules/schedule_40k.py @@ -1,34 +1,25 @@ -# Copyright (c) OpenMMLab. All rights reserved. -from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, - LoggerHook, ParamSchedulerHook) -from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper -from mmengine.optim.scheduler.lr_scheduler import PolyLR -from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop -from torch.optim.sgd import SGD - -from mmseg.engine import SegVisualizationHook - +#configs/_base_/schedules/schedule_40k.py # optimizer -optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0005) -optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) - +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0005) +optim_wrapper = dict(type='OptimWrapper', optimizer=optimizer, clip_grad=None) +# learning policy param_scheduler = [ dict( - type=PolyLR, + type='PolyLR', eta_min=1e-4, power=0.9, begin=0, - end=40000, + end=10000, by_epoch=False) ] # training schedule for 40k -train_cfg = dict(type=IterBasedTrainLoop, max_iters=40000, val_interval=4000) -val_cfg = dict(type=ValLoop) -test_cfg = dict(type=TestLoop) +train_cfg = dict(type='IterBasedTrainLoop', max_iters=10000, val_interval=1000) +val_cfg = dict(type='ValLoop') +test_cfg = dict(type='TestLoop') default_hooks = dict( - timer=dict(type=IterTimerHook), - logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), - param_scheduler=dict(type=ParamSchedulerHook), - checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=4000), - sampler_seed=dict(type=DistSamplerSeedHook), - visualization=dict(type=SegVisualizationHook)) + timer=dict(type='IterTimerHook'), + logger=dict(type='LoggerHook', interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type='ParamSchedulerHook'), + checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=1000), + sampler_seed=dict(type='DistSamplerSeedHook'), + visualization=dict(type='SegVisualizationHook')) diff --git a/mmseg/datasets/__init__.py b/mmseg/datasets/__init__.py index f8ad750d76..907bbf8cef 100644 --- a/mmseg/datasets/__init__.py +++ b/mmseg/datasets/__init__.py @@ -1,3 +1,4 @@ +#mmseg/datasets/__init__.py # Copyright (c) OpenMMLab. All rights reserved. # yapf: disable from .ade import ADE20KDataset @@ -26,6 +27,7 @@ from .refuge import REFUGEDataset from .stare import STAREDataset from .synapse import SynapseDataset +from .deepGlobe import DeepGlobeDataset # yapf: disable from .transforms import (CLAHE, AdjustGamma, Albu, BioMedical3DPad, BioMedical3DRandomCrop, BioMedical3DRandomFlip, @@ -61,5 +63,5 @@ 'MapillaryDataset_v2', 'Albu', 'LEVIRCDDataset', 'LoadMultipleRSImageFromFile', 'LoadSingleRSImageFromFile', 'ConcatCDInput', 'BaseCDDataset', 'DSDLSegDataset', 'BDD100KDataset', - 'NYUDataset', 'HSIDrive20Dataset' + 'NYUDataset', 'HSIDrive20Dataset', 'DeepGlobeDataset' ] diff --git a/mmseg/datasets/deepGlobe.py b/mmseg/datasets/deepGlobe.py new file mode 100644 index 0000000000..e09004254e --- /dev/null +++ b/mmseg/datasets/deepGlobe.py @@ -0,0 +1,48 @@ +#mmseg/datasets/deepGlobe.py +# Copyright (c) OpenMMLab. All rights reserved. +from mmseg.registry import DATASETS +from .basesegdataset import BaseSegDataset +import json +import os +from datetime import datetime + +import geopandas as gpd +import numpy as np +import pandas as pd +import torch +import torch.utils.data as tdata + +@DATASETS.register_module() +class DeepGlobeDataset(BaseSegDataset): + """Deep Globe Dataset. + + The ``img_suffix`` is fixed to '.jpg' and ``seg_map_suffix`` is + fixed to '_t.png' for Cityscapes dataset. + """ + METAINFO = dict( + classes=('Urban', 'Agriculture', 'Range', 'Forest', 'Water', 'Barren', + 'Unknown'), + palette=[[0,255,255], [255,255,0], [255,0,255], [0,255,0], + [0,0,255], [255,255,255], [1,1,1] + ]) + + class_dict={ + "1": "Urban", + "2": "Agriculture", + "3": "Range", + "4": "Forest", + "5": "Water", + "6": "Barren", + "7": "Unknown" + } + color_map = [ + [0,255,255], [255,255,0], [255,0,255], [0,255,0], + [0,0,255], [255,255,255], [1,1,1] + ] + + def __init__(self, + img_suffix='_sat.jpg', + seg_map_suffix='_mask.png', + **kwargs) -> None: + super().__init__( + img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs) diff --git a/mmseg/utils/__init__.py b/mmseg/utils/__init__.py index 0a2af58c6e..c74f610500 100644 --- a/mmseg/utils/__init__.py +++ b/mmseg/utils/__init__.py @@ -2,7 +2,7 @@ # yapf: disable from .class_names import (ade_classes, ade_palette, bdd100k_classes, bdd100k_palette, cityscapes_classes, - cityscapes_palette, cocostuff_classes, + cityscapes_palette, deepGlobe_classes, deepGlobe_palette, cocostuff_classes, cocostuff_palette, dataset_aliases, get_classes, get_palette, isaid_classes, isaid_palette, loveda_classes, loveda_palette, potsdam_classes, diff --git a/mmseg/utils/class_names.py b/mmseg/utils/class_names.py index 644e955966..f2c88a560a 100644 --- a/mmseg/utils/class_names.py +++ b/mmseg/utils/class_names.py @@ -463,6 +463,12 @@ def bdd100k_classes(): 'bicycle' ] +def deepGlobe_classes(): + return[ + 'Urban', 'Agriculture', 'Range', 'Forest', 'Water', 'Barren', + 'Unknown' + ] + def bdd100k_palette(): """bdd100k palette for external use(same with cityscapes)""" @@ -487,9 +493,15 @@ def hsidrive_palette(): [0, 0, 255], [102, 51, 0], [255, 255, 0], [0, 207, 250], [255, 166, 0], [0, 204, 204]] +def deepGlobe_palette(): + """DeepGlobe palette for external use.""" + return [[0,255,255], [255,255,0], [255,0,255], [0,255,0], + [0,0,255], [255,255,255], [1,1,1]] + dataset_aliases = { 'cityscapes': ['cityscapes'], + 'deepGlobe': ['deepGlobe'], 'ade': ['ade', 'ade20k'], 'voc': ['voc', 'pascal_voc', 'voc12', 'voc12aug'], 'pcontext': ['pcontext', 'pascal_context', 'voc2010'], diff --git a/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py b/projects/medical/2d_image/dermoscopy/isic2016_task1/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py b/projects/medical/2d_image/dermoscopy/isic2017_task1/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_vampire-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_vampire-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_vampire-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/configs/vampire_512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/__init__.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py b/projects/medical/2d_image/fluorescein_angriogram/vampire/datasets/vampire_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/dr_hagis/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py b/projects/medical/2d_image/fundus_photography/orvs/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/breast_cancer_cell_seg/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/conic2022_seg/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py b/projects/medical/2d_image/histopathology/consep/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.0001-20k_ravir-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.001-20k_ravir-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/fcn-unet-s5-d16_unet_1xb16-0.01-20k_ravir-512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/configs/ravir_512x512.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/__init__.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py b/projects/medical/2d_image/infrared_reflectance_imaging/ravir/datasets/ravir_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py b/projects/medical/2d_image/microscopy_images/bactteria_detection/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py b/projects/medical/2d_image/x_ray/chest_image_pneum/tools/prepare_dataset.py old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 diff --git a/tests/data/biomedical.nii.gz b/tests/data/biomedical.nii.gz old mode 100755 new mode 100644 diff --git a/tests/data/biomedical_ann.nii.gz b/tests/data/biomedical_ann.nii.gz old mode 100755 new mode 100644 diff --git a/tests/data/dataset.json b/tests/data/dataset.json old mode 100755 new mode 100644 diff --git a/tests/data/dsdl_seg/config.py b/tests/data/dsdl_seg/config.py old mode 100755 new mode 100644 diff --git a/tests/data/dsdl_seg/defs/class-dom.yaml b/tests/data/dsdl_seg/defs/class-dom.yaml old mode 100755 new mode 100644 diff --git a/tests/data/dsdl_seg/defs/segmentation-def.yaml b/tests/data/dsdl_seg/defs/segmentation-def.yaml old mode 100755 new mode 100644 diff --git a/tests/data/dsdl_seg/set-train/train.yaml b/tests/data/dsdl_seg/set-train/train.yaml old mode 100755 new mode 100644 diff --git a/tests/data/dsdl_seg/set-train/train_samples.json b/tests/data/dsdl_seg/set-train/train_samples.json old mode 100755 new mode 100644 diff --git a/tools/dist_test.sh b/tools/dist_test.sh old mode 100755 new mode 100644 diff --git a/tools/dist_train.sh b/tools/dist_train.sh old mode 100755 new mode 100644 diff --git a/tools/model_test.py b/tools/model_test.py new file mode 100644 index 0000000000..7263db435c --- /dev/null +++ b/tools/model_test.py @@ -0,0 +1,70 @@ +import os +import mmcv +import numpy as np +import cv2 +from mmseg.apis import init_model, inference_model + +# Configuration and checkpoint paths +CONFIG_FILE = '/Users/anyego/Desktop/mmsegmentationEQ2/configs/fcn/fcn_r18-d8_4xb2-80k_deepglobe-512x1024.py' +CHECKPOINT_FILE = '/Users/anyego/Desktop/mmsegmentationEQ2/workdir/fcn/iter_10000.pth' +DEVICE = 'cpu' + +# Custom color palette +PALETTE = np.array([ + [0, 255, 255], [255, 255, 0], [255, 0, 255], + [0, 255, 0], [0, 0, 255], [255, 255, 255], + [0, 0, 0] +], dtype=np.uint8) + +# Directories +IMAGE_DIR = '/Users/anyego/Desktop/mmsegmentationEQ2/Test_model' +OUTPUT_DIR = '/Users/anyego/Desktop/mmsegmentationEQ2/PrediccionesFCN' + +def initialize_model(config_path, checkpoint_path, device): + """Initialize the segmentation model.""" + return init_model(config_path, checkpoint_path, device=device) + +def create_output_directory(directory): + """Create the output directory if it doesn't exist.""" + if not os.path.exists(directory): + os.makedirs(directory) + +def get_image_paths(directory): + """Retrieve all image paths from the directory.""" + return [os.path.join(directory, img_name) for img_name in os.listdir(directory)] + +def postprocess_mask(mask): + """Post-process the predicted mask.""" + # Apply morphological operations to refine the mask + kernel = np.ones((3, 3), np.uint8) + refined_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) + return refined_mask + +def process_image(model, img_path): + """Run inference on a single image and return the color mask.""" + result = inference_model(model, img_path) + mask = result.pred_sem_seg.data.cpu().numpy().astype(np.uint8).squeeze(0) + mask = postprocess_mask(mask) + return PALETTE[mask] + +def save_color_mask(color_mask, output_path): + """Save the color mask to the specified path.""" + mmcv.imwrite(color_mask, output_path) + +def main(): + """Main function to run the segmentation inference.""" + model = initialize_model(CONFIG_FILE, CHECKPOINT_FILE, DEVICE) + create_output_directory(OUTPUT_DIR) + + for img_path in get_image_paths(IMAGE_DIR): + color_mask = process_image(model, img_path) + if color_mask.size > 0: + output_path = os.path.join(OUTPUT_DIR, os.path.basename(img_path)) + save_color_mask(color_mask, output_path) + else: + print(f"Skipping {img_path} due to invalid mask") + + print(f"Inference completed. Results saved to: {OUTPUT_DIR}") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tools/slurm_test.sh b/tools/slurm_test.sh old mode 100755 new mode 100644 diff --git a/tools/slurm_train.sh b/tools/slurm_train.sh old mode 100755 new mode 100644