[05e710]: / mediaug / command_line.py

Download this file

96 lines (80 with data), 3.7 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import pathlib
from PIL import Image
import os
import random
from os.path import join
import click
from math import floor
from itertools import cycle
from mediaug.image_utils import read_png, save_img, get_blank_mask
from mediaug.utils import create_dirs
from mediaug.data_prep import make_pix2pix_format
from mediaug.dataset import Dataset
from mediaug.augment import randomly_insert_cells
@click.group()
def cli():
pass
@cli.command()
@click.argument('input_dir', type=click.Path(exists=True))
@click.argument('out_dir', type=click.Path(exists=False))
@click.argument('w')
@click.argument('h')
@click.option('--out_type', default='png')
def resize_image(in_dir, out_dir, w, h):
"""resize all images in a dir"""
print(in_dir, out_dir, h, w)
pathlib.Path(out_dir).mkdir(parents=True)
for subdir, dirs, files in os.walk(in_dir):
for file in files:
if file.endswith('png') or file.endswith('jpg'):
im = Image.open(join(subdir, file))
imResize = im.resize((h, w), Image.ANTIALIAS)
cell_type = os.path.basename(subdir)
pathlib.Path(join(out_dir, cell_type)).mkdir(parents=True, exist_ok=True)
imResize.save(join(out_dir, cell_type, file), 'PNG')
@cli.command()
@click.option('--slide_dir', type=click.Path(exists=True), required=True)
@click.option('--cell_dir', type=click.Path(exists=True), required=True)
@click.option('--out_dir', type=click.Path(), required=True)
@click.option('--num', type=int, required=True)
@click.option('--max_cells', type=int, default=7)
def generate_augment_dataset(slide_dir, cell_dir, out_dir, num, max_cells):
""" Adds cells to slides to produce a weekly supervised training
dataset for SIPaKMeD dataset.
"""
slides = Dataset(slide_dir)
cells = Dataset(cell_dir)
out_ds = Dataset(out_dir, ['all'])
good_slides = slides['superficial-intermediate'] + slides['parabasal']
random.shuffle(good_slides)
slide_generator = cycle(good_slides)
bad_cells = list(set(slides.classes) - set(['superficial-intermediate', 'parabasal']))
for i in range(num):
slide = next(slide_generator)
new_img, new_mask = randomly_insert_cells(slide.img, get_blank_mask(slide.img), cells, bad_cells, (0,max_cells))
out_ds.add_data(new_img, new_mask, 'all', i)
@cli.command()
@click.option('-i', '--image_dir', type=click.Path(exists=True), required=True)
@click.option('-m', '--mask_dir', type=click.Path(exists=True), required=True)
@click.option('-o', '--out_dir', type=click.Path(), required=True)
@click.option('-r', '--split_ratio', type=float, required=True)
def prepare_pix2pix_images(image_dir, mask_dir, out_dir, split_ratio):
""" Prepares images to be in correct format for Pix2Pix algorithm."""
images_list = os.listdir(image_dir)
create_dirs(out_dir, ['train', 'val', 'test', 'all'])
# calc split cutoffs
train_cutoff = floor(split_ratio * len(images_list))
val_cutoff = train_cutoff + floor((len(images_list)-train_cutoff) // 2)
for i, image_path in enumerate(images_list):
mask_path = join(mask_dir, os.path.basename(image_path))
img = read_png(join(image_dir, image_path))
mask = read_png(join(mask_dir, mask_path))
new_img = make_pix2pix_format(img, mask)
# split the data
if i < train_cutoff:
save_img(new_img, join(out_dir, 'train', f'{i}.jpg'))
elif i < val_cutoff:
save_img(new_img, join(out_dir, 'val', f'{i}.jpg'))
else:
save_img(new_img, join(out_dir, 'test', f'{i}.jpg'))
save_img(new_img, join(out_dir, 'all', f'{i}.jpg'))