[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