[libcamera-devel] [PATCH v2 11/11] [WIP] utils: tuning: Add tuning script for rkisp1
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Nov 9 13:39:36 CET 2022
Hi Paul,
Thank you for the patch.
On Sat, Oct 22, 2022 at 03:23:10PM +0900, Paul Elder via libcamera-devel wrote:
> Add a tuning script for rkisp1 that uses libtuning.
>
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
>
> ---
> Changes in v2:
> - add SPDX and copyright
> - s/average_functions/average/
> - update the script to work with the new rkisp1 alsc module
>
> As of v2, this runs, but only with LSC. Parabolic gradient support is
> put on hold, and instead the sectors are divided linearly. Is this what
> we want?
Is mentioned previously, I don't think we want a fixed function to
compute the sector sizes. We want sizes that will minimize the errors.
Honestly, I would hardcode the linear sizes for now, and drop parametric
gradient support as I don't think it will ever be used, but that's not a
blocker.
> Technically this script is complete in the sense that it works, but it's
> still WIP because it only support LSC. What should we do about this?
> Should it be "complete" at this stage and we can add the other modules
> later, or should we keep it WIP until the other modules are added?
>
> v1:
> This won't run as we're missing the necessary parser and generator for
> yaml, parabolic gradient support, and multiple green support in the LSC
> module, hence the DNI. As soon as those are added though, this *should*
> work.
> ---
> utils/tuning/rkisp1.py | 58 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 58 insertions(+)
> create mode 100755 utils/tuning/rkisp1.py
>
> diff --git a/utils/tuning/rkisp1.py b/utils/tuning/rkisp1.py
> new file mode 100755
> index 00000000..cb692dd1
> --- /dev/null
> +++ b/utils/tuning/rkisp1.py
> @@ -0,0 +1,58 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# Copyright (C) 2022, Paul Elder <paul.elder at ideasonboard.com>
> +#
> +# rkisp1.py - Tuning script for rkisp1
> +
> +import sys
> +
> +import libtuning as lt
> +from libtuning.parsers import YamlParser
> +from libtuning.generators import YamlOutput
> +from libtuning.modules.alsc import ALSCRkISP1
Should be named LSCRkISP1 as mentioned elsewhere. Same below.
> +
> +tuner = lt.Camera('RkISP1')
> +tuner.add(ALSCRkISP1(
> + # This can support other debug options (I can't think of any rn
s/rn/right now/
> + # but for future-proofing)
s/$/./
Same for other sentences below.
> + debug=[lt.Debug.Plot],
> +
> + # This is for the actual LSC tuning, and is part of the base
> + # ALSC module. rkisp1's table size (16x16 programmed as mirrored
> + # 8x8) is separate, and is hardcoded in its specific ALSC tuning
It's only the sector sizes that are mirrored, not necessarily the
values.
> + # module
> + sector_shape=(17, 17),
> +
> + # Other functions might include Circular, Hyperbolic, Gaussian,
> + # Linear, Exponential, Logarithmic, etc
> + # Of course, both need not be the same function
> + # Some functions would need a sector_x_parameter (eg. sigma for Gaussian)
> + # Alternatively: sector_x_sizes = [] ? I don't think it would work tho
Drop this, per the comment above.
> + sector_x_gradient=lt.gradient.Linear(lt.Remainder.DistributeFront),
> + sector_y_gradient=lt.gradient.Linear(lt.Remainder.DistributeFront),
> +
> + # This is the function that will be used to average the pixels in each sector
> + # This can also be a custom function.
> + sector_average_function=lt.average.Mean(),
> +
> + # This is the function that will be used to smooth the color ratio values
> + # This can also be a custom function.
> + smoothing_function=lt.smoothing.MedianBlur(3),
> +
> + # Do we need a flag to enable/disable calculating sigmas? afaik
> + # the rkisp1 IPA doesn't use it? But we could output it anyway
It's for the RPi ALSC only, so it shouldn't be part of the base.
> + # and algorithms can decide whether or not if they want to use
> + # it. Oh well, no flag for now, we can always add it later if
> + # there's a big demand, plus it's only two to three values and
> + # not an entire table.
> + ))
> +tuner.setInputType(YamlParser)
> +tuner.setOutputType(YamlOutput)
> +tuner.setOutputOrder([ALSCRkISP1])
> +
> +# Maybe this should be wrapped in an if __main__ = '__main__' ? That way the
It's a good practice, so I would do that, and drop this comment.
> +# developer can control which tuner they want to be executed based on another
> +# layer of arguments? But I was thinking that this would handle *all* arguments
> +# based on the modules' and the input/output configurations.
> +tuner.run(sys.argv)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list