Skip to content

Configuration reference

Defines all datasets available for fetching. Validated by config/datasets.schema.json.

FieldTypeRequiredDescription
idstringYesUnique identifier (^[a-z0-9-]+$). Used in CLI commands.
namestringYesHuman-readable name.
descriptionstringYesBrief description.
typestringYesArchive format: zip, tar, tar.gz, tgz, or folder (Google Drive).
urlstringYesDownload URL (HTTP/HTTPS, Google Drive, Dropbox).
size_mbnumberYesApproximate download size in MB.
image_countnumberYesNumber of images.
resolutionstringYesResolution description (e.g., “2K”, “4K”).
formatstringYesImage format (e.g., “PNG”, “JPEG”).
storage_typestringNoStorage provider: direct (default), google_drive, or dropbox.
folder_idstringNoGoogle Drive folder ID (for folder-type downloads).
post_processstringNoPost-processing action: extract_multipart_zips (for LIU4K v2).
extracted_folderstringNoFolder name after extraction.
rename_tostringNoRename extracted folder to this name.
licensestringNoLicense information.
sourcestringNoOrganization providing the dataset.
{
"datasets": [
{
"id": "div2k-valid",
"name": "DIV2K Validation",
"description": "DIV2K validation set with 100 high-quality 2K images",
"type": "zip",
"url": "http://data.vision.ee.ethz.ch/cvl/DIV2K/DIV2K_valid_HR.zip",
"size_mb": 449,
"image_count": 100,
"resolution": "2K",
"format": "PNG",
"extracted_folder": "DIV2K_valid_HR",
"rename_to": "DIV2K_valid",
"license": "Unknown - check DIV2K website",
"source": "ETH Zurich Computer Vision Lab"
}
]
}

Study configs live in config/studies/ and define encoding experiments. Validated by config/study.schema.json.

FileStudy IDDescription
format-comparison.jsonformat-comparisonCompare JPEG, WebP, AVIF, JPEG XL
avif-speed-sweep.jsonavif-speed-sweepAVIF speed parameter sweep
avif-chroma-subsampling.jsonavif-chroma-subsamplingAVIF chroma subsampling comparison
jxl-effort-sweep.jsonjxl-effort-sweepJPEG XL effort level comparison
webp-method-sweep.jsonwebp-method-sweepWebP method parameter sweep
resolution-impact.jsonresolution-impactImpact of resolution on quality
jpeg-crop-impact.jsonjpeg-crop-impactJPEG crop-impact study
webp-crop-impact.jsonwebp-crop-impactWebP crop-impact study
avif-crop-impact.jsonavif-crop-impactAVIF crop-impact study
jxl-crop-impact.jsonjxl-crop-impactJPEG XL crop-impact study
FieldTypeRequiredDescription
idstringYesUnique study identifier.
namestringNoHuman-readable name. Defaults to id.
descriptionstringNoPurpose of the study.
time_budgetnumberNoDefault time budget in seconds. Overridden by CLI.
dataset.idstringYesDataset identifier from datasets.json.
dataset.max_imagesintegerNoLimit images from dataset.
analysis.x_axisstringNoOverride the primary plot x-axis.
analysis.group_bystringNoOverride the line-grouping parameter for plots.
comparison.tile_parameterstringNoParameter that varies within each comparison figure.
comparison.targetsarrayNoComparison target groups, each with metric and values.
comparison.exclude_imagesstring[]NoBasenames to exclude from automatic comparison source-image selection.
analysis_fragment_sizeintegerNoSide length of the measured fragment for crop-impact studies. Defaults to 200.
crop_too_small_strategystringNoHandling strategy when a crop level cannot contain the fragment.
encodersarrayYesList of encoder configurations.
FieldTypeRequiredDescription
formatstringYesOne of: jpeg, webp, avif, jxl.
qualityint/list/rangeYesQuality settings to sweep (0–100).
chroma_subsamplingstring[]NoSubsampling modes: 444, 422, 420, 400.
speedint/int[]NoAVIF speed setting(s) (0–10).
effortint/int[]NoJXL effort setting(s) (1–10).
methodint/int[]NoWebP method setting(s) (0–6).
resolutionint/int[]NoTarget resolution(s) in pixels (longest edge).
cropint/int[]NoTarget crop longest-edge value(s) in pixels for crop-impact studies.
extra_argsobjectNoEncoder-specific CLI arguments.

The crop and resolution parameters model different preprocessing modes and should not be combined on the same encoder entry.

FormatExampleExpanded
Single integer75[75]
Explicit list[60, 75, 90][60, 75, 90]
Range object{"start": 30, "stop": 90, "step": 10}[30, 40, 50, 60, 70, 80, 90]
{
"id": "format-comparison",
"name": "Format Comparison",
"time_budget": 1800,
"dataset": { "id": "div2k-valid", "max_images": 10 },
"encoders": [
{ "format": "jpeg", "quality": [60, 75, 85, 95] },
{ "format": "webp", "quality": [60, 75, 85, 95] },
{ "format": "avif", "quality": [60, 75, 85, 95], "speed": 4 },
{ "format": "jxl", "quality": [60, 75, 85, 95] }
]
}
{
"id": "avif-speed-sweep",
"name": "AVIF Speed Sweep",
"time_budget": 3600,
"dataset": { "id": "div2k-valid", "max_images": 10 },
"encoders": [
{
"format": "avif",
"quality": { "start": 30, "stop": 90, "step": 10 },
"speed": [2, 4, 6, 8]
}
]
}
{
"id": "avif-crop-impact",
"name": "AVIF Crop Impact Study",
"dataset": { "id": "div2k-valid", "max_images": 100 },
"analysis_fragment_size": 200,
"crop_too_small_strategy": "skip_image",
"analysis": {
"x_axis": "crop",
"group_by": "quality"
},
"comparison": {
"tile_parameter": "crop",
"targets": [
{ "metric": "ssimulacra2", "values": [65, 70, 75, 80, 85, 90] },
{ "metric": "bits_per_pixel", "values": [0.3, 0.4, 0.8, 1.6, 3.2] }
]
},
"encoders": [
{
"format": "avif",
"quality": [30, 40, 50, 60, 70, 80, 90, 100],
"speed": 4,
"crop": [2048, 1600, 1200, 800, 400]
}
]
}

Pipeline output is saved as data/metrics/<study-id>/quality.json, validated by config/quality-results.schema.json.

Key fields per measurement:

FieldDescription
source_imagePath to preprocessed source image
original_imagePath to original dataset image
formatEncoding format
qualityQuality setting used
resolutionResolution sweep value
cropCrop longest-edge sweep value
analysis_fragmentMeasured fragment rectangle in source-image coordinates
crop_regionCrop window rectangle in original-image coordinates
file_sizeEncoded file size in bytes
width, heightImage dimensions
ssimulacra2SSIMULACRA2 score (or null on error)
psnrPSNR in dB
ssimSSIM score
butteraugliButteraugli distance
encoding_timeTime taken to encode in seconds
measurement_errorError message (null if successful)