CVB++ 14.0
search_predictor_factory.hpp
1#pragma once
2
3#include "../_cexports/c_polimago.h"
4
5#include "../global.hpp"
6#include "../value_range.hpp"
7#include "../angle.hpp"
8#include "predictor_factory_base.hpp"
9#include "search_predictor.hpp"
10#include "../minos/training_set.hpp"
11#include "../sample_database/sample_regression_image_list.hpp"
12
13#include <memory>
14
15namespace Cvb
16{
17CVB_BEGIN_INLINE_NS
18
20namespace Polimago
21{
23namespace Training
24{
25
27
30{
31public:
33
38 searchTrainingParameters_(), scaleFactorRange_(ScaleFactorRangeDefault()), singularValueRange_(SingularValueRangeDefault())
39 {
40 searchTrainingParameters_.NumClfs = 6;
41 searchTrainingParameters_.SampleSize = 2000;
42 }
43
45
46 SearchPredictorFactory& operator=(const SearchPredictorFactory&) = default;
47
48 virtual ~SearchPredictorFactory () {};
49
50public:
53 {
54 return ValueRange<double> (1.0, 1.0);
55 }
56
59 {
60 return ValueRange<double> (1.0, 1.0);
61 }
62
65 {
66 return ValueRange<double> (0.25, 10);
67 }
68
70 static constexpr int NumClassificationStepsMin = 3;
71
73 static constexpr int SampleSizeMin = 1;
74
76
80 int SampleSize() const noexcept
81 {
82 return static_cast<int>(searchTrainingParameters_.SampleSize);
83 }
84
86
90 void SetSampleSize(int sampleSize)
91 {
92 if (sampleSize < SampleSizeMin)
93 {
94 throw std::out_of_range ("sample size value must be >=1");
95 }
96
97 searchTrainingParameters_.SampleSize = sampleSize;
98 }
99
101
112 double ExtractionRadius() const noexcept
113 {
114 return searchTrainingParameters_.InvarianceParams.XYRadius;
115 }
116
118
129 void SetExtractionRadius(double radius)
130 {
131 if (radius < 0.0)
132 {
133 throw std::out_of_range ("extraction radius value must be >=0.0");
134 }
135
136 searchTrainingParameters_.InvarianceParams.XYRadius = radius;
137 }
138
140
146 {
147 return ValueRange<Angle>(Angle::FromRadians(searchTrainingParameters_.InvarianceParams.MinAngle),
148 Angle::FromRadians(searchTrainingParameters_.InvarianceParams.MaxAngle));
149 }
150
152
158 {
159 auto diff = range.Max().Rad() - range.Min().Rad();
160 if (diff > CVB_M_PI * 2)
161 {
162 searchTrainingParameters_.InvarianceParams.MinAngle = -CVB_M_PI;
163 searchTrainingParameters_.InvarianceParams.MaxAngle = CVB_M_PI;
164 }
165 else
166 {
167 searchTrainingParameters_.InvarianceParams.MinAngle = range.Min().Rad();
168 searchTrainingParameters_.InvarianceParams.MaxAngle = range.Max().Rad();
169 }
170 if (searchTrainingParameters_.InvarianceParams.MinAngle > searchTrainingParameters_.InvarianceParams.MaxAngle)
171 {
172 std::swap (searchTrainingParameters_.InvarianceParams.MinAngle, searchTrainingParameters_.InvarianceParams.MaxAngle);
173 }
174 }
175
177
183 {
184 return scaleFactorRange_;
185 }
186
188
194 {
195 if ((range.Min() < ScaleFactorRange().Min()) || (range.Min() > ScaleFactorRange().Max()))
196 {
197 throw std::out_of_range ("scale range min value is out of range");
198 }
199 if ((range.Max() < ScaleFactorRange().Min()) || (range.Max() > ScaleFactorRange().Max()))
200 {
201 throw std::out_of_range ("scale range max value is out of range");
202 }
203 scaleFactorRange_ = range;
204 }
205
207
213 {
214 return singularValueRange_;
215 }
216
218
224 {
225 singularValueRange_ = range;
226 }
227
229
234 {
235 return static_cast<InvarianceType>(searchTrainingParameters_.InvarianceParams.InvarianceType);
236 }
237
239
244 {
245 switch(invariances)
246 {
250 break;
251 default:
252 throw std::invalid_argument("invalid invariance type");
253 }
254 searchTrainingParameters_.InvarianceParams.InvarianceType = static_cast<CExports::TInvarianceType>(invariances);
255 }
256
258
262 int NumClassificationSteps() const noexcept
263 {
264 return static_cast<int>(searchTrainingParameters_.NumClfs);
265 }
266
268
272 void SetNumClassificationSteps(int numSteps)
273 {
274 if (numSteps < NumClassificationStepsMin)
275 {
276 throw std::out_of_range ("sample size value must be >=3");
277 }
278 searchTrainingParameters_.NumClfs = numSteps;
279 }
280
282
286 int FeatureResolutionStep1And2() const noexcept
287 {
288 return static_cast<int>(searchTrainingParameters_.Resolution12);
289 }
290
292
296 void SetFeatureResolutionStep1And2(int resolution)
297 {
298 if ((resolution < FeatureResolutionRange().Min()) || (resolution > FeatureResolutionRange().Max()))
299 {
300 throw std::out_of_range ("feature resolution step 1&2 value is out of range");
301 }
302 searchTrainingParameters_.Resolution12 = resolution;
303 }
304
306
310 int FeatureResolutionRest() const noexcept
311 {
312 return static_cast<int>(searchTrainingParameters_.ResolutionRest);
313 }
314
316
320 void SetFeatureResolutionRest(int resolution)
321 {
322 if ((resolution < FeatureResolutionRange().Min()) || (resolution > FeatureResolutionRange().Max()))
323 {
324 throw std::out_of_range ("feature resolution step 3+ value is out of range");
325 }
326 searchTrainingParameters_.ResolutionRest = resolution;
327 }
328
330
336 {
337 PredictorFactoryBase::UseSettingsFromPredictor (clf);
338 scaleFactorRange_ = clf.ScaleRange();
339 singularValueRange_ = clf.ScaleRange();
340 searchTrainingParameters_ = clf.searchTrainingParameters_;
341 }
342
343#if 0
345
352 {
353 return Internal::DoResCallObjectOut<SearchPredictor>([&](void* & res)
354 {
355 return CVB_CALL_CAPI(PMTrainSearchClassifierFromSil(sil.Handle(), ..., preproCode_, lambda_, ..., res);
356 });
357 }
358
360
366 std::unique_ptr<SearchPredictor> TrainPredictor (const Minos::TrainingSet & mts)
367 {
368 return Internal::DoResCallObjectOut<SearchPredictor>([&](void* & res)
369 {
370 return CVB_CALL_CAPI(PMTrainSearchClassifierFromMts(mts.Handle(), ..., preproCode_, lambda_, ..., res);
371 });
372 }
373#endif
374
375private:
376 CExports::TTrainSearchParams searchTrainingParameters_;
377 ValueRange<double> scaleFactorRange_;
378 ValueRange<double> singularValueRange_;
379};
380
383
384
385} /* namespace Training */
386
389
390} /* namespace Polimago */
391CVB_END_INLINE_NS
392} /* namespace Cvb */
static Angle FromRadians(double rad, bool trim=false) noexcept
Create an angle in radians.
Definition: angle.hpp:44
A Minos Training Set from which a classifier can be generated.
Definition: training_set.hpp:1151
void * Handle() const noexcept
Classic API CLF handle.
Definition: training_set.hpp:1255
Predictor that may be used for searching objects.
Definition: search_predictor.hpp:41
ValueRange< double > ScaleRange() const noexcept
Get the range of scale factors that was covered during classifier training.
Definition: search_predictor.hpp:198
Base class for classifier factory classes.
Definition: predictor_factory_base.hpp:30
static ValueRange< int > FeatureResolutionRange()
Valid range of feature resolution value.
Definition: predictor_factory_base.hpp:56
Factory class for the generation of search predictors.
Definition: search_predictor_factory.hpp:30
void SetExtractionRadius(double radius)
Sets the radius for extracting positive search instances.
Definition: search_predictor_factory.hpp:129
void SetScaleRange(ValueRange< double > range)
Sets the range of scale factors to be covered during classifier training. Only meaningful if the inva...
Definition: search_predictor_factory.hpp:193
int NumClassificationSteps() const noexcept
Gets the number of classification steps during search operation.
Definition: search_predictor_factory.hpp:262
void UseSettingsFromPredictor(const SearchPredictor &clf)
Copy the predictor generation settings from a predictor.
Definition: search_predictor_factory.hpp:335
void SetSampleSize(int sampleSize)
Sets the sample size that has been used in each training set.
Definition: search_predictor_factory.hpp:90
void SetSingularValueRange(ValueRange< double > range)
Sets the range of permissible singular values to be covered during classifier training....
Definition: search_predictor_factory.hpp:223
ValueRange< Angle > AngleRange() const
Gets the range of angles to be covered during classifier training.
Definition: search_predictor_factory.hpp:145
static constexpr int SampleSizeMin
Absolute minimum value for SampleSize.
Definition: search_predictor_factory.hpp:73
void SetFeatureResolutionStep1And2(int resolution)
Sets the feature resolution (determines the size of the classification retina) for search step 1 and ...
Definition: search_predictor_factory.hpp:296
void SetFeatureResolutionRest(int resolution)
Sets the feature resolution (determines the size of the classification retina) for step 3 and up.
Definition: search_predictor_factory.hpp:320
void SetNumClassificationSteps(int numSteps)
Sets the number of classification steps during search operation.
Definition: search_predictor_factory.hpp:272
double ExtractionRadius() const noexcept
Gets the radius for extracting positive search instances.
Definition: search_predictor_factory.hpp:112
ValueRange< double > ScaleRange() const
Gets the range of scale factors to be covered during classifier training. Only meaningful if the inva...
Definition: search_predictor_factory.hpp:182
int FeatureResolutionStep1And2() const noexcept
Gets the feature resolution (determines the size of the classification retina) for search step 1 and ...
Definition: search_predictor_factory.hpp:286
void SetAngleRange(ValueRange< Angle > range)
Sets the range of angles to be covered during classifier training.
Definition: search_predictor_factory.hpp:157
static constexpr int NumClassificationStepsMin
Minimum classification step count.
Definition: search_predictor_factory.hpp:70
void SetInvariances(InvarianceType invariances)
Sets the invariances to be used for generating the classifier.
Definition: search_predictor_factory.hpp:243
SearchPredictorFactory()
Constructor.
Definition: search_predictor_factory.hpp:36
ValueRange< double > SingularValueRange() const
Gets the range of permissible singular values to be covered during classifier training....
Definition: search_predictor_factory.hpp:212
static ValueRange< double > ScaleFactorRangeDefault()
Default value for the scale factor range.
Definition: search_predictor_factory.hpp:52
int FeatureResolutionRest() const noexcept
Gets the feature resolution (determines the size of the classification retina) for step 3 and up.
Definition: search_predictor_factory.hpp:310
int SampleSize() const noexcept
Gets the sample size that has been used in each training set.
Definition: search_predictor_factory.hpp:80
static ValueRange< double > ScaleFactorRange()
Acceptable scale factor range for search classifier training.
Definition: search_predictor_factory.hpp:64
static ValueRange< double > SingularValueRangeDefault()
Default value for the singular value range.
Definition: search_predictor_factory.hpp:58
InvarianceType Invariances() const noexcept
Gets the invariances to be used for generating the classifier.
Definition: search_predictor_factory.hpp:233
void * Handle() const noexcept
Classic API SIL handle.
Definition: sample_list.hpp:403
Classifier type that operates on images.
Definition: decl_regression_sil.hpp:182
T Min() const noexcept
Gets the minimum value.
Definition: value_range.hpp:50
T Max() const noexcept
Gets the maximum value.
Definition: value_range.hpp:72
InvarianceType
Invariance types that can be defined for training.
Definition: search_predictor.hpp:23
@ AffineGroup
Affine group (i.e. 2x2 matrix plus translation).
@ RotationScaleTranslation
Rotation + Scale + Translation.
Root namespace for the Image Manager interface.
Definition: c_barcode.h:24
Angle Max(Angle a, Angle b) noexcept
Returns the bigger of two angles.
Definition: angle.hpp:504
Angle Min(Angle a, Angle b) noexcept
Returns the smaller of two angles.
Definition: angle.hpp:521