-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
huoy1
committed
Feb 1, 2018
1 parent
0ed5a04
commit 40c4eb1
Showing
224 changed files
with
32,759 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
Copyright (c) 2017, Jun-Yan Zhu and Taesung Park | ||
All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
|
||
* Redistributions of source code must retain the above copyright notice, this | ||
list of conditions and the following disclaimer. | ||
|
||
* Redistributions in binary form must reproduce the above copyright notice, | ||
this list of conditions and the following disclaimer in the documentation | ||
and/or other materials provided with the distribution. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|
||
|
||
--------------------------- LICENSE FOR pix2pix -------------------------------- | ||
BSD License | ||
|
||
For pix2pix software | ||
Copyright (c) 2016, Phillip Isola and Jun-Yan Zhu | ||
All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
|
||
* Redistributions of source code must retain the above copyright notice, this | ||
list of conditions and the following disclaimer. | ||
|
||
* Redistributions in binary form must reproduce the above copyright notice, | ||
this list of conditions and the following disclaimer in the documentation | ||
and/or other materials provided with the distribution. | ||
|
||
----------------------------- LICENSE FOR DCGAN -------------------------------- | ||
BSD License | ||
|
||
For dcgan.torch software | ||
|
||
Copyright (c) 2015, Facebook, Inc. All rights reserved. | ||
|
||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | ||
|
||
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | ||
|
||
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. | ||
|
||
Neither the name Facebook nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,8 @@ | ||
# EssNet | ||
# <img src='imgs/horse2zebra.gif' align="right" width=384> | ||
|
||
<br><br><br> | ||
|
||
# CycleGAN and pix2pix in PyTorch | ||
|
||
This is our ongoing PyTorch implementation for multi-model segmentation without groudtruth. | ||
|
Empty file.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
import os.path | ||
import random | ||
import torchvision.transforms as transforms | ||
import torch | ||
from data.base_dataset import BaseDataset | ||
from data.image_folder import make_dataset | ||
from PIL import Image | ||
|
||
|
||
class AlignedDataset(BaseDataset): | ||
def initialize(self, opt): | ||
self.opt = opt | ||
self.root = opt.dataroot | ||
self.dir_AB = os.path.join(opt.dataroot, opt.phase) | ||
|
||
self.AB_paths = sorted(make_dataset(self.dir_AB)) | ||
|
||
assert(opt.resize_or_crop == 'resize_and_crop') | ||
|
||
transform_list = [transforms.ToTensor(), | ||
transforms.Normalize((0.5, 0.5, 0.5), | ||
(0.5, 0.5, 0.5))] | ||
|
||
self.transform = transforms.Compose(transform_list) | ||
|
||
def __getitem__(self, index): | ||
AB_path = self.AB_paths[index] | ||
AB = Image.open(AB_path).convert('RGB') | ||
AB = AB.resize((self.opt.loadSize * 2, self.opt.loadSize), Image.BICUBIC) | ||
AB = self.transform(AB) | ||
|
||
w_total = AB.size(2) | ||
w = int(w_total / 2) | ||
h = AB.size(1) | ||
w_offset = random.randint(0, max(0, w - self.opt.fineSize - 1)) | ||
h_offset = random.randint(0, max(0, h - self.opt.fineSize - 1)) | ||
|
||
A = AB[:, h_offset:h_offset + self.opt.fineSize, | ||
w_offset:w_offset + self.opt.fineSize] | ||
B = AB[:, h_offset:h_offset + self.opt.fineSize, | ||
w + w_offset:w + w_offset + self.opt.fineSize] | ||
|
||
if (not self.opt.no_flip) and random.random() < 0.5: | ||
idx = [i for i in range(A.size(2) - 1, -1, -1)] | ||
idx = torch.LongTensor(idx) | ||
A = A.index_select(2, idx) | ||
B = B.index_select(2, idx) | ||
|
||
return {'A': A, 'B': B, | ||
'A_paths': AB_path, 'B_paths': AB_path} | ||
|
||
def __len__(self): | ||
return len(self.AB_paths) | ||
|
||
def name(self): | ||
return 'AlignedDataset' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
|
||
class BaseDataLoader(): | ||
def __init__(self): | ||
pass | ||
|
||
def initialize(self, opt): | ||
self.opt = opt | ||
pass | ||
|
||
def load_data(): | ||
return None | ||
|
||
|
||
|
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
import torch.utils.data as data | ||
from PIL import Image | ||
import torchvision.transforms as transforms | ||
|
||
class BaseDataset(data.Dataset): | ||
def __init__(self): | ||
super(BaseDataset, self).__init__() | ||
|
||
def name(self): | ||
return 'BaseDataset' | ||
|
||
def initialize(self, opt): | ||
pass | ||
|
||
|
||
|
||
|
||
def get_transform(opt): | ||
transform_list = [] | ||
if opt.resize_or_crop == 'resize_and_crop': | ||
osize = [opt.loadSize, opt.loadSize] | ||
transform_list.append(transforms.Scale(osize, Image.BICUBIC)) | ||
transform_list.append(transforms.RandomCrop(opt.fineSize)) | ||
elif opt.resize_or_crop == 'crop': | ||
transform_list.append(transforms.RandomCrop(opt.fineSize)) | ||
elif opt.resize_or_crop == 'scale_width': | ||
transform_list.append(transforms.Lambda( | ||
lambda img: __scale_width(img, opt.fineSize))) | ||
elif opt.resize_or_crop == 'scale_width_and_crop': | ||
transform_list.append(transforms.Lambda( | ||
lambda img: __scale_width(img, opt.loadSize))) | ||
transform_list.append(transforms.RandomCrop(opt.fineSize)) | ||
elif opt.resize_or_crop == 'yh_test_resize': | ||
osize = [opt.fineSize, opt.fineSize] | ||
transform_list.append(transforms.Scale(osize, Image.BICUBIC)) | ||
# elif opt.resize_or_crop == 'resize': | ||
# osize = [opt.loadSize, opt.loadSize] | ||
# transform_list.append(transforms.Scale(osize, Image.BICUBIC)) | ||
# elif opt.resize_or_crop == 'random_crop': | ||
# transform_list.append(random_crop_yh.randomcrop_yh(opt.fineSize)) | ||
|
||
if opt.isTrain and not opt.no_flip: | ||
transform_list.append(transforms.RandomHorizontalFlip()) | ||
|
||
transform_list += [transforms.ToTensor(), | ||
transforms.Normalize((0.5, 0.5, 0.5), | ||
(0.5, 0.5, 0.5))] | ||
return transforms.Compose(transform_list) | ||
|
||
def __scale_width(img, target_width): | ||
ow, oh = img.size | ||
if (ow == target_width): | ||
return img | ||
w = target_width | ||
h = int(target_width * oh / ow) | ||
return img.resize((w, h), Image.BICUBIC) |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import torch.utils.data | ||
from data.base_data_loader import BaseDataLoader | ||
|
||
|
||
def CreateDataset(opt): | ||
dataset = None | ||
if opt.dataset_mode == 'aligned': | ||
from data.aligned_dataset import AlignedDataset | ||
dataset = AlignedDataset() | ||
elif opt.dataset_mode == 'unaligned': | ||
from data.unaligned_dataset import UnalignedDataset | ||
dataset = UnalignedDataset() | ||
elif opt.dataset_mode == 'single': | ||
from data.single_dataset import SingleDataset | ||
dataset = SingleDataset() | ||
elif opt.dataset_mode == 'yh': | ||
from data.yh_dataset import yhDataset | ||
dataset = yhDataset() | ||
elif opt.dataset_mode == 'yh_seg': | ||
from data.yh_seg_dataset import yhSegDataset | ||
dataset = yhSegDataset() | ||
elif opt.dataset_mode == 'yh_seg_spleen': | ||
from data.yh_seg_spleenonly_dataset import yhSegDatasetSpleenOnly | ||
dataset = yhSegDatasetSpleenOnly() | ||
elif opt.dataset_mode == 'yh_test_seg': | ||
from data.yh_test_seg_dataset import yhTestSegDataset | ||
dataset = yhTestSegDataset() | ||
else: | ||
raise ValueError("Dataset [%s] not recognized." % opt.dataset_mode) | ||
|
||
print("dataset [%s] was created" % (dataset.name())) | ||
dataset.initialize(opt) | ||
return dataset | ||
|
||
|
||
class CustomDatasetDataLoader(BaseDataLoader): | ||
def name(self): | ||
return 'CustomDatasetDataLoader' | ||
|
||
def initialize(self, opt): | ||
BaseDataLoader.initialize(self, opt) | ||
self.dataset = CreateDataset(opt) | ||
self.dataloader = torch.utils.data.DataLoader( | ||
self.dataset, | ||
batch_size=opt.batchSize, | ||
shuffle=not opt.serial_batches, | ||
num_workers=int(opt.nThreads)) | ||
|
||
def load_data(self): | ||
return self.dataloader | ||
|
||
def __len__(self): | ||
return min(len(self.dataset), self.opt.max_dataset_size) |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
|
||
def CreateDataLoader(opt): | ||
from data.custom_dataset_data_loader import CustomDatasetDataLoader | ||
data_loader = CustomDatasetDataLoader() | ||
print(data_loader.name()) | ||
data_loader.initialize(opt) | ||
return data_loader |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
############################################################################### | ||
# Code from | ||
# https://github.com/pytorch/vision/blob/master/torchvision/datasets/folder.py | ||
# Modified the original code so that it also loads images from the current | ||
# directory as well as the subdirectories | ||
############################################################################### | ||
|
||
import torch.utils.data as data | ||
|
||
from PIL import Image | ||
import os | ||
import os.path | ||
|
||
IMG_EXTENSIONS = [ | ||
'.jpg', '.JPG', '.jpeg', '.JPEG', | ||
'.png', '.PNG', '.ppm', '.PPM', '.bmp', '.BMP', | ||
] | ||
|
||
|
||
def is_image_file(filename): | ||
return any(filename.endswith(extension) for extension in IMG_EXTENSIONS) | ||
|
||
|
||
def make_dataset(dir): | ||
images = [] | ||
assert os.path.isdir(dir), '%s is not a valid directory' % dir | ||
|
||
for root, _, fnames in sorted(os.walk(dir)): | ||
for fname in fnames: | ||
if is_image_file(fname): | ||
path = os.path.join(root, fname) | ||
images.append(path) | ||
|
||
return images | ||
|
||
|
||
def default_loader(path): | ||
return Image.open(path).convert('RGB') | ||
|
||
|
||
class ImageFolder(data.Dataset): | ||
|
||
def __init__(self, root, transform=None, return_paths=False, | ||
loader=default_loader): | ||
imgs = make_dataset(root) | ||
if len(imgs) == 0: | ||
raise(RuntimeError("Found 0 images in: " + root + "\n" | ||
"Supported image extensions are: " + | ||
",".join(IMG_EXTENSIONS))) | ||
|
||
self.root = root | ||
self.imgs = imgs | ||
self.transform = transform | ||
self.return_paths = return_paths | ||
self.loader = loader | ||
|
||
def __getitem__(self, index): | ||
path = self.imgs[index] | ||
img = self.loader(path) | ||
if self.transform is not None: | ||
img = self.transform(img) | ||
if self.return_paths: | ||
return img, path | ||
else: | ||
return img | ||
|
||
def __len__(self): | ||
return len(self.imgs) |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
from __future__ import division | ||
import torch | ||
import math | ||
import random | ||
from PIL import Image, ImageOps | ||
try: | ||
import accimage | ||
except ImportError: | ||
accimage = None | ||
import numpy as np | ||
import numbers | ||
import types | ||
import collections | ||
import torchvision.transforms as transforms | ||
|
||
class randomcrop_yh(transforms.RandomCrop): | ||
"""Crop the given PIL.Image at a random location. | ||
Args: | ||
size (sequence or int): Desired output size of the crop. If size is an | ||
int instead of sequence like (h, w), a square crop (size, size) is | ||
made. | ||
padding (int or sequence, optional): Optional padding on each border | ||
of the image. Default is 0, i.e no padding. If a sequence of length | ||
4 is provided, it is used to pad left, top, right, bottom borders | ||
respectively. | ||
""" | ||
|
||
def __init__(self, size, padding=0): | ||
if isinstance(size, numbers.Number): | ||
self.size = (int(size), int(size)) | ||
else: | ||
self.size = size | ||
self.padding = padding | ||
|
||
def __call__(self, images): | ||
""" | ||
Args: | ||
img (PIL.Image): Image to be cropped. | ||
Returns: | ||
PIL.Image: Cropped image. | ||
""" | ||
output = [] | ||
for i in range(len(images)): | ||
img = images[i] | ||
if self.padding > 0: | ||
img = ImageOps.expand(img, border=self.padding, fill=0) | ||
|
||
w, h = img.size | ||
th, tw = self.size | ||
if w == tw and h == th: | ||
return img | ||
if i==0: | ||
x1 = random.randint(0, w - tw) | ||
y1 = random.randint(0, h - th) | ||
output.append(img.crop((x1, y1, x1 + tw, y1 + th))) | ||
return output |
Binary file not shown.
Oops, something went wrong.