Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
* v0.4.5

* version file

* v0.4.5

* version num
  • Loading branch information
zhanghang1989 committed Jun 26, 2018
1 parent 1636365 commit b05334f
Show file tree
Hide file tree
Showing 22 changed files with 105 additions and 188 deletions.
12 changes: 6 additions & 6 deletions docs/source/experiments/segmentation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Install Package

- Clone the GitHub repo::
git clone git@github.com:zhanghang1989/PyTorch-Encoding.git
git clone https://github.com/zhanghang1989/PyTorch-Encoding

- Install PyTorch Encoding (if not yet). Please follow the installation guide `Installing PyTorch Encoding <../notes/compile.html>`_.

Expand All @@ -27,7 +27,7 @@ Test Pre-trained Model
for example ``Encnet_ResNet50_PContext``::

python test.py --dataset PContext --model-zoo Encnet_ResNet50_PContext --eval
# pixAcc: 0.7838, mIoU: 0.4958: 100%|████████████████████████| 1276/1276 [46:31<00:00, 2.19s/it]
# pixAcc: 0.7888, mIoU: 0.5056: 100%|████████████████████████| 1276/1276 [46:31<00:00, 2.19s/it]

The command for training the model can be found by clicking ``cmd`` in the table.

Expand All @@ -37,11 +37,11 @@ Test Pre-trained Model
+----------------------------------+-----------+-----------+-----------+----------------------------------------------------------------------------------------------+------------+
| Model | pixAcc | mIoU | Note | Command | Logs |
+==================================+===========+===========+===========+==============================================================================================+============+
| Encnet_ResNet50_PContext | 78.4% | 49.6% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc50_pcont')" class="toggleblock">cmd</a>` | ENC50PC_ |
| Encnet_ResNet50_PContext | 78.9% | 50.6% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc50_pcont')" class="toggleblock">cmd</a>` | ENC50PC_ |
+----------------------------------+-----------+-----------+-----------+----------------------------------------------------------------------------------------------+------------+
| EncNet_ResNet101_PContext | 79.9% | 51.8% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc101_pcont')" class="toggleblock">cmd</a>` | ENC101PC_ |
| EncNet_ResNet101_PContext | 80.3% | 53.2% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc101_pcont')" class="toggleblock">cmd</a>` | ENC101PC_ |
+----------------------------------+-----------+-----------+-----------+----------------------------------------------------------------------------------------------+------------+
| EncNet_ResNet50_ADE | 79.8% | 41.3% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc50_ade')" class="toggleblock">cmd</a>` | ENC50ADE_ |
| EncNet_ResNet50_ADE | 79.9% | 41.2% | | :raw-html:`<a href="javascript:toggleblock('cmd_enc50_ade')" class="toggleblock">cmd</a>` | ENC50ADE_ |
+----------------------------------+-----------+-----------+-----------+----------------------------------------------------------------------------------------------+------------+

.. _ENC50PC: https://github.com/zhanghang1989/image-data/blob/master/encoding/segmentation/logs/encnet_resnet50_pcontext.log?raw=true
Expand All @@ -68,7 +68,7 @@ Test Pre-trained Model
</code>

<code xml:space="preserve" id="cmd_enc50_ade" style="display: none; text-align: left; white-space: pre-wrap">
CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py --dataset ADE20K --model EncNet --aux --se-loss
CUDA_VISIBLE_DEVICES=0,1,2,3 python train.py --dataset ade20k --model encnetv2 --aux --se-loss
</code>

Quick Demo
Expand Down
18 changes: 8 additions & 10 deletions docs/source/notes/compile.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,18 @@ Install from Source
-------------------

* Install PyTorch by following the `PyTorch instructions <http://pytorch.org/>`_.
This package relies on PyTorch master branch (higher than stable released v0.4.0), please follow
`the instruction <https://github.com/pytorch/pytorch#from-source>`_ to install
PyTorch from source.

* Install from source
* PIP Install::

- Clone the repo::
pip install torch-encoding

git clone https://github.com/zhanghang1989/PyTorch-Encoding && cd PyTorch-Encoding
* Install from source::

- On Linux::

python setup.py install

- On Mac OSX::

MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install
git clone https://github.com/zhanghang1989/PyTorch-Encoding && cd PyTorch-Encoding
python setup.py install

Citations
---------
Expand Down
110 changes: 0 additions & 110 deletions docs/source/notes/extending.rst

This file was deleted.

1 change: 1 addition & 0 deletions encoding/datasets/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@
'pascal_aug': VOCAugSegmentation,
'pcontext': ContextSegmentation,
}

def get_segmentation_dataset(name, **kwargs):
return datasets[name.lower()](**kwargs)
44 changes: 27 additions & 17 deletions encoding/datasets/ade20k.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ class ADE20KSegmentation(BaseDataset):
BASE_DIR = 'ADEChallengeData2016'
NUM_CLASS = 150
def __init__(self, root=os.path.expanduser('~/.encoding/data'), split='train',
mode=None, transform=None, target_transform=None):
mode=None, transform=None, target_transform=None, **kwargs):
super(ADE20KSegmentation, self).__init__(
root, split, mode, transform, target_transform)
root, split, mode, transform, target_transform, **kwargs)
# assert exists and prepare dataset automatically
root = os.path.join(root, self.BASE_DIR)
assert os.path.exists(root), "Please setup the dataset using" + \
Expand Down Expand Up @@ -70,27 +70,37 @@ def pred_offset(self):


def _get_ade20k_pairs(folder, split='train'):
img_paths = []
mask_paths = []
def get_path_pairs(img_folder, mask_folder):
img_paths = []
mask_paths = []
for filename in os.listdir(img_folder):
basename, _ = os.path.splitext(filename)
if filename.endswith(".jpg"):
imgpath = os.path.join(img_folder, filename)
maskname = basename + '.png'
maskpath = os.path.join(mask_folder, maskname)
if os.path.isfile(maskpath):
img_paths.append(imgpath)
mask_paths.append(maskpath)
else:
print('cannot find the mask:', maskpath)
return img_paths, mask_paths

if split == 'train':
img_folder = os.path.join(folder, 'images/training')
mask_folder = os.path.join(folder, 'annotations/training')
img_paths, mask_paths = get_path_pairs(img_folder, mask_folder)
elif split == 'val':
img_folder = os.path.join(folder, 'images/validation')
mask_folder = os.path.join(folder, 'annotations/validation')
img_paths, mask_paths = get_path_pairs(img_folder, mask_folder)
else:
img_folder = os.path.join(folder, 'images/trainval')
mask_folder = os.path.join(folder, 'annotations/trainval')
for filename in os.listdir(img_folder):
basename, _ = os.path.splitext(filename)
if filename.endswith(".jpg"):
imgpath = os.path.join(img_folder, filename)
maskname = basename + '.png'
maskpath = os.path.join(mask_folder, maskname)
if os.path.isfile(maskpath):
img_paths.append(imgpath)
mask_paths.append(maskpath)
else:
print('cannot find the mask:', maskpath)
train_img_folder = os.path.join(folder, 'images/training')
train_mask_folder = os.path.join(folder, 'annotations/training')
val_img_folder = os.path.join(folder, 'images/validation')
val_mask_folder = os.path.join(folder, 'annotations/validation')
train_img_paths, train_mask_paths = get_path_pairs(train_img_folder, train_mask_folder)
val_img_paths, val_mask_paths = get_path_pairs(val_img_folder, val_mask_folder)
return train_img_paths + val_img_paths, train_mask_paths + val_mask_paths

return img_paths, mask_paths
3 changes: 3 additions & 0 deletions encoding/datasets/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ def __init__(self, root, split, mode=None, transform=None,
self.mode = mode if mode is not None else split
self.base_size = base_size
self.crop_size = crop_size
if self.mode == 'train':
print('BaseDataset: base_size {}, crop_size {}'. \
format(base_size, crop_size))

def __getitem__(self, index):
raise NotImplemented
Expand Down
5 changes: 3 additions & 2 deletions encoding/datasets/pascal_aug.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ class VOCAugSegmentation(BaseDataset):
NUM_CLASS = 21
TRAIN_BASE_DIR = 'VOCaug/dataset/'
def __init__(self, root, split='train', mode=None, transform=None,
target_transform=None):
super(VOCAugSegmentation, self).__init__(root, split, mode, transform, target_transform)
target_transform=None, **kwargs):
super(VOCAugSegmentation, self).__init__(root, split, mode, transform,
target_transform, **kwargs)
# train/val/test splits are pre-cut
_voc_root = os.path.join(root, self.TRAIN_BASE_DIR)
_mask_dir = os.path.join(_voc_root, 'cls')
Expand Down
5 changes: 3 additions & 2 deletions encoding/datasets/pascal_voc.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ class VOCSegmentation(BaseDataset):
NUM_CLASS = 21
BASE_DIR = 'VOCdevkit/VOC2012'
def __init__(self, root, split='train', mode=None, transform=None,
target_transform=None):
super(VOCSegmentation, self).__init__(root, split, mode, transform, target_transform)
target_transform=None, **kwargs):
super(VOCSegmentation, self).__init__(root, split, mode, transform,
target_transform, **kwargs)
_voc_root = os.path.join(self.root, self.BASE_DIR)
_mask_dir = os.path.join(_voc_root, 'SegmentationClass')
_image_dir = os.path.join(_voc_root, 'JPEGImages')
Expand Down
6 changes: 2 additions & 4 deletions encoding/datasets/pcontext.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ class ContextSegmentation(BaseDataset):
BASE_DIR = 'VOCdevkit/VOC2010'
NUM_CLASS = 59
def __init__(self, root=os.path.expanduser('~/.encoding/data'), split='train',
mode=None, transform=None, target_transform=None):
mode=None, transform=None, target_transform=None, **kwargs):
super(ContextSegmentation, self).__init__(
root, split, mode, transform, target_transform)
root, split, mode, transform, target_transform, **kwargs)
from detail import Detail
#from detail import mask
root = os.path.join(root, self.BASE_DIR)
Expand Down Expand Up @@ -78,8 +78,6 @@ def __getitem__(self, index):
img = self.transform(img)
return img, os.path.basename(path)
# convert mask to 60 categories
#mask = Image.fromarray(self._class_to_index(
# self.detail.getMask(img_id)))
mask = self.masks[iid]
# synchrosized transform
if self.mode == 'train':
Expand Down
21 changes: 13 additions & 8 deletions encoding/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@

class BaseNet(nn.Module):
def __init__(self, nclass, backbone, aux, se_loss, dilated=True, norm_layer=None,
mean=[.485, .456, .406], std=[.229, .224, .225], root='~/.encoding/models'):
base_size=576, crop_size=608, mean=[.485, .456, .406],
std=[.229, .224, .225], root='~/.encoding/models'):
super(BaseNet, self).__init__()
self.nclass = nclass
self.aux = aux
self.se_loss = se_loss
self.mean = mean
self.std = std
self.base_size = base_size
self.crop_size = crop_size
# copying modules from pretrained models
if backbone == 'resnet50':
self.pretrained = resnet.resnet50(pretrained=True, dilated=dilated,
Expand Down Expand Up @@ -70,23 +73,25 @@ def evaluate(self, x, target=None):

class MultiEvalModule(DataParallel):
"""Multi-size Segmentation Eavluator"""
def __init__(self, module, nclass, device_ids=None,
base_size=520, crop_size=480, flip=True,
def __init__(self, module, nclass, device_ids=None, flip=True,
scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75]):
super(MultiEvalModule, self).__init__(module, device_ids)
self.nclass = nclass
self.base_size = base_size
self.crop_size = crop_size
self.base_size = module.base_size
self.crop_size = module.crop_size
self.scales = scales
self.flip = flip
print('MultiEvalModule: base_size {}, crop_size {}'. \
format(self.base_size, self.crop_size))

def parallel_forward(self, inputs, **kwargs):
"""Multi-GPU Mult-size Evaluation
Args:
inputs: list of Tensors
"""
inputs = [(input.unsqueeze(0).cuda(device),) for input, device in zip(inputs, self.device_ids)]
inputs = [(input.unsqueeze(0).cuda(device),)
for input, device in zip(inputs, self.device_ids)]
replicas = self.replicate(self, self.device_ids[:len(inputs)])
kwargs = scatter(kwargs, target_gpus, dim) if kwargs else []
if len(inputs) < len(kwargs):
Expand Down Expand Up @@ -134,8 +139,8 @@ def forward(self, image):
_,_,ph,pw = pad_img.size()
assert(ph >= height and pw >= width)
# grid forward and normalize
h_grids = int(math.ceil(1.0*(ph-crop_size)/stride)) + 1
w_grids = int(math.ceil(1.0*(pw-crop_size)/stride)) + 1
h_grids = int(math.ceil(1.0 * (ph-crop_size)/stride)) + 1
w_grids = int(math.ceil(1.0 * (pw-crop_size)/stride)) + 1
with torch.cuda.device_of(image):
outputs = image.new().resize_(batch,self.nclass,ph,pw).zero_().cuda()
count_norm = image.new().resize_(batch,1,ph,pw).zero_().cuda()
Expand Down
Loading

0 comments on commit b05334f

Please sign in to comment.