Blame view

cpp/main.cpp 5.72 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
  
310a1698   Laila Saadatifard   update the ivote3...
22
23
24
25
26
27
28
29
30
31
32
  void ivote3(float* img, float std[], float phi, float d_phi, unsigned int r[], int iter, float t, unsigned int conn[],
  	size_t x, size_t y, size_t z);
  void lmax(float* center, float* vote, float t1, unsigned int conn[], size_t x, size_t y, size_t z);
  
  void invert_data(float* cpuI, size_t x, size_t y, size_t z) {
  	size_t idx;
  	for (size_t ix = 0; ix < x; ix++) {
  		for (size_t iy = 0; iy < y; iy++) {
  			for (size_t iz = 0; iz < z; iz++) {
  				idx = iz * x * y + iy * x + ix;
  				cpuI[idx] = 255 - cpuI[idx];
f12505fb   Laila Saadatifard   upload the ivote ...
33
34
35
  			}
  		}
  	}
310a1698   Laila Saadatifard   update the ivote3...
36
37
  }
  
f12505fb   Laila Saadatifard   upload the ivote ...
38
  
94d437dd   Laila Saadatifard   ivote3 code compi...
39
  
2558ee86   Laila Saadatifard   updating ivote3 t...
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;
b448d0ad   David Mayerich   fixed AABB error
47
  	std::cout << "This version has been compiled on " << __DATE__ << " at " << __TIME__ << std::endl;
2558ee86   Laila Saadatifard   updating ivote3 t...
48
  	std::cout << "=========================================================================" << std::endl << std::endl;
f12505fb   Laila Saadatifard   upload the ivote ...
49
  
b448d0ad   David Mayerich   fixed AABB error
50
  
2558ee86   Laila Saadatifard   updating ivote3 t...
51
  }
f12505fb   Laila Saadatifard   upload the ivote ...
52
  
2558ee86   Laila Saadatifard   updating ivote3 t...
53
  void init_args(int argc, char* argv[]) {
f12505fb   Laila Saadatifard   upload the ivote ...
54
55
56
57
58
59
60
61
62
  #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");
310a1698   Laila Saadatifard   update the ivote3...
63
  	args.add("t", "threshold value for the final result", "0", "positive valu");
94d437dd   Laila Saadatifard   ivote3 code compi...
64
  	args.add("invert", "to invert the input data set", "string");
2558ee86   Laila Saadatifard   updating ivote3 t...
65
66
67
  	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");
310a1698   Laila Saadatifard   update the ivote3...
68
  	args.add("sigma", "the gaussian blur standard deviation", "3", "s >=0 (s = 0, no blurring)");
2558ee86   Laila Saadatifard   updating ivote3 t...
69
  	args.add("conn", "the number of connected neighbors for calculating the local maxima", "5", "[positive value]");
f12505fb   Laila Saadatifard   upload the ivote ...
70
71
72
73
  	//parse the command line arguments.
  	args.parse(argc, argv);
  
  	//display the help text if requested
2558ee86   Laila Saadatifard   updating ivote3 t...
74
75
76
77
78
79
80
81
  	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 ...
82
83
84
85
  		exit(1);
  	}
  
  	//if the input and output files aren't specified, throw an error and exit
2558ee86   Laila Saadatifard   updating ivote3 t...
86
87
  	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 ...
88
89
90
  		exit(1);
  	}
  
2558ee86   Laila Saadatifard   updating ivote3 t...
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;
310a1698   Laila Saadatifard   update the ivote3...
101
  
2558ee86   Laila Saadatifard   updating ivote3 t...
102
  }
310a1698   Laila Saadatifard   update the ivote3...
103
  int main(int argc, char** argv) {
f12505fb   Laila Saadatifard   upload the ivote ...
104
  
f12505fb   Laila Saadatifard   upload the ivote ...
105
  
2558ee86   Laila Saadatifard   updating ivote3 t...
106
107
108
  	cudaDeviceProp prop;
  	int count;
  	cudaGetDeviceCount(&count);
310a1698   Laila Saadatifard   update the ivote3...
109
  	for (int i = 0; i<count; i++) {
2558ee86   Laila Saadatifard   updating ivote3 t...
110
111
112
113
114
115
  		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);
  	}
310a1698   Laila Saadatifard   update the ivote3...
116
  
2558ee86   Laila Saadatifard   updating ivote3 t...
117
  	init_args(argc, argv);
f12505fb   Laila Saadatifard   upload the ivote ...
118
  
310a1698   Laila Saadatifard   update the ivote3...
119
120
121
122
123
124
125
  	unsigned int r[3] = { rmax , rmax, rmax };
  
  	float sigma3[3] = { sigma, sigma, sigma };
  	unsigned int conn[3] = { nlmax, nlmax, nlmax };
  	float d_phi = phi / (iter);
  
  	size_t bytes = x*y*z * sizeof(float);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
126
  
f12505fb   Laila Saadatifard   upload the ivote ...
127
  	//allocate space on the cpu for the input data
310a1698   Laila Saadatifard   update the ivote3...
128
  	float* cpuI = (float*)malloc(bytes);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
129
  
f12505fb   Laila Saadatifard   upload the ivote ...
130
  	//load the input file into the cpuI
2558ee86   Laila Saadatifard   updating ivote3 t...
131
  	std::ifstream nissl(args.arg(0), std::ios::in | std::ios::binary);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
132
133
  	nissl.read((char*)cpuI, bytes);
  	nissl.close();
310a1698   Laila Saadatifard   update the ivote3...
134
  	if (args["invert"].is_set())
94d437dd   Laila Saadatifard   ivote3 code compi...
135
  		invert_data(cpuI, x, y, z);
310a1698   Laila Saadatifard   update the ivote3...
136
  
f12505fb   Laila Saadatifard   upload the ivote ...
137
  	//write a new file from the cpuI.
2558ee86   Laila Saadatifard   updating ivote3 t...
138
  	std::ofstream original("0-inv-128.vol", std::ofstream::out | std::ofstream::binary);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
139
140
  	original.write((char*)cpuI, bytes);
  	original.close();
310a1698   Laila Saadatifard   update the ivote3...
141
142
  
  
2558ee86   Laila Saadatifard   updating ivote3 t...
143
  	ivote3(cpuI, sigma3, phi, d_phi, r, iter, t, conn, x, y, z);			// call the ivote function
310a1698   Laila Saadatifard   update the ivote3...
144
145
  
  	std::ofstream fvote("00-vote8_aabb.vol", std::ofstream::out | std::ofstream::binary);
2558ee86   Laila Saadatifard   updating ivote3 t...
146
147
  	fvote.write((char*)cpuI, bytes);
  	fvote.close();
310a1698   Laila Saadatifard   update the ivote3...
148
  
2558ee86   Laila Saadatifard   updating ivote3 t...
149
150
151
  	//allocate space on the cpu for the output result
  	float* cpu_out = (float*)malloc(bytes * 3);
  
f12505fb   Laila Saadatifard   upload the ivote ...
152
  	//write the output file.
a744d027   Laila Saadatifard   upload the ivote3...
153
154
  	//for (int t0=0; t0<=5000; t0+=100){
  	//	float t1 = t0;
310a1698   Laila Saadatifard   update the ivote3...
155
156
  	int t0 = t;
  	lmax(cpu_out, cpuI, t, conn, x, y, z);
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
157
  	
310a1698   Laila Saadatifard   update the ivote3...
158
159
160
161
  	std::ofstream fo(args.arg(1), std::ofstream::out | std::ofstream::binary);
  	fo.write((char*)cpu_out, bytes);
  	fo.close();
  
94d437dd   Laila Saadatifard   ivote3 code compi...
162
  	// creat a file for saving the list centers
310a1698   Laila Saadatifard   update the ivote3...
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  
  	std::ofstream list(args.arg(2));
  	// 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 << ix << " " << iy << " " << iz << " " << cpu_out[idx] << '\n';
  
3f0e43ce   Laila Saadatifard   compute the local...
178
179
  					}
  				}
310a1698   Laila Saadatifard   update the ivote3...
180
  			}
3f0e43ce   Laila Saadatifard   compute the local...
181
182
  		}
  
310a1698   Laila Saadatifard   update the ivote3...
183
184
185
  		list.close();
  	}
  
3f0e43ce   Laila Saadatifard   compute the local...
186
  
a744d027   Laila Saadatifard   upload the ivote3...
187
  	//}
310a1698   Laila Saadatifard   update the ivote3...
188
  	cudaDeviceReset();
c9aba18a   Laila Saadatifard   ivote3 on the GPU...
189
  
310a1698   Laila Saadatifard   update the ivote3...
190
  }