Skip to content

jarmak-personal/weft

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Weft

An adaptive-basis image codec. Weft encodes an image by picking the best representation from a small library of bases, per tile and per image — primitive stacks, bicubic patches, color palettes, gradient fields, and DCT frequency residuals. For each image the encoder runs a rate-distortion tournament over the candidates and writes only the winner.

This is a tech-exploration repo, not a production codec. The measurements below are real; the engineering is not production-grade. Expect rough edges.

What it does well

On the committed 14-fixture test corpus (see scripts/whitepaper_bench.py for the reproduction), Weft at quality 75 wins 10/14 vs JPEG and 11/14 vs WebP at iso-bytes, averaging +11.6 dB vs JPEG and +5.8 dB vs WebP. Across all fixtures Weft uses 243 KB total; PNG-lossless uses 1260 KB and WebP-lossless uses 850 KB on the same corpus. The most striking wins are on structured / mixed content where classical DCT codecs plateau:

  • Natural photos (landscape, cartoon-family, baseball): primitive stack + DCT residual beats JPEG by 3–6 dB at the same byte budget
  • Pixel art and diagrams: palette basis wins at ~10× smaller bytes than PNG
  • Synthetic rendered scenes: primitive stack wins decisively (single-digit KB for crisp reconstruction)
  • Smooth analytic content: bicubic basis wins PSNR/byte against everything including WebP-lossless

What it doesn't do

  • Decode is not faster than libjpeg. Weft's CPU decoder is roughly 2–10× slower than libjpeg-turbo at the same output size. The primitive walk is analytic but has real constant overhead per tile. An experimental CUDA decode kernel exists (src/weft/gpu_render.py) and is correct, but per-call GPU memory overhead dominates at practical scales, so it's not actually faster than CPU either.
  • The "crisp at any scale" property is real but commodity. Weft's primitive bases render analytically at any target resolution, but for hard-edge content PNG + nearest-neighbor upscale delivers the same edge sharpness for smaller bytes. The exception is smooth analytic content where Weft's bicubic path genuinely wins.
  • No perceptual / neural components. This is a classical codec. Modern neural codecs (and ESRGAN-style upscalers) will beat Weft on natural texture reconstruction at scale.

Core idea

For each tile (adaptive quadtree, variable sizes) the encoder fits every candidate basis:

Basis Best for Bitstream block
Primitive stack Mixed content; analytic shapes PRIM
Per-tile bicubic patch Smooth gradients PRIM (as PRIM_BICUBIC)
Full-image bicubic Entirely smooth images BIC
Palette + labels Hard-edge pixel art / screenshots PAL
Gradient field (Poisson solve) Large flat regions with sharp edges GRD
DCT residual (additive) Everything above + natural texture fidelity DCT

Auto-select runs all candidates, scores by PSNR − λ · BPP, keeps the winner. Lambda scales with the quality knob so quality=90 actually means "spend bytes for quality".

The decoder reads the block directory and dispatches to the renderer matching the bases present in the bitstream.

Install

pip install -e .

Optional GPU extras (used by the encoder's tile-fit scoring kernel; degrades to CPU automatically if missing):

pip install -e .[gpu]

CLI

# Encode with auto-select (recommended)
weft encode input.png output.weft --quality 75

# Decode
weft decode output.weft decoded.png

# Decode at a different resolution (analytic bases render crisply at any scale)
weft decode output.weft upscaled.png --width 1920 --height 1080

# Benchmark against a fixture set
weft bench ./dataset report.json --quality 75

Python API

from weft.api import encode_image
from weft.decoder import decode_image, decode_to_array
from weft.types import EncodeConfig

cfg = EncodeConfig(
    quality=75,
    feature_flags={"auto_select": True},
)
report = encode_image("input.png", "output.weft", cfg)
print(f"{report.bytes_written} bytes, variant={report.metadata['auto_selected_variant']}")

# Decode to a file
decode_image("output.weft", "decoded.png")

# Or decode directly to a NumPy array (linear RGB float32)
array = decode_to_array("output.weft", width=1920, height=1080)

Read more

  • Project sitedocs/index.html is a GitHub Pages landing page with interactive image-comparison sliders for all 14 fixtures. To preview locally: cd docs && python -m http.server 8000 then open http://localhost:8000/. To deploy: enable GitHub Pages in the repo settings and point it at /docs on main.
  • docs/WEFT_WHITEPAPER.md — full technical whitepaper: core idea, bases catalog, auto-select algorithm, benchmark methodology + results, honest limitations, future directions
  • docs/WEFT_SPEC.md — bitstream format specification (current v1.4)
  • docs/EXPERIMENTS.md — experiment harness CLI reference
  • scripts/whitepaper_bench.py — one-command reproduction of the whitepaper numbers (no external datasets required)
  • scripts/generate_site_assets.py — rebuilds the comparison PNGs + JSON the site loads

Repo layout

src/weft/              Codec source (encoder, decoder, CLI, bases, GPU helpers)
src/weft/kernels/      NVRTC-compiled CUDA sources
tests/                 pytest suite (122 tests — bitstream, encoder, decoder, bases)
docs/WEFT_SPEC.md      Bitstream format specification
docs/WEFT_WHITEPAPER.md   Technical whitepaper
samples/inputs/        Committed test corpus (deterministic generators)
scripts/whitepaper_bench.py   Benchmark reproduction script

Naming

The codec was originally called RTIC ("Ray Traced Image Codec") when the decoder used OptiX to render primitives on GPU ray-tracing cores. That path was removed; "ray traced" stopped being true long before the name got updated. The new name comes from weaving: each tile picks a different weft — a different thread — and the tiles together form the fabric of the image. Optional backronym: Weighted Encoding of Frequency Tiles.

Status

Active tech exploration. Not recommended for production use. Bitstream format may break between minor versions without notice.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors