CVB++ 15.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{
17 CVB_BEGIN_INLINE_NS
18
20 namespace Polimago
21 {
23 namespace Training
24 {
25
27
29 class SearchPredictorFactory : public PredictorFactoryBase
30 {
31 public:
33
37 : PredictorFactoryBase()
38 , searchTrainingParameters_()
39 , scaleFactorRange_(ScaleFactorRangeDefault())
40 , singularValueRange_(SingularValueRangeDefault())
41 {
42 searchTrainingParameters_.NumClfs = 6;
43 searchTrainingParameters_.SampleSize = 2000;
44 }
45
46 public:
49 {
50 return ValueRange<double>(1.0, 1.0);
51 }
52
55 {
56 return ValueRange<double>(1.0, 1.0);
57 }
58
61 {
62 return ValueRange<double>(0.25, 10);
63 }
64
66 static constexpr int NumClassificationStepsMin = 3;
67
69 static constexpr int SampleSizeMin = 1;
70
72
76 int SampleSize() const noexcept
77 {
78 return static_cast<int>(searchTrainingParameters_.SampleSize);
79 }
80
82
86 void SetSampleSize(int sampleSize)
87 {
88 if (sampleSize < SampleSizeMin)
89 {
90 throw std::out_of_range("sample size value must be >=1");
91 }
92
93 searchTrainingParameters_.SampleSize = sampleSize;
94 }
95
97
108 double ExtractionRadius() const noexcept
109 {
110 return searchTrainingParameters_.InvarianceParams.XYRadius;
111 }
112
114
125 void SetExtractionRadius(double radius)
126 {
127 if (radius < 0.0)
128 {
129 throw std::out_of_range("extraction radius value must be >=0.0");
130 }
131
132 searchTrainingParameters_.InvarianceParams.XYRadius = radius;
133 }
134
136
142 {
143 return ValueRange<Angle>(Angle::FromRadians(searchTrainingParameters_.InvarianceParams.MinAngle),
144 Angle::FromRadians(searchTrainingParameters_.InvarianceParams.MaxAngle));
145 }
146
148
154 {
155 auto diff = range.Max().Rad() - range.Min().Rad();
156 if (diff > CVB_M_PI * 2)
157 {
158 searchTrainingParameters_.InvarianceParams.MinAngle = -CVB_M_PI;
159 searchTrainingParameters_.InvarianceParams.MaxAngle = CVB_M_PI;
160 }
161 else
162 {
163 searchTrainingParameters_.InvarianceParams.MinAngle = range.Min().Rad();
164 searchTrainingParameters_.InvarianceParams.MaxAngle = range.Max().Rad();
165 }
166 if (searchTrainingParameters_.InvarianceParams.MinAngle > searchTrainingParameters_.InvarianceParams.MaxAngle)
167 {
168 std::swap(searchTrainingParameters_.InvarianceParams.MinAngle,
169 searchTrainingParameters_.InvarianceParams.MaxAngle);
170 }
171 }
172
175
181 {
182 return scaleFactorRange_;
183 }
184
187
193 {
194 if ((range.Min() < ScaleFactorRange().Min()) || (range.Min() > ScaleFactorRange().Max()))
195 {
196 throw std::out_of_range("scale range min value is out of range");
197 }
198 if ((range.Max() < ScaleFactorRange().Min()) || (range.Max() > ScaleFactorRange().Max()))
199 {
200 throw std::out_of_range("scale range max value is out of range");
201 }
202 scaleFactorRange_ = range;
203 }
204
207
213 {
214 return singularValueRange_;
215 }
216
219
225 {
226 singularValueRange_ = range;
227 }
228
230
235 {
236 return static_cast<InvarianceType>(searchTrainingParameters_.InvarianceParams.InvarianceType);
237 }
238
240
245 {
246 switch (invariances)
247 {
251 break;
252 default:
253 throw std::invalid_argument("invalid invariance type");
254 }
255 searchTrainingParameters_.InvarianceParams.InvarianceType =
256 static_cast<CExports::TInvarianceType>(invariances);
257 }
258
260
264 int NumClassificationSteps() const noexcept
265 {
266 return static_cast<int>(searchTrainingParameters_.NumClfs);
267 }
268
270
274 void SetNumClassificationSteps(int numSteps)
275 {
276 if (numSteps < NumClassificationStepsMin)
277 {
278 throw std::out_of_range("sample size value must be >=3");
279 }
280 searchTrainingParameters_.NumClfs = numSteps;
281 }
282
285
289 int FeatureResolutionStep1And2() const noexcept
290 {
291 return static_cast<int>(searchTrainingParameters_.Resolution12);
292 }
293
296
300 void SetFeatureResolutionStep1And2(int resolution)
301 {
302 if ((resolution < FeatureResolutionRange().Min()) || (resolution > FeatureResolutionRange().Max()))
303 {
304 throw std::out_of_range("feature resolution step 1&2 value is out of range");
305 }
306 searchTrainingParameters_.Resolution12 = resolution;
307 }
308
310
314 int FeatureResolutionRest() const noexcept
315 {
316 return static_cast<int>(searchTrainingParameters_.ResolutionRest);
317 }
318
320
324 void SetFeatureResolutionRest(int resolution)
325 {
326 if ((resolution < FeatureResolutionRange().Min()) || (resolution > FeatureResolutionRange().Max()))
327 {
328 throw std::out_of_range("feature resolution step 3+ value is out of range");
329 }
330 searchTrainingParameters_.ResolutionRest = resolution;
331 }
332
334
340 {
341 PredictorFactoryBase::UseSettingsFromPredictor(clf);
342 scaleFactorRange_ = clf.ScaleRange();
343 singularValueRange_ = clf.ScaleRange();
344 searchTrainingParameters_ = clf.searchTrainingParameters_;
345 }
346
347#if 0
349
356 {
357 return Internal::DoResCallObjectOut<SearchPredictor>([&](void* & res)
358 {
359 return CVB_CALL_CAPI(PMTrainSearchClassifierFromSil(sil.Handle(), ..., preproCode_, lambda_, ..., res);
360 });
361 }
362
364
370 std::unique_ptr<SearchPredictor> TrainPredictor (const Minos::TrainingSet & mts)
371 {
372 return Internal::DoResCallObjectOut<SearchPredictor>([&](void* & res)
373 {
374 return CVB_CALL_CAPI(PMTrainSearchClassifierFromMts(mts.Handle(), ..., preproCode_, lambda_, ..., res);
375 });
376 }
377#endif
378
379 private:
380 CExports::TTrainSearchParams searchTrainingParameters_;
381 ValueRange<double> scaleFactorRange_;
382 ValueRange<double> singularValueRange_;
383 };
384
387
388 } /* namespace Training */
389
392
393 } /* namespace Polimago */
394 CVB_END_INLINE_NS
395} /* namespace Cvb */
static Angle FromRadians(double rad, bool trim=false) noexcept
Create an angle in radians.
Definition angle.hpp:39
A Minos Training Set from which a classifier can be generated.
Definition training_set.hpp:1188
void * Handle() const noexcept
Classic API CLF handle.
Definition training_set.hpp:1295
SearchPredictorFactory()
Constructor.
Definition search_predictor_factory.hpp:36
Predictor that may be used for searching objects.
Definition search_predictor.hpp:44
ValueRange< double > ScaleRange() const noexcept
Get the range of scale factors that was covered during classifier training.
Definition search_predictor.hpp:192
static ValueRange< int > FeatureResolutionRange()
Valid range of feature resolution value.
Definition predictor_factory_base.hpp:59
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:125
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:192
int NumClassificationSteps() const noexcept
Gets the number of classification steps during search operation.
Definition search_predictor_factory.hpp:264
void UseSettingsFromPredictor(const SearchPredictor &clf)
Copy the predictor generation settings from a predictor.
Definition search_predictor_factory.hpp:339
void SetSampleSize(int sampleSize)
Sets the sample size that has been used in each training set.
Definition search_predictor_factory.hpp:86
void SetSingularValueRange(ValueRange< double > range)
Sets the range of permissible singular values to be covered during classifier training....
Definition search_predictor_factory.hpp:224
ValueRange< Angle > AngleRange() const
Gets the range of angles to be covered during classifier training.
Definition search_predictor_factory.hpp:141
static constexpr int SampleSizeMin
Absolute minimum value for SampleSize.
Definition search_predictor_factory.hpp:69
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:300
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:324
void SetNumClassificationSteps(int numSteps)
Sets the number of classification steps during search operation.
Definition search_predictor_factory.hpp:274
double ExtractionRadius() const noexcept
Gets the radius for extracting positive search instances.
Definition search_predictor_factory.hpp:108
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:180
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:289
void SetAngleRange(ValueRange< Angle > range)
Sets the range of angles to be covered during classifier training.
Definition search_predictor_factory.hpp:153
static constexpr int NumClassificationStepsMin
Minimum classification step count.
Definition search_predictor_factory.hpp:66
void SetInvariances(InvarianceType invariances)
Sets the invariances to be used for generating the classifier.
Definition search_predictor_factory.hpp:244
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:48
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:314
int SampleSize() const noexcept
Gets the sample size that has been used in each training set.
Definition search_predictor_factory.hpp:76
static ValueRange< double > ScaleFactorRange()
Acceptable scale factor range for search classifier training.
Definition search_predictor_factory.hpp:60
static ValueRange< double > SingularValueRangeDefault()
Default value for the singular value range.
Definition search_predictor_factory.hpp:54
InvarianceType Invariances() const noexcept
Gets the invariances to be used for generating the classifier.
Definition search_predictor_factory.hpp:234
void * Handle() const noexcept
Classic API SIL handle.
Definition sample_list.hpp:411
Classifier type that operates on images.
Definition decl_regression_sil.hpp:190
Container for range definitions.
Definition value_range.hpp:17
T Min() const noexcept
Gets the minimum value.
Definition value_range.hpp:47
T Max() const noexcept
Gets the maximum value.
Definition value_range.hpp:69
Namespace for the Polimago package training functionality.
Definition classification_predictor_factory.hpp:23
std::shared_ptr< SearchPredictorFactory > SearchPredictorFactoryPtr
Convenience shared pointer for SearchPredictorFactory.
Definition search_predictor_factory.hpp:386
Namespace for the Polimago package.
Definition classification_predictor.hpp:38
InvarianceType
Invariance types that can be defined for training.
Definition search_predictor.hpp:23
@ AffineGroup
Affine group (i.e. 2x2 matrix plus translation).
Definition search_predictor.hpp:31
@ Translation
Translation.
Definition search_predictor.hpp:27
@ RotationScaleTranslation
Rotation + Scale + Translation.
Definition search_predictor.hpp:29
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
Angle Max(Angle a, Angle b) noexcept
Returns the bigger of two angles.
Definition angle.hpp:495
Angle Min(Angle a, Angle b) noexcept
Returns the smaller of two angles.
Definition angle.hpp:512
T swap(T... args)