Blame view

cpp/main.cpp 5.8 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>
2558ee86   Laila Saadatifard   updating ivote3 t...
10
  #include <stim/math/constants.h>
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
11
  
2558ee86   Laila Saadatifard   updating ivote3 t...
12
13
14
15
16
17
18
19
  stim::arglist args;
  int iter;
  unsigned int rmax;
  unsigned int nlmax;
  float t;
  float sigma;
  float phi;
  size_t x, y, z;
1f55a874   Laila Saadatifard   upload the fixed ...
20
  
a744d027   Laila Saadatifard   upload the ivote3...
21
  
2558ee86   Laila Saadatifard   updating ivote3 t...
22
  void ivote3(float* img, float std[], float phi, float d_phi, unsigned int r[], int iter, float t, unsigned int conn[], 
f12505fb   Laila Saadatifard   upload the ivote ...
23
  			unsigned int x, unsigned int y, unsigned int z);
46820b25   Laila Saadatifard   create an obj fil...
24
  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 ...
25
26
27
28
29
30
31
32
33
34
35
  
  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...
36
  	
f12505fb   Laila Saadatifard   upload the ivote ...
37
  
94d437dd   Laila Saadatifard   ivote3 code compi...
38
  
2558ee86   Laila Saadatifard   updating ivote3 t...
39
40
41
42
43
44
45
46
  void advertise() {
  	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;
f12505fb   Laila Saadatifard   upload the ivote ...
47
  
2558ee86   Laila Saadatifard   updating ivote3 t...
48
  }
f12505fb   Laila Saadatifard   upload the ivote ...
49
  
2558ee86   Laila Saadatifard   updating ivote3 t...
50
  void init_args(int argc, char* argv[]) {
f12505fb   Laila Saadatifard   upload the ivote ...
51
52
53
54
55
56
57
58
59
60
  #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...
61
  	args.add("invert", "to invert the input data set", "string");
2558ee86   Laila Saadatifard   updating ivote3 t...
62
63
64
65
66
  	args.add("rmax", "maximum possible radius of the cells in the input image", "10", "[positive value]");
  	args.add("phi", "starting angle for the vote region (in degrees)", "25.0", "0 <= phi < 180");
  	args.add("iter", "number of iterations for voting", "8", "i > 0");
  	args.add("sigma", "the gaussian blur standard deviation", "5", "s >=0 (s = 0, no blurring)");
  	args.add("conn", "the number of connected neighbors for calculating the local maxima", "5", "[positive value]");
f12505fb   Laila Saadatifard   upload the ivote ...
67
68
69
70
  	//parse the command line arguments.
  	args.parse(argc, argv);
  
  	//display the help text if requested
2558ee86   Laila Saadatifard   updating ivote3 t...
71
72
73
74
75
76
77
78
  	if (args["help"].is_set()) {
  		advertise();
  		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;
f12505fb   Laila Saadatifard   upload the ivote ...
79
80
81
82
  		exit(1);
  	}
  
  	//if the input and output files aren't specified, throw an error and exit
2558ee86   Laila Saadatifard   updating ivote3 t...
83
84
  	if (args.nargs() < 3) {
  		std::cout << "ERROR: three files must be specified for segmentation, enter ivote --help for options." << std::endl << std::endl;
f12505fb   Laila Saadatifard   upload the ivote ...
85
86
87
  		exit(1);
  	}
  
2558ee86   Laila Saadatifard   updating ivote3 t...
88
89
90
91
92
93
94
95
96
97
98
99
100
  	//set the x, y, z.
  	x = (size_t)args["x"].as_int();
  	y = (size_t)args["y"].as_int();
  	z = (size_t)args["z"].as_int();
  	iter = args["iter"].as_int();
  	rmax = (unsigned int)args["rmax"].as_int();
  	nlmax = (unsigned int)args["conn"].as_int();
  	t = args["t"].as_float();
  	sigma = args["sigma"].as_float();
  	phi = (float)args["phi"].as_float() * (float)stim::PI / 180;
  	
  }
  int main(int argc, char** argv){
f12505fb   Laila Saadatifard   upload the ivote ...
101
  
f12505fb   Laila Saadatifard   upload the ivote ...
102
  
2558ee86   Laila Saadatifard   updating ivote3 t...
103
104
105
106
107
108
109
110
111
112
113
114
  	cudaDeviceProp prop;
  	int count;
  	cudaGetDeviceCount(&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);
  		printf("shared memory per block: %lu\n", prop.sharedMemPerBlock);
  	}
  		
  	init_args(argc, argv);
f12505fb   Laila Saadatifard   upload the ivote ...
115
  
2558ee86   Laila Saadatifard   updating ivote3 t...
116
117
118
  	unsigned int r[3] = { rmax  , rmax, rmax};
  	
  	float sigma3[3] = { sigma, sigma, sigma};
94d437dd   Laila Saadatifard   ivote3 code compi...
119
  	unsigned int conn[3] = { nlmax, nlmax, nlmax};
94d437dd   Laila Saadatifard   ivote3 code compi...
120
  	float d_phi = phi/(iter+2);
f12505fb   Laila Saadatifard   upload the ivote ...
121
  	
2558ee86   Laila Saadatifard   updating ivote3 t...
122
  	size_t bytes = x*y*z*sizeof(float);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
123
  
f12505fb   Laila Saadatifard   upload the ivote ...
124
  	//allocate space on the cpu for the input data
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
125
126
  	float* cpuI = (float*) malloc(bytes);
  
f12505fb   Laila Saadatifard   upload the ivote ...
127
  	//load the input file into the cpuI
2558ee86   Laila Saadatifard   updating ivote3 t...
128
  	std::ifstream nissl(args.arg(0), std::ios::in | std::ios::binary);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
129
130
  	nissl.read((char*)cpuI, bytes);
  	nissl.close();
94d437dd   Laila Saadatifard   ivote3 code compi...
131
132
  	if(args["invert"].is_set())
  		invert_data(cpuI, x, y, z);
f12505fb   Laila Saadatifard   upload the ivote ...
133
134
  	
  	//write a new file from the cpuI.
2558ee86   Laila Saadatifard   updating ivote3 t...
135
  	std::ofstream original("0-inv-128.vol", std::ofstream::out | std::ofstream::binary);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
136
137
  	original.write((char*)cpuI, bytes);
  	original.close();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
138
  	
a744d027   Laila Saadatifard   upload the ivote3...
139
  	
2558ee86   Laila Saadatifard   updating ivote3 t...
140
141
142
143
144
  	ivote3(cpuI, sigma3, phi, d_phi, r, iter, t, conn, x, y, z);			// call the ivote function
  		
  	std::ofstream fvote("0-vote8.vol", std::ofstream::out | std::ofstream::binary);
  	fvote.write((char*)cpuI, bytes);
  	fvote.close();
a744d027   Laila Saadatifard   upload the ivote3...
145
  	
2558ee86   Laila Saadatifard   updating ivote3 t...
146
147
148
  	//allocate space on the cpu for the output result
  	float* cpu_out = (float*)malloc(bytes * 3);
  
f12505fb   Laila Saadatifard   upload the ivote ...
149
  	//write the output file.
a744d027   Laila Saadatifard   upload the ivote3...
150
151
  	//for (int t0=0; t0<=5000; t0+=100){
  	//	float t1 = t0;
46820b25   Laila Saadatifard   create an obj fil...
152
153
154
  		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);
2558ee86   Laila Saadatifard   updating ivote3 t...
155
  			std::ofstream fo( args.arg(1), std::ofstream::out | std::ofstream::binary);
46820b25   Laila Saadatifard   create an obj fil...
156
157
  			fo.write((char*)cpu_out, bytes);
  			fo.close();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
158
  	
94d437dd   Laila Saadatifard   ivote3 code compi...
159
  	// creat a file for saving the list centers
46820b25   Laila Saadatifard   create an obj fil...
160
  	
2558ee86   Laila Saadatifard   updating ivote3 t...
161
  		std::ofstream list(args.arg(2));
3f0e43ce   Laila Saadatifard   compute the local...
162
163
164
165
166
167
168
169
170
171
172
  		// 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++;
2558ee86   Laila Saadatifard   updating ivote3 t...
173
  								list << ix << " " << iy << " "<< iz << " " << cpu_out[idx] << '\n' ;
3f0e43ce   Laila Saadatifard   compute the local...
174
175
176
177
178
  					
  							}
  						}
  					}
  				}
2558ee86   Laila Saadatifard   updating ivote3 t...
179
  				
3f0e43ce   Laila Saadatifard   compute the local...
180
181
182
183
  		list.close();
  		}
  
  
a744d027   Laila Saadatifard   upload the ivote3...
184
  	//}
f12505fb   Laila Saadatifard   upload the ivote ...
185
  		cudaDeviceReset();       
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
186
  	
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
187
  }