Blame view

cpp/main.cpp 9.27 KB
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
1
  #include <iostream>
46820b25   Laila Saadatifard   create an obj fil...
2
  #include <string>
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
3
  #include <fstream>
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
4
5
6
7
  #include <cuda_runtime.h>
  #include <stim/math/vector.h>
  #include <stim/parser/arguments.h>
  #include <stim/parser/filename.h>
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
8
  #include <stim/visualization/colormap.h>
f12505fb   Laila Saadatifard   upload the ivote ...
9
  #include <stim/image/image.h>
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
10
11
  #define pi	3.14159
  
1f55a874   Laila Saadatifard   upload the fixed ...
12
13
14
15
16
17
18
  //#define M_PI	3.14159
  //#include <stim/math/circle.h>
  //#include <stim/math/vec3.h>
  //#include <stim/math/plane.h>
  //#include <stim/math/vector.h>
  //#include <stim/visualization/aabb3.h>
  
a744d027   Laila Saadatifard   upload the ivote3...
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
  
  
  /*void test_3(float* gpu_out, float* gpu_grad, float rmax, float phi, int n, int x, int y, int z);
  
  int main(){
  	
  	int  n=20;
  	float rmax;
  	float phi_deg;
  	float phi;
  	rmax=4;
  	phi_deg = 15;
  	phi = phi_deg * pi/180;
  	int x,y,z;
  	x=y=z=1;
  	unsigned int size = x*y*z*sizeof (float);
  	float* cpu_grad = (float*) malloc(3*size);
  	float* gpu_grad;
  	cudaMalloc(&gpu_grad, 3*size);
  	cpu_grad[0]=1;
  	cpu_grad[1]=0;
  	cpu_grad[2]=-0.5;
  	cudaMemcpy(gpu_grad, cpu_grad, 3*size, cudaMemcpyHostToDevice);
  	float* cpu_out = (float*) malloc(3*size*(n+1));
  	float* gpu_out;
  	cudaMalloc(&gpu_out, 3*size*(n+1));
  	test_3(gpu_out, gpu_grad, rmax, phi, n, x, y, z);
  	cudaMemcpy(cpu_out, gpu_out, 3*size*(n+1), cudaMemcpyDeviceToHost);
  	std::ofstream list("circle_check_cuda1.txt");
  	if (list.is_open()){
  		for (int j=0; j<=n; ++j)
  			list << cpu_out[3*j] << '\t' << cpu_out[3*j +1] << '\t' << cpu_out[3*j + 2] << '\n';
  	}
  	list.close();
  	*/
1f55a874   Laila Saadatifard   upload the fixed ...
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
  /*
  	int main(){
  
  
  		stim::vec3<float> g(-44,-3.4,-0.005);   // form a vec3 variable for the gradient vector
  			stim::vec3<float> g_sph = g.cart2sph();			//convert cartesian coordinate to spherical for the gradient vector
  			int n =36;										//set the number of points to find the boundaries of the conical voting area
  			int xi = 105;
  			int yi = 17;
  			int zi = 23;
  			float xc = 12 * cos(g_sph[1]) * sin(g_sph[2]);			//calculate the center point of the surface of the voting area for the voter
  			float yc = 10 * sin(g_sph[1]) * sin(g_sph[2]) ;
  			float zc = 10 * cos(g_sph[2]) ;
  			float r = sqrt(xc*xc + yc*yc + zc*zc);
  			xc+=xi;
  			yc+=yi;
  			zc+=zi;
  			stim::vec3<float> center(xc,yc,zc);
  			
  			float d = 2 * r * tan(25*pi/180 );		//find the diameter of the conical voting area
  			stim::vec3<float> norm = g.norm();			//compute the normalize gradient vector
  			float step = 360.0/(float) n;
  			stim::circle<float>  cir(center, d, norm);
  			stim::aabb3<int> bb(xi,yi,zi);
  			bb.insert(xc,yc,zc);
  			for(float j = 0; j <360.0; j += step){
  				stim::vec3<float> out = cir.p(j);
  				bb.insert(out[0], out[1], out[2]);
  			}
  
  			bb.trim_low(0,0,0);
  			bb.trim_high(128-1, 128-1, 128-1);
  
  			std::cout<< bb.low[0] << '\t' << bb.low[1] << '\t' << bb.low[2] << '\n';
  			std::cout<< bb.high[0] << '\t' << bb.high[1] << '\t' << bb.high[2] << '\n';
  			std::cin >> n;
  */
  		/*int  n=10;
  		stim::circle<float>  cir;
  		float* c0= (float*) malloc(3*sizeof(float));
  		c0[0] =-4;
  		c0[1]=0;
  		c0[2] = 3;
  		stim::vec3<float> c(c0[0],c0[1],c0[2]);
  		float len = c.len();
  		stim::vec3<float> norm(c0[0]/len,c0[1]/len,c0[2]/len);
  		std::cout<< len << '\n';
  		std::cout<< norm << '\n';
  		cir.center(c);
  		cir.normal(norm);
  		cir.scale(2);
  		stim::vec3<float> out = cir.p(45);
  		std::vector<stim::vec3<float>> out2 = cir.getPoints(n);
a744d027   Laila Saadatifard   upload the ivote3...
107
  	
1f55a874   Laila Saadatifard   upload the fixed ...
108
109
110
  		std::cout<< out << '\n';
  		std::cout <<out[0] << '\t' << out[1] << '\t' << out[2] <<'\n';
  		std::cout<< c << '\n';
a744d027   Laila Saadatifard   upload the ivote3...
111
  	
1f55a874   Laila Saadatifard   upload the fixed ...
112
113
114
115
116
117
118
119
120
  		for (std::vector<stim::vec3<float>>::const_iterator i = out2.begin(); i != out2.end(); ++i)
  		std::cout << *i << '\n';
  		std::ofstream list("circle_check.txt");
  		if (list.is_open()){
  			for (std::vector<stim::vec3<float>>::const_iterator j = out2.begin(); j != out2.end(); ++j)
  				list << *j << '\n';
  		}
  		list.close();
  		std::cin >> n;
a744d027   Laila Saadatifard   upload the ivote3...
121
122
  
  }
a744d027   Laila Saadatifard   upload the ivote3...
123
  */
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
124
  
1f55a874   Laila Saadatifard   upload the fixed ...
125
  
46820b25   Laila Saadatifard   create an obj fil...
126
  void ivote3(float* img, float std[], float anisotropy, float phi, float d_phi, unsigned int r[], int iter, float t, unsigned int conn[], 
f12505fb   Laila Saadatifard   upload the ivote ...
127
  			unsigned int x, unsigned int y, unsigned int z);
46820b25   Laila Saadatifard   create an obj fil...
128
  void lmax(float* center, float* vote, float t1, unsigned int conn[], unsigned int x, unsigned int y, unsigned int z);
f12505fb   Laila Saadatifard   upload the ivote ...
129
130
131
132
133
134
135
136
137
138
139
  
  void invert_data(float* cpuI, unsigned int x, unsigned int y, unsigned int z){
  		for(int ix = 0; ix < x; ix++){
  			for (int iy = 0; iy < y; iy++){
  				for (int iz = 0; iz < z; iz++){
  					int idx = iz * x * y + iy * x + ix;
  					cpuI[idx] = 255 - cpuI[idx];
  				}
  			}
  		}
  	}
94d437dd   Laila Saadatifard   ivote3 code compi...
140
  	
f12505fb   Laila Saadatifard   upload the ivote ...
141
142
  int main(int argc, char** argv){
  
94d437dd   Laila Saadatifard   ivote3 code compi...
143
144
145
146
147
148
149
150
151
152
  
  	cudaDeviceProp prop;
  	int count;
  	cudaGetDeviceCount(&count);
  	//printf("cudadevicecount: %i\n", count);
  	for (int i=0; i<count; i++){
  		cudaGetDeviceProperties(&prop, i);
  		printf("current device ID: %d\n", i);
  		printf("device name: %s\n", prop.name);
  		printf("total global mem: %lu\n", prop.totalGlobalMem);
89604e92   Laila Saadatifard   ivote3 run on the...
153
  		printf("shared memory per block: %lu\n", prop.sharedMemPerBlock);
94d437dd   Laila Saadatifard   ivote3 code compi...
154
  	}
89604e92   Laila Saadatifard   ivote3 run on the...
155
  		
f12505fb   Laila Saadatifard   upload the ivote ...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  	//output advertisement
  	std::cout<<std::endl<<std::endl;
  	std::cout<<"========================================================================="<<std::endl;
  	std::cout<<"Thank you for using the ivote3 segmentation tool!"<<std::endl;
  	std::cout<<"Scalable Tissue Imaging and Modeling (STIM) Lab, University of Houston"<<std::endl;
  	std::cout<<"Developers: Laila Saadatifard and David Mayerich"<<std::endl;
  	std::cout<<"Source: https://git.stim.ee.uh.edu/segmentation/ivote3"<<std::endl;
  	std::cout<<"========================================================================="<<std::endl<<std::endl;
  
  	stim::arglist args;
  
  #ifdef _WIN32
  	args.set_ansi(false);
  #endif
  
  	//add arduments
  	args.add("help", "prints this help");
  	args.add("x", "size of the dataset along X axis", "positive value");
  	args.add("y", "size of the dataset along Y axis", "positive value");
  	args.add("z", "size of the dataset along Z axis", "positive value");
  	args.add("t", "threshold value for the final result", "positive valu");
94d437dd   Laila Saadatifard   ivote3 code compi...
177
  	args.add("invert", "to invert the input data set", "string");
1f55a874   Laila Saadatifard   upload the fixed ...
178
  	args.add("anisotropy", "anisotropy value of the imaging", "1");
f12505fb   Laila Saadatifard   upload the ivote ...
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  	//parse the command line arguments.
  	args.parse(argc, argv);
  
  	//display the help text if requested
  	if(args["help"].is_set()){				
  		std::cout<<std::endl<<"usage: ivote input_image output_list --option [A B C ...]"<<std::endl;
  		std::cout<<std::endl<<std::endl
  				  << "examples: ivote blue.bmp list.txt "<<std::endl;
  		
  		std::cout<<std::endl<<std::endl;
  		std::cout<<args.str()<<std::endl;
  		exit(1);
  	}
  
  	//if the input and output files aren't specified, throw an error and exit
  	if(args.nargs() < 2){
  		std::cout<<"ERROR: two files must be specified for segmentation, enter ivote --help for options."<<std::endl<<std::endl;
  		exit(1);
  	}
  
  	//get the input image file
  	stim::filename Ifilename(args.arg(0));
  
  	//get the output file name
  	stim::filename OutName(args.arg(1));
  
  	//set the x, y, z.
  	int x = args["x"].as_int();
  	int y = args["y"].as_int();
  	int z = args["z"].as_int();
  
  	//set the threshold.
  	float t = args["t"].as_float();
94d437dd   Laila Saadatifard   ivote3 code compi...
212
213
  	//set the anisotropy
  	float anisotropy =  args["anisotropy"].as_float();
a744d027   Laila Saadatifard   upload the ivote3...
214
  	unsigned int rmax = 10;
46820b25   Laila Saadatifard   create an obj fil...
215
  	unsigned int r[3] = { 12, rmax, rmax};
94d437dd   Laila Saadatifard   ivote3 code compi...
216
217
  	float std = 5;
  	float sigma[3] = { std, std, std};
3f0e43ce   Laila Saadatifard   compute the local...
218
  	unsigned int nlmax = 5;
94d437dd   Laila Saadatifard   ivote3 code compi...
219
220
  	unsigned int conn[3] = { nlmax, nlmax, nlmax};
  	float phi_deg = 25.0;
f12505fb   Laila Saadatifard   upload the ivote ...
221
  	float phi = phi_deg * pi /180;
94d437dd   Laila Saadatifard   ivote3 code compi...
222
223
  	int iter = 8;
  	float d_phi = phi/(iter+2);
f12505fb   Laila Saadatifard   upload the ivote ...
224
225
  	
  	std::string filename = Ifilename.str();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
226
227
  	unsigned int bytes = x*y*z*sizeof(float);
  
f12505fb   Laila Saadatifard   upload the ivote ...
228
  	//allocate space on the cpu for the input data
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
229
230
  	float* cpuI = (float*) malloc(bytes);
  
f12505fb   Laila Saadatifard   upload the ivote ...
231
  	//load the input file into the cpuI
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
232
233
234
  	std::ifstream nissl(filename, std::ios::in | std::ios::binary);
  	nissl.read((char*)cpuI, bytes);
  	nissl.close();
94d437dd   Laila Saadatifard   ivote3 code compi...
235
236
  	if(args["invert"].is_set())
  		invert_data(cpuI, x, y, z);
f12505fb   Laila Saadatifard   upload the ivote ...
237
238
  	
  	//write a new file from the cpuI.
46820b25   Laila Saadatifard   create an obj fil...
239
  	std::ofstream original("shared2D-v1/inv-128.vol", std::ofstream::out | std::ofstream::binary);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
240
241
  	original.write((char*)cpuI, bytes);
  	original.close();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
242
  	
f12505fb   Laila Saadatifard   upload the ivote ...
243
  	//allocate space on the cpu for the output result
89604e92   Laila Saadatifard   ivote3 run on the...
244
  	float* cpu_out = (float*) malloc(bytes);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
245
  	
f12505fb   Laila Saadatifard   upload the ivote ...
246
  	// call the ivote function
46820b25   Laila Saadatifard   create an obj fil...
247
248
  	//ivote3(cpu_out, cpuI, sigma, anisotropy, phi, d_phi, r, iter, t, conn, x, y, z);
  	ivote3(cpuI, sigma, anisotropy, phi, d_phi, r, iter, t, conn, x, y, z);
f12505fb   Laila Saadatifard   upload the ivote ...
249
  	//write the blurred file from the cpuI.
89604e92   Laila Saadatifard   ivote3 run on the...
250
  	std::ofstream fblur("shared2D-v8/vote8.vol", std::ofstream::out | std::ofstream::binary);
f12505fb   Laila Saadatifard   upload the ivote ...
251
252
  	fblur.write((char*)cpuI, bytes);
  	fblur.close();
a744d027   Laila Saadatifard   upload the ivote3...
253
254
255
256
257
258
259
  	
  	//stim::image<float>imgrad3;
  	//imgrad3.set_interleaved3(cpu_out, 128,128,128,3);
  	//std::ofstream fgx("syn/gx-128.vol", std::ofstream::out | std::ofstream::binary);
  	//fgx.write((char*)imgrad3.channel(0).data(), bytes);
  	//fgx.close();
  	
f12505fb   Laila Saadatifard   upload the ivote ...
260
  	//write the output file.
a744d027   Laila Saadatifard   upload the ivote3...
261
262
  	//for (int t0=0; t0<=5000; t0+=100){
  	//	float t1 = t0;
46820b25   Laila Saadatifard   create an obj fil...
263
264
265
  		int t0 = t;
  			lmax(cpu_out, cpuI, t, conn, x, y, z);
  			//std::ofstream fo("shared2D-v8/" + OutName.str(), std::ofstream::out | std::ofstream::binary);
a744d027   Laila Saadatifard   upload the ivote3...
266
  			std::ofstream fo( OutName.str()+std::to_string(t0)+".vol", std::ofstream::out | std::ofstream::binary);
46820b25   Laila Saadatifard   create an obj fil...
267
268
  			fo.write((char*)cpu_out, bytes);
  			fo.close();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
269
  	
94d437dd   Laila Saadatifard   ivote3 code compi...
270
  	// creat a file for saving the list centers
46820b25   Laila Saadatifard   create an obj fil...
271
  	
3f0e43ce   Laila Saadatifard   compute the local...
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  		std::ofstream list(OutName.str()+std::to_string(t0)+".obj");
  		// set the number of detected cells to zero.
  		int nod = 0;
  		if (list.is_open()){
  
  				for (int iz=0; iz<z; iz++){
  					for (int iy=0; iy<y; iy++){
  						for (int ix=0; ix<x; ix++){
  
  							int idx = iz * x * y + iy * x + ix;
  							if (cpu_out[idx]>0){
  								nod++;
  								list << "v" << "\t" << ix << "\t" << iy << "\t"<< iz << "\t" << cpu_out[idx] << '\n' ;
  					
  							}
  						}
  					}
  				}
  				list << "p" << "\t";
  				for (unsigned int i_nod =1 ; i_nod <=nod; i_nod++){
  					list << i_nod << "\t";
  				}
  
  		list.close();
  		}
  
  
a744d027   Laila Saadatifard   upload the ivote3...
299
  	//}
f12505fb   Laila Saadatifard   upload the ivote ...
300
  		cudaDeviceReset();       
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
301
  	
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
302
  }