-
Notifications
You must be signed in to change notification settings - Fork 3
/
utilities.py
155 lines (87 loc) · 5.67 KB
/
utilities.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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# -*- coding: utf-8 -*-
"""
Spyder Editor
Author: Sudipan Saha
"""
import numpy as np
import scipy.io as sio
import cv2
def matchSegmentationResultToOriginalLabel(resultMap, referenceMap):
##ADDING 1 to not keep any zero value
##Otherwise zero is an object here (Impervious surfaces)
resultMap = resultMap+1
referenceMap = referenceMap+1
##Finding unique values
resultMapUniqueVals = np.unique(resultMap)
referenceMapUniqueVals,referenceMapUniqueCounts = np.unique(referenceMap, return_counts=True)
referenceSortingIndices = np.argsort(-referenceMapUniqueCounts)
referenceMapUniqueVals = referenceMapUniqueVals[referenceSortingIndices]
resultToReferenceRelationMatrix = np.zeros((len(resultMapUniqueVals),len(referenceMapUniqueVals)))
totalIntersection = 0
for resultIndex, resultUniqueVal in enumerate(resultMapUniqueVals):
resultUniqueValIndicator = np.copy(resultMap)
resultUniqueValIndicator[resultUniqueValIndicator!=resultUniqueVal] = 0
for referenceIndex,referenceUniqueVal in enumerate(referenceMapUniqueVals):
referenceUniqueValIndicator = np.copy(referenceMap)
referenceUniqueValIndicator[referenceUniqueValIndicator!=referenceUniqueVal] = 0
resultReferenceIntersection = resultUniqueValIndicator*referenceUniqueValIndicator
numIntersection = len(np.argwhere(resultReferenceIntersection))
totalIntersection = totalIntersection+numIntersection
resultToReferenceRelationMatrix[resultIndex,referenceIndex] = numIntersection
resultMapReassigned = np.zeros(resultMap.shape)
for referenceIndex,referenceUniqueVal in enumerate(referenceMapUniqueVals):
matchesCorrespondingToThisVal = resultToReferenceRelationMatrix[:,referenceIndex]
if np.sum(matchesCorrespondingToThisVal)==0: ##this check is important, other python finds a max even in a all-zero column
continue
maximizingIndex = np.argsort(matchesCorrespondingToThisVal)[-1]
resultMapOptimumMatch = resultMapUniqueVals[maximizingIndex]
resultMapReassigned[resultMap==resultMapOptimumMatch] = referenceUniqueVal
resultToReferenceRelationMatrix[maximizingIndex,:] = 0
##Subtracting 1 to keep values as it were
resultMapReassigned = resultMapReassigned-1
##if some label in the result map has not been assigned to any class of reference, then it will have value -1 at this stage
##we reassign it to 6, since "6" indicates undefined class in Potsdam dataset
resultMapReassigned[resultMapReassigned==-1]=6
return resultMapReassigned.astype(int)
def matchSegmentationResultToOriginalLabelZurich(resultMap, referenceMap):
##ADDING 1 to not keep any zero value
##Otherwise zero is an object here (Impervious surfaces)
resultMap = resultMap+1
referenceMap = referenceMap+1
##Finding unique values
resultMapUniqueVals = np.unique(resultMap)
referenceMapUniqueVals,referenceMapUniqueCounts = np.unique(referenceMap, return_counts=True)
referenceSortingIndices = np.argsort(-referenceMapUniqueCounts)
referenceMapUniqueVals = referenceMapUniqueVals[referenceSortingIndices]
resultToReferenceRelationMatrix = np.zeros((len(resultMapUniqueVals),len(referenceMapUniqueVals)))
totalIntersection = 0
for resultIndex, resultUniqueVal in enumerate(resultMapUniqueVals):
resultUniqueValIndicator = np.copy(resultMap)
resultUniqueValIndicator[resultUniqueValIndicator!=resultUniqueVal] = 0
for referenceIndex,referenceUniqueVal in enumerate(referenceMapUniqueVals):
referenceUniqueValIndicator = np.copy(referenceMap)
referenceUniqueValIndicator[referenceUniqueValIndicator!=referenceUniqueVal] = 0
resultReferenceIntersection = resultUniqueValIndicator*referenceUniqueValIndicator
numIntersection = len(np.argwhere(resultReferenceIntersection))
totalIntersection = totalIntersection+numIntersection
resultToReferenceRelationMatrix[resultIndex,referenceIndex] = numIntersection
# print(resultToReferenceRelationMatrix.astype(int))
resultMapReassigned = np.zeros(resultMap.shape)
for referenceIndex,referenceUniqueVal in enumerate(referenceMapUniqueVals):
matchesCorrespondingToThisVal = resultToReferenceRelationMatrix[:,referenceIndex]
if np.sum(matchesCorrespondingToThisVal)==0: ##this check is important, other python finds a max even in a all-zero column
continue
maximizingIndex = np.argsort(matchesCorrespondingToThisVal)[-1]
resultMapOptimumMatch = resultMapUniqueVals[maximizingIndex]
#print(resultMapOptimumMatch)
#print(referenceUniqueVal)
resultMapReassigned[resultMap==resultMapOptimumMatch] = referenceUniqueVal
resultToReferenceRelationMatrix[maximizingIndex,:] = 0
# print(np.unique(resultMap))
# print(np.unique(referenceMap))
##Subtracting 1 to keep values as it were
resultMapReassigned = resultMapReassigned-1
##if some label in the result map has not been assigned to any class of reference, then it will have value -1 at this stage
##we reassign it to 8, since "8" indicates uncategorized/background class in Zurich dataset
resultMapReassigned[resultMapReassigned==-1]=8
return resultMapReassigned.astype(int)