[PATCH v1 08/11] libtuning: module: awb: Add bayes AWB support

Paul Elder paul.elder at ideasonboard.com
Tue Jan 14 01:14:09 CET 2025


On Thu, Jan 09, 2025 at 12:53:59PM +0100, Stefan Klug wrote:
> To support the bayesian AWB algorithm in libtuning, the necessary data
> needs to be collected and written to the tuning file.
> 
> Prior probabilities and AwbModes are defined by the user and therefore
> added to the example config file.
> 
> Extend the output to also contain the necessary data for the bayesian
> AWB algorithm.
> 
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> ---
>  utils/tuning/config-example.yaml             | 34 +++++++++++++++++++-
>  utils/tuning/libtuning/modules/awb/awb.py    | 16 +++++----
>  utils/tuning/libtuning/modules/awb/rkisp1.py | 21 ++++++++----
>  3 files changed, 58 insertions(+), 13 deletions(-)
> 
> diff --git a/utils/tuning/config-example.yaml b/utils/tuning/config-example.yaml
> index 1b7f52cd2fff..30e88341df01 100644
> --- a/utils/tuning/config-example.yaml
> +++ b/utils/tuning/config-example.yaml
> @@ -5,7 +5,39 @@ general:
>      do_alsc_colour: 1
>      luminance_strength: 0.5
>    awb:
> -    greyworld: 0
> +    # Algorithm can be either 'grey' or 'bayes'
> +    algorithm: bayes
> +    # priors is only used for the bayes algorithm
> +    priors:
> +      - lux: 0
> +        ct: [ 2000, 13000]

I think s/]/ ]/ would be nicer.

> +        probability: [ 1.0, 1.0 ]
> +    AwbMode:
> +      AwbAuto:
> +        lo: 2500
> +        hi: 8000
> +      AwbIncandescent:
> +        lo: 2500
> +        hi: 3000
> +      AwbTungsten:
> +        lo: 3000
> +        hi: 3500
> +      AwbFluorescent:
> +        lo: 4000
> +        hi: 4700
> +      AwbIndoor:
> +        lo: 3000
> +        hi: 5000
> +      AwbDaylight:
> +        lo: 5500
> +        hi: 6500
> +      AwbCloudy:
> +        lo: 6500
> +        hi: 8000
> +      # One custom mode can be defined if needed
> +      #AwbCustom:
> +      #  lo: 2000
> +      #  hi: 1300
>    macbeth:
>      small: 1
>      show: 0
> diff --git a/utils/tuning/libtuning/modules/awb/awb.py b/utils/tuning/libtuning/modules/awb/awb.py
> index c154cf3b8609..0dc4f59dcb26 100644
> --- a/utils/tuning/libtuning/modules/awb/awb.py
> +++ b/utils/tuning/libtuning/modules/awb/awb.py
> @@ -27,10 +27,14 @@ class AWB(Module):
>  
>          imgs = [img for img in images if img.macbeth is not None]
>  
> -        gains, _, _ = awb(imgs, None, None, False)
> -        gains = np.reshape(gains, (-1, 3))
> +        ct_curve, transverse_pos, transverse_neg = awb(imgs, None, None, False)
> +        ct_curve = np.reshape(ct_curve, (-1, 3))
> +        gains = [{
> +            'ct': int(v[0]),
> +            'gains': [float(1.0 / v[1]), float(1.0 / v[2])]
> +        } for v in ct_curve]
> +
> +        return {'colourGains': gains,
> +                'transversePos': transverse_pos,
> +                'transverseNeg': transverse_neg}

I don't think we use transversePos and transverseNeg?


Paul

>  
> -        return [{
> -                    'ct': int(v[0]),
> -                    'gains': [float(1.0 / v[1]), float(1.0 / v[2])]
> -                } for v in gains]
> diff --git a/utils/tuning/libtuning/modules/awb/rkisp1.py b/utils/tuning/libtuning/modules/awb/rkisp1.py
> index 0c95843b83d3..d562d26eb8cc 100644
> --- a/utils/tuning/libtuning/modules/awb/rkisp1.py
> +++ b/utils/tuning/libtuning/modules/awb/rkisp1.py
> @@ -6,9 +6,6 @@
>  
>  from .awb import AWB
>  
> -import libtuning as lt
> -
> -
>  class AWBRkISP1(AWB):
>      hr_name = 'AWB (RkISP1)'
>      out_name = 'Awb'
> @@ -20,8 +17,20 @@ class AWBRkISP1(AWB):
>          return True
>  
>      def process(self, config: dict, images: list, outputs: dict) -> dict:
> -        output = {}
> -
> -        output['colourGains'] = self.do_calculation(images)
> +        if not 'awb' in config['general']:
> +            raise ValueError('AWB configuration missing')
> +        awb_config = config['general']['awb']
> +        algorithm = awb_config['algorithm']
> +
> +        output = {'algorithm': algorithm}
> +        data = self.do_calculation(images)
> +        if algorithm == 'grey':
> +            output['colourGains'] = data['colourGains']
> +        elif algorithm == 'bayes':
> +            output['AwbMode'] = awb_config['AwbMode']
> +            output['priors'] = awb_config['priors']
> +            output.update(data)
> +        else:
> +            raise ValueError(f"Unknown AWB algorithm {output['algorithm']}")
>  
>          return output
> -- 
> 2.43.0
> 


More information about the libcamera-devel mailing list