-
Notifications
You must be signed in to change notification settings - Fork 5
/
predict2.py
141 lines (127 loc) · 6.13 KB
/
predict2.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
136
137
138
139
140
141
import math
import numpy as np
import matplotlib.pyplot as plt
import tifffile as tiff
from train_unet import weights_path, get_model, normalize, PATCH_SZ, N_CLASSES
def predict(x, model, patch_sz=160, n_classes=8):
img_height = x.shape[0]
img_width = x.shape[1]
n_channels = x.shape[2]
# make extended img so that it contains integer number of patches
npatches_vertical = math.ceil(img_height / patch_sz)
npatches_horizontal = math.ceil(img_width / patch_sz)
extended_height = patch_sz * npatches_vertical
extended_width = patch_sz * npatches_horizontal
ext_x = np.zeros(shape=(extended_height, extended_width, n_channels), dtype=np.float32)
# fill extended image with mirrors:
ext_x[:img_height, :img_width, :] = x
for i in range(img_height, extended_height):
ext_x[i, :, :] = ext_x[2 * img_height - i - 1, :, :]
for j in range(img_width, extended_width):
ext_x[:, j, :] = ext_x[:, 2 * img_width - j - 1, :]
# now we assemble all patches in one array
patches_list = []
for i in range(0, npatches_vertical):
for j in range(0, npatches_horizontal):
x0, x1 = i * patch_sz, (i + 1) * patch_sz
y0, y1 = j * patch_sz, (j + 1) * patch_sz
patches_list.append(ext_x[x0:x1, y0:y1, :])
# model.predict() needs numpy array rather than a list
patches_array = np.asarray(patches_list)
# predictions:
patches_predict = model.predict(patches_array, batch_size=4)
prediction = np.zeros(shape=(extended_height, extended_width, n_classes), dtype=np.float32)
print("starting of k")
print(npatches_horizontal)
i=0
j=0
for k in range(1,1+patches_predict.shape[0]):
x0, x1 = (i) * patch_sz, (i+1) * patch_sz
y0, y1 = (j) * patch_sz, (j+1) * patch_sz
if (k % npatches_horizontal == 0 and k!=0):
i+=1
j=0
else:
j+=1
prediction[x0:x1, y0:y1, :] = patches_predict[k-1, :, :, :]
print("ending of k")
return prediction[:img_height, :img_width, :]
def picture_from_mask(mask, threshold=0):
colors = {
0: [150, 80, 0], # Brown - Bare Soil
1: [0, 255, 0], # Light green - Grass
2: [100, 100, 100], # Gray - Building
3: [150, 150, 255], # Purple - Swimming Pool
4: [0, 125, 0], # Dark Green - Trees
5: [0, 0, 0], # Black - Roads
6: [255, 255, 0], # Yellow - Railway Station
7: [0, 0, 150] # Blue - Water
}
z_order = {
1: 2,
2: 6,
3: 5,
4: 7,
5: 1,
6: 0,
7: 4,
8: 3
}
pict = 255*np.ones(shape=(3, mask.shape[1], mask.shape[2]), dtype=np.uint8)
for i in range(1, 9):
cl = z_order[i]
for ch in range(3):
pict[ch,:,:][mask[cl,:,:] > threshold] = colors[cl][ch]
return pict
if __name__ == '__main__':
model = get_model()
weights_path = "weights/unet_weights_30_50ep.hdf5"
model.load_weights(weights_path)
print(weights_path)
for i in range(1,15):
test_id = str(i)
print('Predicting for data/sat/{}.tif'.format(test_id))
img = normalize(tiff.imread('data/sat/{}.tif'.format(test_id)))
print(img.shape)
for i in range(15):
if i == 0: # reverse first dimension
mymat = predict(img[::-1,:,:], model, patch_sz=PATCH_SZ, n_classes=N_CLASSES).transpose([2,0,1])
#print(mymat[0][0][0], mymat[3][12][13])
# print("Case 1",img.shape, mymat.shape)
elif i == 1: # reverse second dimension
temp = predict(img[:,::-1,:], model, patch_sz=PATCH_SZ, n_classes=N_CLASSES).transpose([2,0,1])
#print(temp[0][0][0], temp[3][12][13])
print("Case 2", temp.shape, mymat.shape)
mymat = np.mean( np.array([ temp[:,::-1,:], mymat ]), axis=0 )
elif i == 2: # transpose(interchange) first and second dimensions
temp = predict(img.transpose([1,0,2]), model, patch_sz=PATCH_SZ, n_classes=N_CLASSES).transpose([2,0,1])
#print(temp[0][0][0], temp[3][12][13])
print("Case 3", temp.shape, mymat.shape)
mymat = np.mean( np.array([ temp.transpose(0,2,1), mymat ]), axis=0 )
elif i == 3:
temp = predict(np.rot90(img, 1), model, patch_sz=PATCH_SZ, n_classes=N_CLASSES)
#print(temp.transpose([2,0,1])[0][0][0], temp.transpose([2,0,1])[3][12][13])
# print("Case 4", temp.shape, mymat.shape)
mymat = np.mean( np.array([ np.rot90(temp, -1).transpose([2,0,1]), mymat ]), axis=0 )
elif i == 4:
temp = predict(np.rot90(img,2), model, patch_sz=PATCH_SZ, n_classes=N_CLASSES)
#print(temp.transpose([2,0,1])[0][0][0], temp.transpose([2,0,1])[3][12][13])
# print("Case 5", temp.shape, mymat.shape)
mymat = np.mean( np.array([ np.rot90(temp,-2).transpose([2,0,1]), mymat ]), axis=0 )
elif i == 5:
temp = predict(np.rot90(img,3), model, patch_sz=PATCH_SZ, n_classes=N_CLASSES)
#print(temp.transpose([2,0,1])[0][0][0], temp.transpose([2,0,1])[3][12][13])
# print("Case 6", temp.shape, mymat.shape)
mymat = np.mean( np.array([ np.rot90(temp, -3).transpose(2,0,1), mymat ]), axis=0 )
else:
temp = predict(img, model, patch_sz=PATCH_SZ, n_classes=N_CLASSES).transpose([2,0,1])
#print(temp[0][0][0], temp[3][12][13])
# print("Case 7", temp.shape, mymat.shape)
mymat = np.mean( np.array([ temp, mymat ]), axis=0 )
#print(mymat[0][0][0], mymat[3][12][13])
map = picture_from_mask(mymat, 0.5)
#mask = predict(img, model, patch_sz=PATCH_SZ, n_classes=N_CLASSES).transpose([2,0,1]) # make channels first
#map = picture_from_mask(mask, 0.5)
#tiff.imsave('result.tif', (255*mask).astype('uint8'))
tiff.imsave('data/kvinputData/res{}.tif'.format(test_id), (255*mymat).astype('uint8'))
tiff.imsave('data/kvinputData/map{}.tif'.format(test_id), map)