feat: add fire detection training pipeline
This commit is contained in:
18
.gitignore
vendored
18
.gitignore
vendored
@@ -4,10 +4,22 @@ __pycache__/
|
||||
build/
|
||||
dist/
|
||||
wheels/
|
||||
*.egg-info
|
||||
*.egg-info/
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
||||
# Virtual environments and caches
|
||||
.venv/
|
||||
.ruff_cache/
|
||||
|
||||
# IDEs
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Local datasets and training outputs
|
||||
data/*
|
||||
runs/
|
||||
|
||||
# Model artifacts
|
||||
*.pt
|
||||
*.onnx
|
||||
*.engine
|
||||
*.torchscript
|
||||
9
configs/datasets/fire.yaml
Normal file
9
configs/datasets/fire.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
# YOLOv8 火灾检测数据集配置
|
||||
|
||||
path: data/fire-dataset
|
||||
|
||||
train: train/images
|
||||
val: validation/images
|
||||
|
||||
nc: 1
|
||||
names: ["fire"]
|
||||
@@ -1,7 +1,7 @@
|
||||
[project]
|
||||
name = "yolo"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
description = "Fire detection training, evaluation, inference, and dataset utilities based on Ultralytics YOLO"
|
||||
readme = "README.md"
|
||||
authors = [
|
||||
{ name = "Kunpeng", email = "mx18782708114@163.com" }
|
||||
@@ -14,6 +14,7 @@ dependencies = [
|
||||
"pandas>=3.0.5",
|
||||
"torch>=2.13.0",
|
||||
"torchvision>=0.28.0",
|
||||
"ultralytics>=8.3.0",
|
||||
]
|
||||
|
||||
[tool.uv.sources]
|
||||
@@ -26,8 +27,8 @@ url = "https://download.pytorch.org/whl/cu132"
|
||||
explicit = true
|
||||
|
||||
[project.scripts]
|
||||
yolo = "yolo:main"
|
||||
fire-yolo = "yolo.cli:main"
|
||||
|
||||
[build-system]
|
||||
requires = ["uv_build>=0.12.0,<0.13.0"]
|
||||
build-backend = "uv_build"
|
||||
build-backend = "uv_build"
|
||||
@@ -1,6 +1,3 @@
|
||||
def main() -> None:
|
||||
import torch
|
||||
__version__ = "0.1.0"
|
||||
|
||||
print(f"torch version: {torch.__version__}")
|
||||
print(f"torch cuda available: {torch.cuda.is_available()}")
|
||||
print("Hello from yolo!")
|
||||
__all__ = ["__version__"]
|
||||
138
src/yolo/cli.py
Normal file
138
src/yolo/cli.py
Normal file
@@ -0,0 +1,138 @@
|
||||
import argparse
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
|
||||
from .data import convert_dataset
|
||||
from .defaults import (
|
||||
DEFAULT_DATA_CONFIG,
|
||||
DEFAULT_DATASET_ROOT,
|
||||
DEFAULT_DETECT_RUNS_DIR,
|
||||
DEFAULT_PRETRAINED_MODEL,
|
||||
)
|
||||
from .engine import export_model, predict, train, validate
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="fire-yolo",
|
||||
description="Fire detection training, validation, prediction, and data utilities.",
|
||||
)
|
||||
subparsers = parser.add_subparsers(dest="command", required=True)
|
||||
|
||||
train_parser = subparsers.add_parser("train", help="Train a fire detection model")
|
||||
train_parser.add_argument("--data", default=str(DEFAULT_DATA_CONFIG))
|
||||
train_parser.add_argument("--model", default=str(DEFAULT_PRETRAINED_MODEL))
|
||||
train_parser.add_argument("--epochs", type=int, default=150)
|
||||
train_parser.add_argument("--imgsz", type=int, default=640)
|
||||
train_parser.add_argument("--batch", type=int, default=32)
|
||||
train_parser.add_argument("--workers", type=int, default=8)
|
||||
train_parser.add_argument("--device")
|
||||
train_parser.add_argument("--project", default=str(DEFAULT_DETECT_RUNS_DIR))
|
||||
train_parser.add_argument("--name")
|
||||
train_parser.add_argument("--cache", action="store_true")
|
||||
train_parser.add_argument(
|
||||
"--patience",
|
||||
type=int,
|
||||
default=20,
|
||||
help="Stop after this many epochs without a fitness improvement (0 disables early stopping)",
|
||||
)
|
||||
|
||||
val_parser = subparsers.add_parser("val", help="Evaluate model weights")
|
||||
val_parser.add_argument("--weights", required=True)
|
||||
val_parser.add_argument("--data", default=str(DEFAULT_DATA_CONFIG))
|
||||
val_parser.add_argument("--imgsz", type=int, default=640)
|
||||
val_parser.add_argument("--batch", type=int, default=32)
|
||||
val_parser.add_argument("--device")
|
||||
val_parser.add_argument("--project", default=str(DEFAULT_DETECT_RUNS_DIR))
|
||||
val_parser.add_argument("--name", default="validation")
|
||||
val_parser.add_argument("--no-plots", action="store_true")
|
||||
|
||||
predict_parser = subparsers.add_parser("predict", help="Run prediction")
|
||||
predict_parser.add_argument("--weights", required=True)
|
||||
predict_parser.add_argument("--source", required=True)
|
||||
predict_parser.add_argument("--conf", type=float, default=0.25)
|
||||
predict_parser.add_argument("--iou", type=float, default=0.45)
|
||||
predict_parser.add_argument("--imgsz", type=int, default=640)
|
||||
predict_parser.add_argument("--device")
|
||||
predict_parser.add_argument("--project", default=str(DEFAULT_DETECT_RUNS_DIR))
|
||||
predict_parser.add_argument("--name", default="predict")
|
||||
predict_parser.add_argument("--no-save", action="store_true")
|
||||
|
||||
export_parser = subparsers.add_parser("export", help="Export model weights")
|
||||
export_parser.add_argument("--weights", required=True)
|
||||
export_parser.add_argument("--format", default="onnx")
|
||||
export_parser.add_argument("--imgsz", type=int, default=640)
|
||||
export_parser.add_argument("--device")
|
||||
|
||||
convert_parser = subparsers.add_parser("convert", help="Convert VOC XML to YOLO labels")
|
||||
convert_parser.add_argument("--data-root", default=str(DEFAULT_DATASET_ROOT))
|
||||
convert_parser.add_argument(
|
||||
"--splits",
|
||||
nargs="+",
|
||||
default=["train", "validation"],
|
||||
)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def main(argv: Sequence[str] | None = None) -> int:
|
||||
args = build_parser().parse_args(argv)
|
||||
|
||||
if args.command == "train":
|
||||
train(
|
||||
data_yaml=args.data,
|
||||
model_weights=args.model,
|
||||
epochs=args.epochs,
|
||||
imgsz=args.imgsz,
|
||||
batch=args.batch,
|
||||
workers=args.workers,
|
||||
device=args.device,
|
||||
project=args.project,
|
||||
name=args.name,
|
||||
cache=args.cache,
|
||||
patience=args.patience,
|
||||
)
|
||||
elif args.command == "val":
|
||||
validate(
|
||||
weights=args.weights,
|
||||
data_yaml=args.data,
|
||||
imgsz=args.imgsz,
|
||||
batch=args.batch,
|
||||
device=args.device,
|
||||
project=args.project,
|
||||
name=args.name,
|
||||
plots=not args.no_plots,
|
||||
)
|
||||
elif args.command == "predict":
|
||||
predict(
|
||||
weights=args.weights,
|
||||
source=args.source,
|
||||
conf=args.conf,
|
||||
iou=args.iou,
|
||||
imgsz=args.imgsz,
|
||||
device=args.device,
|
||||
project=args.project,
|
||||
name=args.name,
|
||||
save=not args.no_save,
|
||||
)
|
||||
elif args.command == "export":
|
||||
export_model(
|
||||
weights=args.weights,
|
||||
fmt=args.format,
|
||||
imgsz=args.imgsz,
|
||||
device=args.device,
|
||||
)
|
||||
elif args.command == "convert":
|
||||
data_root = Path(args.data_root).expanduser().resolve()
|
||||
for split in args.splits:
|
||||
converted = convert_dataset(
|
||||
data_root / split / "annotations",
|
||||
data_root / split / "labels",
|
||||
)
|
||||
print(f"{split}: converted {converted} XML files")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
3
src/yolo/data/__init__.py
Normal file
3
src/yolo/data/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from .convert import convert_dataset, voc_to_yolo
|
||||
|
||||
__all__ = ["convert_dataset", "voc_to_yolo"]
|
||||
83
src/yolo/data/convert.py
Normal file
83
src/yolo/data/convert.py
Normal file
@@ -0,0 +1,83 @@
|
||||
import xml.etree.ElementTree as ET
|
||||
from collections.abc import Mapping
|
||||
from pathlib import Path
|
||||
|
||||
YoloBox = tuple[int, float, float, float, float]
|
||||
|
||||
|
||||
def voc_to_yolo(
|
||||
xml_path: str | Path,
|
||||
class_map: Mapping[str, int] | None = None,
|
||||
) -> list[YoloBox]:
|
||||
classes = class_map or {"fire": 0}
|
||||
source = Path(xml_path)
|
||||
root = ET.parse(source).getroot()
|
||||
size = root.find("size")
|
||||
if size is None:
|
||||
raise ValueError(f"Missing <size> in {source}")
|
||||
|
||||
image_width = float(size.findtext("width") or 0)
|
||||
image_height = float(size.findtext("height") or 0)
|
||||
if image_width <= 0 or image_height <= 0:
|
||||
raise ValueError(
|
||||
f"Invalid image size in {source}: {image_width}x{image_height}"
|
||||
)
|
||||
|
||||
labels: list[YoloBox] = []
|
||||
for obj in root.findall("object"):
|
||||
name = obj.findtext("name")
|
||||
if name not in classes:
|
||||
continue
|
||||
|
||||
box = obj.find("bndbox")
|
||||
if box is None:
|
||||
raise ValueError(f"Missing <bndbox> in {source}")
|
||||
|
||||
xmin = float(box.findtext("xmin") or 0)
|
||||
ymin = float(box.findtext("ymin") or 0)
|
||||
xmax = float(box.findtext("xmax") or 0)
|
||||
ymax = float(box.findtext("ymax") or 0)
|
||||
if xmin < 0 or ymin < 0 or xmax <= xmin or ymax <= ymin:
|
||||
raise ValueError(
|
||||
f"Invalid bounding box in {source}: {xmin}, {ymin}, {xmax}, {ymax}"
|
||||
)
|
||||
if xmax > image_width or ymax > image_height:
|
||||
raise ValueError(f"Bounding box exceeds image bounds in {source}")
|
||||
|
||||
labels.append(
|
||||
(
|
||||
classes[name],
|
||||
((xmin + xmax) / 2) / image_width,
|
||||
((ymin + ymax) / 2) / image_height,
|
||||
(xmax - xmin) / image_width,
|
||||
(ymax - ymin) / image_height,
|
||||
)
|
||||
)
|
||||
|
||||
return labels
|
||||
|
||||
|
||||
def convert_dataset(
|
||||
xml_dir: str | Path,
|
||||
output_dir: str | Path,
|
||||
class_map: Mapping[str, int] | None = None,
|
||||
) -> int:
|
||||
source_dir = Path(xml_dir)
|
||||
destination_dir = Path(output_dir)
|
||||
if not source_dir.is_dir():
|
||||
raise FileNotFoundError(f"Annotation directory does not exist: {source_dir}")
|
||||
|
||||
destination_dir.mkdir(parents=True, exist_ok=True)
|
||||
xml_files = sorted(source_dir.glob("*.xml"))
|
||||
for xml_file in xml_files:
|
||||
labels = voc_to_yolo(xml_file, class_map)
|
||||
output_file = destination_dir / f"{xml_file.stem}.txt"
|
||||
output_file.write_text(
|
||||
"".join(
|
||||
f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n"
|
||||
for class_id, x_center, y_center, width, height in labels
|
||||
),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
return len(xml_files)
|
||||
12
src/yolo/defaults.py
Normal file
12
src/yolo/defaults.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
||||
CONFIG_DIR = PROJECT_ROOT / "configs"
|
||||
DATA_DIR = PROJECT_ROOT / "data"
|
||||
MODELS_DIR = PROJECT_ROOT / "models"
|
||||
RUNS_DIR = PROJECT_ROOT / "runs"
|
||||
|
||||
DEFAULT_DATA_CONFIG = CONFIG_DIR / "datasets" / "fire.yaml"
|
||||
DEFAULT_DATASET_ROOT = DATA_DIR / "fire-dataset"
|
||||
DEFAULT_PRETRAINED_MODEL = MODELS_DIR / "pretrained" / "yolov8n.pt"
|
||||
DEFAULT_DETECT_RUNS_DIR = RUNS_DIR / "detect"
|
||||
180
src/yolo/engine.py
Normal file
180
src/yolo/engine.py
Normal file
@@ -0,0 +1,180 @@
|
||||
from datetime import datetime
|
||||
import csv
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import torch
|
||||
from ultralytics import YOLO, settings
|
||||
|
||||
from .defaults import (
|
||||
DEFAULT_DATA_CONFIG,
|
||||
DEFAULT_DETECT_RUNS_DIR,
|
||||
DEFAULT_PRETRAINED_MODEL,
|
||||
PROJECT_ROOT,
|
||||
)
|
||||
|
||||
PathLike = str | Path
|
||||
|
||||
|
||||
def _write_best_point(run_dir: Path) -> None:
|
||||
results_path = run_dir / "results.csv"
|
||||
if not results_path.is_file():
|
||||
return
|
||||
|
||||
with results_path.open(encoding="utf-8-sig", newline="") as results_file:
|
||||
rows = list(csv.DictReader(results_file))
|
||||
if not rows:
|
||||
return
|
||||
|
||||
metric_keys = ("metrics/mAP50(B)", "metrics/mAP50-95(B)")
|
||||
if any(metric_key not in rows[0] for metric_key in metric_keys):
|
||||
return
|
||||
|
||||
best_points = {}
|
||||
for metric_key in metric_keys:
|
||||
best_row = max(rows, key=lambda row: float(row[metric_key]))
|
||||
best_points[metric_key] = {
|
||||
"epoch": int(float(best_row["epoch"])),
|
||||
"value": float(best_row[metric_key]),
|
||||
}
|
||||
|
||||
summary = {
|
||||
"selection_metric": "metrics/mAP50-95(B)",
|
||||
"best_point": best_points["metrics/mAP50-95(B)"],
|
||||
"best_map50": best_points["metrics/mAP50(B)"],
|
||||
"best_weights": str(run_dir / "weights" / "best.pt"),
|
||||
"last_weights": str(run_dir / "weights" / "last.pt"),
|
||||
"epochs_completed": len(rows),
|
||||
}
|
||||
(run_dir / "best_point.json").write_text(
|
||||
json.dumps(summary, ensure_ascii=False, indent=2),
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
|
||||
def resolve_device(device: str | None = None) -> str:
|
||||
if device:
|
||||
return device
|
||||
return "cuda" if torch.cuda.is_available() else "cpu"
|
||||
|
||||
|
||||
def _existing_file(path: PathLike, description: str) -> Path:
|
||||
resolved = Path(path).expanduser().resolve()
|
||||
if not resolved.is_file():
|
||||
raise FileNotFoundError(f"{description} does not exist: {resolved}")
|
||||
return resolved
|
||||
|
||||
|
||||
def _configure_ultralytics() -> None:
|
||||
settings.update({"datasets_dir": str(PROJECT_ROOT)})
|
||||
|
||||
|
||||
def train(
|
||||
data_yaml: PathLike = DEFAULT_DATA_CONFIG,
|
||||
model_weights: PathLike = DEFAULT_PRETRAINED_MODEL,
|
||||
epochs: int = 150,
|
||||
imgsz: int = 640,
|
||||
batch: int = 32,
|
||||
workers: int = 8,
|
||||
device: str | None = None,
|
||||
project: PathLike = DEFAULT_DETECT_RUNS_DIR,
|
||||
name: str | None = None,
|
||||
patience: int = 20,
|
||||
**kwargs: Any,
|
||||
) -> Any:
|
||||
data_path = _existing_file(data_yaml, "Dataset config")
|
||||
weights_path = _existing_file(model_weights, "Model weights")
|
||||
_configure_ultralytics()
|
||||
|
||||
run_name = name or f"fire_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
||||
run_dir = Path(project) / run_name
|
||||
model = YOLO(str(weights_path))
|
||||
results = model.train(
|
||||
data=str(data_path),
|
||||
epochs=epochs,
|
||||
imgsz=imgsz,
|
||||
batch=batch,
|
||||
workers=workers,
|
||||
device=resolve_device(device),
|
||||
project=str(Path(project)),
|
||||
name=run_name,
|
||||
patience=patience,
|
||||
**kwargs,
|
||||
)
|
||||
_write_best_point(run_dir)
|
||||
return results
|
||||
|
||||
|
||||
def validate(
|
||||
weights: PathLike,
|
||||
data_yaml: PathLike = DEFAULT_DATA_CONFIG,
|
||||
imgsz: int = 640,
|
||||
batch: int = 32,
|
||||
device: str | None = None,
|
||||
project: PathLike = DEFAULT_DETECT_RUNS_DIR,
|
||||
name: str = "validation",
|
||||
plots: bool = True,
|
||||
**kwargs: Any,
|
||||
) -> Any:
|
||||
weights_path = _existing_file(weights, "Model weights")
|
||||
data_path = _existing_file(data_yaml, "Dataset config")
|
||||
_configure_ultralytics()
|
||||
|
||||
model = YOLO(str(weights_path))
|
||||
return model.val(
|
||||
data=str(data_path),
|
||||
imgsz=imgsz,
|
||||
batch=batch,
|
||||
device=resolve_device(device),
|
||||
project=str(Path(project)),
|
||||
name=name,
|
||||
plots=plots,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
|
||||
def predict(
|
||||
weights: PathLike,
|
||||
source: str,
|
||||
conf: float = 0.25,
|
||||
iou: float = 0.45,
|
||||
imgsz: int = 640,
|
||||
device: str | None = None,
|
||||
project: PathLike = DEFAULT_DETECT_RUNS_DIR,
|
||||
name: str = "predict",
|
||||
save: bool = True,
|
||||
**kwargs: Any,
|
||||
) -> Any:
|
||||
weights_path = _existing_file(weights, "Model weights")
|
||||
model = YOLO(str(weights_path))
|
||||
return model.predict(
|
||||
source=source,
|
||||
conf=conf,
|
||||
iou=iou,
|
||||
imgsz=imgsz,
|
||||
device=resolve_device(device),
|
||||
project=str(Path(project)),
|
||||
name=name,
|
||||
save=save,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
|
||||
def export_model(
|
||||
weights: PathLike,
|
||||
fmt: str = "onnx",
|
||||
imgsz: int = 640,
|
||||
device: str | None = None,
|
||||
**kwargs: Any,
|
||||
) -> str:
|
||||
weights_path = _existing_file(weights, "Model weights")
|
||||
model = YOLO(str(weights_path))
|
||||
return str(
|
||||
model.export(
|
||||
format=fmt,
|
||||
imgsz=imgsz,
|
||||
device=resolve_device(device),
|
||||
**kwargs,
|
||||
)
|
||||
)
|
||||
106
src/yolo/visualization.py
Normal file
106
src/yolo/visualization.py
Normal file
@@ -0,0 +1,106 @@
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
PixelBox = tuple[int, int, int, int]
|
||||
|
||||
|
||||
def draw_boxes(
|
||||
image: np.ndarray,
|
||||
boxes: Sequence[PixelBox],
|
||||
labels: Sequence[str] | None = None,
|
||||
confidences: Sequence[float] | None = None,
|
||||
color: tuple[int, int, int] = (0, 0, 255),
|
||||
thickness: int = 2,
|
||||
) -> np.ndarray:
|
||||
output = image.copy()
|
||||
for index, (x1, y1, x2, y2) in enumerate(boxes):
|
||||
cv2.rectangle(output, (x1, y1), (x2, y2), color, thickness)
|
||||
|
||||
text_parts: list[str] = []
|
||||
if labels and index < len(labels):
|
||||
text_parts.append(labels[index])
|
||||
if confidences and index < len(confidences):
|
||||
text_parts.append(f"{confidences[index]:.2f}")
|
||||
text = " ".join(text_parts)
|
||||
if not text:
|
||||
continue
|
||||
|
||||
(text_width, text_height), _ = cv2.getTextSize(
|
||||
text,
|
||||
cv2.FONT_HERSHEY_SIMPLEX,
|
||||
0.5,
|
||||
1,
|
||||
)
|
||||
cv2.rectangle(
|
||||
output,
|
||||
(x1, y1 - text_height - 4),
|
||||
(x1 + text_width + 4, y1),
|
||||
color,
|
||||
-1,
|
||||
)
|
||||
cv2.putText(
|
||||
output,
|
||||
text,
|
||||
(x1 + 2, y1 - 3),
|
||||
cv2.FONT_HERSHEY_SIMPLEX,
|
||||
0.5,
|
||||
(255, 255, 255),
|
||||
1,
|
||||
)
|
||||
|
||||
return output
|
||||
|
||||
|
||||
def compare(
|
||||
image_path: str | Path,
|
||||
boxes: Sequence[PixelBox],
|
||||
labels: Sequence[str] | None = None,
|
||||
confidences: Sequence[float] | None = None,
|
||||
save_path: str | Path | None = None,
|
||||
) -> np.ndarray:
|
||||
image = cv2.imread(str(image_path))
|
||||
if image is None:
|
||||
raise FileNotFoundError(f"Cannot read image: {image_path}")
|
||||
annotated = draw_boxes(image, boxes, labels, confidences)
|
||||
|
||||
height, width = image.shape[:2]
|
||||
padding = 20
|
||||
comparison = np.full(
|
||||
(height + padding, width * 2 + padding * 3, 3),
|
||||
255,
|
||||
dtype=np.uint8,
|
||||
)
|
||||
cv2.putText(
|
||||
comparison,
|
||||
"Original",
|
||||
(padding + width // 2 - 30, 15),
|
||||
cv2.FONT_HERSHEY_SIMPLEX,
|
||||
0.5,
|
||||
(0, 0, 0),
|
||||
1,
|
||||
)
|
||||
cv2.putText(
|
||||
comparison,
|
||||
"Detected",
|
||||
(padding * 2 + width + width // 2 - 30, 15),
|
||||
cv2.FONT_HERSHEY_SIMPLEX,
|
||||
0.5,
|
||||
(0, 0, 0),
|
||||
1,
|
||||
)
|
||||
comparison[padding : padding + height, padding : padding + width] = image
|
||||
comparison[
|
||||
padding : padding + height,
|
||||
padding * 2 + width : padding * 2 + width * 2,
|
||||
] = annotated
|
||||
|
||||
if save_path is not None:
|
||||
destination = Path(save_path)
|
||||
destination.parent.mkdir(parents=True, exist_ok=True)
|
||||
if not cv2.imwrite(str(destination), comparison):
|
||||
raise OSError(f"Failed to write image: {destination}")
|
||||
|
||||
return comparison
|
||||
210
uv.lock
generated
210
uv.lock
generated
@@ -2,9 +2,56 @@ version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.14"
|
||||
resolution-markers = [
|
||||
"sys_platform == 'win32'",
|
||||
"sys_platform == 'emscripten'",
|
||||
"sys_platform != 'emscripten' and sys_platform != 'win32'",
|
||||
"python_full_version >= '3.15' and sys_platform == 'win32'",
|
||||
"python_full_version < '3.15' and sys_platform == 'win32'",
|
||||
"python_full_version >= '3.15' and sys_platform == 'emscripten'",
|
||||
"python_full_version < '3.15' and sys_platform == 'emscripten'",
|
||||
"python_full_version >= '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'",
|
||||
"python_full_version < '3.15' and sys_platform != 'emscripten' and sys_platform != 'win32'",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2026.7.22"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.4.9"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -163,6 +210,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/fd/3c/6a2bf344106328fd04963664a60b9bb6496fc25df8e962fcdc1367285fb9/fsspec-2026.7.0-py3-none-any.whl", hash = "sha256:b57ddbafedfaef7018c1ecab32aa200a9d7ca26b77965f64e48b70061249d279", size = 206583, upload-time = "2026-07-28T16:34:49.538Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.18"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jinja2"
|
||||
version = "3.1.6"
|
||||
@@ -439,6 +495,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nvidia-ml-py"
|
||||
version = "13.610.43"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f0/b5/a8fbc356f768fa5c9cfd646668fd7d34bf55bdd1c6e20754642a64d930d4/nvidia_ml_py-13.610.43.tar.gz", hash = "sha256:65437eb73d68d0c62c931ca4d45038472faff03bd0b8729abba4b899f70d60f2", size = 52109, upload-time = "2026-06-01T18:54:08.829Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/23/45/caa600acfab94560807a20a64b5830d2cd3c3202b7f1328644d70b7d6bd8/nvidia_ml_py-13.610.43-py3-none-any.whl", hash = "sha256:f13c72698edef492f985cc225f14faafe68ae065a2e407f45bdf6f4b9b43fde8", size = 53163, upload-time = "2026-06-01T18:54:07.704Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nvidia-nccl-cu13"
|
||||
version = "2.29.7"
|
||||
@@ -582,6 +647,56 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "polars"
|
||||
version = "1.43.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "polars-runtime-32" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "polars-runtime-32"
|
||||
version = "1.43.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "psutil"
|
||||
version = "7.2.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyparsing"
|
||||
version = "3.3.2"
|
||||
@@ -603,6 +718,47 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml"
|
||||
version = "6.0.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.34.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "certifi" },
|
||||
{ name = "charset-normalizer" },
|
||||
{ name = "idna" },
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "83.0.0"
|
||||
@@ -713,6 +869,52 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ultralytics"
|
||||
version = "8.4.117"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "filelock" },
|
||||
{ name = "matplotlib" },
|
||||
{ name = "numpy" },
|
||||
{ name = "nvidia-ml-py" },
|
||||
{ name = "opencv-python" },
|
||||
{ name = "pillow" },
|
||||
{ name = "polars" },
|
||||
{ name = "psutil" },
|
||||
{ name = "pyyaml" },
|
||||
{ name = "requests" },
|
||||
{ name = "torch" },
|
||||
{ name = "torchvision" },
|
||||
{ name = "ultralytics-thop" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/c3/99/80e5ae3587eb0918d97594fbd1408a1568af1401b63778e8835e89eb1f9e/ultralytics-8.4.117.tar.gz", hash = "sha256:0c0c91cd8a6587a22f0acb07b2bc7261a2fe8660afc03bc8061b6945c34a8eee", size = 1201560, upload-time = "2026-08-09T17:11:40.939Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/00/e2/3667fc4ec89900818512a0ef2fe97ae46be3afdc5bd5c786ec0dd5c35c1b/ultralytics-8.4.117-py3-none-any.whl", hash = "sha256:859a16eebc707f8b1b6e259d01f70040287f2e97c12c9ee0c5e6309484db3a2f", size = 1420355, upload-time = "2026-08-09T17:11:36.149Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ultralytics-thop"
|
||||
version = "2.1.6"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "numpy" },
|
||||
{ name = "torch" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/45/20/d6b6aaa8ecf7dbdeaf0c05f73bdcd04cf8ce468d936bc48dbcd368e75baf/ultralytics_thop-2.1.6.tar.gz", hash = "sha256:0ec2df8ebd3db35795e1f80cdc8bce6734446dbe989bca1b0c89396353f0f08c", size = 36364, upload-time = "2026-07-30T22:31:28.143Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/53/98/f1fa3d40d548c8a2a3eec33b7f856063bb6c7d51e16d5198b1f390b2c79d/ultralytics_thop-2.1.6-py3-none-any.whl", hash = "sha256:23f7b8ad124fa3432c1a7de9279102c4fdda699216032a7dff49f87ec3d1a3af", size = 30479, upload-time = "2026-07-30T22:31:26.874Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.7.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yolo"
|
||||
version = "0.1.0"
|
||||
@@ -724,6 +926,7 @@ dependencies = [
|
||||
{ name = "pandas" },
|
||||
{ name = "torch" },
|
||||
{ name = "torchvision" },
|
||||
{ name = "ultralytics" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
@@ -734,4 +937,5 @@ requires-dist = [
|
||||
{ name = "pandas", specifier = ">=3.0.5" },
|
||||
{ name = "torch", specifier = ">=2.13.0", index = "https://download.pytorch.org/whl/cu132" },
|
||||
{ name = "torchvision", specifier = ">=0.28.0", index = "https://download.pytorch.org/whl/cu132" },
|
||||
{ name = "ultralytics", specifier = ">=8.3.0" },
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user