libipa: awb_bayes: Change the probabilities from log space to linear space
The original code used to specify the probabilities in log space and scaled for the RaspberryPi hardware with 192 AWB measurement points. This is reasonable as the whole algorithm makes use of unitless numbers to prefer some colour temperatures based on a lux level. These numbers are then hand tuned with the specific device in mind. This has two shortcomings: 1. The linear interpolation of PWLs in log space is mathematically incorrect. The outcome might still be ok, as both spaces (log and linear) are monotonic, but it is still not "right". 2. Having unitless numbers gets more error prone when we try to harmonize the behavior over multiple platforms. Change the algorithm to interpret the numbers as being in linear space. This makes the interpolation mathematically correct at the expense of a few log operations. To account for that change, update the numbers in the tuning example file with the linear counterparts scaled to one AWB zone measurement. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
This commit is contained in:
parent
d98f3512ec
commit
d476f8358b
3 changed files with 15 additions and 10 deletions
|
@ -57,8 +57,9 @@ namespace ipa {
|
|||
* applied. To keep the actual implementations computationally inexpensive,
|
||||
* the squared colour error shall be returned.
|
||||
*
|
||||
* If the awb statistics provide multiple zones, the sum over all zones needs to
|
||||
* calculated.
|
||||
* If the awb statistics provide multiple zones, the average of the individual
|
||||
* squared errors shall be returned. Averaging/normalizing is necessary so that
|
||||
* the numeric dimensions are the same on all hardware platforms.
|
||||
*
|
||||
* \return The computed error value
|
||||
*/
|
||||
|
|
|
@ -234,6 +234,10 @@ int AwbBayes::readPriors(const YamlObject &tuningData)
|
|||
|
||||
auto &pwl = priors[lux];
|
||||
for (const auto &[ct, prob] : ctToProbability) {
|
||||
if (prob < 1e-6) {
|
||||
LOG(Awb, Error) << "Prior probability must be larger than 1e-6";
|
||||
return -EINVAL;
|
||||
}
|
||||
pwl.append(ct, prob);
|
||||
}
|
||||
}
|
||||
|
@ -323,7 +327,7 @@ double AwbBayes::coarseSearch(const ipa::Pwl &prior, const AwbStats &stats) cons
|
|||
double b = ctB_.eval(t, &spanB);
|
||||
RGB<double> gains({ 1 / r, 1.0, 1 / b });
|
||||
double delta2Sum = stats.computeColourError(gains);
|
||||
double priorLogLikelihood = prior.eval(prior.domain().clamp(t));
|
||||
double priorLogLikelihood = log(prior.eval(prior.domain().clamp(t)));
|
||||
double finalLogLikelihood = delta2Sum - priorLogLikelihood;
|
||||
|
||||
errorLimits.record(delta2Sum);
|
||||
|
@ -406,7 +410,7 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
|
|||
for (int i = -nsteps; i <= nsteps; i++) {
|
||||
double tTest = t + i * step;
|
||||
double priorLogLikelihood =
|
||||
prior.eval(prior.domain().clamp(tTest));
|
||||
log(prior.eval(prior.domain().clamp(tTest)));
|
||||
priorLogLikelihoodLimits.record(priorLogLikelihood);
|
||||
Pwl::Point rbStart{ { ctR_.eval(tTest, &spanR),
|
||||
ctB_.eval(tTest, &spanB) } };
|
||||
|
|
|
@ -7,21 +7,21 @@ general:
|
|||
awb:
|
||||
# Algorithm can either be 'grey' or 'bayes'
|
||||
algorithm: bayes
|
||||
# Priors is only used for the bayes algorithm. They are defined in
|
||||
# logarithmic space. A good staring point is:
|
||||
# Priors is only used for the bayes algorithm. They are defined in linear
|
||||
# space. A good staring point is:
|
||||
# - lux: 0
|
||||
# ct: [ 2000, 3000, 13000 ]
|
||||
# probability: [ 1.0, 0.0, 0.0 ]
|
||||
# probability: [ 1.005, 1.0, 1.0 ]
|
||||
# - lux: 800
|
||||
# ct: [ 2000, 6000, 13000 ]
|
||||
# probability: [ 0.0, 2.0, 2.0 ]
|
||||
# probability: [ 1.0, 1.01, 1.01 ]
|
||||
# - lux: 1500
|
||||
# ct: [ 2000, 4000, 6000, 6500, 7000, 13000 ]
|
||||
# probability: [ 0.0, 1.0, 6.0, 7.0, 1.0, 1.0 ]
|
||||
# probability: [ 1.0, 1.005, 1.032, 1.037, 1.01, 1.01 ]
|
||||
priors:
|
||||
- lux: 0
|
||||
ct: [ 2000, 13000 ]
|
||||
probability: [ 0.0, 0.0 ]
|
||||
probability: [ 1.0, 1.0 ]
|
||||
AwbMode:
|
||||
AwbAuto:
|
||||
lo: 2500
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue