| import glob |
| import os |
| from PIL import Image |
| import urllib.request |
| from tqdm import tqdm |
|
|
| import numpy as np |
| import PIL.Image |
| import sys |
| from io import BytesIO |
| import IPython.display |
| import numpy as np |
| from math import ceil |
| from PIL import Image, ImageDraw |
| import os |
|
|
| from IPython.display import HTML |
| from base64 import b64encode |
| import imageio |
|
|
| def show_animation(movie_name): |
| mp4 = open(movie_name,'rb').read() |
| data_url = "data:video/mp4;base64," + b64encode(mp4).decode() |
| return HTML(""" |
| <video width=400 controls> |
| <source src="%s" type="video/mp4"> |
| </video> |
| """ % data_url) |
|
|
| def imshow(a, format='png', jpeg_fallback=True): |
| a = np.asarray(a, dtype=np.uint8) |
| str_file = BytesIO() |
| PIL.Image.fromarray(a).save(str_file, format) |
| im_data = str_file.getvalue() |
| try: |
| disp = IPython.display.display(IPython.display.Image(im_data)) |
| except IOError: |
| if jpeg_fallback and format != 'jpeg': |
| print ('Warning: image was too large to display in format "{}"; ' |
| 'trying jpeg instead.').format(format) |
| return imshow(a, format='jpeg') |
| else: |
| raise |
| return disp |
|
|
| |
| def clamp(x, minimum, maximum): |
| return max(minimum, min(x, maximum)) |
|
|
| def create_image_grid(images, scale=0.25, rows=1): |
| w,h = images[0].size |
| w = int(w*scale) |
| h = int(h*scale) |
| height = rows*h |
| cols = ceil(len(images) / rows) |
| width = cols*w |
| canvas = PIL.Image.new('RGBA', (width,height), 'white') |
| for i,img in enumerate(images): |
| img = img.resize((w,h), PIL.Image.ANTIALIAS) |
| canvas.paste(img, (w*(i % cols), h*(i // cols))) |
| return canvas |
|
|
| def find_latest_pkl(path): |
| curr_best = 0 |
| latest_pkl = '' |
| for pkl in glob.glob(f'{path}/*.pkl'): |
| ckpt_number = int(pkl.split('-')[-1][:-4]) |
| if curr_best < ckpt_number: |
| curr_best = ckpt_number |
| latest_pkl = pkl |
| return latest_pkl |
|
|
| def resize(path, dim = (512, 512)): |
| dirs = os.listdir(path) |
| out_path = f'{path}/{dim[0]}x{dim[1]}' |
| os.makedirs(out_path, exist_ok=True) |
| for item in log_progress(dirs): |
| img_path = f'{path}/{item}' |
| if os.path.isfile(img_path): |
| im = Image.open(img_path) |
| imResize = im.resize(dim, Image.ANTIALIAS).convert('RGB') |
| imResize.save(f'{out_path}/{item}', 'JPEG', quality=90) |
| return out_path |
|
|
| def resize_dirs(path, out_dir, dim = (512, 512)): |
| sub_dirs = os.listdir(path) |
| for sub_dir in sub_dirs: |
| out_path = f'{out_dir}/{sub_dir}' |
| os.makedirs(out_path, exist_ok=True) |
| for item in log_progress(os.listdir(f'{path}/{sub_dir}/')[:10]): |
| img_path = f'{path}/{sub_dir}/{item}' |
| if os.path.isfile(img_path): |
| im = Image.open(img_path) |
| imResize = im.resize(dim, Image.ANTIALIAS).convert('RGB') |
| imResize.save(f'{out_path}/{item}', 'JPEG', quality=90) |
| return out_dir |
|
|
| class DownloadProgressBar(tqdm): |
| def update_to(self, b=1, bsize=1, tsize=None): |
| if tsize is not None: |
| self.total = tsize |
| self.update(b * bsize - self.n) |
|
|
| |
| def download_url(url, output_path): |
| with DownloadProgressBar(unit='B', unit_scale=True, |
| miniters=1, desc=url.split('/')[-1]) as t: |
| urllib.request.urlretrieve(url, filename=output_path, reporthook=t.update_to) |
|
|
| |
| def log_progress(sequence, every=1, size=None, name='Items'): |
| from ipywidgets import IntProgress, HTML, VBox |
| from IPython.display import display |
|
|
| is_iterator = False |
| if size is None: |
| try: |
| size = len(sequence) |
| except TypeError: |
| is_iterator = True |
| if size is not None: |
| if every is None: |
| if size <= 200: |
| every = 1 |
| else: |
| every = int(size / 200) |
| else: |
| assert every is not None, 'sequence is iterator, set every' |
|
|
| if is_iterator: |
| progress = IntProgress(min=0, max=1, value=1) |
| progress.bar_style = 'info' |
| else: |
| progress = IntProgress(min=0, max=size, value=0) |
| label = HTML() |
| box = VBox(children=[label, progress]) |
| display(box) |
|
|
| index = 0 |
| try: |
| for index, record in enumerate(sequence, 1): |
| if index == 1 or index % every == 0: |
| if is_iterator: |
| label.value = '{name}: {index} / ?'.format( |
| name=name, |
| index=index |
| ) |
| else: |
| progress.value = index |
| label.value = u'{name}: {index} / {size}'.format( |
| name=name, |
| index=index, |
| size=size |
| ) |
| yield record |
| except: |
| progress.bar_style = 'danger' |
| raise |
| else: |
| progress.bar_style = 'success' |
| progress.value = index |
| label.value = "{name}: {index}".format( |
| name=name, |
| index=str(index or '?') |
| ) |