Download README.md from MuskAI/LTF-Demo: direct link, hf CLI and curl.
- Browser
- Download file 5.58 kB
-
https://huggingface.co/spaces/MuskAI/LTF-Demo/resolve/main/README.md
- Command line
-
hf download hf://spaces/MuskAI/LTF-Demo/README.md
-
curl -L -o README.md https://huggingface.co/spaces/MuskAI/LTF-Demo/resolve/main/README.md
title: LTF Image Detector
emoji: 🔎
colorFrom: blue
colorTo: indigo
sdk: gradio
language: en
sdk_version: 6.31.0
python_version: '3.11'
app_file: app.py
pinned: false
short_description: Test LTF on your original image files
LTF online demo
Upload an original image file to obtain real / AI-generated scores. The model uses the original RGB image and its full set of 224-pixel tiles; it does not resize the entire input to a fixed resolution before inference. The preview is reduced for display only. Fusion at threshold 0.5 is the default.
This custom PyTorch model uses frozen CLIP ViT-L/14, two-level MIL, cross-shuffle during training, and gated fusion. The published checkpoint is epoch 20 from the historical GenImage run, whose logged macro accuracy is 98.39%. These are historical results, not an accuracy guarantee for uploaded images. Scores are model outputs and are not calibrated authenticity probabilities.
Configuration
Space variables (Settings → Variables and secrets):
| Variable | Meaning | Default |
|---|---|---|
LTF_MODEL_REPO |
Model repository containing runtime and weights | Required on Hub |
LTF_MODEL_REVISION |
Model commit SHA | main; deployment pins a commit |
LTF_MODEL_DIR |
Local model folder, for offline testing | Unset |
LTF_DEVICE |
auto, cpu, or cuda:0 |
auto |
LTF_CHUNK_SIZE |
Number of CLIP views per forward chunk | 8 |
LTF_CPU_THREADS |
PyTorch CPU threads | 2 |
LTF_MAX_PIXELS |
Largest accepted image, in pixels | 16000000 |
LTF_MAX_VIEWS |
Largest accepted count of local tiles + global view | 400 |
Oversized images are rejected explicitly; their pixels or tiles are not silently removed. Gradio queues one inference at a time. Original image paths and tokens are not returned in prediction JSON. Uploaded files use Gradio temporary storage with periodic cleanup; they are not added to either repository.
The runtime downloads the model at the configured revision, verifies its asset and source hashes, and then loads it once. No training runs on the Space.
For a private model repository, set an appropriately scoped read token as
the Space secret HF_TOKEN. Do not put tokens in app.py or README.md.
Local run
Use Python 3.11 and install requirements.txt. From this directory:
LTF_MODEL_DIR=../model_repo python app.py
The web UI and its predict API both call the same original-file inference path.
Attention and tile inspection
The Analyze button additionally requests the model's existing return_viz
outputs during the same forward pass. Temporary observation hooks collect the
eight L1 across-tile aggregation heads. No model parameters are changed.
- Exact, numbered local crop boxes, including edge-aligned overlap and small-image padding.
- L1 tile-attention overlay: mean or any of the eight aggregation heads.
- L2 local-view overlay with the global-view attention weight listed separately.
- Four ranked local crop cards; clicking a card selects its patch inspector.
- Side-by-side original crop, patch overlay and interactive 16×16 weight matrix.
- Large score card and branch comparison, plus per-view attention ranking charts.
- Responsive desktop/mobile layout; replacing an image clears previous analysis.
- A tile selector for inspecting any local tile without rerunning inference.
- Exact view-weight table, embedding fusion gate and read-only model/inference parameters.
- Historical training settings from the original saved configuration, explicitly labeled Training only.
Colors use a fixed log2 scale relative to uniform attention (weight × N):
0.25×, 0.5×, 1×, 2× and 4×. Neutral gray represents the uniform reference;
blue is below and orange-red above that reference. Small differences are not
stretched into strong colors. L2 uses the count of all views, including Global,
for its reference. Overlap uses mean tile weight. Raw weights are available in
the ranking charts, weight table and prediction JSON. A displayed percentage is
an attention share, not a calibrated class probability.
These are model attention values, not pixel-level forgery probabilities or
causal explanations. The eight selectable heads belong to the L1 across-tile
aggregator; L1 patch pooling and L2 view pooling use gated MIL attention.
The original five-output predict API is preserved. The new explain API
returns prediction results plus visualization images, tables and attention metadata.
Changing a head or inspected tile uses per-session cached data, retained for up
to an hour. Changing the decision branch or threshold updates the result from
the cached scores. Uploading a new image clears previous results. The unchanged
checkpoint is used for both endpoints.
Clickable GenImage examples
The gallery includes four real and four generated validation images. Click an
image to run the same prediction and attention analysis as an uploaded file.
Captions show dataset labels, separately from model predictions. Original files,
source paths and checksums are recorded in examples/manifest.json; attribution
is in examples/SOURCE.md.
Tiling policy
Full 224×224 blocks are taken without overlap. If pixels remain at the right or bottom, a final block is aligned to that boundary; only boundary blocks may overlap. For width 500, horizontal starts are 0, 224, 276. The global view is separate. This corrects earlier uniformly overlapping tiling; weights are unchanged, but predictions can change. Historical benchmark results have not been recomputed with this preprocessing.