Source code for src.generate_heatmaps

"""
Author: Ismael Seidel
Affiliation: Embedded Computing Lab (ECL), Federal University of Santa Catarina (UFSC)

Description:
    This module generates quality heatmaps for light field views at different bitrates,
    visualizing spatial quality variations across encoded views using matplotlib.
"""

import os
from pathlib import Path
import sys

# Add the parent directory to the Python path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from lfc_toolkit.src.configuration.configuration_reader import \
    ConfigurationReader, read_config_from_argv
from lfc_toolkit.src.ctc.lightfield_factory import LightFieldFactory
from lfc_toolkit.src.data_handlers.formatters import \
    get_formatted_filename_for_lf
from lfc_toolkit.src.quality.heatmap import HeatmapMatplotlib


[docs] def main(configuration: ConfigurationReader = None) -> None: """Generate quality heatmaps for all configured light fields and codecs. Creates matplotlib-based heatmaps visualizing spatial quality variations for each light field view at different target bitrates and quality metrics. Heatmaps are saved to the configured output path organized by codec name. :param configuration: Configuration reader instance (read from argv if None) :type configuration: ConfigurationReader :return: None :rtype: None """ if not configuration: configuration = read_config_from_argv() print("Using the paths from", configuration) try: heatmap_configurations = configuration["quality_heatmaps"] except KeyError: print("Error: 'quality_heatmaps' section is missing in the configuration.") return heatmaps_output_path = heatmap_configurations["path"] metrics = heatmap_configurations["metrics"] show_values = heatmap_configurations.get("show_values", False) cmap = heatmap_configurations.get("cmap", "viridis") codecs = configuration["codecs-to-run"] sample_codecs = configuration["sample-codecs-to-run"] # Combined object codecs.update(sample_codecs) for name in configuration.lightfield_names: print(f"({name} LF)") bpps = configuration.lightfield_configurations[name]["target-rates"] for codec_name, codec_info in codecs.items(): print(f"Generating quality heatmaps for {codec_name}") output_path = f"{heatmaps_output_path}/{codec_name}" os.makedirs(output_path, exist_ok=True) for metric in metrics: unit, used_tool = configuration.get_used_quality_unit_and_tool( metric=metric ) used_tool_details = configuration["quality"]["wrappers"][ used_tool ] used_tool_short_name = used_tool_details["short_name"] used_tool_raw_type = used_tool_details["raw_type"] for target_rate in bpps: lightfield = LightFieldFactory.get_raw_lightfield( configuration=configuration, lightfield_name=name, raw_type=used_tool_raw_type, bpp_for_naming=target_rate, ) path = "" if codec_name in sample_codecs: samples_path = sample_codecs.get(codec_name).get("samples_path", {}).get(used_tool_short_name, "") if samples_path: path = samples_path else: path = Path(codec_info['results']) / "metrics_reports" / used_tool_short_name heatmap = HeatmapMatplotlib( path=path, lightfield=lightfield, tool_name=used_tool_short_name, target_rate=target_rate, distortion_name=metric, distortion_unit=unit, title="Teste", configuration=configuration ) filename = get_formatted_filename_for_lf( output_path, lightfield=lightfield, file_extension=heatmap_configurations["format"], extra_end=f"{metric}_{target_rate}", ) heatmap.plot( show_values=show_values, filename=filename, codec_name=f"{codec_info.get('rd_preferences', {}).get('title', codec_name)}", cmap=cmap, )
if __name__ == "__main__": main()