[PATCH v2 15/17] libipa: awb_bayes: Add logging of value limits
Stefan Klug
stefan.klug at ideasonboard.com
Thu Jan 23 12:41:05 CET 2025
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 at ideasonboard.com>
---
Changes in v2:
- Added this commit
---
src/ipa/libipa/awb_bayes.cpp | 57 ++++++++++++++++++++++++++++++++++--
1 file changed, 55 insertions(+), 2 deletions(-)
diff --git a/src/ipa/libipa/awb_bayes.cpp b/src/ipa/libipa/awb_bayes.cpp
index 8ab6ed661a3e..aaa8c7a663ad 100644
--- a/src/ipa/libipa/awb_bayes.cpp
+++ b/src/ipa/libipa/awb_bayes.cpp
@@ -50,6 +50,44 @@ 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 +315,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 +327,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 +351,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 +397,9 @@ void AwbBayes::fineSearch(double &t, double &r, double &b, ipa::Pwl const &prior
Pwl::Point bestRB;
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 +414,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 +433,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 +451,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 +472,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;
}
/**
--
2.43.0
More information about the libcamera-devel
mailing list