[PATCH v2 10/17] ipa: rkisp1: Add support for bayes AWB algorithm from libipa

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Feb 23 23:56:28 CET 2025


Hi Stefan,

On Thu, Jan 23, 2025 at 12:41:00PM +0100, Stefan Klug wrote:
> Now that libipa contains a bayes AWB algorithm, add it as supported
> algorithm to the rkisp1 ipa.
> 
> The decision between the grey world algorithm and the bayesian is done
> based on the "algorithm" property of the "Awb" algorithm in the tuning
> file. If the lux value in the frameContext is set by the Lux algorithm
> it is taken into account. If the lux value is 0 the prior likelihood
> estimation gets ignored in the AWB calculations.
> 
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
> Reviewed-by: Daniel Scally <dan.scally at ideasonboard.com>
> 
> ---
> 
> Changes in v2:
> - Collected tags
> ---
>  src/ipa/rkisp1/algorithms/awb.cpp | 52 +++++++++++++++++++++++--------
>  1 file changed, 39 insertions(+), 13 deletions(-)
> 
> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
> index b21d0d4c03bb..55e1b43c8cd2 100644
> --- a/src/ipa/rkisp1/algorithms/awb.cpp
> +++ b/src/ipa/rkisp1/algorithms/awb.cpp
> @@ -16,6 +16,7 @@
>  
>  #include <libcamera/ipa/core_ipa_interface.h>
>  
> +#include "libipa/awb_bayes.h"
>  #include "libipa/awb_grey.h"
>  #include "libipa/colours.h"
>  
> @@ -45,13 +46,23 @@ class RkISP1AwbStats : public AwbStats
>  {
>  public:
>  	RkISP1AwbStats(const RGB<double> &rgbMeans)
> -		: rgbMeans_(rgbMeans) {}
> +		: rgbMeans_(rgbMeans)
> +	{
> +		rg_ = rgbMeans_.r() / rgbMeans_.g();
> +		bg_ = rgbMeans_.b() / rgbMeans_.g();
> +	}
>  
> -	double computeColourError([[maybe_unused]] const RGB<double> &gains) const override
> +	double computeColourError(const RGB<double> &gains) const override
>  	{
> -		LOG(RkISP1Awb, Error)
> -			<< "RkISP1AwbStats::computeColourError is not implemented";
> -		return 0.0;
> +		/*
> +		* Compute the sum of the squared colour error (non-greyness) as it
> +		* appears in the log likelihood equation.
> +		*/
> +		double deltaR = gains.r() * rg_ - 1.0;
> +		double deltaB = gains.b() * bg_ - 1.0;
> +		double delta2 = deltaR * deltaR + deltaB * deltaB;
> +
> +		return delta2;
>  	}
>  
>  	RGB<double> getRGBMeans() const override
> @@ -61,6 +72,8 @@ public:
>  
>  private:
>  	RGB<double> rgbMeans_;
> +	double rg_;
> +	double bg_;
>  };
>  
>  Awb::Awb()
> @@ -78,13 +91,30 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)
>  							 kMaxColourTemperature,
>  							 kDefaultColourTemperature);
>  
> -	awbAlgo_ = std::make_unique<AwbGrey>();
> +	if (!tuningData.contains("algorithm"))
> +		LOG(RkISP1Awb, Info) << "No awb algorithm specified."
> +				     << " Default to grey world";
> +
> +	auto mode = tuningData["algorithm"].get<std::string>("grey");
> +	if (mode == "grey") {
> +		awbAlgo_ = std::make_unique<AwbGrey>();
> +	} else if (mode == "bayes") {
> +		awbAlgo_ = std::make_unique<AwbBayes>();
> +	} else {
> +		LOG(RkISP1Awb, Error) << "Unknown awb algorithm: " << mode;
> +		return -EINVAL;
> +	}
> +	LOG(RkISP1Awb, Debug) << "Using awb algorithm: " << mode;
> +
>  	int ret = awbAlgo_->init(tuningData);
>  	if (ret) {
>  		LOG(RkISP1Awb, Error) << "Failed to init awb algorithm";
>  		return ret;
>  	}
>  
> +	const auto &src = awbAlgo_->controls();
> +	cmap.insert(src.begin(), src.end());
> +
>  	return 0;
>  }
>  
> @@ -131,6 +161,8 @@ void Awb::queueRequest(IPAContext &context,
>  			<< (*awbEnable ? "Enabling" : "Disabling") << " AWB";
>  	}
>  
> +	awbAlgo_->handleControls(controls);
> +
>  	frameContext.awb.autoEnabled = awb.autoEnabled;
>  
>  	if (awb.autoEnabled)

There's a comment a bit below that states

		/*
		 * \todo: Colour temperature reported in metadata is now
		 * incorrect, as we can't deduce the temperature from the gains.
		 * This will be fixed with the bayes AWB algorithm.
		 */

Has this been addressed, can it be removed ?

> @@ -271,14 +303,8 @@ void Awb::process(IPAContext &context,
>  	    rgbMeans.b() < kMeanMinThreshold)
>  		return;
>  
> -	/*
> -	 * \Todo: Hardcode lux to a fixed value, until an estimation is
> -	 * implemented.
> -	 */
> -	int lux = 1000;
> -
>  	RkISP1AwbStats awbStats{ rgbMeans };
> -	AwbResult awbResult = awbAlgo_->calculateAwb(awbStats, lux);
> +	AwbResult awbResult = awbAlgo_->calculateAwb(awbStats, frameContext.lux.lux);
>  
>  	activeState.awb.temperatureK = awbResult.colourTemperature;
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list