from fastai2.vision.all import * source = untar_data(URLs.MNIST_TINY)/'train' items = get_image_files(source) fn = items[0]; fn img = PILImage.create(fn); img tconv = ToTensor() img = tconv(img) img.shape,type(img) lbl = parent_label(fn); lbl tcat = Categorize(vocab=['3','7']) lbl = tcat(lbl); lbl lbld = tcat.decode(lbl) lbld pipe = Pipeline([PILImage.create,tconv]) img = pipe(fn) img.shape pipe.show(img, figsize=(1,1), cmap='Greys'); type(img) # !pip install albumentations source = untar_data(URLs.PETS) items = get_image_files(source/"images") img = PILImage.create(items[0]) img from albumentations import ShiftScaleRotate aug = ShiftScaleRotate(p=1) def aug_tfm(img): np_img = np.array(img) aug_img = aug(image=np_img)['image'] return PILImage.create(aug_img) aug_tfm(img) tfm = Transform(aug_tfm) class AlbumentationsTransform(Transform): def __init__(self, aug): self.aug = aug def encodes(self, img: PILImage): aug_img = self.aug(image=np.array(img))['image'] return PILImage.create(aug_img) tfm = AlbumentationsTransform(ShiftScaleRotate(p=1)) a,b = tfm((img, 'dog')) show_image(a, title=b); cv_source = untar_data(URLs.CAMVID_TINY) cv_items = get_image_files(cv_source/'images') img = PILImage.create(cv_items[0]) mask = PILMask.create(cv_source/'labels'/f'{cv_items[0].stem}_P{cv_items[0].suffix}') ax = img.show() ax = mask.show(ctx=ax) class SegmentationAlbumentationsTransform(ItemTransform): def __init__(self, aug): self.aug = aug def encodes(self, x): img,mask = x aug = self.aug(image=np.array(img), mask=np.array(mask)) return PILImage.create(aug["image"]), PILMask.create(aug["mask"]) tfm = SegmentationAlbumentationsTransform(ShiftScaleRotate(p=1)) a,b = tfm((img, mask)) ax = a.show() ax = b.show(ctx=ax) source = untar_data(URLs.PETS)/"images" items = get_image_files(source) def resized_image(fn:Path, sz=128): x = Image.open(fn).convert('RGB').resize((sz,sz)) # Convert image to tensor for modeling return tensor(array(x)).permute(2,0,1).float()/255. class TitledImage(fastuple): def show(self, ctx=None, **kwargs): show_titled_image(self, ctx=ctx, **kwargs) img = resized_image(items[0]) TitledImage(img,'test title').show() class PetTfm(Transform): def __init__(self, vocab, o2i, lblr): self.vocab,self.o2i,self.lblr = vocab,o2i,lblr def encodes(self, o): return [resized_image(o), self.o2i[self.lblr(o)]] def decodes(self, x): return TitledImage(x[0],self.vocab[x[1]]) labeller = using_attr(RegexLabeller(pat = r'^(.*)_\d+.jpg$'), 'name') vals = list(map(labeller, items)) vocab,o2i = uniqueify(vals, sort=True, bidir=True) pets = PetTfm(vocab,o2i,labeller) x,y = pets(items[0]) x.shape,y dec = pets.decode([x,y]) dec.show() class PetTfm(ItemTransform): def __init__(self, vocab, o2i, lblr): self.vocab,self.o2i,self.lblr = vocab,o2i,lblr def encodes(self, o): return (resized_image(o), self.o2i[self.lblr(o)]) def decodes(self, x): return TitledImage(x[0],self.vocab[x[1]]) dec = pets.decode(pets(items[0])) dec.show() class PetTfm(ItemTransform): def setups(self, items): self.labeller = using_attr(RegexLabeller(pat = r'^(.*)_\d+.jpg$'), 'name') vals = map(self.labeller, items) self.vocab,self.o2i = uniqueify(vals, sort=True, bidir=True) def encodes(self, o): return (resized_image(o), self.o2i[self.labeller(o)]) def decodes(self, x): return TitledImage(x[0],self.vocab[x[1]]) pets = PetTfm() pets.setup(items) x,y = pets(items[0]) x.shape, y dec = pets.decode((x,y)) dec.show() class PetTfm(ItemTransform): def setups(self, items): self.labeller = using_attr(RegexLabeller(pat = r'^(.*)_\d+.jpg$'), 'name') vals = map(self.labeller, items) self.vocab,self.o2i = uniqueify(vals, sort=True, bidir=True) def encodes(self, o): return (PILImage.create(o), self.o2i[self.labeller(o)]) def decodes(self, x): return TitledImage(x[0],self.vocab[x[1]]) tfms = Pipeline([PetTfm(), Resize(224), FlipItem(p=1), ToTensor()]) tfms.setup(items) tfms.vocab x,y = tfms(items[0]) x.shape,y tfms.show(tfms(items[0])) tfms FlipItem.order,Resize.order class PetTfm(ItemTransform): order = -5 def setups(self, items): self.labeller = using_attr(RegexLabeller(pat = r'^(.*)_\d+.jpg$'), 'name') vals = map(self.labeller, items) self.vocab,self.o2i = uniqueify(vals, sort=True, bidir=True) def encodes(self, o): return (PILImage.create(o), self.o2i[self.labeller(o)]) def decodes(self, x): return TitledImage(x[0],self.vocab[x[1]]) tfms = Pipeline([Resize(224), PetTfm(), FlipItem(p=1), ToTensor()]) tfms tls = TfmdLists(items, [Resize(224), PetTfm(), FlipItem(p=0.5), ToTensor()]) x,y = tls[0] x.shape,y tls.vocab tls.show((x,y)) show_at(tls, 0) splits = RandomSplitter(seed=42)(items) splits tls = TfmdLists(items, [Resize(224), PetTfm(), FlipItem(p=0.5), ToTensor()], splits=splits) show_at(tls.train, 0) dls = tls.dataloaders(bs=64) dls.show_batch() dls = tls.dataloaders(bs=64, after_batch=[IntToFloatTensor(), *aug_transforms()]) dls.show_batch() class ImageResizer(Transform): order=1 "Resize image to `size` using `resample`" def __init__(self, size, resample=Image.BILINEAR): if not is_listy(size): size=(size,size) self.size,self.resample = (size[1],size[0]),resample def encodes(self, o:PILImage): return o.resize(size=self.size, resample=self.resample) def encodes(self, o:PILMask): return o.resize(size=self.size, resample=Image.NEAREST) tfms = [[PILImage.create, ImageResizer(128), ToTensor(), IntToFloatTensor()], [labeller, Categorize()]] dsets = Datasets(items, tfms) t = dsets[0] type(t[0]),type(t[1]) x,y = dsets.decode(t) x.shape,y dsets.show(t); dsets = Datasets(items, tfms, splits=splits) tfms = [[PILImage.create], [labeller, Categorize()]] dsets = Datasets(items, tfms, splits=splits) dls = dsets.dataloaders(bs=64, after_item=[ImageResizer(128), ToTensor(), IntToFloatTensor()]) dls.show_batch() dsets = Datasets(items, tfms) dl = TfmdDL(dsets, bs=64, after_item=[ImageResizer(128), ToTensor(), IntToFloatTensor()]) cv_source = untar_data(URLs.CAMVID_TINY) cv_items = get_image_files(cv_source/'images') cv_splitter = RandomSplitter(seed=42) cv_split = cv_splitter(cv_items) cv_label = lambda o: cv_source/'labels'/f'{o.stem}_P{o.suffix}' tfms = [[PILImage.create], [cv_label, PILMask.create]] cv_dsets = Datasets(cv_items, tfms, splits=cv_split) dls = cv_dsets.dataloaders(bs=64, after_item=[ImageResizer(128), ToTensor(), IntToFloatTensor()]) dls.show_batch(max_n=4) class SegmentationAlbumentationsTransform(ItemTransform): split_idx = 0 def __init__(self, aug): self.aug = aug def encodes(self, x): img,mask = x aug = self.aug(image=np.array(img), mask=np.array(mask)) return PILImage.create(aug["image"]), PILMask.create(aug["mask"]) cv_dsets = Datasets(cv_items, tfms, splits=cv_split) dls = cv_dsets.dataloaders(bs=64, after_item=[ImageResizer(128), ToTensor(), IntToFloatTensor(), SegmentationAlbumentationsTransform(ShiftScaleRotate(p=1))]) dls.show_batch(max_n=4) tfms = [[PILImage.create], [labeller, Categorize()]] dsets = Datasets(items, tfms, splits=splits) dls = dsets.dataloaders(bs=64, after_item=[ImageResizer(128), ToTensor(), IntToFloatTensor()]) path = untar_data(URLs.PETS) tst_files = get_image_files(path/"images") len(tst_files) tst_dl = dls.test_dl(tst_files) tst_dl.show_batch(max_n=9)