faces.md §12.3 measured what the cheapest detector costs: the small faces in every group shot, and a dog embedded a dozen times. Which trade is right depends on the machine doing the sweep — a desktop left overnight and a tablet on a battery want different answers — so the detector is now a per-device setting, Fast / Balanced / Thorough on the settings page beside the indexing button, persisted with the rest of the settings file. A detector is half of a model id. Every face, marker, shard and calibration is keyed on faces.model_id precisely so that a model change is a new id and a re-index rather than a silent change under existing data, and a detector change is a model change: it decides which faces exist and where the landmarks that align them land. So each choice names its own pipeline. 500M keeps the bare "w600k_mbf" every existing library was written under, so an upgrade disturbs nothing; the others are qualified. Choosing one restarts coverage from zero under the new id, the sweep re-detects, confirmed names carry across by box overlap, and the sync shards are keyed by the same id so a peer on another setting neither adopts nor pollutes them. The library controller carries the id into the sync the same way it carries the cache budget, because the sync starts from places that have no settings in reach. All three shape-fixed exports ship — APK, Arch, Flatpak — since a tablet has no other way to obtain the one it was not installed with; the APK grows by twenty megabytes for the choice.
92 lines
4.4 KiB
Bash
92 lines
4.4 KiB
Bash
# Maintainer: Duncan Tourolle <duncan@tourolle.paris>
|
|
#
|
|
# Builds from the local checkout rather than a release tarball, which is what
|
|
# makes `makepkg -si` in this directory install what you are actually working
|
|
# on. Swap `source` for a tagged tarball when there is something to release.
|
|
pkgname=darkroom
|
|
pkgver=0.12.0
|
|
# Back to 1 with the version: a new pkgver is a new archive name, so there is
|
|
# nothing for makepkg to reuse and nothing for a release number to disambiguate.
|
|
pkgrel=1
|
|
pkgdesc="Non-destructive RAW photo library and editor"
|
|
arch=('x86_64')
|
|
url="https://gitea.tourolle.paris/dtourolle/DarkRoom"
|
|
license=('GPL-3.0-or-later')
|
|
# Runtime: Vulkan for wgpu, and a Secret Service implementation for the
|
|
# Nextcloud credentials (FR-NC-2) — gnome-keyring or kwallet both provide it.
|
|
depends=('vulkan-icd-loader' 'fontconfig' 'libxkbcommon')
|
|
makedepends=('cargo' 'git')
|
|
optdepends=('gnome-keyring: store Nextcloud credentials'
|
|
'kwallet: store Nextcloud credentials')
|
|
options=('!lto') # the workspace sets its own LTO in Cargo.toml
|
|
|
|
_repo="$(cd "${startdir}/.." && pwd)"
|
|
|
|
build() {
|
|
cd "${_repo}"
|
|
export RUSTUP_TOOLCHAIN=stable
|
|
export CARGO_TARGET_DIR="${_repo}/target"
|
|
cargo build --release --locked -p darkroom-desktop
|
|
}
|
|
|
|
package() {
|
|
cd "${_repo}"
|
|
install -Dm755 "target/release/darkroom-desktop" \
|
|
"${pkgdir}/usr/bin/darkroom-desktop"
|
|
|
|
install -Dm644 "packaging/paris.tourolle.darkroom.desktop" \
|
|
"${pkgdir}/usr/share/applications/paris.tourolle.darkroom.desktop"
|
|
|
|
# The same AppStream file the Flatpak installs, so a software centre
|
|
# describes the two packages identically instead of falling back to the
|
|
# desktop entry's one-line Comment for this one. Installed here rather than
|
|
# written twice: the description, the licence fields and the OARS rating
|
|
# are facts about the application, not about how it was packaged.
|
|
install -Dm644 "packaging/paris.tourolle.darkroom.metainfo.xml" \
|
|
"${pkgdir}/usr/share/metainfo/paris.tourolle.darkroom.metainfo.xml"
|
|
|
|
# The icon's *name* is the contract, not its path: the desktop entry says
|
|
# `Icon=paris.tourolle.darkroom` and the compositor resolves that through
|
|
# the hicolor theme. Installed under 256x256 because that is the source's
|
|
# actual size — lying about it makes scaled-down icons look wrong.
|
|
install -Dm644 "ui/dr-ui/ui/app-icon.png" \
|
|
"${pkgdir}/usr/share/icons/hicolor/256x256/apps/paris.tourolle.darkroom.png"
|
|
|
|
install -Dm644 "README.md" "${pkgdir}/usr/share/doc/${pkgname}/README.md"
|
|
|
|
# The face models, into the last directory the app searches. A pair the
|
|
# user placed in their own data directory outranks these, so installing
|
|
# them cannot override a deliberate choice of weights.
|
|
#
|
|
# These live in LFS; a checkout without `git lfs pull` has ~130-byte
|
|
# pointers here. Installing one produces a package whose face indexing
|
|
# fails inside the graph loader on the user's machine, so refuse instead.
|
|
for _m in scrfd_500m_640.onnx scrfd_2.5g_640.onnx scrfd_10g_640.onnx arcface_mbf_b1.onnx; do
|
|
_src="models/face/${_m}"
|
|
if [[ "$(stat -c%s "${_src}")" -lt 100000 ]]; then
|
|
echo "error: ${_m} is an LFS pointer, not a model — run: git lfs pull" >&2
|
|
return 1
|
|
fi
|
|
install -Dm644 "${_src}" "${pkgdir}/usr/share/darkroom/models/${_m}"
|
|
done
|
|
|
|
# The scene model, for the per-category grades. Unlike the face weights
|
|
# this one is in the repository — AGPL, and GPLv3 §13 permits the
|
|
# combination (models/LICENCE.md) — so it is installed unconditionally and
|
|
# a pointer here is a broken checkout rather than a licence decision.
|
|
#
|
|
# Three files: the graph, its vocabulary, and the category descriptor
|
|
# grouping ADE20K's 150 classes into what the tab shows. All three, because
|
|
# dr_ui::library::scene_model reports the tab unavailable without any one
|
|
# of them. Only the graph gets the pointer check — the other two are
|
|
# legitimately a few kilobytes.
|
|
_src="models/scene/yolo26s-sem-ade20k.onnx"
|
|
if [[ "$(stat -c%s "${_src}")" -lt 100000 ]]; then
|
|
echo "error: the scene model is an LFS pointer — run: git lfs pull" >&2
|
|
return 1
|
|
fi
|
|
for _m in yolo26s-sem-ade20k.onnx yolo26s-sem-ade20k.classes.json categories.txt; do
|
|
install -Dm644 "models/scene/${_m}" "${pkgdir}/usr/share/darkroom/models/${_m}"
|
|
done
|
|
}
|