1 // This is brl/bpro/core/sdet_pro/processes/sdet_create_texture_classifier_process.cxx
2 //:
3 // \file
4
5 #include <bprb/bprb_func_process.h>
6 #include <bprb/bprb_parameters.h>
7 #include <brdb/brdb_value.h>
8 #include <sdet/sdet_texture_classifier.h>
9 #include <sdet/sdet_texture_classifier_params.h>
10 #include <bbas_pro/bbas_1d_array_string.h>
11 #include <bbas_pro/bbas_1d_array_string_sptr.h>
12 #include <vsol/vsol_polygon_2d.h>
13 #include "vsl/vsl_binary_io.h"
14
15 //: initialize input and output types
sdet_create_texture_classifier_process_cons(bprb_func_process & pro)16 bool sdet_create_texture_classifier_process_cons(bprb_func_process& pro)
17 {
18 vsl_add_to_binary_loader(vsol_polygon_2d());
19 // process takes 9 inputs:
20 std::vector<std::string> input_types;
21 input_types.emplace_back("float"); //lambda 0
22 input_types.emplace_back("float"); //lambda 1
23 input_types.emplace_back("unsigned"); //number of scales
24 input_types.emplace_back("float"); //scale interval
25 input_types.emplace_back("float"); //angle interval
26 input_types.emplace_back("float"); //laplace radius
27 input_types.emplace_back("float"); //gauss radius
28 input_types.emplace_back("unsigned"); // k
29 input_types.emplace_back("unsigned"); // number of samples
30 if (!pro.set_input_types(input_types))
31 return false;
32
33 // process has 1 output:
34 // output[0]: the current state of the texture classifier
35 std::vector<std::string> output_types;
36 output_types.emplace_back("sdet_texture_classifier_sptr");
37 return pro.set_output_types(output_types);
38 }
39
sdet_create_texture_classifier_process(bprb_func_process & pro)40 bool sdet_create_texture_classifier_process(bprb_func_process& pro)
41 {
42 if (!pro.verify_inputs())
43 {
44 std::cout << pro.name() << "texture classifier process inputs are not valid"<< std::endl;
45 return false;
46 }
47
48 // get inputs
49 auto lambda0 = pro.get_input<float>(0);
50 auto lambda1 = pro.get_input<float>(1);
51 auto n_scales = pro.get_input<unsigned>(2);
52 auto scale_interval = pro.get_input<float>(3);
53 auto angle_interval = pro.get_input<float>(4);
54 auto laplace_radius = pro.get_input<float>(5);
55 auto gauss_radius = pro.get_input<float>(6);
56 auto k = pro.get_input<unsigned>(7);
57 auto n_samples = pro.get_input<unsigned>(8);
58
59 //set texture classifier params
60 sdet_texture_classifier_params tcp;
61 tcp.k_ = k;
62 tcp.lambda0_ = lambda0;
63 tcp.lambda1_ = lambda1;
64 tcp.n_scales_ = n_scales;
65 tcp.n_samples_ = n_samples;
66 tcp.scale_interval_ = scale_interval;
67 tcp.angle_interval_ = angle_interval;
68 tcp.laplace_radius_ = laplace_radius;
69 tcp.gauss_radius_ = gauss_radius;
70 tcp.signed_response_ = true;
71 tcp.mag_ = false;
72 sdet_texture_classifier_sptr tc_ptr = new sdet_texture_classifier(tcp);
73
74 // pass the texture classifier into the database
75 // to enable subsequent processing
76 pro.set_output_val<sdet_texture_classifier_sptr>(0, tc_ptr);
77
78 return true;
79 }
80
81 //: PROCESS to save the current training data if any (saves the parameter block as well)
sdet_save_texture_classifier_process_cons(bprb_func_process & pro)82 bool sdet_save_texture_classifier_process_cons(bprb_func_process& pro)
83 {
84 // process takes 2 inputs:
85 std::vector<std::string> input_types;
86 input_types.emplace_back("sdet_texture_classifier_sptr"); //texture classifier
87 input_types.emplace_back("vcl_string"); // output filename
88
89 if (!pro.set_input_types(input_types))
90 return false;
91
92 std::vector<std::string> output_types;
93 return pro.set_output_types(output_types);
94 }
95
sdet_save_texture_classifier_process(bprb_func_process & pro)96 bool sdet_save_texture_classifier_process(bprb_func_process& pro)
97 {
98 if (!pro.verify_inputs())
99 {
100 std::cout << pro.name() << "texture classifier process inputs are not valid"<< std::endl;
101 return false;
102 }
103
104 sdet_texture_classifier_sptr tc_ptr = pro.get_input<sdet_texture_classifier_sptr>(0);
105 if (!tc_ptr){
106 std::cout << "In finishing texture training - null texture_classifier\n";
107 return false;
108 }
109 std::string name = pro.get_input<std::string>(1);
110 if (name == "")
111 return false;
112 // saves the parameters and the current training data
113 tc_ptr->save_data(name);
114 return true;
115 }
116
117
118 //: PROCESS to load the current training data if any (loads the parameter block as well)
sdet_load_texture_classifier_process_cons(bprb_func_process & pro)119 bool sdet_load_texture_classifier_process_cons(bprb_func_process& pro)
120 {
121 // process takes 1 inputs:
122 std::vector<std::string> input_types;
123 input_types.emplace_back("vcl_string"); // input filename to read data for the instance of texture classifier
124 if (!pro.set_input_types(input_types))
125 return false;
126
127 std::vector<std::string> output_types;
128 output_types.emplace_back("sdet_texture_classifier_sptr"); //texture classifier
129 return pro.set_output_types(output_types);
130 }
131
sdet_load_texture_classifier_process(bprb_func_process & pro)132 bool sdet_load_texture_classifier_process(bprb_func_process& pro)
133 {
134 if (!pro.verify_inputs())
135 {
136 std::cout << pro.name() << "texture classifier process inputs are not valid"<< std::endl;
137 return false;
138 }
139
140 std::string input_ins_path = pro.get_input<std::string>(0);
141
142 sdet_texture_classifier_params dummy;
143 sdet_texture_classifier_sptr tc_ptr = new sdet_texture_classifier(dummy);
144 tc_ptr->load_data(input_ins_path);
145 std::cout << " loaded classifier with params: " << *tc_ptr << std::endl;
146 tc_ptr->filter_responses().set_params(tc_ptr->n_scales_,tc_ptr->scale_interval_,tc_ptr->lambda0_,tc_ptr->lambda1_,tc_ptr->angle_interval_,tc_ptr->cutoff_per_);
147
148 std::cout << " in the loaded classifier max filter radius: " << tc_ptr->max_filter_radius() << std::endl;
149
150 // pass the texture classifier into the database
151 // to enable subsequent processing
152 pro.set_output_val<sdet_texture_classifier_sptr>(0, tc_ptr);
153 return true;
154 }
155
156
157 //: PROCESS to load the current dictionary (loads the parameter block as well)
sdet_load_texture_dictionary_process_cons(bprb_func_process & pro)158 bool sdet_load_texture_dictionary_process_cons(bprb_func_process& pro)
159 {
160 // process takes 1 inputs:
161 std::vector<std::string> input_types;
162 input_types.emplace_back("vcl_string"); // input filename
163 if (!pro.set_input_types(input_types))
164 return false;
165
166 std::vector<std::string> output_types;
167 output_types.emplace_back("sdet_texture_classifier_sptr"); //texture classifier
168 return pro.set_output_types(output_types);
169 }
170
sdet_load_texture_dictionary_process(bprb_func_process & pro)171 bool sdet_load_texture_dictionary_process(bprb_func_process& pro)
172 {
173 if (!pro.verify_inputs())
174 {
175 std::cout << pro.name() << "texture classifier process inputs are not valid"<< std::endl;
176 return false;
177 }
178
179 std::string input_ins_path = pro.get_input<std::string>(0);
180
181 sdet_texture_classifier_params dummy;
182 sdet_texture_classifier_sptr tc_ptr = new sdet_texture_classifier(dummy);
183 tc_ptr->load_dictionary(input_ins_path);
184 std::cout << " loaded classifier with params: " << *tc_ptr << std::endl;
185 tc_ptr->filter_responses().set_params(tc_ptr->n_scales_,tc_ptr->scale_interval_,tc_ptr->lambda0_,tc_ptr->lambda1_,tc_ptr->angle_interval_,tc_ptr->cutoff_per_);
186
187 std::cout << " in the loaded classifier max filter radius: " << tc_ptr->max_filter_radius() << std::endl;
188 // pass the texture classifier into the database
189 // to enable subsequent processing
190 pro.set_output_val<sdet_texture_classifier_sptr>(0, tc_ptr);
191 return true;
192 }
193