validation.m
6.79 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
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
clear all;
%for t=100:100:5000
t=2350;
X = 128;
Y = 128;
Z = 128;
D = 10;
t0=1;
r1=12;
r2=10;
% t=2300;
itr=5;
vote=7;
std = [5 5];
gt_filename = 'gt2.vol';
% out_filename = sprintf('128-128-128/0-nissl-std%d.%d-t0%d-r%d.%d-t%d-out%d.%d.vol',std(1), std(2),t0,r1,r2,t,itr,vote);
out_filename = sprintf('D:/build/ivote3-bld/0-out.%d.vol',t);
% txt_filename = sprintf('128-128-128/0-validation-nissl-std%d.%d-r%d.%d-t%d-out%d.%d-D%d.txt',std(1), std(2),r1,r2,t,itr,vote,D);
txt_filename = sprintf('D:/build/ivote3-bld/0-t%d-atomic-aabb.txt',t);
spec = sprintf('Nissl-std%d.%d-r%d.%d-t%d-out%d.%d',std(1), std(2),r1,r2,t,itr,vote);
fid0 = fopen(gt_filename);
gt = fread(fid0,[X Y*Z], 'single');
fclose(fid0);
% store x,y, and z directions of cell centers defined by the ground-trurth in an array
gt = reshape(gt, [X Y Z]);
[gtx, gty, gtz] = ind2sub(size(gt),find(gt));
ref = [gtx gty gtz];
fid1 = fopen(out_filename);
out = fread(fid1,[X Y*Z], 'single');
fclose(fid1);
% store x,y, and z directions of detected cells by the code in an array
out = reshape(out, [X Y Z]);
[cx, cy, cz] = ind2sub(size(out),find(out));
cent = [cx cy cz];
% 1-find the nearest detected cell for each element in the ground truth.
[idx, dist] = knnsearch(cent,ref);
% 2- find the same detected cells for different elements in the ground truth and assign that to which gt's element with the lowest distance.
ind_eq_idx = zeros(numel(idx), 10);
%set number of cells with the same detected cell center to zero.
noc=0;
for i=1:numel(idx)
% check the current element hasn't considered yet
s_ind = sum(ind_eq_idx==i);
if s_ind==0
% check how many of the elemnts assigned to the same detected cell
s = sum(idx==idx(i));
if s>1
noc = noc+1;
%save the index and number of gt's elements with the same assigned detected cells.
id_ref(noc,1) = i;
id_ref(noc,2) = s;
ind1 = find(idx==idx(i));
ind_eq_idx(i, 1:numel(ind1)) = ind1;
end
end
end
% determine those indices which hs assigned to only one detected cell
b = idx;
u_eq_idx = unique(ind_eq_idx(ind_eq_idx>0));
b(u_eq_idx)=0;
% set the number of over sefgmented cells to zero.
oseg=0;
for k=1:size(id_ref,1)
k1 = id_ref(k,1);
k2 = id_ref(k,2);
%find the minimum distance to the detected cell happened for which of the gt's element
l = ind_eq_idx(k1,1:k2);
[~, local_id_min] = min(dist(l));
% set the element with minimum distance to the corresponding detected cell
b(l(local_id_min)) = idx(k1);
%remove the proper element from the list of indices with same designated detected cells
u_eq_idx (u_eq_idx == l(local_id_min))=0;
% check if the indices remained in the list has distance less than the value is set for validation
ly = l (l~=l(local_id_min));
distl = dist(ly);
sl = sum(distl<D);
% if the distance is low enought, consider the corresponding cell as oversegmented
if sl>0
oseg = oseg+1;
end
end
% %****
% % check if the oversegmented detected cells could be assigned to the gt's element with no detected cell!
% %find the indices of gt's element with no detected cell
% u_idx1 = find(b==0);
% %find the coordinates of gt's
% ref1 = ref(u_idx1,:);
% % find the indices of detected cells which are assigned to a gt's element
% ub = unique(b(b>0));
% % set the number of detected cell which are not assigned to a gt's element to zero
% mm=0;
% % find the indices of detected cell which are not assigned to a gt's element
% for j=1:size(cent,1)
% z = sum(ub(:)==j);
% if z==0
% mm = mm+1;
% cent_id1(mm) = j;
% end
% end
% % find the coordinated of of detected cells
% cent1 = cent(cent_id1,:);
%
% % check if there are osme low enough distances
% [idx1, dist1] = knnsearch(cent1,ref1);
% ind_eq_idx_rc = zeros(numel(idx1), 10);
% %set number of cells with the same detected cell center to zero.
% noc_rc=0;
% for i_rc=1:numel(idx1)
% % check the current element hasn't considered yet
% s_ind_rc = sum(ind_eq_idx_rc==i_rc);
% if s_ind_rc==0
% % check how many of the elemnts assigned to the same detected cell
% s_rc = sum(idx1==idx1(i_rc));
% if s_rc>1
% noc_rc = noc_rc+1;
% %save the index and number of gt's elements with the same assigned detected cells.
% id_ref_rc(noc_rc,1) = i_rc;
% id_ref_rc(noc_rc,2) = s_rc;
% ind1_rc = find(idx1==idx1(i_rc));
% ind_eq_idx_rc(i_rc, 1:numel(ind1_rc)) = ind1_rc;
% end
% end
% end
% % determine those indices which hs assigned to only one detected cell
% b_rc = idx1;
% u_eq_idx_rc = unique(ind_eq_idx_rc(ind_eq_idx_rc>0));
% b_rc(u_eq_idx_rc)=0;
% % set the number of over sefgmented cells to zero.
% oseg_rc=0;
% for k_rc=1:size(id_ref_rc,1)
% k1_rc = id_ref_rc(k_rc,1);
% k2_rc = id_ref_rc(k_rc,2);
% %find the minimum distance to the detected cell happened for which of the gt's element
% l_rc = ind_eq_idx_rc(k1_rc,1:k2_rc);
% [~, local_id_min_rc] = min(dist1(l_rc));
% % set the element with minimum distance to the corresponding detected cell
% b_rc(l_rc(local_id_min_rc)) = idx1(k1_rc);
% %remove the proper element from the list of indices with same designated detected cells
% u_eq_idx_rc (u_eq_idx_rc == l_rc(local_id_min_rc))=0;
% % check if the indices remained in the list has distance less than the value is set for validation
% ly_rc = l_rc (l_rc~=l_rc(local_id_min_rc));
% distl_rc = dist1(ly_rc);
% sl_rc = sum(distl_rc<D);
% % if the distance is low enought, consider the corresponding cell as oversegmented
% if sl_rc>0
% oseg_rc = oseg_rc+1;
% end
% end
%******
% b include the gt's element and its detected cells, for those element with no cell detection, b has zero value
b_ind = find(b==0);
b_dist = dist;
% remove the disatances for those elements with no detected cells from distance array
b_dist(b_ind)=-1;
% b_ind_rc = find(b_rc==0);
% b_dist_rc = dist1;
% b_dist_rc(b_ind_rc)=-1;
% calculate Ttrue Positive, number of detected cells that have low enough distance to one of the gt's elements.
TP = sum(b_dist>=0) - sum(b_dist>D); % + (sum(b_dist_rc>=0) - sum(b_dist_rc>D));
% calculate False Negative, number of gt's elements with no detected cells.
FN = size(ref, 1) - TP;
% calculate False Positive, number of detected cells, which their distance to the gt's element is long
% or considered as over segmentation.
FP = size(cent,1) - TP;
% compute the validation factors.
Precision = TP/(TP + FP);
Recall = TP/(TP+FN);
Accuracy= TP/(TP+FP+FN);
fid_text = fopen(txt_filename, 'w');
fprintf(fid_text, '********--------\tValidation Results for %s\t--------********\n\n',spec);
fprintf(fid_text, 'number of detected cells by GROUND_TRUTH = %d\n', size(ref,1));
fprintf(fid_text, 'number of detected cells by IVOTE3 = %d\n', size(cent,1));
fprintf(fid_text, 'number of OVER-SEGMENTED cells = %d\n', oseg);
fprintf(fid_text, 'TP = %f,\t\tFP = %f,\t\tFN = %f\n', TP,FP,FN);
fprintf(fid_text, 'Precision = %f\n', Precision);
fprintf(fid_text, 'Accuracy = %f\n', Accuracy);
fprintf(fid_text, 'Recall = %f\n', Recall);
fclose(fid_text);
clear all;
%end