Files
DarkRoom/models/LICENCE.md
T
dtourolle 84fade99ec Put the developer docs under docs/dev and index the folder for users first
docs/ had 26 developer documents flat beside the manual, and the two
audiences are very differently sized: most readers want the manual and
the gesture reference, a few want the register, the designs and the
measurements. The manual and gestures.md stay at the top; everything for
someone changing the code moves to docs/dev/, and the two documents that
name their own successors — the v0.1 milestone and the UI-refinement plan
— go to docs/dev/archive/ rather than being deleted, since both are still
cited. docs/README.md is the index, users first.

Every reference follows: code comments, Cargo manifests, the workflows,
the pre-commit hook, the bench and traceability tools (which locate the
repo root by docs/dev/requirements.md now), packaging, the Docker READMEs,
CLAUDE.md, CONTRIBUTING.md and the README. The matrix links one level
deeper and is regenerated. Links out of the moved documents into the tree
gain a level; a link checker over every Markdown file finds none broken.
2026-09-20 21:16:03 +02:00

6.9 KiB
Raw Permalink Blame History

Model weights — licensing

Two Ultralytics checkpoints ship here, both exported by tools/export-seg-model.sh, each with its class vocabulary written out by the same script:

File Checkpoint Trained on Used by
segment/yolo26n-seg.onnx yolo26n-seg.pt COCO, 80 thing classes local adjustments, subject selection
scene/yolo26s-sem-ade20k.onnx yolo26s-sem-ade20k.pt ADE20K, 150 classes the scene tab's per-category grades

Both come from https://huggingface.co/Ultralytics/YOLO26. The face weights in face/ are a separate matter with a separate grant — see face/README.md. The keypoint weights in keypoints/ and the border filler in inpaint/ are the other two, and the easiest — see the last two sections.

The grant

Ultralytics releases YOLO under AGPL-3.0, and the weights carry the same grant as the framework — the HuggingFace repository declares agpl-3.0 for the checkpoints themselves, not merely for the training code. A commercial licence is offered separately; DarkRoom does not use it and does not need it.

What that means for DarkRoom

DarkRoom is GPL-3.0-or-later. GPLv3 §13 explicitly permits combination with AGPL-3.0 code, so redistributing these weights inside this repository is allowed — this is not the situation the InsightFace "buffalo" weights would have created, where a non-commercial research grant is simply incompatible with the project's licence and with F-Droid, Flatpak and Play distribution (NFR-COMPAT-2, D13).

The consequence, and it is a real one: the combined work is effectively AGPL-3.0. §13's permission runs one way — the AGPL's §13 network-use condition attaches to the portion under that licence. For a local-first desktop and Android photo editor that condition has no practical bite, because there is no network service offering the combined work to remote users. It would acquire bite the moment any hosted or server-side rendering appeared, and that is the thing to remember rather than rediscover.

This was decided deliberately (D14), not arrived at by accident, and docs/dev/segmentation.md §7 records the reasoning.

Class vocabulary — a caveat worth reading

docs/dev/segmentation.md §4 specified YOLO pretrained on ADE20K, whose 150 classes include the stuff categories that matter most in photography — sky, vegetation, water, wall, mountain.

This was true when written and is not any more. Checked 2026-08-21, no YOLO/ADE20K combination existed: Ultralytics shipped YOLO26-seg on COCO only, and the one HuggingFace repository claiming otherwise (laxmacl/yolov8-ade20k) was empty. Re-checked 2026-08-30: Ultralytics now ships a semantic task with ADE20K checkpoints (https://docs.ultralytics.com/tasks/semantic), and yolo26s-sem-ade20k is what scene/ holds.

So the two vocabularies divide the work rather than compete:

  • segment/, COCO, 80 things. Separates instances — clicking one of three people selects that person. This is what local adjustments need, and a semantic model cannot do it: it would return one "person" region covering all three.
  • scene/, ADE20K, 150 classes. Labels every pixel, including the stuff COCO has no word for — sky, vegetation, water, mountain, wall. This is what the scene tab's per-category grades need, and it does not care that instances are merged, because a per-category grade applies to the whole category.

Neither replaces the other. Keeping both is the deliberate choice.

The loader treats each vocabulary as model metadata rather than compiled-in knowledge, which is what made adding the second model a file plus a descriptor rather than a code change — as this document predicted it would be.

keypoints/ — XFeat, Apache-2.0

File Source Trained on Used by
keypoints/xfeat-1024.onnx weights/xfeat.pt from https://github.com/verlab/accelerated_features MegaDepth + synthetic warps, by the authors panorama alignment (FR-MRG-8), landscape frames
keypoints/xfeat-768.onnx the same weights — the same, portrait frames

Exported by tools/export-xfeat.sh at fixed grayscale inputs of 1024×768 and 768×1024 — the same weights twice, because tract needs a static shape and a portrait frame in a landscape input wastes half of it. Only the convolutional network is in each file; the keypoint decoding is Rust.

The repository and its weights are Apache-2.0, read on 2026-09-19 from the LICENSE at its root, with no separate grant on the checkpoint and no non-commercial clause anywhere in the tree. Apache-2.0 is GPLv3-compatible one way — code and weights under it may be combined into a GPLv3 work — so this is neither the InsightFace situation (D13, a use restriction that binds every user) nor the Ultralytics one (D14, where the combined work becomes AGPL). It is the licence position this document would have wanted for every model in it, and it was chosen over stronger detectors partly for that reason: SuperPoint and SuperGlue are non-commercial, R2D2 and SiLK are CC BY-NC.

The training data is the authors' concern, not a licence on the weights: XFeat trains on MegaDepth, which is itself a research dataset, but the weights are released under the repository's licence without a data-derived restriction — unlike the gaze models §7 of the requirements declined, where the dataset licence restricts models trained on it by name.

inpaint/ — MI-GAN, MIT

File Source Trained on Used by
inpaint/migan-512.onnx migan_512_places2.pt from https://github.com/Picsart-AI-Research/MI-GAN (Sargsyan et al., ICCV 2023), fine-tuned in the darkroom-infill repository (2026-09-20, second model that evening: trained against MI-GAN's own discriminator) Places2 by the authors, then ~7 400 of the maintainer's own photographs with border-shaped voids the panorama border fill (FR-MRG-4)

The bare 512 generator at a fixed 1×4×512×512, six operator types; the tiling, the context and the blend are Rust (dr_pano::fill). Since 2026-09-20 the shipped file is the fine-tune (docs/dev/panorama.md §14), exported by python -m infill.export in darkroom-infill; tools/export-migan.sh still produces the stock generator from the upstream checkpoint, which the fine-tune starts from. The fine-tuned weights are a derivative of the MIT weights trained on photographs the maintainer owns, and carry the same MIT grant.

MIT, code and weights alike — LICENSE and LICENSE-WEIGHTS in the repository, both read on 2026-09-19, both the plain MIT text with no further grant. GPL-compatible, store-compatible, nothing to read around: the cleanest position of any model here. The training set is Places2, a research dataset, but the weights are released under the repository's licence without a data-derived restriction (contrast the gaze models §7 of the requirements declined, and the InsightFace grant of D13).