diff --git a/README.md b/README.md index 9cdb925..3c2de64 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ Currently targets the ONNX backend. The pipeline is designed to support addition |-------------------------------------------------------------------------------|---------|-------------------------------------------------| | [`denoise-nafnet`](models/denoise-nafnet/README.md) | denoise | NAFNet denoiser trained on SIDD dataset | | [`denoise-nind`](models/denoise-nind/README.md) | denoise | UNet denoiser trained on NIND dataset | -| [`embed-openclip-vitb32`](models/embed-openclip-vitb32/README.md) | embed | OpenCLIP ViT-B/32 text/image embeddings | | [`mask-object-sam21-base-plus`](models/mask-object-sam21-base-plus/README.md) | mask | SAM 2.1 Hiera Base Plus for interactive masking | | [`mask-object-sam21-small`](models/mask-object-sam21-small/README.md) | mask | SAM 2.1 Hiera Small for interactive masking | | [`mask-object-sam21-tiny`](models/mask-object-sam21-tiny/README.md) | mask | SAM 2.1 Hiera Tiny for interactive masking | @@ -232,3 +231,9 @@ Each model directory must include a `README.md` documenting: | Reproducibility | Full pipeline | See existing model READMEs for examples. + +Wiki +---- + +* [GitHub wiki](https://github.com/darktable-org/darktable-ai/wiki "github wiki") +* [Developer wiki](https://github.com/darktable-org/darktable-ai/wiki/Developers-portal "darktable-ai developer wiki") diff --git a/models/embed-openclip-vitb32/.skip b/models/embed-openclip-vitb32/.skip deleted file mode 100644 index e69de29..0000000 diff --git a/models/embed-openclip-vitb32/README.md b/models/embed-openclip-vitb32/README.md deleted file mode 100644 index ce3c165..0000000 --- a/models/embed-openclip-vitb32/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# OpenCLIP ViT-B-32 - -Image embedding model for zero-shot tagging and perceptual similarity. -Uses contrastive language-image pre-training to produce 512-dimensional -embeddings that can be compared via cosine similarity. - -## Source - -- Repository: https://github.com/mlfoundations/open_clip -- Paper: [Reproducible scaling laws for contrastive language-image learning](https://arxiv.org/abs/2212.07143) (2023) -- Pretrained: `laion2b_s34b_b79k` (LAION-2B dataset) -- License: MIT - -## Architecture - -ViT-B-32 (Vision Transformer Base, 32x32 patches) — 12 transformer layers, -768 hidden dimension, 12 attention heads. Input image is split into 7x7 = 49 -patches of 32x32 pixels plus a CLS token. The CLS token output is projected -to 512 dimensions. - -## ONNX Model - -| Property | Value | -|-------------|-----------------------------------------| -| File | `model.onnx` | -| Input | `image` — float32 [1, 3, 224, 224] | -| Output | `embedding` — float32 [1, 512] | -| Resolution | Fixed 224x224 (resize + center crop) | -| Normalize | [0, 1] range (CLIP norm baked in) | - -## Notes - -- Input and output are both float32. -- Embeddings are L2-normalized — use dot product for cosine similarity. -- No tiling: the model requires fixed 224x224 input. -- Architecture is loaded via `open_clip` pip package (no repo clone needed). -- No checkpoints to download — `open_clip` fetches pretrained weights automatically during conversion. -- Output `tags.json` contains pre-computed text embeddings for ~80 photo tags. - -## Selection Criteria - -| Property | Value | -|--------------------------|---------------------------------------------------------------------------------------------------------| -| Model license | MIT | -| OSAID v1.0 | Open Source AI | -| MOF | Class II (Open Tooling) | -| Training data license | LAION-2B (CC-BY-4.0 metadata); images are web-crawled with mixed licenses | -| Training data provenance | LAION-2B: 2B image-text pairs from Common Crawl, filtered using CLIP for quality | -| Training code | [MIT](https://github.com/mlfoundations/open_clip) | -| Known limitations | Training images are web-crawled; individual image licenses are not verified | -| Published research | [Reproducible scaling laws for contrastive language-image learning](https://arxiv.org/abs/2212.07143) | -| Inference | Local only, no cloud dependencies | -| Scope | Image embedding for tagging and similarity (no generation or synthesis) | -| Reproducibility | Full pipeline (setup, convert, clean, demo) | diff --git a/models/embed-openclip-vitb32/convert.py b/models/embed-openclip-vitb32/convert.py deleted file mode 100644 index 2bdf760..0000000 --- a/models/embed-openclip-vitb32/convert.py +++ /dev/null @@ -1,267 +0,0 @@ -"""Export OpenCLIP ViT-B-32 image encoder to ONNX and pre-compute tag embeddings. - -Produces: - model.onnx — image encoder with baked-in CLIP normalization + L2 norm - tags.json — pre-computed text embeddings for 86 hierarchical photo tags - -Tag vocabulary is defined in tags.md (human-readable reference). -""" - -import argparse -import json -import os - -import numpy as np -import torch -import torch.nn as nn -import torch.nn.functional as F - -import open_clip - -# --------------------------------------------------------------------------- -# Tag vocabulary for zero-shot classification -# Hierarchical tags using "|" separator, matching darktable's tag system. -# Each entry is (tag, CLIP prompt). See tags.md for the human-readable list. -# --------------------------------------------------------------------------- - -TAG_VOCAB = [ - # genre (12) - ("genre|landscape", "landscape photography"), - ("genre|portrait", "portrait photography"), - ("genre|street", "street photography"), - ("genre|wildlife", "wildlife photography"), - ("genre|macro", "macro photography"), - ("genre|architecture", "architecture photography"), - ("genre|food", "food photography"), - ("genre|sports", "sports photography"), - ("genre|event", "event photography"), - ("genre|abstract", "abstract photography"), - ("genre|still life", "still life photography"), - ("genre|aerial", "aerial photography"), - # subject|people (6) - ("subject|people|person", "a photo of a person"), - ("subject|people|couple", "a photo of a couple"), - ("subject|people|group", "a photo of a group of people"), - ("subject|people|child", "a photo of a child"), - ("subject|people|baby", "a photo of a baby"), - ("subject|people|elderly person", "a photo of an elderly person"), - # subject|animal (8) - ("subject|animal|dog", "a photo of a dog"), - ("subject|animal|cat", "a photo of a cat"), - ("subject|animal|bird", "a photo of a bird"), - ("subject|animal|horse", "a photo of a horse"), - ("subject|animal|insect", "a photo of an insect"), - ("subject|animal|fish", "a photo of a fish"), - ("subject|animal|reptile", "a photo of a reptile"), - ("subject|animal|wild animal", "a photo of a wild animal"), - # subject|nature (10) - ("subject|nature|flower", "a photo of a flower"), - ("subject|nature|tree", "a photo of a tree"), - ("subject|nature|mountain", "a photo of a mountain"), - ("subject|nature|waterfall", "a photo of a waterfall"), - ("subject|nature|river", "a photo of a river"), - ("subject|nature|lake", "a photo of a lake"), - ("subject|nature|ocean", "a photo of the ocean"), - ("subject|nature|cloud", "a photo of clouds"), - ("subject|nature|rock", "a photo of rocks"), - ("subject|nature|field", "a photo of a field"), - # subject|vehicle (5) - ("subject|vehicle|car", "a photo of a car"), - ("subject|vehicle|bicycle", "a photo of a bicycle"), - ("subject|vehicle|boat", "a photo of a boat"), - ("subject|vehicle|train", "a photo of a train"), - ("subject|vehicle|airplane", "a photo of an airplane"), - # subject|structure (5) - ("subject|structure|building", "a photo of a building"), - ("subject|structure|bridge", "a photo of a bridge"), - ("subject|structure|tower", "a photo of a tower"), - ("subject|structure|statue", "a photo of a statue"), - ("subject|structure|ruin", "a photo of a ruin"), - # setting (8) - ("setting|indoor", "an indoor photograph"), - ("setting|outdoor", "an outdoor photograph"), - ("setting|urban", "a photo taken in an urban setting"), - ("setting|rural", "a photo taken in a rural setting"), - ("setting|beach", "a photo taken at a beach"), - ("setting|forest", "a photo taken in a forest"), - ("setting|desert", "a photo taken in a desert"), - ("setting|studio", "a studio photograph"), - # lighting (8) - ("lighting|sunrise", "a photo taken at sunrise"), - ("lighting|sunset", "a photo taken at sunset"), - ("lighting|golden hour", "a photo taken during golden hour"), - ("lighting|blue hour", "a photo taken during blue hour"), - ("lighting|night", "a photo taken at night"), - ("lighting|backlit", "a backlit photograph"), - ("lighting|silhouette", "a silhouette photograph"), - ("lighting|low light", "a low light photograph"), - # technique (8) - ("technique|black and white", "a black and white photograph"), - ("technique|long exposure", "a long exposure photograph"), - ("technique|bokeh", "a photograph with bokeh"), - ("technique|panorama", "a panoramic photograph"), - ("technique|close-up", "a close-up photograph"), - ("technique|wide angle", "a wide angle photograph"), - ("technique|motion blur", "a photograph with motion blur"), - ("technique|reflection", "a photograph with reflections"), - # mood (6) - ("mood|dramatic", "a dramatic photograph"), - ("mood|peaceful", "a peaceful photograph"), - ("mood|moody", "a moody photograph"), - ("mood|vibrant", "a vibrant photograph"), - ("mood|minimal", "a minimalist photograph"), - ("mood|chaotic", "a chaotic photograph"), - # weather (6) - ("weather|sunny", "a photo taken in sunny weather"), - ("weather|cloudy", "a photo taken in cloudy weather"), - ("weather|rainy", "a photo taken in rainy weather"), - ("weather|snowy", "a photo taken in snowy weather"), - ("weather|foggy", "a photo taken in foggy weather"), - ("weather|stormy", "a photo taken in stormy weather"), - # season (4) - ("season|spring", "a photo taken in spring"), - ("season|summer", "a photo taken in summer"), - ("season|autumn", "a photo taken in autumn"), - ("season|winter", "a photo taken in winter"), -] - - -# --------------------------------------------------------------------------- -# ONNX wrapper -# --------------------------------------------------------------------------- - -class ImageEncoderOnnx(nn.Module): - """Wraps OpenCLIP visual encoder for ONNX export. - - Bakes in CLIP-specific normalization and L2 normalization so the caller - only needs to provide [0, 1] float32 RGB input. - - Input: image — float32 [B, 3, 224, 224] in [0, 1] - Output: embedding — float32 [B, 512] L2-normalized - """ - - def __init__(self, model): - super().__init__() - self.visual = model.visual - self.register_buffer( - "mean", - torch.tensor([0.48145466, 0.4578275, 0.40821073]).view(1, 3, 1, 1), - ) - self.register_buffer( - "std", - torch.tensor([0.26862954, 0.26130258, 0.27577711]).view(1, 3, 1, 1), - ) - - @torch.no_grad() - def forward(self, image): - x = (image - self.mean) / self.std - features = self.visual(x) - features = F.normalize(features, dim=-1) - return features - - -# --------------------------------------------------------------------------- -# Export -# --------------------------------------------------------------------------- - -def export_image_encoder(model, output_path, opset): - """Export image encoder to ONNX.""" - encoder = ImageEncoderOnnx(model) - encoder.eval() - - dummy = torch.randn(1, 3, 224, 224) - - os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True) - - print(f"Exporting image encoder to {output_path}...") - # Use dynamo exporter — the legacy tracer cannot handle the fused - # aten::_native_multi_head_attention op used by torch >= 2.5. - onnx_program = torch.onnx.export( - encoder, - (dummy,), - dynamo=True, - ) - onnx_program.save(output_path) - - # Consolidate external data into a single ONNX file. - import onnx - external_data_path = output_path + ".data" - if os.path.isfile(external_data_path): - print("Consolidating external data into single file...") - onnx_model = onnx.load(output_path, load_external_data=True) - onnx.save(onnx_model, output_path) - os.remove(external_data_path) - else: - onnx_model = onnx.load(output_path) - - onnx.checker.check_model(onnx_model) - print("ONNX checker passed.") - - # Verify ONNX output matches PyTorch - import onnxruntime as ort - session = ort.InferenceSession(output_path, providers=["CPUExecutionProvider"]) - input_name = session.get_inputs()[0].name - ort_out = session.run(None, {input_name: dummy.numpy()})[0] - ref_out = encoder(dummy).numpy() - diff = np.abs(ort_out - ref_out).max() - print(f"ONNX vs PyTorch max diff: {diff:.6f}") - print(f"Output shape: {ort_out.shape}, norm: {np.linalg.norm(ort_out, axis=-1)}") - - -def generate_tags(model, tokenizer, output_path): - """Pre-compute text embeddings for photo tags.""" - tags = [tag for tag, _ in TAG_VOCAB] - prompts = [prompt for _, prompt in TAG_VOCAB] - tokens = tokenizer(prompts) - - with torch.no_grad(): - text_features = model.encode_text(tokens) - text_features = F.normalize(text_features, dim=-1) - - embeddings = text_features.cpu().numpy().tolist() - - data = {"tags": tags, "embeddings": embeddings} - with open(output_path, "w") as f: - json.dump(data, f, indent=2) - - print(f"Generated {len(tags)} tag embeddings → {output_path}") - - -# --------------------------------------------------------------------------- -# Main -# --------------------------------------------------------------------------- - -def convert(output, tags_output, opset=20): - """Entry point for programmatic conversion.""" - os.makedirs(os.path.dirname(output) or ".", exist_ok=True) - - print("Loading OpenCLIP ViT-B-32 (laion2b_s34b_b79k)...") - model, _, preprocess = open_clip.create_model_and_transforms( - "ViT-B-32", pretrained="laion2b_s34b_b79k" - ) - model.eval() - for param in model.parameters(): - param.requires_grad = False - - tokenizer = open_clip.get_tokenizer("ViT-B-32") - - export_image_encoder(model, output, opset) - generate_tags(model, tokenizer, tags_output) - - print("Done!") - - -def main(): - parser = argparse.ArgumentParser( - description="Export OpenCLIP ViT-B-32 image encoder to ONNX" - ) - parser.add_argument("--output", required=True, help="Output ONNX path") - parser.add_argument("--tags-output", required=True, help="Output tags.json path") - parser.add_argument("--opset", type=int, default=20, help="ONNX opset version") - args = parser.parse_args() - - convert(args.output, args.tags_output, args.opset) - - -if __name__ == "__main__": - main() diff --git a/models/embed-openclip-vitb32/demo.py b/models/embed-openclip-vitb32/demo.py deleted file mode 100644 index 75083fd..0000000 --- a/models/embed-openclip-vitb32/demo.py +++ /dev/null @@ -1,139 +0,0 @@ -"""Demo: compute image embedding and show top-5 zero-shot tags. - -Saves a PNG with the original image and top-5 tag predictions overlaid. -""" - -import argparse -import json -import os -import time - -import numpy as np -import onnxruntime as ort -from PIL import Image, ImageDraw, ImageFont, ImageOps - -IMAGE_SIZE = 224 - - -def preprocess(image): - """Resize shortest edge to 224, center crop, normalize to [0, 1] BCHW.""" - w, h = image.size - scale = IMAGE_SIZE / min(w, h) - new_w, new_h = int(w * scale + 0.5), int(h * scale + 0.5) - image = image.resize((new_w, new_h), Image.LANCZOS) - - left = (new_w - IMAGE_SIZE) // 2 - top = (new_h - IMAGE_SIZE) // 2 - image = image.crop((left, top, left + IMAGE_SIZE, top + IMAGE_SIZE)) - - arr = np.array(image).astype(np.float32) / 255.0 - arr = arr.transpose(2, 0, 1)[np.newaxis] # BCHW - return arr - - -def draw_tags(image, tags_scores): - """Draw top tags on the image and return the annotated image.""" - draw = ImageDraw.Draw(image) - w, h = image.size - font_size = max(16, min(w, h) // 25) - pad = max(4, font_size // 4) - try: - font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", font_size) - except (OSError, IOError): - try: - font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", font_size) - except (OSError, IOError): - font = ImageFont.load_default() - - y = pad * 2 - for tag, score in tags_scores: - text = f"{tag}: {score:.2f}" - bbox = draw.textbbox((0, 0), text, font=font) - tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1] - draw.rectangle( - [pad, y - pad // 2, pad * 2 + tw, y + th + pad // 2], - fill=(0, 0, 0, 180), - ) - draw.text((pad + pad // 2, y), text, fill=(255, 255, 255), font=font) - y += th + pad * 2 - - return image - - -def run_inference(model_path, image_path, output_path): - os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True) - - # Load tags - model_dir = os.path.dirname(model_path) - tags_path = os.path.join(model_dir, "tags.json") - if not os.path.isfile(tags_path): - print(f"Warning: tags.json not found at {tags_path}") - tags, tag_embeddings = [], None - else: - with open(tags_path) as f: - data = json.load(f) - tags = data["tags"] - tag_embeddings = np.array(data["embeddings"], dtype=np.float32) - - t0 = time.perf_counter() - - # Load model - session = ort.InferenceSession(model_path, providers=["CPUExecutionProvider"]) - t_load = time.perf_counter() - - # Load and preprocess image - image = Image.open(image_path) - image = ImageOps.exif_transpose(image) - image = image.convert("RGB") - orig_w, orig_h = image.size - input_tensor = preprocess(image) - t_pre = time.perf_counter() - - # Run inference - (embedding,) = session.run(None, {"image": input_tensor}) - t_inf = time.perf_counter() - - print(f" Image: {orig_w}x{orig_h}") - print(f" Embedding: shape={embedding.shape}, norm={np.linalg.norm(embedding):.4f}") - print(f" Load: {t_load - t0:.3f}s Preprocess: {t_pre - t_load:.3f}s Inference: {t_inf - t_pre:.3f}s") - - # Zero-shot classification - if tag_embeddings is not None: - scores = (embedding @ tag_embeddings.T)[0] # dot product = cosine sim - top_idx = np.argsort(scores)[::-1][:5] - tags_scores = [(tags[i], float(scores[i])) for i in top_idx] - - print(" Top-5 tags:") - for tag, score in tags_scores: - print(f" {score:.3f} {tag}") - - # Save annotated image - annotated = image.copy().convert("RGBA") - overlay = Image.new("RGBA", annotated.size, (0, 0, 0, 0)) - annotated = draw_tags(overlay, tags_scores) - result = Image.alpha_composite(image.convert("RGBA"), annotated) - result.convert("RGB").save(output_path) - else: - image.save(output_path) - - print(f" Saved: {output_path}") - print(f" Total: {time.perf_counter() - t0:.3f}s") - - -def demo(model, image, output, **kwargs): - """Entry point for programmatic demo.""" - run_inference(model, image, output) - - -def main(): - parser = argparse.ArgumentParser(description="OpenCLIP embedding demo") - parser.add_argument("--model", required=True, help="Path to model.onnx") - parser.add_argument("--image", required=True, help="Input image path") - parser.add_argument("--output", required=True, help="Output PNG path") - args = parser.parse_args() - - demo(args.model, args.image, args.output) - - -if __name__ == "__main__": - main() diff --git a/models/embed-openclip-vitb32/model.yaml b/models/embed-openclip-vitb32/model.yaml deleted file mode 100644 index e1953c2..0000000 --- a/models/embed-openclip-vitb32/model.yaml +++ /dev/null @@ -1,25 +0,0 @@ -id: embed-openclip-vitb32 -name: "embed openclip vitb32" -description: "OpenCLIP ViT-B-32 image embeddings for tagging and similarity" -task: embed -version: "0.1" -type: single -dep_group: openclip - -model_card: - long_description: "Vision Transformer (ViT-B/32) image encoder from the OpenCLIP project; produces 512-dimensional embeddings used for auto-tagging and image similarity search" - scope: "image feature extraction for tagging and similarity" - author: "LAION (Ilharco, Wortsman, Carlini et al.)" - source: "https://github.com/mlfoundations/open_clip" - paper: "https://arxiv.org/abs/2212.07143" - license: "MIT" - training_data: "LAION-2B: 2B image-text pairs from Common Crawl, filtered using CLIP for quality" - training_data_license: "CC-BY-4.0 metadata; images are web-crawled with mixed licenses" - notes: "training images are web-crawled; individual image licenses are not verified; narrow feature extractor, does not generate or modify images" - -convert: - - script: convert.py - args: - output: "{output}/model.onnx" - tags_output: "{output}/tags.json" - opset: 20 diff --git a/models/embed-openclip-vitb32/tags.md b/models/embed-openclip-vitb32/tags.md deleted file mode 100644 index df08e6c..0000000 --- a/models/embed-openclip-vitb32/tags.md +++ /dev/null @@ -1,152 +0,0 @@ -# Default tag vocabulary - -86 hierarchical tags for zero-shot image classification. -Tags use `|` as hierarchy separator, matching darktable's tag system. - -## genre (12) - -| Tag | CLIP prompt | -|-----|-------------| -| `genre\|landscape` | landscape photography | -| `genre\|portrait` | portrait photography | -| `genre\|street` | street photography | -| `genre\|wildlife` | wildlife photography | -| `genre\|macro` | macro photography | -| `genre\|architecture` | architecture photography | -| `genre\|food` | food photography | -| `genre\|sports` | sports photography | -| `genre\|event` | event photography | -| `genre\|abstract` | abstract photography | -| `genre\|still life` | still life photography | -| `genre\|aerial` | aerial photography | - -## subject (34) - -### subject|people (6) - -| Tag | CLIP prompt | -|-----|-------------| -| `subject\|people\|person` | a photo of a person | -| `subject\|people\|couple` | a photo of a couple | -| `subject\|people\|group` | a photo of a group of people | -| `subject\|people\|child` | a photo of a child | -| `subject\|people\|baby` | a photo of a baby | -| `subject\|people\|elderly person` | a photo of an elderly person | - -### subject|animal (8) - -| Tag | CLIP prompt | -|-----|-------------| -| `subject\|animal\|dog` | a photo of a dog | -| `subject\|animal\|cat` | a photo of a cat | -| `subject\|animal\|bird` | a photo of a bird | -| `subject\|animal\|horse` | a photo of a horse | -| `subject\|animal\|insect` | a photo of an insect | -| `subject\|animal\|fish` | a photo of a fish | -| `subject\|animal\|reptile` | a photo of a reptile | -| `subject\|animal\|wild animal` | a photo of a wild animal | - -### subject|nature (10) - -| Tag | CLIP prompt | -|-----|-------------| -| `subject\|nature\|flower` | a photo of a flower | -| `subject\|nature\|tree` | a photo of a tree | -| `subject\|nature\|mountain` | a photo of a mountain | -| `subject\|nature\|waterfall` | a photo of a waterfall | -| `subject\|nature\|river` | a photo of a river | -| `subject\|nature\|lake` | a photo of a lake | -| `subject\|nature\|ocean` | a photo of the ocean | -| `subject\|nature\|cloud` | a photo of clouds | -| `subject\|nature\|rock` | a photo of rocks | -| `subject\|nature\|field` | a photo of a field | - -### subject|vehicle (5) - -| Tag | CLIP prompt | -|-----|-------------| -| `subject\|vehicle\|car` | a photo of a car | -| `subject\|vehicle\|bicycle` | a photo of a bicycle | -| `subject\|vehicle\|boat` | a photo of a boat | -| `subject\|vehicle\|train` | a photo of a train | -| `subject\|vehicle\|airplane` | a photo of an airplane | - -### subject|structure (5) - -| Tag | CLIP prompt | -|-----|-------------| -| `subject\|structure\|building` | a photo of a building | -| `subject\|structure\|bridge` | a photo of a bridge | -| `subject\|structure\|tower` | a photo of a tower | -| `subject\|structure\|statue` | a photo of a statue | -| `subject\|structure\|ruin` | a photo of a ruin | - -## setting (8) - -| Tag | CLIP prompt | -|-----|-------------| -| `setting\|indoor` | an indoor photograph | -| `setting\|outdoor` | an outdoor photograph | -| `setting\|urban` | a photo taken in an urban setting | -| `setting\|rural` | a photo taken in a rural setting | -| `setting\|beach` | a photo taken at a beach | -| `setting\|forest` | a photo taken in a forest | -| `setting\|desert` | a photo taken in a desert | -| `setting\|studio` | a studio photograph | - -## lighting (8) - -| Tag | CLIP prompt | -|-----|-------------| -| `lighting\|sunrise` | a photo taken at sunrise | -| `lighting\|sunset` | a photo taken at sunset | -| `lighting\|golden hour` | a photo taken during golden hour | -| `lighting\|blue hour` | a photo taken during blue hour | -| `lighting\|night` | a photo taken at night | -| `lighting\|backlit` | a backlit photograph | -| `lighting\|silhouette` | a silhouette photograph | -| `lighting\|low light` | a low light photograph | - -## technique (8) - -| Tag | CLIP prompt | -|-----|-------------| -| `technique\|black and white` | a black and white photograph | -| `technique\|long exposure` | a long exposure photograph | -| `technique\|bokeh` | a photograph with bokeh | -| `technique\|panorama` | a panoramic photograph | -| `technique\|close-up` | a close-up photograph | -| `technique\|wide angle` | a wide angle photograph | -| `technique\|motion blur` | a photograph with motion blur | -| `technique\|reflection` | a photograph with reflections | - -## mood (6) - -| Tag | CLIP prompt | -|-----|-------------| -| `mood\|dramatic` | a dramatic photograph | -| `mood\|peaceful` | a peaceful photograph | -| `mood\|moody` | a moody photograph | -| `mood\|vibrant` | a vibrant photograph | -| `mood\|minimal` | a minimalist photograph | -| `mood\|chaotic` | a chaotic photograph | - -## weather (6) - -| Tag | CLIP prompt | -|-----|-------------| -| `weather\|sunny` | a photo taken in sunny weather | -| `weather\|cloudy` | a photo taken in cloudy weather | -| `weather\|rainy` | a photo taken in rainy weather | -| `weather\|snowy` | a photo taken in snowy weather | -| `weather\|foggy` | a photo taken in foggy weather | -| `weather\|stormy` | a photo taken in stormy weather | - -## season (4) - -| Tag | CLIP prompt | -|-----|-------------| -| `season\|spring` | a photo taken in spring | -| `season\|summer` | a photo taken in summer | -| `season\|autumn` | a photo taken in autumn | -| `season\|winter` | a photo taken in winter | diff --git a/pyproject.toml b/pyproject.toml index eb1e3fb..a58ba89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,11 +71,6 @@ sam21 = [ "hydra-core>=1.3.2", "iopath>=0.1.10", ] -openclip = [ - {include-group = "core"}, - "open_clip_torch", - "onnxscript", -] all-models = [ {include-group = "nafnet"}, {include-group = "nind"}, @@ -83,7 +78,6 @@ all-models = [ {include-group = "segnext"}, {include-group = "bsrgan"}, {include-group = "sam21"}, - {include-group = "openclip"}, ] eval = [ "numpy<2.0", diff --git a/uv.lock b/uv.lock index a7f21cd..19f65bf 100644 --- a/uv.lock +++ b/uv.lock @@ -63,15 +63,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/64/013409c451a44b61310fb757af4527f3de57fc98a00f40448de28b864290/albumentations-2.0.8-py3-none-any.whl", hash = "sha256:c4c4259aaf04a7386ad85c7fdcb73c6c7146ca3057446b745cc035805acb1017", size = 369423, upload-time = "2025-05-27T21:23:15.609Z" }, ] -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - [[package]] name = "annotated-types" version = "0.7.0" @@ -87,19 +78,6 @@ version = "4.9.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } -[[package]] -name = "anyio" -version = "4.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, -] - [[package]] name = "certifi" version = "2026.2.25" @@ -267,9 +245,7 @@ all-models = [ { name = "onnx" }, { name = "onnxconverter-common" }, { name = "onnxruntime" }, - { name = "onnxscript" }, { name = "onnxsim" }, - { name = "open-clip-torch" }, { name = "opencv-python-headless" }, { name = "ptflops" }, { name = "pytorch-msssim" }, @@ -338,17 +314,6 @@ nind = [ { name = "torch" }, { name = "torchvision" }, ] -openclip = [ - { name = "numpy" }, - { name = "onnx" }, - { name = "onnxruntime" }, - { name = "onnxscript" }, - { name = "onnxsim" }, - { name = "open-clip-torch" }, - { name = "opencv-python-headless" }, - { name = "torch" }, - { name = "torchvision" }, -] rawnind = [ { name = "colour-science" }, { name = "configargparse" }, @@ -412,9 +377,7 @@ all-models = [ { name = "onnx", specifier = ">=1.10.0" }, { name = "onnxconverter-common" }, { name = "onnxruntime" }, - { name = "onnxscript" }, { name = "onnxsim" }, - { name = "open-clip-torch" }, { name = "opencv-python-headless" }, { name = "ptflops" }, { name = "pytorch-msssim" }, @@ -484,17 +447,6 @@ nind = [ { name = "torch", specifier = ">=2.2.0,<2.7" }, { name = "torchvision", specifier = ">=0.17.0,<0.22" }, ] -openclip = [ - { name = "numpy", specifier = "<2.0" }, - { name = "onnx", specifier = ">=1.10.0" }, - { name = "onnxruntime" }, - { name = "onnxscript" }, - { name = "onnxsim" }, - { name = "open-clip-torch" }, - { name = "opencv-python-headless" }, - { name = "torch", specifier = ">=2.2.0,<2.7" }, - { name = "torchvision", specifier = ">=0.17.0,<0.22" }, -] rawnind = [ { name = "colour-science" }, { name = "configargparse" }, @@ -597,18 +549,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] -[[package]] -name = "ftfy" -version = "6.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a5/d3/8650919bc3c7c6e90ee3fa7fd618bf373cbbe55dff043bd67353dbb20cd8/ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec", size = 308927, upload-time = "2024-10-26T00:50:35.149Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083", size = 44821, upload-time = "2024-10-26T00:50:33.425Z" }, -] - [[package]] name = "future" version = "1.0.0" @@ -649,79 +589,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size = 4880944, upload-time = "2026-03-30T08:47:37.831Z" }, ] -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, -] - -[[package]] -name = "hf-xet" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/08/23c84a26716382c89151b5b447b4beb19e3345f3a93d3b73009a71a57ad3/hf_xet-1.4.2.tar.gz", hash = "sha256:b7457b6b482d9e0743bd116363239b1fa904a5e65deede350fbc0c4ea67c71ea", size = 672357, upload-time = "2026-03-13T06:58:51.077Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/86/b40b83a2ff03ef05c4478d2672b1fc2b9683ff870e2b25f4f3af240f2e7b/hf_xet-1.4.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:71f02d6e4cdd07f344f6844845d78518cc7186bd2bc52d37c3b73dc26a3b0bc5", size = 3800339, upload-time = "2026-03-13T06:58:36.245Z" }, - { url = "https://files.pythonhosted.org/packages/64/2e/af4475c32b4378b0e92a587adb1aa3ec53e3450fd3e5fe0372a874531c00/hf_xet-1.4.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e9b38d876e94d4bdcf650778d6ebbaa791dd28de08db9736c43faff06ede1b5a", size = 3559664, upload-time = "2026-03-13T06:58:34.787Z" }, - { url = "https://files.pythonhosted.org/packages/3c/4c/781267da3188db679e601de18112021a5cb16506fe86b246e22c5401a9c4/hf_xet-1.4.2-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:77e8c180b7ef12d8a96739a4e1e558847002afe9ea63b6f6358b2271a8bdda1c", size = 4217422, upload-time = "2026-03-13T06:58:27.472Z" }, - { url = "https://files.pythonhosted.org/packages/68/47/d6cf4a39ecf6c7705f887a46f6ef5c8455b44ad9eb0d391aa7e8a2ff7fea/hf_xet-1.4.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3b3c6a882016b94b6c210957502ff7877802d0dbda8ad142c8595db8b944271", size = 3992847, upload-time = "2026-03-13T06:58:25.989Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ef/e80815061abff54697239803948abc665c6b1d237102c174f4f7a9a5ffc5/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9d9a634cc929cfbaf2e1a50c0e532ae8c78fa98618426769480c58501e8c8ac2", size = 4193843, upload-time = "2026-03-13T06:58:44.59Z" }, - { url = "https://files.pythonhosted.org/packages/54/75/07f6aa680575d9646c4167db6407c41340cbe2357f5654c4e72a1b01ca14/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6b0932eb8b10317ea78b7da6bab172b17be03bbcd7809383d8d5abd6a2233e04", size = 4432751, upload-time = "2026-03-13T06:58:46.533Z" }, - { url = "https://files.pythonhosted.org/packages/cd/71/193eabd7e7d4b903c4aa983a215509c6114915a5a237525ec562baddb868/hf_xet-1.4.2-cp37-abi3-win_amd64.whl", hash = "sha256:ad185719fb2e8ac26f88c8100562dbf9dbdcc3d9d2add00faa94b5f106aea53f", size = 3671149, upload-time = "2026-03-13T06:58:57.07Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7e/ccf239da366b37ba7f0b36095450efae4a64980bdc7ec2f51354205fdf39/hf_xet-1.4.2-cp37-abi3-win_arm64.whl", hash = "sha256:32c012286b581f783653e718c1862aea5b9eb140631685bb0c5e7012c8719a87", size = 3533426, upload-time = "2026-03-13T06:58:55.46Z" }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - -[[package]] -name = "huggingface-hub" -version = "1.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, - { name = "httpx" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "tqdm" }, - { name = "typer" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/a8/94ccc0aec97b996a3a68f3e1fa06a4bd7185dd02bf22bfba794a0ade8440/huggingface_hub-1.7.1.tar.gz", hash = "sha256:be38fe66e9b03c027ad755cb9e4b87ff0303c98acf515b5d579690beb0bf3048", size = 722097, upload-time = "2026-03-13T09:36:07.758Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/75/ca21955d6117a394a482c7862ce96216239d0e3a53133ae8510727a8bcfa/huggingface_hub-1.7.1-py3-none-any.whl", hash = "sha256:38c6cce7419bbde8caac26a45ed22b0cea24152a8961565d70ec21f88752bfaa", size = 616308, upload-time = "2026-03-13T09:36:06.062Z" }, -] - [[package]] name = "hydra-core" version = "1.3.2" @@ -1213,22 +1080,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, ] -[[package]] -name = "onnx-ir" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ml-dtypes" }, - { name = "numpy" }, - { name = "onnx" }, - { name = "sympy" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b2/a5/acc43c8fa6edbc584d127fb6bbd13ae9ebfc01b9675c74e0da2de15fa4a6/onnx_ir-0.2.0.tar.gz", hash = "sha256:8bad3906691987290789b26d05e0dbff467029a0b1e411e12e4cae02e43503e4", size = 141693, upload-time = "2026-02-24T02:31:10.998Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/df/a99736bcca6b16e36c687ce4996abcf4ce73c514fddd9e730cfcb6a334f2/onnx_ir-0.2.0-py3-none-any.whl", hash = "sha256:eb14d1399c2442bd1ff702719e70074e9cedfa3af5729416a32752c9e0f82591", size = 164100, upload-time = "2026-02-24T02:31:09.454Z" }, -] - [[package]] name = "onnxconverter-common" version = "1.16.0" @@ -1267,23 +1118,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/a9/7b06efd5802db881860d961a7cb4efacb058ed694c1c8f096c0c1499d017/onnxruntime-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:8d770a934513f6e17937baf3438eaaec5983a23cdaedb81c9fc0dfcf26831c24", size = 12169884, upload-time = "2026-02-19T17:14:49.962Z" }, ] -[[package]] -name = "onnxscript" -version = "0.6.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ml-dtypes" }, - { name = "numpy" }, - { name = "onnx" }, - { name = "onnx-ir" }, - { name = "packaging" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/2b/538fdeb0e25bed5d7e0f954af5710543e2629499fb74381afc3333f8a8ae/onnxscript-0.6.2.tar.gz", hash = "sha256:abb2e6f464db40c9b8c7fbb3e64cca04cf3f4495e67c4eda5eac17b784191ce3", size = 590865, upload-time = "2026-02-10T22:53:39.638Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/66/56/e6b179397497ab93266b6eb00743403a6a699a29063a423c4a14595d3db9/onnxscript-0.6.2-py3-none-any.whl", hash = "sha256:20e3c3fd1da19b3655549d5455a2df719db47374fe430e01e865ae69127c37b9", size = 689064, upload-time = "2026-02-10T22:53:41.663Z" }, -] - [[package]] name = "onnxsim" version = "0.6.2" @@ -1300,25 +1134,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/1f/ea45faff66c18186eee94b26b56de3ccae6b3959e35610d63d46752940f9/onnxsim-0.6.2-cp312-abi3-win_amd64.whl", hash = "sha256:5d48239ef14a211462f833b59f1d4afad24d0a2e4b08c02d2bd1ad37bb2d07db", size = 1633099, upload-time = "2026-02-26T07:15:08.274Z" }, ] -[[package]] -name = "open-clip-torch" -version = "2.32.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ftfy" }, - { name = "huggingface-hub" }, - { name = "regex" }, - { name = "safetensors" }, - { name = "timm" }, - { name = "torch" }, - { name = "torchvision" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/7b/fd38dfd522968135dce71d0b543c2ae776f9c8e27df6ad46b63bab09eef7/open_clip_torch-2.32.0.tar.gz", hash = "sha256:0220bc111162527eb738c1fe20dbfd6ea45dfe44726b54a4de18d3945d8f2f00", size = 1491248, upload-time = "2025-04-05T21:55:24.51Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/f9/0458745c1d299411161ee3b6c32228a3de0be1d8497d779fd7f17a8e96aa/open_clip_torch-2.32.0-py3-none-any.whl", hash = "sha256:80b35b43e37afc2b6173aa5ab0ad68744ab3a3211e624f72dfe743a162707637", size = 1528783, upload-time = "2025-04-05T21:55:22.967Z" }, -] - [[package]] name = "opencv-python" version = "4.11.0.86" @@ -1615,35 +1430,9 @@ version = "2026.2.28" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8b/71/41455aa99a5a5ac1eaf311f5d8efd9ce6433c03ac1e0962de163350d0d97/regex-2026.2.28.tar.gz", hash = "sha256:a729e47d418ea11d03469f321aaf67cdee8954cde3ff2cf8403ab87951ad10f2", size = 415184, upload-time = "2026-02-28T02:19:42.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/db/8cbfd0ba3f302f2d09dd0019a9fcab74b63fee77a76c937d0e33161fb8c1/regex-2026.2.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e621fb7c8dc147419b28e1702f58a0177ff8308a76fa295c71f3e7827849f5d9", size = 488462, upload-time = "2026-02-28T02:16:22.616Z" }, - { url = "https://files.pythonhosted.org/packages/5d/10/ccc22c52802223f2368731964ddd117799e1390ffc39dbb31634a83022ee/regex-2026.2.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d5bef2031cbf38757a0b0bc4298bb4824b6332d28edc16b39247228fbdbad97", size = 290774, upload-time = "2026-02-28T02:16:23.993Z" }, - { url = "https://files.pythonhosted.org/packages/62/b9/6796b3bf3101e64117201aaa3a5a030ec677ecf34b3cd6141b5d5c6c67d5/regex-2026.2.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb399ed84eabf4282587ba151f2732ad8168e66f1d3f85b1d038868fe547703", size = 288724, upload-time = "2026-02-28T02:16:25.403Z" }, - { url = "https://files.pythonhosted.org/packages/9c/02/291c0ae3f3a10cea941d0f5366da1843d8d1fa8a25b0671e20a0e454bb38/regex-2026.2.28-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c1b34dfa72f826f535b20712afa9bb3ba580020e834f3c69866c5bddbf10098", size = 791924, upload-time = "2026-02-28T02:16:26.863Z" }, - { url = "https://files.pythonhosted.org/packages/0f/57/f0235cc520d9672742196c5c15098f8f703f2758d48d5a7465a56333e496/regex-2026.2.28-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:851fa70df44325e1e4cdb79c5e676e91a78147b1b543db2aec8734d2add30ec2", size = 860095, upload-time = "2026-02-28T02:16:28.772Z" }, - { url = "https://files.pythonhosted.org/packages/b3/7c/393c94cbedda79a0f5f2435ebd01644aba0b338d327eb24b4aa5b8d6c07f/regex-2026.2.28-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:516604edd17b1c2c3e579cf4e9b25a53bf8fa6e7cedddf1127804d3e0140ca64", size = 906583, upload-time = "2026-02-28T02:16:30.977Z" }, - { url = "https://files.pythonhosted.org/packages/2c/73/a72820f47ca5abf2b5d911d0407ba5178fc52cf9780191ed3a54f5f419a2/regex-2026.2.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7ce83654d1ab701cb619285a18a8e5a889c1216d746ddc710c914ca5fd71022", size = 800234, upload-time = "2026-02-28T02:16:32.55Z" }, - { url = "https://files.pythonhosted.org/packages/34/b3/6e6a4b7b31fa998c4cf159a12cbeaf356386fbd1a8be743b1e80a3da51e4/regex-2026.2.28-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2791948f7c70bb9335a9102df45e93d428f4b8128020d85920223925d73b9e1", size = 772803, upload-time = "2026-02-28T02:16:34.029Z" }, - { url = "https://files.pythonhosted.org/packages/10/e7/5da0280c765d5a92af5e1cd324b3fe8464303189cbaa449de9a71910e273/regex-2026.2.28-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03a83cc26aa2acda6b8b9dfe748cf9e84cbd390c424a1de34fdcef58961a297a", size = 781117, upload-time = "2026-02-28T02:16:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/76/39/0b8d7efb256ae34e1b8157acc1afd8758048a1cf0196e1aec2e71fd99f4b/regex-2026.2.28-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ec6f5674c5dc836994f50f1186dd1fafde4be0666aae201ae2fcc3d29d8adf27", size = 854224, upload-time = "2026-02-28T02:16:38.119Z" }, - { url = "https://files.pythonhosted.org/packages/21/ff/a96d483ebe8fe6d1c67907729202313895d8de8495569ec319c6f29d0438/regex-2026.2.28-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:50c2fc924749543e0eacc93ada6aeeb3ea5f6715825624baa0dccaec771668ae", size = 761898, upload-time = "2026-02-28T02:16:40.333Z" }, - { url = "https://files.pythonhosted.org/packages/89/bd/d4f2e75cb4a54b484e796017e37c0d09d8a0a837de43d17e238adf163f4e/regex-2026.2.28-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ba55c50f408fb5c346a3a02d2ce0ebc839784e24f7c9684fde328ff063c3cdea", size = 844832, upload-time = "2026-02-28T02:16:41.875Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a7/428a135cf5e15e4e11d1e696eb2bf968362f8ea8a5f237122e96bc2ae950/regex-2026.2.28-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:edb1b1b3a5576c56f08ac46f108c40333f222ebfd5cf63afdfa3aab0791ebe5b", size = 788347, upload-time = "2026-02-28T02:16:43.472Z" }, { url = "https://files.pythonhosted.org/packages/a9/59/68691428851cf9c9c3707217ab1d9b47cfeec9d153a49919e6c368b9e926/regex-2026.2.28-cp311-cp311-win32.whl", hash = "sha256:948c12ef30ecedb128903c2c2678b339746eb7c689c5c21957c4a23950c96d15", size = 266033, upload-time = "2026-02-28T02:16:45.094Z" }, { url = "https://files.pythonhosted.org/packages/42/8b/1483de1c57024e89296cbcceb9cccb3f625d416ddb46e570be185c9b05a9/regex-2026.2.28-cp311-cp311-win_amd64.whl", hash = "sha256:fd63453f10d29097cc3dc62d070746523973fb5aa1c66d25f8558bebd47fed61", size = 277978, upload-time = "2026-02-28T02:16:46.75Z" }, { url = "https://files.pythonhosted.org/packages/a4/36/abec45dc6e7252e3dbc797120496e43bb5730a7abf0d9cb69340696a2f2d/regex-2026.2.28-cp311-cp311-win_arm64.whl", hash = "sha256:00f2b8d9615aa165fdff0a13f1a92049bfad555ee91e20d246a51aa0b556c60a", size = 270340, upload-time = "2026-02-28T02:16:48.626Z" }, - { url = "https://files.pythonhosted.org/packages/07/42/9061b03cf0fc4b5fa2c3984cbbaed54324377e440a5c5a29d29a72518d62/regex-2026.2.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fcf26c3c6d0da98fada8ae4ef0aa1c3405a431c0a77eb17306d38a89b02adcd7", size = 489574, upload-time = "2026-02-28T02:16:50.455Z" }, - { url = "https://files.pythonhosted.org/packages/77/83/0c8a5623a233015595e3da499c5a1c13720ac63c107897a6037bb97af248/regex-2026.2.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02473c954af35dd2defeb07e44182f5705b30ea3f351a7cbffa9177beb14da5d", size = 291426, upload-time = "2026-02-28T02:16:52.52Z" }, - { url = "https://files.pythonhosted.org/packages/9e/06/3ef1ac6910dc3295ebd71b1f9bfa737e82cfead211a18b319d45f85ddd09/regex-2026.2.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b65d33a17101569f86d9c5966a8b1d7fbf8afdda5a8aa219301b0a80f58cf7d", size = 289200, upload-time = "2026-02-28T02:16:54.08Z" }, - { url = "https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc", size = 796765, upload-time = "2026-02-28T02:16:55.905Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5d/57702597627fc23278ebf36fbb497ac91c0ce7fec89ac6c81e420ca3e38c/regex-2026.2.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:481df4623fa4969c8b11f3433ed7d5e3dc9cec0f008356c3212b3933fb77e3d8", size = 863093, upload-time = "2026-02-28T02:16:58.094Z" }, - { url = "https://files.pythonhosted.org/packages/02/6d/f3ecad537ca2811b4d26b54ca848cf70e04fcfc138667c146a9f3157779c/regex-2026.2.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:64e7c6ad614573e0640f271e811a408d79a9e1fe62a46adb602f598df42a818d", size = 909455, upload-time = "2026-02-28T02:17:00.918Z" }, - { url = "https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4", size = 802037, upload-time = "2026-02-28T02:17:02.842Z" }, - { url = "https://files.pythonhosted.org/packages/44/7c/c6d91d8911ac6803b45ca968e8e500c46934e58c0903cbc6d760ee817a0a/regex-2026.2.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:864cdd1a2ef5716b0ab468af40139e62ede1b3a53386b375ec0786bb6783fc05", size = 775113, upload-time = "2026-02-28T02:17:04.506Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8d/4a9368d168d47abd4158580b8c848709667b1cd293ff0c0c277279543bd0/regex-2026.2.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:511f7419f7afab475fd4d639d4aedfc54205bcb0800066753ef68a59f0f330b5", size = 784194, upload-time = "2026-02-28T02:17:06.888Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bf/2c72ab5d8b7be462cb1651b5cc333da1d0068740342f350fcca3bca31947/regex-2026.2.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b42f7466e32bf15a961cf09f35fa6323cc72e64d3d2c990b10de1274a5da0a59", size = 856846, upload-time = "2026-02-28T02:17:09.11Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f4/6b65c979bb6d09f51bb2d2a7bc85de73c01ec73335d7ddd202dcb8cd1c8f/regex-2026.2.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8710d61737b0c0ce6836b1da7109f20d495e49b3809f30e27e9560be67a257bf", size = 763516, upload-time = "2026-02-28T02:17:11.004Z" }, - { url = "https://files.pythonhosted.org/packages/8e/32/29ea5e27400ee86d2cc2b4e80aa059df04eaf78b4f0c18576ae077aeff68/regex-2026.2.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4390c365fd2d45278f45afd4673cb90f7285f5701607e3ad4274df08e36140ae", size = 849278, upload-time = "2026-02-28T02:17:12.693Z" }, - { url = "https://files.pythonhosted.org/packages/1d/91/3233d03b5f865111cd517e1c95ee8b43e8b428d61fa73764a80c9bb6f537/regex-2026.2.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb3b1db8ff6c7b8bf838ab05583ea15230cb2f678e569ab0e3a24d1e8320940b", size = 790068, upload-time = "2026-02-28T02:17:14.9Z" }, { url = "https://files.pythonhosted.org/packages/76/92/abc706c1fb03b4580a09645b206a3fc032f5a9f457bc1a8038ac555658ab/regex-2026.2.28-cp312-cp312-win32.whl", hash = "sha256:f8ed9a5d4612df9d4de15878f0bc6aa7a268afbe5af21a3fdd97fa19516e978c", size = 266416, upload-time = "2026-02-28T02:17:17.15Z" }, { url = "https://files.pythonhosted.org/packages/fa/06/2a6f7dff190e5fa9df9fb4acf2fdf17a1aa0f7f54596cba8de608db56b3a/regex-2026.2.28-cp312-cp312-win_amd64.whl", hash = "sha256:01d65fd24206c8e1e97e2e31b286c59009636c022eb5d003f52760b0f42155d4", size = 277297, upload-time = "2026-02-28T02:17:18.723Z" }, { url = "https://files.pythonhosted.org/packages/b7/f0/58a2484851fadf284458fdbd728f580d55c1abac059ae9f048c63b92f427/regex-2026.2.28-cp312-cp312-win_arm64.whl", hash = "sha256:c0b5ccbb8ffb433939d248707d4a8b31993cb76ab1a0187ca886bf50e96df952", size = 270408, upload-time = "2026-02-28T02:17:20.328Z" }, @@ -1677,28 +1466,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" }, ] -[[package]] -name = "safetensors" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, - { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, - { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, - { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, - { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, - { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, - { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, - { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, -] - [[package]] name = "scikit-image" version = "0.26.0" @@ -1773,15 +1540,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, ] -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, -] - [[package]] name = "simsimd" version = "6.5.16" @@ -1918,22 +1676,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl", hash = "sha256:e8be15c94273113d31ecb7aa3a39822189dd11c4967e3cc88c178f1ad2fd1170", size = 243960, upload-time = "2026-03-03T19:14:35.808Z" }, ] -[[package]] -name = "timm" -version = "0.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "pyyaml" }, - { name = "safetensors" }, - { name = "torch" }, - { name = "torchvision" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/90/79/f79ebb37aab0815a67e025d3fd2ae94b02a4d6078ba9ddc8aed9adc6fb25/timm-0.9.2.tar.gz", hash = "sha256:d0977cc5e02c69bda979fca8b52aa315a5f2cb64ebf8ad2c4631b1e452762c14", size = 2085780, upload-time = "2023-05-14T15:05:40.34Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/90/94f5deb8d76e24a89813aef95e8809ca8fd7414490428480eda19b133d4a/timm-0.9.2-py3-none-any.whl", hash = "sha256:8da40cc58ed32b0622bf87d8714f9b7023398ba4cfa8fa678578d2aefde4a909", size = 2173359, upload-time = "2023-05-14T15:05:37.583Z" }, -] - [[package]] name = "torch" version = "2.6.0" @@ -2015,21 +1757,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/06/00/59500052cb1cf8cf5316be93598946bc451f14072c6ff256904428eaf03c/triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c", size = 253159365, upload-time = "2025-01-22T19:13:24.648Z" }, ] -[[package]] -name = "typer" -version = "0.24.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-doc" }, - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" }, -] - [[package]] name = "typing-extensions" version = "4.15.0" @@ -2060,15 +1787,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] -[[package]] -name = "wcwidth" -version = "0.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, -] - [[package]] name = "werkzeug" version = "3.1.8"