--- a +++ b/FastRCNN/utils/DefectDataset.py @@ -0,0 +1,131 @@ +import numpy as np +import os +from skimage import exposure, filters +import chainer +from chainercv import utils +from chainercv import transforms +import warnings + +root = './Data/' +root2 = './Data/' + +class DetectionDataset(chainer.dataset.DatasetMixin): + """Base class for defect defection dataset + """ + + def __init__(self, data_dir='auto', split='', img_size=1024, resize=False): + if data_dir == 'auto': + data_dir = root + self.data_dir = data_dir + self.img_size = img_size + self.resize = resize + images_file = os.path.join(self.data_dir, '{}images.txt'.format(split)) + self.images = [line.strip() for line in open(images_file)] + + def obtain_image_name(self,i): + #print(i) + return self.images[i] + + def __len__(self): + return len(self.images) + + def get_example(self, i): + """Returns the i-th example. + + Args: + i (int): The index of the example. + + Returns: + tuple of an image and its label. + The image is in CHW format and its color channel is ordered in + RGB. + a bounding box is appended to the returned value. + """ + img = utils.read_image( + os.path.join(self.data_dir, 'images', self.images[i]), + color=True) + # Add processing to the other two channels + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + img[1, :, :] = exposure.rescale_intensity(exposure.equalize_adapthist( + exposure.rescale_intensity(img[1, :, :])), out_range=(0, 255)) + img[2, :, :] = exposure.rescale_intensity(filters.gaussian( + exposure.rescale_intensity(img[2, :, :])), out_range=(0, 255)) + + # bbs should be a matrix (m by 4). m is the number of bounding + # boxes in the image + # labels should be an integer array (m by 1). m is the same as the bbs + + bbs_file = os.path.join(self.data_dir, 'bounding_boxes', self.images[i][0:-4]+'.txt') + + bbs = np.stack([line.strip().split() for line in open(bbs_file)]).astype(np.float32) + label = np.stack([0]*bbs.shape[0]).astype(np.int32) + + _, H, W = img.shape + if self.resize and (H != self.img_size or W != self.img_size): + img = transforms.resize(img, (self.img_size, self.img_size)) + bbs = transforms.resize_bbox(bbs, (H, W), (self.img_size, self.img_size)) + + return img, bbs, label + +class MultiDetectionDataset(chainer.dataset.DatasetMixin): + """Base class for multi defect defection dataset + """ + + def __init__(self, data_dir='auto', split='', img_size=1024, resize=False): + if data_dir == 'auto': + data_dir = root2 + self.data_dir = data_dir + self.img_size = img_size + self.resize = resize + images_file = os.path.join(self.data_dir, '{}images.txt'.format(split)) + self.images = [ + line.strip() for line in open(images_file)] + + def __len__(self): + return len(self.images) + + def get_example(self, i): + """Returns the i-th example. + + Args: + i (int): The index of the example. + + Returns: + tuple of an image and its label. + The image is in CHW format and its color channel is ordered in + RGB. + a bounding box is appended to the returned value. + """ + img = utils.read_image( + os.path.join(self.data_dir, 'images', self.images[i]), + color=True) + # Add processing to the other two channels + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + img[1, :, :] = exposure.rescale_intensity(exposure.equalize_adapthist( + exposure.rescale_intensity(img[1, :, :])), out_range=(0, 255)) + img[2, :, :] = exposure.rescale_intensity(filters.gaussian( + exposure.rescale_intensity(img[2, :, :])), out_range=(0, 255)) + + # bbs should be a matrix (m by 4). m is the number of bounding + # boxes in the image + # labels should be an integer array (m by 1). m is the same as the bbs + + bbs_file = os.path.join(self.data_dir, 'bounding_boxes', self.images[i][0:-4]+'.txt') + print(bbs_file) + #bbs_file = "./Data/bounding_boxes/a.txt" + label_bbs = np.loadtxt(bbs_file, dtype=np.float32) + print(label_bbs) + # only 1D for medical case + #label = label_bbs[:,0].astype(np.int32) + #bbs = label_bbs[:,1:5] + label = label_bbs[0].astype(np.int32) + bbs = label_bbs[1:5] + + _, H, W = img.shape + if self.resize and (H != self.img_size or W != self.img_size): + img = transforms.resize(img, (self.img_size, self.img_size)) + bbs = transforms.resize_bbox(bbs, (H, W), (self.img_size, self.img_size)) + + return img, bbs, label