Skip to content

Releases: luxgrain/GALOSH

GALOSH v0.6.0 — the chroma knob means what you think it means + Linux one-command setup

Choose a tag to compare

@luxgrain luxgrain released this 06 Aug 17:09

The chroma knob now means what you think it means — plus Linux became a first-class citizen.

Highlights

  • Hybrid chroma strength (semantics change; defaults bit-unchanged). The old knob only tuned the ridge stiffness of the Y-guided chroma regression — on content where the projection saturates it was nearly inert, and 0 didn't mean "off" (an un-ridged regression, measured below noisy on Set8 s20). New: one monotone dial on every engine — 0 = true bypass (chroma planes pass through bit-exactly), 0–1 = dry/wet mix (the July variant-Q interior optimum reappears: Set8 s20 Cr, c=0.5 beats c=1 by +0.30 dB), 1 = canonical (byte-identical to v0.5.1), >1 = the legacy ridge scaling (still real gains on heavy noise: CRVD ISO25600 +0.22 dB at c=2). Reported via GALOSH-frameserver #1.
  • Linux one-command setup: ./install_linux.sh builds the CLIs, creates a private .venv, and generates ./galosh-dng / ./galosh-png launchers; docs/QUICKSTART_LINUX.md assumes zero Python knowledge. Verified flow on Ubuntu 24.04; output matches the Windows build to ~139 dB PSNR.
  • exiftool is optional now: the DNG/PNG wrappers warn and continue without it (the DNG skeleton renders on its own), --no-exiftool skips the metadata overlay on purpose, and raw sources beyond DNG (CR3/CR2/NEF/ARW — any Bayer LibRaw reads) are documented. Every CLI's size-mismatch error now explains the raw float32 contract.

Downloads

  • GALOSH_YUV_win64.zip — sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt: the bundled CLI carries the new chroma dial; READMEs document it.
  • GALOSH_RAW_win64.zip — DNG in → denoised DNG out (unchanged from v0.3.0).

SHA256:

8e1f3cd09f965f50344f348cfcb65c201571b538b2776fe75a171b855bbaf76b  GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573  GALOSH_RAW_win64.zip

See CHANGELOG.md for the complete list.

GALOSH v0.5.1 — 4:2:0 adaptive chroma radius revived: sigma_C-driven + one-sided ridge

Choose a tag to compare

@luxgrain luxgrain released this 01 Aug 03:45

Bugfix release. The 4:2:0 noise-adaptive chroma radius introduced in v0.4.x had silently died in v0.5.0: its input readout collapsed to the estimator's read floor after the envelope switch, leaving the radius stuck at R=2 on every engine. v0.5.1 revives the adaptation by measuring chroma noise where it lives.

Highlights

  • sigma_C-driven chroma radius: the 4:2:0 half-res chroma LOESS radius is now keyed to a blind Laplacian-MAD measured directly on the native half-res Cb/Cr planes (blind-vs-oracle correlation 0.984–0.992), threshold recalibrated on the original crossover material (T_C = 0.020). A/B: CRVD real noise +0.165 dB, LPIPS flat.
  • One-sided MAP-ridge eps (new, default ON): strength_eff = strength_c * clamp(sigma_C / 0.012, 1, 4) — never weaker than the shipped ridge, it only stiffens the chroma regression on noisy content (+0.055 dB / −0.001 LPIPS over 27 cells).
  • Exact cross-engine agreement: CPU, OpenCL and Vulkan compute sigma_C host-side with identical arithmetic, so radius/eps decisions match everywhere. Vulkan keeps its zero-mid-frame-readback design (host-decided radius via a widened push constant).
  • Byte-exact escape hatch: GALOSH_YUV420_RADIUS_SRC=lin + GALOSH_YUV420_EPS_SRC=const reproduces v0.5.0 byte-identically (verified against v0.5.0 reference builds on CPU and Vulkan).
  • Bench (420 GALOSH rows, AWGN / PG-core / PG-cmp / CRVD): PSNR, SSIM and LPIPS improve on essentially every track × variant; gains concentrate at high noise (CRVD ISO25600 +0.26 dB, PG-core ISO12800 +0.14 dB); low-noise cells unchanged by design. The 444 lanes and the RAW pipelines are completely untouched.

Downloads

  • GALOSH_YUV_win64.zip — sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt: the bundled CLI (bin/galosh_yuv_cpu.exe) carries the 4:2:0 fix; the PNG drag & drop path is byte-identical to v0.5.0.
  • GALOSH_RAW_win64.zip — DNG in → denoised DNG out (unchanged from v0.3.0).

SHA256:

473879aa75f8964beec2f252ba0bed6096b8649a48507394b7aebb9e186b26c1  GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573  GALOSH_RAW_win64.zip

See CHANGELOG.md for the complete list.

GALOSH v0.5.0 — YUV blind estimation fixed: the envelope estimator lands

Choose a tag to compare

@luxgrain luxgrain released this 20 Jul 06:17

The headline is a correction. The YUV pipeline's blind (α, σ²) noise fit had been a simplified global-Laplacian-MAD + synthetic α since an early rewrite — not the lower-envelope estimator the paper describes as shared with the RAW pipeline. The simplification was never recorded or validated; it shipped by mistake. v0.5.0 restores the canonical estimator across CPU, OpenCL and Vulkan, and corrects the record.

Highlights

  • Canonical envelope estimator for YUV: a single-plane variant of the RAW lower-envelope fit (16×16 block stats, exact rank-n/2 Laplacian medians, 32-bin p5–p20 lower envelope, Huber-WLS ×5, dark-pixel σ² refinement), one shared switch for every YUV route. Legacy MAD stays available as GALOSH_YUV_NOISE_EST=mad (output-identical to v0.4.0).
  • Validated twice: ablation (54 cells × 8 lanes) = +0.39 dB / −0.056 LPIPS vs MAD, beating even oracle variance-fit injection; full bench rerun (1,656 cells) = AWGN-420 +1.19 dB, PG +0.11–0.24 dB, CRVD +0.32/+0.36 dB, LPIPS improves on all 32 track × variant rows. CRVD-444 ISO25600 vs σ-oracle BM3D widens from +3.2 to +3.9 dB.
  • Two v0.4.0 GPU bugs fixed (found by the parity work): the 420 re-encode adapter's [0,1] clip destroyed sub-black/super-white noise excursions (dark-frame blind σ collapsed 0.0266 → 0.0142 → chroma under-denoise), and the OpenCL 420 chroma lane was missing the noise-adaptive LOESS radius.
  • Three-engine parity on Intel Arc A310 / RTX 4070 Ti / AMD gfx1036 (estimates bit-near ≤0.3 %; the degenerate→MAD fallback fires identically; Vulkan resolves it on-device to keep zero mid-frame readbacks). 4K fit: OpenCL −6 ms, Vulkan +6 ms; hold frames untouched — every v0.4.0 video speed number stands. RAW pipelines completely unchanged.

Downloads

  • GALOSH_YUV_win64.zip — sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt with the envelope estimator; README now documents the measured strength guidance (-l 0.7 for light-to-moderate noise, default 1.0 for high-ISO).
  • GALOSH_RAW_win64.zip — DNG in → denoised DNG out (unchanged from v0.3.0).

SHA256:

f04cea42368bb9bd633b149ab5541b1ab3d373f59eabb54ed94ea55d53c85fb3  GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573  GALOSH_RAW_win64.zip

See CHANGELOG.md for the complete list.

GALOSH v0.4.0 — GALOSH-420: planar YCbCr containers + Vulkan YUV engine

Choose a tag to compare

@luxgrain luxgrain released this 11 Jul 07:36

GALOSH-420: planar YCbCr video containers + a Vulkan YUV engine with real-time 4K.

Highlights

  • GALOSH-420 planar front-end on all three backends (CPU / OpenCL / Vulkan): feed 4:2:0 / 4:2:2 / 4:4:4 / 4:0:0 integer containers directly — --pix --depth=8..16 --range=full|limited --matrix=bt601|bt709|bt2020|custom:Kr,Kb --eotf=srgb|g22|g24|bt709|hlg|pq|linear --siting=center|left|topleft — format-preserving in/out. DVD, Blu-ray, HDR10 (PQ 10-bit top-left), HLG and JPEG profiles covered. One shared header (standalone/galosh_yuv420.h) serves every backend, so flag vocabulary and chroma-siting phases cannot drift.
  • Design locked by experiment (SIDD 80 scenes × 3 sitings × 2 matrices): chroma is denoised at its native half-resolution lattice with a siting-phased downsampled-luma guide — beats upsample-to-444-first by +0.3–0.5 dB Cb/Cr at ~4× lower chroma cost. Siting itself does not affect denoise quality; only a guide-phase mismatch costs (−0.13/−0.19 dB), and the phase-matched guide is machine-verified by a built-in affine-field selftest (--selftest-phase). Spec: docs/yuv420_frontend_spec.md.
  • New Vulkan YUV engine (standalone/vk/galosh_yuv_vk.exe): FP16 inter-phase storage, zero mid-frame readbacks, watchdog-safe banded submissions; the heavy shrinkage / inverse-LUT shaders are shared verbatim with the raw engine. Parity 67.3 dB vs the CPU FP32 reference on NVIDIA / Arc / AMD iGPU, 95 dB cross-GPU agreement.
  • Video amortization ported to YUV: --noise=hold|every:N + state file + 32 KB LUT sidecar. A held frame skips both exact-median noise estimators and is bit-identical to a fit frame for the same model.

Measured speed (GPU time, ms (fps), fit → hold)

GPU Mode 1080p 4K 8K
NVIDIA RTX 4070 Ti 444 38.2 → 2.7 (376) 50.4 → 11.0 (91) 98.3 → 45.1 (22.2)
420 54.4 → 2.6 (391) 130 → 10.2 (98) 316 → 105 (9.5)
Intel Arc A310 444 139 → 34.7 (28.8) 258 → 149 (6.7) 754 → 625 (1.6)
420 196 → 37.5 (26.7) 416 → 158 (6.3) 857 → 609 (1.6)
AMD Radeon iGPU 444 244 → 124 (8.1) 593 → 499 (2.0) 2116 → 1996 (0.5)
420 252 → 118 (8.5) 732 → 470 (2.1) 2123 → 1881 (0.5)

4:2:0 video steady state clears 4K60 with headroom on the 4070 Ti (98 fps) in the quality configuration. OpenCL (kept as the FP32 portable reference, same --pix front-end): NVIDIA 4K 444 = 79 ms — Vulkan is 1.6× faster fitting and ~7× at video steady state.

Downloads

  • GALOSH_YUV_win64.zip — sRGB PNG in → denoised PNG out (drag & drop or CLI). Rebuilt with the v0.4.0 engine (the bundled CLI exe also accepts the new --pix planar container flags).
  • GALOSH_RAW_win64.zip — DNG in → denoised DNG out (unchanged from v0.3.0).

SHA256:

e6aee6c7062b3c18e7d3d12d2f387a0a4f28d74815ca72e758eebeb5ff547e91  GALOSH_YUV_win64.zip
99730d51aae71bcb5d3e08f480a03f9874b31a39c4844d788149c177ba2a2573  GALOSH_RAW_win64.zip

See CHANGELOG.md for the complete list.

GALOSH v0.3.0 — V2 engine: Vulkan compute, video modes, cross-vendor GPU

Choose a tag to compare

@luxgrain luxgrain released this 10 Jul 20:11

V2 engine release: Vulkan compute port, video modes, and cross-vendor GPU support.

Highlights

  • New Vulkan compute port (standalone/vk/): the full raw pipeline as one vendor-agnostic shader set — verified on NVIDIA RTX 4070 Ti, Intel Arc A310 and an AMD Radeon iGPU at 69.7–70.6 dB vs the CPU FP32 reference, with FP16 inter-phase storage, Windows-watchdog-safe banded execution at any resolution, and a subgroup-cooperative 8×8 WHT kernel that makes the quality configuration 4–18× faster than a literal port.
  • Video modes: --noise=hold|every:N|ema:B amortizes the blind noise fit across frames (held frames bit-identical to fit frames); --wht=4 / --upsample=fast speed options with measured per-flag quality labels (standalone/README.md).
  • OpenCL is now cross-vendor too: FP64 eliminated (compensated FP32) so the kernels build on Intel Arc, and a silent AMD workgroup-size failure was root-caused and fixed — all three GPUs now match the CPU reference at 70.55 dB. OpenCL remains the portable reference; Vulkan is the performance path.

Measured speed (full pipeline, ms (fps))

quality = 8×8 WHT + jinc (paper configuration), fast = --wht=4 --upsample=fast. hold = video steady state; fit = fully blind on every frame.

GPU Res quality hold fast hold quality fit OpenCL quality fit VK/CL
NVIDIA RTX 4070 Ti 1080p 2.81 (356) 1.33 (752) 4.17 (240) 11.8 (85) 2.8×
4K 10.9 (91.7) 4.63 (216) 14.9 (67.0) 39.3 (25) 2.6×
8K 44.4 (22.5) 18.7 (53.4) 59.4 (16.8) 150 (6.7) 2.5×
Intel Arc A310 1080p 34.3 (29.2) 12.1 (82.5) 39.4 (25.4) 748 (1.3) 19×
4K 142 (7.0) 50.3 (19.9) 158 (6.3) 2858 (0.3) 18×
8K 585 (1.7) 214 (4.7) 654 (1.5)
AMD Radeon iGPU 1080p 110 (9.1) 41.0 (24.4) 121 (8.3) 256 (3.9) 2.1×
4K 446 (2.2) 170 (5.9) 487 (2.1) 1029 (1.0) 2.1×
8K 1821 (0.5) 716 (1.4) 1982 (0.5)

The quality configuration clears 4K60 on the 4070 Ti (91.7 fps hold, 67 fps fully-blind per-frame). OpenCL 8K on the two slower GPUs is not run (single kernels exceed the ~2 s Windows GPU watchdog; the banding mitigation is Vulkan-host-only). Full table with the intermediate option columns is in the README.

Downloads

  • GALOSH_RAW_win64.zip — DNG in → denoised DNG out (drag & drop or CLI). Rebuilt: --gpu (OpenCL) now works on NVIDIA / Intel Arc / AMD; --wht 4 / --upsample fast wrapper flags included.
  • GALOSH_YUV_win64.zip — sRGB PNG in → denoised PNG out (unchanged from v0.2.0, CPU engine).

See CHANGELOG.md for the complete list.

GALOSH v0.2.0 — Windows standalone denoisers (RAW DNG / sRGB PNG)

Choose a tag to compare

@luxgrain luxgrain released this 08 Jul 21:42

Standalone Windows builds of the GALOSH blind, training-free denoiser — no installation, no Python, no noise profiles. Drag & drop your files onto the exe.

日本語の使い方は各 ZIP 内の README_ja.txt にあります。

Downloads

ZIP Input → Output Size
GALOSH_RAW_win64.zip DNG → denoised DNG 83 MB
GALOSH_YUV_win64.zip sRGB PNG → denoised PNG 39 MB

Usage

  • Drag & drop DNG/PNG files onto galosh_raw.exe / galosh_yuv.exe (defaults l=1 c=1), or:
galosh_raw.exe -l 0.8 -c 1.2 photo.dng
galosh_raw.exe --gpu photo.dng          (OpenCL fast path)
galosh_yuv.exe -l 1 -c 1.2 photo.png
  • Output is written next to the original as <name>_GALOSH_l<L>_c<C>.dng/.png; the original is never modified.
  • -l = luminance strength (lower to keep grain), -c = chrominance strength (raise if color blotches remain).

Highlights

  • Fully blind: per-image Poisson–Gaussian noise fit — no noise profile, no training data, any camera.
  • Any 2×2 Bayer CFA DNG (RGGB/GRBG/GBRG/BGGR); convert native raws (NEF/CR3/ARW…) to DNG first. X-Trans / monochrome / linear DNGs are rejected with a clear error.
  • Metadata fully copied from the original via bundled ExifTool — EXIF, GPS, MakerNotes, XMP, ICC, and the DNG color-calibration tags (ColorMatrix1/2, dual-illuminant calibration, AsShotNeutral, lens opcodes), so raw converters render the same colors as the original. Deliberately not copied: NoiseProfile (no longer true after denoising) and LinearizationTable (output is already linearized).
  • PNG: RGB / RGBA / grayscale, alpha preserved untouched; 16-bit inputs are processed at 8-bit precision (with a notice).

SHA256

c6e6192f6f46837611f5c54221d2cef84261e853528ad658fb18eca235642b30  GALOSH_RAW_win64.zip
c91bcdc72d6d5b4db34d2c3ab3bb630316d7e0f83cefe04047c51783de482b6a  GALOSH_YUV_win64.zip

Links

GALOSH is Apache-2.0; bundled third-party components are listed in THIRD_PARTY_LICENSES.txt inside each ZIP.

GALOSH v0.1.0 — first public release

Choose a tag to compare

@luxgrain luxgrain released this 04 Jul 05:31

Blind, training-free denoising of raw Bayer and sRGB/YUV images by parallel-friendly local shrinkage.

Paper: arXiv:2607.03768 · Interactive comparison viewer · Zenodo DOI 10.5281/zenodo.21187219

  • Canonical standalone implementation: CPU FP32 / CPU INT32 (Q11.20 fixed-point) / GPU FP32 (OpenCL) / GPU INT16 streaming
  • Full benchmark harness: SIDD Medium + RawNIND, raw and sRGB domains, all-blind protocol
  • Manuscript PDFs attached (English + Japanese translation)

Licenses: code Apache-2.0, paper CC BY 4.0. See CHANGELOG.md for details.