update from asus 106

This commit is contained in:
asus committed 2026-08-05 15:56:11 +07:00
1 parent 6637fb1302
commit 8285400254
28 files changed
+3215 -459

No files matched your search

+46 -2
View File
@@ -14,6 +14,7 @@ Label files are plain YOLO:
import os
import shutil
import time
from typing import List, Optional
from backend import batches, config, db, jobs, projects, review
@@ -74,12 +75,55 @@ def _next_split(cur, project_id: int, val_every: int) -> str:
return "val" if position % val_every == val_every - 1 else "train"
def write_data_yaml(project: dict, batch_ids: list = None) -> str:
def sync_labels(project_id: int, selected_class_ids: Optional[List[int]] = None) -> dict:
"""Re-sync label files on disk for all merged frames in the project dataset."""
project = projects.get(project_id)
root = dataset_dir(project["slug"])
with db.cursor() as cur:
cur.execute(
"SELECT d.frame_id, d.label_rel FROM dataset_items d WHERE d.project_id = ?",
(project_id,),
)
items = cur.fetchall()
class_map = None
if selected_class_ids is not None and len(selected_class_ids) > 0:
class_map = {cid: idx for idx, cid in enumerate(sorted(selected_class_ids))}
synced_files = 0
total_lines = 0
for frame_id, label_rel in items:
annotations = review.listing(frame_id)
if class_map is not None:
annotations = [a for a in annotations if a["class_id"] in class_map]
lines = []
for item in annotations:
mapped_cid = class_map[item["class_id"]] if class_map is not None else item["class_id"]
lines.append(_label_line(mapped_cid, item["geometry"], project["label_type"]))
path = os.path.join(root, label_rel)
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
f.write("\n".join(lines) + ("\n" if lines else ""))
synced_files += 1
total_lines += len(lines)
return {"synced_files": synced_files, "total_lines": total_lines}
def write_data_yaml(project: dict, batch_ids: list = None, selected_class_ids: Optional[List[int]] = None) -> str:
"""Rebuild data.yaml from the project's classes (REQ-051)."""
sync_labels(project["id"], selected_class_ids=selected_class_ids)
root = dataset_dir(project["slug"])
os.makedirs(root, exist_ok=True)
counts = summary(project["id"])["splits"]
names = ", ".join(f"'{item['name']}'" for item in project["classes"])
target_classes = project["classes"]
if selected_class_ids is not None and len(selected_class_ids) > 0:
target_classes = [c for c in project["classes"] if c["class_id"] in selected_class_ids]
names = ", ".join(f"'{item['name']}'" for item in target_classes)
if batch_ids:
with db.cursor() as cur: