libipa: awb_bayes: Add logging of value limits

When tuning the AWB algorithm it is more helpful to get a feeling for
the value ranges than to get verbose output of every single step. Add a
small utility class to track the limits and log them.

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:
Stefan Klug 2025-01-23 12:41:05 +01:00
parent ce9d547aff
commit c2059585f3

View file

@ -50,6 +50,43 @@ namespace libcamera {
LOG_DECLARE_CATEGORY(Awb)
namespace {
template<typename T>
class LimitsRecorder
{
public:
LimitsRecorder()
: min_(std::numeric_limits<T>::max()),
max_(std::numeric_limits<T>::min())
{
}
void record(const T &value)
{
min_ = std::min(min_, value);
max_ = std::max(max_, value);
}
const T &min() const { return min_; }
const T &max() const { return max_; }
private:
T min_;
T max_;
};
#ifndef __DOXYGEN__
template<typename T>
std::ostream &operator<<(std::ostream &out, const LimitsRecorder<T> &v)
{
out << "[ " << v.min() << ", " << v.max() << " ]";
return out;
}
#endif
} /* namespace */
namespace ipa {
/**
@ -277,6 +314,8 @@ double AwbBayes::coarseSearch(const ipa::Pwl &prior, const AwbStats &stats) cons
double t = currentMode_->ctLo;
int spanR = -1;
int spanB = -1;
LimitsRecorder<double> errorLimits;
LimitsRecorder<double> priorLogLikelihoodLimits;
/* Step down the CT curve evaluating log likelihood. */
while (true) {
@ -287,6 +326,9 @@ double AwbBayes::coarseSearch(const ipa::Pwl &prior, const AwbStats &stats) cons
double priorLogLikelihood = prior.eval(prior.domain().clamp(t));
double finalLogLikelihood = delta2Sum - priorLogLikelihood;
errorLimits.record(delta2Sum);
priorLogLikelihoodLimits.record(priorLogLikelihood);
LOG(Awb, Debug) << "Coarse search t: " << t
<< " gains: " << gains
<< " error: " << delta2Sum
@ -308,7 +350,9 @@ double AwbBayes::coarseSearch(const ipa::Pwl &prior, const AwbStats &stats) cons
}
t = points[bestPoint].x();
LOG(Awb, Debug) << "Coarse search found CT " << t;
LOG(Awb, Debug) << "Coarse search found CT " << t
<< " error limits:" << errorLimits
<< " prior log likelihood limits:" << priorLogLikelihoodLimits;
/*
* We have the best point of the search, but refine it with a quadratic
@ -352,6 +396,9 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
Pwl::Point bestRB(0);
double transverseRange = transverseNeg_ + transversePos_;
const int maxNumDeltas = 12;
LimitsRecorder<double> errorLimits;
LimitsRecorder<double> priorLogLikelihoodLimits;
/* a transverse step approximately every 0.01 r/b units */
int numDeltas = floor(transverseRange * 100 + 0.5) + 1;
@ -366,6 +413,7 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
double tTest = t + i * step;
double priorLogLikelihood =
prior.eval(prior.domain().clamp(tTest));
priorLogLikelihoodLimits.record(priorLogLikelihood);
Pwl::Point rbStart{ { ctR_.eval(tTest, &spanR),
ctB_.eval(tTest, &spanB) } };
Pwl::Point samples[maxNumDeltas];
@ -384,6 +432,7 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
Pwl::Point rbTest = rbStart + transverse * p.x();
RGB<double> gains({ 1 / rbTest[0], 1.0, 1 / rbTest[1] });
double delta2Sum = stats.computeColourError(gains);
errorLimits.record(delta2Sum);
p.y() = delta2Sum - priorLogLikelihood;
if (p.y() < samples[bestPoint].y())
@ -401,6 +450,7 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
Pwl::Point rbTest = rbStart + transverse * bestOffset;
RGB<double> gains({ 1 / rbTest[0], 1.0, 1 / rbTest[1] });
double delta2Sum = stats.computeColourError(gains);
errorLimits.record(delta2Sum);
double finalLogLikelihood = delta2Sum - priorLogLikelihood;
LOG(Awb, Debug)
<< "Fine search t: " << tTest
@ -421,7 +471,9 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
r = bestRB[0];
b = bestRB[1];
LOG(Awb, Debug)
<< "Fine search found t " << t << " r " << r << " b " << b;
<< "Fine search found t " << t << " r " << r << " b " << b
<< " error limits: " << errorLimits
<< " prior log likelihood limits: " << priorLogLikelihoodLimits;
}
/**