-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmisc_utils.py
135 lines (106 loc) · 5.4 KB
/
misc_utils.py
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 25 17:14:25 2020
@author: malrawi
"""
import torchvision.transforms as transforms # torch transform used for computer vision applications
from PIL import Image
from datasets import ImageDataset, get_clothCoParse_class_names
from torch.utils.data import DataLoader
import torch
import utils
import numpy as np
from tkinter import Tk
from tkinter.filedialog import askopenfilename
from modanet_dataset import ModanetDataset
import sys
def get_any_image():
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
# if not filename:
# print("Program ended: Canceling selecting an image")
# sys.exit(0)
return filename
def sample_images(images, targets, model, device, number_of_classes):
score_threshold = 0.8
class_name = get_clothCoParse_class_names()
images = list(image.to(device) for image in images)
model.eval() # setting model to evaluation mode
with torch.no_grad():
predictions = model(images) # Returns predictions
masks = predictions[0]['masks'].cpu().squeeze(1)
labels = predictions[0]['labels'].cpu()
scores = predictions[0]['scores'].cpu() # scores are already sorted
np.set_printoptions(precision=2)
print("scores", scores.numpy())
print('detected labels', labels.numpy())
print('sorted detected labels', labels.sort()[0].numpy())
print('original labels', targets[0]['labels'].sort()[0].numpy())
print('detected labels', labels[scores>score_threshold].sort()[0].numpy(), '>scor_thr', score_threshold)
print('-------------# # # #-----------')
to_pil = transforms.ToPILImage()
to_pil(images[0].cpu()).show()
for i in range(len(labels)): # we have one label for each mask
if scores[i].item()>score_threshold:
Image.fromarray( 255*masks[i].numpy().round() ).show()
print('label:', labels[i].item(), ', score: {:.2f}'.format(scores[i].numpy()), 'class is', class_name[labels[i]])
model.train() # putting back the model into train status/mode
def get_transforms():
transforms_train = [
# transforms.Resize((opt.img_height, opt.img_width), Image.BICUBIC),
transforms.ToTensor(),
transforms.Normalize( (.5, )*3, (.5, )*3, (.5, )*3), ]
transforms_target = None
transforms_test = [ transforms.ToTensor(),
transforms.Normalize( (.5, )*3, (.5, )*3, (.5, )*3), ]
return transforms_train, transforms_test, transforms_target
def get_dataloaders(opt):
# Configure dataloaders
transforms_train, transforms_test, transforms_target = get_transforms()
if opt.dataset_name=='Modanet':
dataset=ModanetDataset("../data/%s" % opt.dataset_name,
transforms_ = transforms_train,
HPC_run=opt.HPC_run, )
dataset_test=ModanetDataset("../data/%s" % opt.dataset_name,
transforms_ = transforms_test,
HPC_run=opt.HPC_run, )
elif opt.dataset_name=='ClothCoParse':
dataset = ImageDataset("../data/%s" % opt.dataset_name,
transforms_ = transforms_train,
transforms_target=transforms_target,
mode="train",
HPC_run=opt.HPC_run,
remove_background = opt.remove_background,
person_detection = opt.person_detection
)
dataset_test = ImageDataset("../data/%s" % opt.dataset_name,
transforms_ = transforms_test,
transforms_target=transforms_target,
mode="train", # we are splitting data later, so all will be in train folder
HPC_run=opt.HPC_run,
remove_background = opt.remove_background,
person_detection = opt.person_detection
)
else:
print( opt.dataset_name, " is incorrect dataset name, please select another one")
sys.exit(0)
num_classes = dataset.number_of_classes(opt) # for some reason, number_of_classes will be lost if we move this line down after the block
# split the dataset in train and test set
train_samples = int(len(dataset)*opt.train_percentage)
dataset, dataset_test = torch.utils.data.random_split(dataset, [train_samples, len(dataset)-train_samples])
dataloader = DataLoader(
dataset,
batch_size=opt.batch_size,
shuffle=opt.train_shuffle,
num_workers = opt.n_cpu,
collate_fn= utils.collate_fn
)
'''test is same as train for now'''
data_loader_test = DataLoader(
dataset_test,
batch_size=1,
shuffle=False,
num_workers=opt.n_cpu,
collate_fn=utils.collate_fn
)
return dataloader, data_loader_test, num_classes