From 50f7a78475ee023279370a13892b507b3a7cf712 Mon Sep 17 00:00:00 2001 From: Teakowa Date: Mon, 10 Aug 2026 15:03:52 +0800 Subject: [PATCH] feat: extract mastery run-code evidence Refs #1 Refs OWBastion/owbastion.com#75 --- README.md | 11 +- app/core/context.py | 2 +- app/core/roi_config.py | 4 +- app/image/preprocess.py | 6 ++ app/parser/result_merger.py | 2 + app/parser/run_code.py | 68 ++++++++++++ app/schemas/response.py | 1 + app/service.py | 28 ++++- configs/roi_1280x720.manifest.json | 8 +- configs/roi_1280x720.yaml | 8 +- scripts/batch_eval.py | 14 +++ tests/fixtures/run_code/cases.json | 50 +++++++++ .../run_code/run_code_ambiguous_1280.png | Bin 0 -> 14401 bytes .../fixtures/run_code/run_code_clean_1280.png | Bin 0 -> 14616 bytes .../fixtures/run_code/run_code_compressed.jpg | Bin 0 -> 14427 bytes .../run_code/run_code_cropped_1200.png | Bin 0 -> 8539 bytes .../run_code/run_code_high_res_2560.png | Bin 0 -> 36514 bytes .../run_code/run_code_malformed_1280.png | Bin 0 -> 14192 bytes .../run_code/run_code_missing_1280.png | Bin 0 -> 9475 bytes .../run_code/run_code_scaled_1600.png | Bin 0 -> 34139 bytes tests/test_api.py | 97 +++++++++++++++++- tests/test_batch_eval.py | 14 +++ tests/test_parser_run_code.py | 46 +++++++++ tests/test_result_merger.py | 12 +++ tests/test_run_code_fixtures.py | 22 ++++ training/README.md | 5 + 26 files changed, 385 insertions(+), 13 deletions(-) create mode 100644 app/parser/run_code.py create mode 100644 tests/fixtures/run_code/cases.json create mode 100644 tests/fixtures/run_code/run_code_ambiguous_1280.png create mode 100644 tests/fixtures/run_code/run_code_clean_1280.png create mode 100644 tests/fixtures/run_code/run_code_compressed.jpg create mode 100644 tests/fixtures/run_code/run_code_cropped_1200.png create mode 100644 tests/fixtures/run_code/run_code_high_res_2560.png create mode 100644 tests/fixtures/run_code/run_code_malformed_1280.png create mode 100644 tests/fixtures/run_code/run_code_missing_1280.png create mode 100644 tests/fixtures/run_code/run_code_scaled_1600.png create mode 100644 tests/test_parser_run_code.py create mode 100644 tests/test_run_code_fixtures.py diff --git a/README.md b/README.md index cb91df1..cf17ef3 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ and also include traceable contract metadata: "request_id": "...", "engine": "rapidocr", "model_version": "builtin", - "layout_version": "1280x720-v5", + "layout_version": "1280x720-v6", "ok": true, "data": {}, "fields": { @@ -64,7 +64,7 @@ and also include traceable contract metadata: "cropped": false, "blur_score": 0.08, "normalized_size": [1280, 720], - "layout_version": "1280x720-v5", + "layout_version": "1280x720-v6", "warnings": [] } } @@ -91,6 +91,13 @@ central completion banner is not an authoritative player source, so its player n not included in `ChallengeData` or field evidence. `map_variant` is `"classic"` when the right-panel map label contains `经典版` or `经典`, and `null` when the variant is not detected. +`run_code` is additive, optional OCR evidence from the dedicated settlement `run_code_panel` ROI. +When its visible label and all three numeric groups are reliable, OCRKit returns canonical +`NNNN-NNNN-NNNN`; it records the ROI confidence, source, normalization, and one of +`ok`, `missing`, `invalid`, `ambiguous`, or `low_confidence`. Legacy supported layouts +without that field return `missing` rather than an error. OCRKit never decides whether a +run code is eligible for mastery, duplicate, or worth XP. The compatible Bastion release +version is intentionally not recorded until the HUD field is actually released. ### R2 Object Mode diff --git a/app/core/context.py b/app/core/context.py index 4605e49..06667ec 100644 --- a/app/core/context.py +++ b/app/core/context.py @@ -18,7 +18,7 @@ class AppContext: object_store: R2ObjectStore | None = None model_version: str = "builtin" engine_name: str = "rapidocr" - layout_version: str = "1280x720-v5" + layout_version: str = "1280x720-v6" achievement_titles: tuple[str, ...] = () diff --git a/app/core/roi_config.py b/app/core/roi_config.py index 1f04766..a78fb5d 100644 --- a/app/core/roi_config.py +++ b/app/core/roi_config.py @@ -19,7 +19,7 @@ class RoiConfig: width: int height: int rois: dict[str, RoiBox] - version: str = "1280x720-v5" + version: str = "1280x720-v6" def load_roi_config(path: Path) -> RoiConfig: @@ -39,7 +39,7 @@ def load_roi_config(path: Path) -> RoiConfig: width=int(size["width"]), height=int(size["height"]), rois=rois, - version=str(data.get("layout_version", "1280x720-v5")), + version=str(data.get("layout_version", "1280x720-v6")), ) diff --git a/app/image/preprocess.py b/app/image/preprocess.py index 5be9df4..f199eef 100644 --- a/app/image/preprocess.py +++ b/app/image/preprocess.py @@ -28,6 +28,10 @@ def preprocess_achievement_panel(image: np.ndarray) -> np.ndarray: return clahe.apply(gray) +def preprocess_run_code_panel(image: np.ndarray) -> np.ndarray: + return preprocess_left_panel(image) + + def preprocess_right_panel(image: np.ndarray) -> np.ndarray: up = _upscale(image, 2.0) gray = cv2.cvtColor(up, cv2.COLOR_BGR2GRAY) @@ -41,6 +45,8 @@ def preprocess_by_roi(roi_name: str, image: np.ndarray) -> np.ndarray: return preprocess_left_panel(image) if roi_name == "achievement_panel": return preprocess_achievement_panel(image) + if roi_name == "run_code_panel": + return preprocess_run_code_panel(image) if roi_name == "bottom_left_hero": return preprocess_left_panel(image) if roi_name == "right_panel": diff --git a/app/parser/result_merger.py b/app/parser/result_merger.py index e46811f..d2c4497 100644 --- a/app/parser/result_merger.py +++ b/app/parser/result_merger.py @@ -14,6 +14,7 @@ def merge_result( bottom_left: BottomLeftHero, right: RightPanel, achievement_panel_text: str | None = None, + run_code: str | None = None, ) -> ChallengeData: duration_text = left.clear_time if left.clear_time_seconds is not None else center.duration_text duration_seconds = left.clear_time_seconds if left.clear_time_seconds is not None else center.duration_seconds @@ -34,4 +35,5 @@ def merge_result( map_variant=right.map_variant, difficulty=right.difficulty, version=right.version, + run_code=run_code, ) diff --git a/app/parser/run_code.py b/app/parser/run_code.py new file mode 100644 index 0000000..333fd14 --- /dev/null +++ b/app/parser/run_code.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from dataclasses import dataclass, replace +import re + + +RUN_CODE_MIN_CONFIDENCE = 0.9 + +_LABEL = r"(?:本局\s*代码|run\s*code)" +_GROUP = r"[1-9]\d{3}" +_SEPARATOR = r"[-‐‑‒–—−-]" +_LABEL_PATTERN = re.compile(_LABEL, re.IGNORECASE) +_CANDIDATE_PATTERN = re.compile( + rf"{_LABEL}\s*[::]?\s*" + rf"(?P(?P{_GROUP})\s*(?P{_SEPARATOR})\s*" + rf"(?P{_GROUP})\s*(?P{_SEPARATOR})\s*(?P{_GROUP})(?!\d))", + re.IGNORECASE, +) + + +@dataclass(frozen=True) +class ParsedRunCode: + value: str | None + status: str + normalization: tuple[str, ...] = () + warning: str | None = None + + +def parse_run_code(text: str) -> ParsedRunCode: + labels = list(_LABEL_PATTERN.finditer(text)) + if not labels: + return ParsedRunCode(value=None, status="missing") + + candidates = list(_CANDIDATE_PATTERN.finditer(text)) + if len(candidates) != len(labels): + return ParsedRunCode(value=None, status="invalid", warning="run_code.invalid") + + normalized_codes = { + "-".join(match.group(name) for name in ("first", "second", "third")) + for match in candidates + } + if len(normalized_codes) != 1: + return ParsedRunCode(value=None, status="ambiguous", warning="run_code.ambiguous") + + candidate = candidates[0] + raw = candidate.group("raw") + normalization: list[str] = [] + if candidate.group("separator_one") != "-" or candidate.group("separator_two") != "-": + normalization.append("separator:canonical-hyphen") + if re.search(r"\s", raw): + normalization.append("whitespace:trimmed") + + return ParsedRunCode( + value=normalized_codes.pop(), + status="ok", + normalization=tuple(normalization), + ) + + +def enforce_run_code_confidence(parsed: ParsedRunCode, confidence: float) -> ParsedRunCode: + if parsed.value is not None and confidence < RUN_CODE_MIN_CONFIDENCE: + return replace( + parsed, + value=None, + status="low_confidence", + warning="run_code.low_confidence", + ) + return parsed diff --git a/app/schemas/response.py b/app/schemas/response.py index 2c5f128..c14520b 100644 --- a/app/schemas/response.py +++ b/app/schemas/response.py @@ -48,6 +48,7 @@ class ChallengeData(BaseModel): map_variant: str | None difficulty: str | None version: str | None + run_code: str | None = None class ChallengeResponse(BaseModel): diff --git a/app/service.py b/app/service.py index 78d76f6..3548d06 100644 --- a/app/service.py +++ b/app/service.py @@ -12,6 +12,7 @@ from app.parser.left_panel import parse_left_panel from app.parser.result_merger import merge_result from app.parser.right_panel import parse_right_panel +from app.parser.run_code import ParsedRunCode, enforce_run_code_confidence, parse_run_code from app.schemas.response import ChallengeResponse, DebugPayload, FieldEvidence, QualityPayload @@ -32,6 +33,7 @@ "map_variant": ("right_panel",), "difficulty": ("right_panel",), "version": ("right_panel",), + "run_code": ("run_code_panel",), } @@ -47,11 +49,24 @@ def _field_evidence(name: str, value: Any, confidences: dict[str, float]) -> Fie ) -def _build_field_evidence(data, confidences: dict[str, float]) -> dict[str, FieldEvidence]: - return { +def _build_field_evidence( + data, + confidences: dict[str, float], + run_code: ParsedRunCode, +) -> dict[str, FieldEvidence]: + fields = { name: _field_evidence(name, getattr(data, name), confidences) for name in _FIELD_ROIS } + run_code_confidence = confidences.get("run_code_panel", 0.0) + fields["run_code"] = FieldEvidence( + value=data.run_code, + confidence=run_code_confidence if run_code.status != "missing" else 0.0, + source_roi=list(_FIELD_ROIS["run_code"]), + normalization=list(run_code.normalization), + status=run_code.status, + ) + return fields def extract_structured( @@ -84,6 +99,10 @@ def extract_structured( achievement_text = raw_text.get("achievement_panel", "") title_text = " ".join(part for part in (left_text, achievement_text) if part) left = parse_left_panel(title_text, achievement_titles) if achievement_titles else parse_left_panel(title_text) + run_code = enforce_run_code_confidence( + parse_run_code(raw_text.get("run_code_panel", "")), + confidences.get("run_code_panel", 0.0), + ) bottom_left = parse_bottom_left_hero(raw_text.get("bottom_left_hero", "")) right = parse_right_panel(raw_text.get("right_panel", ""), map_names, map_aliases) data = merge_result( @@ -92,6 +111,7 @@ def extract_structured( bottom_left, right, achievement_panel_text=achievement_text.strip() or None, + run_code=run_code.value, ) warnings: list[str] = list(input_quality["warnings"]) @@ -101,6 +121,8 @@ def extract_structured( warnings.append("left_panel.deaths_skips_missing") if data.version is None: warnings.append("right_panel.version_missing") + if run_code.warning is not None: + warnings.append(run_code.warning) debug_payload = None if include_debug: debug_payload = DebugPayload( @@ -125,7 +147,7 @@ def extract_structured( layout_version=layout_version, ok=True, data=data, - fields=_build_field_evidence(data, confidences), + fields=_build_field_evidence(data, confidences, run_code), warnings=warnings, quality=QualityPayload( original_size=input_quality["original_size"], diff --git a/configs/roi_1280x720.manifest.json b/configs/roi_1280x720.manifest.json index 15df4b7..0c90484 100644 --- a/configs/roi_1280x720.manifest.json +++ b/configs/roi_1280x720.manifest.json @@ -1,6 +1,6 @@ { "schema_version": "1", - "layout_version": "1280x720-v5", + "layout_version": "1280x720-v6", "standard_size": { "width": 1280, "height": 720 @@ -12,6 +12,12 @@ "x2": 220, "y2": 470 }, + "run_code_panel": { + "x1": 30, + "y1": 190, + "x2": 360, + "y2": 285 + }, "achievement_panel": { "x1": 35, "y1": 10, diff --git a/configs/roi_1280x720.yaml b/configs/roi_1280x720.yaml index 5348a85..0033ba7 100644 --- a/configs/roi_1280x720.yaml +++ b/configs/roi_1280x720.yaml @@ -1,4 +1,4 @@ -layout_version: 1280x720-v5 +layout_version: 1280x720-v6 standard_size: width: 1280 @@ -11,6 +11,12 @@ rois: x2: 220 y2: 470 + run_code_panel: + x1: 30 + y1: 190 + x2: 360 + y2: 285 + achievement_panel: x1: 35 y1: 10 diff --git a/scripts/batch_eval.py b/scripts/batch_eval.py index a28c044..e5eab6b 100644 --- a/scripts/batch_eval.py +++ b/scripts/batch_eval.py @@ -15,6 +15,10 @@ from app.service import extract_structured +DEFAULT_RUN_CODE_CASES = Path("tests/fixtures/run_code/cases.json") +DEFAULT_RUN_CODE_IMAGES_DIR = Path("tests/fixtures/run_code") + + def evaluate(cases_path: Path, images_dir: Path, model_config: Path | None = None) -> dict[str, object]: cases = json.loads(cases_path.read_text(encoding="utf-8")) context = create_context() @@ -76,11 +80,16 @@ def main() -> None: parser = ArgumentParser(description="Evaluate OCRKit against the checked-in challenge fixtures.") parser.add_argument("--cases", type=Path, default=Path("datasets/fixtures/challenge/cases.json")) parser.add_argument("--images-dir", type=Path, default=Path("datasets/fixtures/challenge")) + parser.add_argument("--run-code-cases", type=Path, default=DEFAULT_RUN_CODE_CASES) + parser.add_argument("--run-code-images-dir", type=Path, default=DEFAULT_RUN_CODE_IMAGES_DIR) parser.add_argument("--model-config", type=Path) parser.add_argument("--report", type=Path) parser.add_argument("--min-field-accuracy", type=float) + parser.add_argument("--min-run-code-accuracy", type=float, default=1.0) args = parser.parse_args() result = evaluate(args.cases, args.images_dir, args.model_config) + run_code_result = evaluate(args.run_code_cases, args.run_code_images_dir, args.model_config) + result["run_code"] = run_code_result if args.report is not None: args.report.parent.mkdir(parents=True, exist_ok=True) args.report.write_text(json.dumps(result, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") @@ -88,6 +97,11 @@ def main() -> None: raise SystemExit( f"fixture field accuracy {result['field_accuracy']:.6f} is below {args.min_field_accuracy:.6f}" ) + if args.min_run_code_accuracy is not None and run_code_result["field_accuracy"] < args.min_run_code_accuracy: + raise SystemExit( + "run-code fixture exact-match accuracy " + f"{run_code_result['field_accuracy']:.6f} is below {args.min_run_code_accuracy:.6f}" + ) print(json.dumps(result, ensure_ascii=False, indent=2)) diff --git a/tests/fixtures/run_code/cases.json b/tests/fixtures/run_code/cases.json new file mode 100644 index 0000000..c45caa3 --- /dev/null +++ b/tests/fixtures/run_code/cases.json @@ -0,0 +1,50 @@ +[ + { + "id": "clean_1280", + "image": "run_code_clean_1280.png", + "notes": "Synthetic 1280x720 settlement-panel fixture with surrounding numeric statistics.", + "expected": {"run_code": "4821-7354-1926"} + }, + { + "id": "high_res_2560", + "image": "run_code_high_res_2560.png", + "notes": "Synthetic 2560x1440 source normalized into the standard layout.", + "expected": {"run_code": "7246-3815-9472"} + }, + { + "id": "compressed", + "image": "run_code_compressed.jpg", + "notes": "Synthetic JPEG with mild compression artifacts.", + "expected": {"run_code": "1642-7395-8206"} + }, + { + "id": "scaled_1600", + "image": "run_code_scaled_1600.png", + "notes": "Synthetic 1600x900 source with a slightly different screenshot scale.", + "expected": {"run_code": "9134-2687-5410"} + }, + { + "id": "missing", + "image": "run_code_missing_1280.png", + "notes": "Synthetic supported legacy-style panel without a run-code field.", + "expected": {"run_code": null} + }, + { + "id": "cropped", + "image": "run_code_cropped_1200.png", + "notes": "Synthetic cropped source without the expected run-code region.", + "expected": {"run_code": null} + }, + { + "id": "ambiguous", + "image": "run_code_ambiguous_1280.png", + "notes": "Synthetic conflicting candidates; neither must be accepted.", + "expected": {"run_code": null} + }, + { + "id": "malformed", + "image": "run_code_malformed_1280.png", + "notes": "Synthetic labelled value with a short final group; it must not be repaired.", + "expected": {"run_code": null} + } +] diff --git a/tests/fixtures/run_code/run_code_ambiguous_1280.png b/tests/fixtures/run_code/run_code_ambiguous_1280.png new file mode 100644 index 0000000000000000000000000000000000000000..c2133cb61e26f1e216d9b003092370cbc4bc5aaa GIT binary patch literal 14401 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 HoB#YD*2N}z literal 0 HcmV?d00001 diff --git a/tests/fixtures/run_code/run_code_compressed.jpg b/tests/fixtures/run_code/run_code_compressed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d626ff65de649bc405d9916c172098a8ccbd802 GIT binary patch literal 14427 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