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