schale 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- schale-0.1.0/.github/workflows/ci.yml +23 -0
- schale-0.1.0/CHANGELOG.md +16 -0
- schale-0.1.0/CONTRIBUTING.md +27 -0
- schale-0.1.0/LICENSE +21 -0
- schale-0.1.0/PKG-INFO +179 -0
- schale-0.1.0/README.md +144 -0
- schale-0.1.0/THIRD_PARTY_NOTICES.md +48 -0
- schale-0.1.0/docs/architecture.md +63 -0
- schale-0.1.0/docs/assets.md +89 -0
- schale-0.1.0/docs/cache.md +69 -0
- schale-0.1.0/docs/inputs.md +57 -0
- schale-0.1.0/docs/inventory.md +54 -0
- schale-0.1.0/docs/releasing.md +49 -0
- schale-0.1.0/docs/student-model-notice.md +22 -0
- schale-0.1.0/docs/students.md +141 -0
- schale-0.1.0/docs/validation-0.1.0.md +26 -0
- schale-0.1.0/pyproject.toml +74 -0
- schale-0.1.0/scripts/bundle_student_model.py +28 -0
- schale-0.1.0/scripts/check_distribution.py +96 -0
- schale-0.1.0/scripts/validate_inventory.py +225 -0
- schale-0.1.0/src/schale/__init__.py +25 -0
- schale-0.1.0/src/schale/__main__.py +5 -0
- schale-0.1.0/src/schale/account.py +93 -0
- schale-0.1.0/src/schale/adapters/__init__.py +1 -0
- schale-0.1.0/src/schale/adapters/extraction.py +58 -0
- schale-0.1.0/src/schale/adapters/schaledb.py +160 -0
- schale-0.1.0/src/schale/assets.py +215 -0
- schale-0.1.0/src/schale/assets_cli.py +49 -0
- schale-0.1.0/src/schale/cache.py +503 -0
- schale-0.1.0/src/schale/cache_cli.py +203 -0
- schale-0.1.0/src/schale/cache_control.py +141 -0
- schale-0.1.0/src/schale/cli.py +316 -0
- schale-0.1.0/src/schale/collections.py +120 -0
- schale-0.1.0/src/schale/data_control.py +36 -0
- schale-0.1.0/src/schale/format_reward.py +27 -0
- schale-0.1.0/src/schale/inputs.py +243 -0
- schale-0.1.0/src/schale/literal.py +77 -0
- schale-0.1.0/src/schale/localization.py +325 -0
- schale-0.1.0/src/schale/py.typed +0 -0
- schale-0.1.0/src/schale/reference.py +83 -0
- schale-0.1.0/src/schale/scanner/__init__.py +139 -0
- schale-0.1.0/src/schale/scanner/_cnn.py +290 -0
- schale-0.1.0/src/schale/scanner/_grid.py +102 -0
- schale-0.1.0/src/schale/scanner/_icons.py +114 -0
- schale-0.1.0/src/schale/scanner/_identity.py +157 -0
- schale-0.1.0/src/schale/scanner/_ocr.py +201 -0
- schale-0.1.0/src/schale/scanner/_preprocessing.py +161 -0
- schale-0.1.0/src/schale/scanner/training/__init__.py +182 -0
- schale-0.1.0/src/schale/scanner/training/augment.py +76 -0
- schale-0.1.0/src/schale/scanner/training/dataset.py +304 -0
- schale-0.1.0/src/schale/scanner/training/export.py +305 -0
- schale-0.1.0/src/schale/scanner/training/model.py +200 -0
- schale-0.1.0/src/schale/scanner/training/train.py +696 -0
- schale-0.1.0/src/schale/schema/equipments.py +60 -0
- schale-0.1.0/src/schale/schema/furniture.py +43 -0
- schale-0.1.0/src/schale/schema/group.py +37 -0
- schale-0.1.0/src/schale/schema/item.py +115 -0
- schale-0.1.0/src/schale/schema/scanner.py +95 -0
- schale-0.1.0/src/schale/schema/stages.py +116 -0
- schale-0.1.0/src/schale/stage_rewards.py +231 -0
- schale-0.1.0/src/schale/students/__init__.py +1 -0
- schale-0.1.0/src/schale/students/audit.py +38 -0
- schale-0.1.0/src/schale/students/benchmark.py +585 -0
- schale-0.1.0/src/schale/students/catalog.py +67 -0
- schale-0.1.0/src/schale/students/export.py +64 -0
- schale-0.1.0/src/schale/students/extract.py +325 -0
- schale-0.1.0/src/schale/students/identity.py +188 -0
- schale-0.1.0/src/schale/students/inspector.html +104 -0
- schale-0.1.0/src/schale/students/inspector.py +470 -0
- schale-0.1.0/src/schale/students/labels.py +196 -0
- schale-0.1.0/src/schale/students/layout.py +150 -0
- schale-0.1.0/src/schale/students/model_bundle.py +99 -0
- schale-0.1.0/src/schale/students/models.py +44 -0
- schale-0.1.0/src/schale/students/numeric.py +218 -0
- schale-0.1.0/src/schale/students/paths.py +17 -0
- schale-0.1.0/src/schale/students/review.py +37 -0
- schale-0.1.0/src/schale/students/runtime.py +49 -0
- schale-0.1.0/src/schale/students/video.py +256 -0
- schale-0.1.0/src/schale/students/vision.py +330 -0
- schale-0.1.0/src/schale/toolkit_cli.py +200 -0
- schale-0.1.0/src/schale/vision/__init__.py +1 -0
- schale-0.1.0/src/schale/vision/text.py +77 -0
- schale-0.1.0/tests/__init__.py +1 -0
- schale-0.1.0/tests/conftest.py +45 -0
- schale-0.1.0/tests/test_assets.py +175 -0
- schale-0.1.0/tests/test_dependency_policy.py +68 -0
- schale-0.1.0/tests/test_distribution.py +265 -0
- schale-0.1.0/tests/test_http_cache.py +344 -0
- schale-0.1.0/tests/test_inputs.py +180 -0
- schale-0.1.0/tests/test_inventory_onnx.py +251 -0
- schale-0.1.0/tests/test_parsing.py +27 -0
- schale-0.1.0/tests/test_scanner.py +337 -0
- schale-0.1.0/tests/test_students.py +270 -0
- schale-0.1.0/tests/test_students_benchmark.py +117 -0
- schale-0.1.0/tests/test_students_inspector.py +161 -0
- schale-0.1.0/tests/test_students_layout.py +82 -0
- schale-0.1.0/tests/test_students_numeric.py +255 -0
- schale-0.1.0/tests/test_toolkit.py +333 -0
- schale-0.1.0/uv.lock +1364 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Package and contracts
|
|
2
|
+
on: [push, pull_request, workflow_dispatch]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
test:
|
|
7
|
+
strategy:
|
|
8
|
+
matrix:
|
|
9
|
+
os: [ubuntu-latest, windows-latest]
|
|
10
|
+
python: ['3.12', '3.13']
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
env:
|
|
13
|
+
SCHALE_CACHE_DIR: ${{ github.workspace }}/.schale/ci-cache
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: astral-sh/setup-uv@v6
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python }}
|
|
19
|
+
- run: uv sync --locked --no-default-groups --group test
|
|
20
|
+
- run: uv run --no-default-groups --group test pytest tests/test_assets.py tests/test_inventory_onnx.py tests/test_dependency_policy.py tests/test_http_cache.py tests/test_inputs.py tests/test_toolkit.py tests/test_students.py tests/test_students_numeric.py tests/test_students_layout.py tests/test_students_inspector.py tests/test_distribution.py -q
|
|
21
|
+
- run: uv build --no-sources
|
|
22
|
+
- run: uv run --no-default-groups python scripts/check_distribution.py dist/schale-0.1.0-py3-none-any.whl dist/schale-0.1.0.tar.gz
|
|
23
|
+
- run: uvx twine check --strict dist/schale-0.1.0-py3-none-any.whl dist/schale-0.1.0.tar.gz
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 — 최초 공개 버전
|
|
4
|
+
|
|
5
|
+
- 학생·인벤토리의 공통 ONNX CTC 엔진. 실행용 extras는 Torch/EasyOCR 없이 동작하며 학습은 명시적 `training` 그룹으로 분리.
|
|
6
|
+
- 인벤토리 격자 정합, 카탈로그 아이콘 검증, 수량 실패/축약 구분, 칸별 ROI·후보·판독 근거와 정확도 대조 보고서.
|
|
7
|
+
- SchaleDB 호환 자동화 툴킷: 기준 데이터, 공통 계정 모델, 컬렉션 import/diff/merge/export, 보상 계산.
|
|
8
|
+
- 영상·단일 이미지·폴더·목록·인코딩 bytes·이미지 매니페스트를 받는 공통 추출 API.
|
|
9
|
+
- 이미지 중복 픽셀 제거, 내용 기반 입력 지문, 이미지 순서 기반 감독 보고서.
|
|
10
|
+
- JSON·스킬·초상화·장비 아이콘의 공유 HTTP 캐시: TTL, ETag/Last-Modified, SHA-256, 원자 저장, 내용 중복 제거, 변경 이력.
|
|
11
|
+
- 자동/수동/오프라인 정책, 증분 갱신 CLI, 동시 요청 합치기, 속도 제한, 오류 재시도 유예.
|
|
12
|
+
- 선택형 ONNX 학생 인식, UI 정합·ROI 감독, 모델 설치와 무결성 검사.
|
|
13
|
+
- MIT 및 제3자 고지, API/사용/확장 문서, 테스트·빌드·배포 검사.
|
|
14
|
+
- 코드와 게임 참조·학습 모델의 분리. 로컬 자원 ZIP 설치, SHA-256 검증, 내용별 캐시 저장과 이전 버전 보존.
|
|
15
|
+
|
|
16
|
+
게임 이미지·UI 참조·학습 모델은 Git 소스 및 Python 배포본에 포함하지 않습니다. 비전 기능은 사용자가 준비한 별도 로컬 자원을 사용합니다.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 개발 안내
|
|
2
|
+
|
|
3
|
+
Python 3.12+와 uv를 사용합니다. [구조와 확장 계약](docs/architecture.md)을 먼저 확인하세요.
|
|
4
|
+
|
|
5
|
+
```powershell
|
|
6
|
+
# 학습/인벤토리 개발 의존성 없는 회귀 테스트
|
|
7
|
+
uv sync --no-default-groups --group test
|
|
8
|
+
uv run --no-default-groups --group test pytest tests/test_toolkit.py tests/test_students.py tests/test_students_numeric.py tests/test_students_layout.py tests/test_students_inspector.py tests/test_distribution.py -q
|
|
9
|
+
|
|
10
|
+
# 기본 개발 환경: 학생 ONNX 추론과 테스트, Torch/EasyOCR 제외
|
|
11
|
+
uv sync
|
|
12
|
+
uv run pytest -q
|
|
13
|
+
|
|
14
|
+
# 학습/CNN 비교 실험을 개발할 때만 (CPU Torch 포함)
|
|
15
|
+
uv run --group training pytest tests/test_students_benchmark.py -q
|
|
16
|
+
|
|
17
|
+
# 인벤토리 ONNX 계약 (Torch 불필요)
|
|
18
|
+
uv run pytest tests/test_inventory_onnx.py tests/test_scanner.py -q
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Torch가 없는 환경에서는 학습 전용 `test_students_benchmark.py` 모듈을 건너뜁니다. 로컬 장비 모델이 없으면 해당 모델 통합 검사도 건너뜁니다. 게임 자원 없는 CI는 생성한 도형·배열로 계약을 검증하며 실제 정확도는 별도 평가합니다. 학습 코드를 수정할 때는 반드시 `training` 그룹을 선택해 해당 테스트를 실행하세요. 학습 모듈을 포함하는 프로젝트 전체 타입 검사는 `uv run --group training pyright`로 수행합니다.
|
|
22
|
+
|
|
23
|
+
단위 테스트는 최소 fixture로 계약을 검증합니다. fixture 추론 모델은 정확도 평가에 쓰지 않습니다. `test_parsing.py`는 SchaleDB 접속 또는 캐시가 필요합니다. `test_scanner.py`의 일부는 별도 예제 이미지가 없으면 건너뜁니다. 실제 정확도는 동의하에 제공된 영상과 독립 정답으로 검증하고 개인 영상·계정 JSON을 저장소/배포본에 넣지 않습니다.
|
|
24
|
+
|
|
25
|
+
새 기능에는 Python API, 필요한 CLI, 데이터 보존·실패 테스트, 사용 예시를 함께 추가하세요. 기존 `students` 명령과 `Extraction` 형식은 보존합니다. 의존성은 필요한 extra에만 넣고 코어 import가 비전 런타임을 로드하지 않는지 검사합니다. 변경 파일은 Ruff 검사/포맷을 적용하고 프로젝트 전체 Pyright를 확인합니다.
|
|
26
|
+
|
|
27
|
+
UI 판독 변경은 원본 영상·미사용 촬영 조건 검증이 필요합니다. 기존 입력 통과를 일반화 보증으로 표현하지 않습니다. [배포 절차](docs/releasing.md)의 실제 모델 검증은 CI의 패키지·회귀 검사와 별개입니다.
|
schale-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 schale contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
schale-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: schale
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: SchaleDB-compatible Blue Archive automation toolkit: data, collections, rewards, and vision
|
|
5
|
+
Keywords: blue-archive,schaledb,automation,collections,computer-vision
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
License-File: THIRD_PARTY_NOTICES.md
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Topic :: Multimedia :: Video
|
|
14
|
+
Requires-Dist: pydantic>=2.12.5
|
|
15
|
+
Requires-Dist: requests>=2.32.5
|
|
16
|
+
Requires-Dist: typer>=0.15.3
|
|
17
|
+
Requires-Dist: filelock>=3.20.3
|
|
18
|
+
Requires-Dist: opencv-python>=4.10.0 ; extra == 'scanner'
|
|
19
|
+
Requires-Dist: pillow>=10.0 ; extra == 'scanner'
|
|
20
|
+
Requires-Dist: numpy>=1.26.0 ; extra == 'scanner'
|
|
21
|
+
Requires-Dist: onnxruntime>=1.23.2 ; extra == 'scanner'
|
|
22
|
+
Requires-Dist: opencv-python>=4.10.0 ; extra == 'student-ocr'
|
|
23
|
+
Requires-Dist: numpy>=1.26.0 ; extra == 'student-ocr'
|
|
24
|
+
Requires-Dist: pillow>=10.0 ; extra == 'student-ocr'
|
|
25
|
+
Requires-Dist: onnxruntime>=1.23.2 ; extra == 'student-ocr'
|
|
26
|
+
Requires-Dist: opencv-python>=4.10.0 ; extra == 'vision'
|
|
27
|
+
Requires-Dist: numpy>=1.26.0 ; extra == 'vision'
|
|
28
|
+
Requires-Python: >=3.12
|
|
29
|
+
Project-URL: Repository, https://github.com/c0sogi/schale
|
|
30
|
+
Project-URL: Issues, https://github.com/c0sogi/schale/issues
|
|
31
|
+
Provides-Extra: scanner
|
|
32
|
+
Provides-Extra: student-ocr
|
|
33
|
+
Provides-Extra: vision
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
# Schale
|
|
37
|
+
|
|
38
|
+
**SchaleDB 데이터와 호환되는 Blue Archive 자동화 툴킷.**
|
|
39
|
+
|
|
40
|
+
게임의 기준 데이터와 사용자의 계정 상태를 연결하고, 반복적인 정보 수집·비교·갱신·계산을 재사용 가능한 Python API와 CLI로 제공합니다. 영상 인식은 여러 입력 방식 중 하나입니다. 새로운 도구도 같은 학생 ID와 공통 데이터 모델을 사용해 기존 도구와 조합할 수 있도록 확장합니다.
|
|
41
|
+
|
|
42
|
+
## 설계 원칙
|
|
43
|
+
|
|
44
|
+
- **SchaleDB 호환성:** 기준 ID를 재사용하고, 사이트 저장 형식은 어댑터에서 처리합니다.
|
|
45
|
+
- **관측과 사실의 구분:** 값, 확인 상태, 출처를 함께 보관합니다. 미확인은 0이 아니며, 화면에 없었다고 미보유로 판단하지 않습니다.
|
|
46
|
+
- **조합 가능한 도구:** 데이터 조회, 계정 처리, 보상 계산, 비전 추출을 독립적으로 실행하거나 Python에서 연결합니다.
|
|
47
|
+
- **가벼운 코어:** 일반 데이터 자동화에는 OpenCV·ONNX Runtime·PyTorch가 필요하지 않습니다.
|
|
48
|
+
- **검토 가능한 자동화:** 원본을 보존하고 병합·내보내기의 적용 및 보류 이유를 남깁니다. 사이트 업로드나 게임 조작은 자동 실행하지 않습니다.
|
|
49
|
+
|
|
50
|
+
## 현재 기능
|
|
51
|
+
|
|
52
|
+
| 기능 | CLI | 결과 |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| SchaleDB 기준 데이터 조회 | `data fetch` | 정의 JSON + 출처·내용 해시 |
|
|
55
|
+
| 사이트 육성정보 가져오기 | `collection import` | 공통 `AccountSnapshot` |
|
|
56
|
+
| 영상 추출 결과 연결 | `collection from-extraction` | 19개 육성 필드·상태·시각 근거 |
|
|
57
|
+
| 계정 비교·안전한 갱신 | `collection diff`, `collection merge` | 변경 내역, 병합 결과·보류 보고서 |
|
|
58
|
+
| SchaleDB 호환 내보내기 | `collection export` | 사이트 가져오기 문자열 + 보고서 |
|
|
59
|
+
| 스테이지 보상 기대값 | `rewards calculate` | 서버·조건별 1회 보상 기대값 |
|
|
60
|
+
| 학생 정보 영상·스크린샷 분석 | `students extract`, `students inspect` | 학생별 이미지·판독·감독 화면 |
|
|
61
|
+
| 인벤토리 스캔 | `scan` | 아이템 ID·티어·수량 표기·칸별 판독 근거 |
|
|
62
|
+
|
|
63
|
+
소재 소요량 계산, 육성 계획 최적화, 새로운 화면/게임 조작 자동화는 향후 확장 대상이며 0.1.0의 구현 기능에 포함하지 않습니다.
|
|
64
|
+
|
|
65
|
+
## 설치
|
|
66
|
+
|
|
67
|
+
Python 3.12 이상이 필요합니다.
|
|
68
|
+
|
|
69
|
+
```powershell
|
|
70
|
+
# CLI: 데이터·계정·보상 도구
|
|
71
|
+
uv tool install "schale==0.1.0"
|
|
72
|
+
# Python 프로젝트에 추가할 때
|
|
73
|
+
uv add "schale==0.1.0"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
학생 비전도 사용하려면 위 CLI 설치 대신 다음으로 설치합니다. 기본 설치가 이미 있다면 `uv tool install --reinstall`로 extras를 추가하세요.
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
uv tool install "schale[student-ocr,scanner]==0.1.0"
|
|
80
|
+
schale assets install ".\my-vision-resources.zip"
|
|
81
|
+
schale students install-model ".\schale-student-numeric-v1.zip"
|
|
82
|
+
schale students doctor
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
영상 처리에는 별도 설치한 `ffmpeg`와 `ffprobe`가 PATH에 있어야 합니다. 학생 인식은 `student-ocr`, 인벤토리는 `scanner`, 템플릿 전용은 `vision` extra입니다. 학생·인벤토리 문자 인식은 같은 ONNX 엔진과 별도 설치한 문자 모델을 공유합니다.
|
|
86
|
+
|
|
87
|
+
**PyPI 패키지는 코드만 제공합니다.** 게임 이미지·UI 참조·장비 모델은 포함하지 않으며 자동으로 내려받지 않습니다. 비전 기능에는 사용자가 별도로 준비한 신뢰할 수 있는 로컬 참조 번들과 문자 모델이 필요합니다. 현재 공개 배포하는 게임 참조 번들은 없습니다. 자원 준비 전에도 데이터·계정·보상 기능은 사용할 수 있습니다. [로컬 비전 자원 구성](docs/assets.md)을 확인하세요.
|
|
88
|
+
|
|
89
|
+
모든 실행용 extras와 기본 개발·테스트 환경은 Torch/EasyOCR를 설치하지 않습니다. 학습·CNN 비교 실험만 `uv run --group training ...`으로 선택하며 CPU Torch를 사용합니다.
|
|
90
|
+
|
|
91
|
+
## 계정 워크플로
|
|
92
|
+
|
|
93
|
+
사이트의 기존 컬렉션을 보존하면서 새 영상의 확인된 값만 반영하는 예입니다. 출력 경로는 새 파일/폴더여야 합니다.
|
|
94
|
+
|
|
95
|
+
```powershell
|
|
96
|
+
schale data fetch students --region kr --output students.json
|
|
97
|
+
schale collection import existing-export.txt --catalog students.json --output account.json
|
|
98
|
+
schale students extract recording.mp4 --output recording-result
|
|
99
|
+
schale collection from-extraction recording-result/results.json --output observed.json
|
|
100
|
+
schale collection diff account.json observed.json --output differences.json
|
|
101
|
+
schale collection merge account.json observed.json --output merged.json
|
|
102
|
+
schale collection export merged.json --base existing-export.txt --output schaledb.txt
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
비전 없이 사이트 내보내기 두 개를 각각 가져와 비교·병합할 수도 있습니다. 기본 병합은 `confirmed`, `corrected`, `imported` 값만 수용합니다. 미확인 신원/필드는 보고서에 보류하며 원본 관측 파일에 남습니다. 관측 시각으로 자동 정렬하지 않으므로 **incoming은 사용자가 최신 또는 우선할 데이터로 선택**해야 합니다.
|
|
106
|
+
|
|
107
|
+
SchaleDB 가져오기는 컬렉션 전체를 교체합니다. 기존 사이트 내보내기를 보관하고 `--base`로 전달하세요. 도구는 사이트 계정을 변경하지 않습니다. 장비 자체 레벨은 공통 모델에 남지만 사이트 포맷에 없어 내보내지 못합니다. 잠긴 일반 스킬의 0은 사이트 최소값 1로 변환됩니다.
|
|
108
|
+
|
|
109
|
+
```powershell
|
|
110
|
+
schale rewards calculate --stage 1011101 --server Global --output rewards.json
|
|
111
|
+
schale rewards calculate --stage 1011101 --condition FirstClear --output first-clear.json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
기본은 조건 없는 보상이며 `--condition`은 해당 조건의 보상을 추가합니다. 기대값은 확정 드롭 수량이나 최적 파밍 계획이 아닙니다.
|
|
115
|
+
|
|
116
|
+
## 유연한 입력
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
from pathlib import Path
|
|
120
|
+
from schale import ImageBatch, ImageInput
|
|
121
|
+
from schale.students.extract import extract
|
|
122
|
+
|
|
123
|
+
extract(Path("recording.mp4"), Path("out-video"))
|
|
124
|
+
extract(Path("screenshots"), Path("out-folder"))
|
|
125
|
+
extract([Path("a.png"), Path("b.webp")], Path("out-list"))
|
|
126
|
+
extract(ImageBatch([ImageInput(Path("a.png").read_bytes(), name="capture")]), Path("out-memory"))
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
단일 이미지, 디렉터리, 명시적 이미지 목록, 인코딩된 이미지 bytes, JSON 매니페스트를 받습니다. 동일 픽셀은 중복 제거하여 확인 근거를 부풀리지 않습니다. [입력 계약과 예시](docs/inputs.md)를 참고하세요.
|
|
130
|
+
|
|
131
|
+
## Python API
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
from pathlib import Path
|
|
135
|
+
from schale import AccountSnapshot, ReferenceCatalog, StageRewards
|
|
136
|
+
from schale.adapters.schaledb import from_schaledb, to_schaledb
|
|
137
|
+
from schale.collections import compare, merge
|
|
138
|
+
|
|
139
|
+
catalog = ReferenceCatalog.fetch("students", region="kr")
|
|
140
|
+
base = from_schaledb(Path("existing-export.txt").read_text(), catalog=catalog)
|
|
141
|
+
incoming = AccountSnapshot.model_validate_json(Path("observed.json").read_text())
|
|
142
|
+
changes = compare(base, incoming)
|
|
143
|
+
updated, merge_report = merge(base, incoming)
|
|
144
|
+
encoded, export_report = to_schaledb(updated)
|
|
145
|
+
rewards = StageRewards.from_stages([1011101], server="Global")
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
학생 추출은 `schale.students.extract.extract`, 보상 계산은 `StageRewards`, 계정 교환은 `schale.adapters`에서 제공합니다. 학생 추출 결과는 `Extraction/results.json`과 원본 판독 근거로 구성됩니다.
|
|
149
|
+
|
|
150
|
+
## 캐시와 지원 범위
|
|
151
|
+
|
|
152
|
+
공유 캐시는 사용자 홈의 `.schale/cache`이며 `SCHALE_CACHE_DIR`로 변경합니다. 모든 SchaleDB JSON·이미지는 조건부 HTTP 캐시를 사용합니다. 기본 자동 모드는 사용 시 만료된 항목만 갱신하며, 유효 기간 안에는 HTTP 요청을 하지 않습니다. JSON 7일·이미지 30일 TTL, ETag/Last-Modified 재검증, SHA-256 무결성 확인, 콘텐츠 중복 제거, 프로세스 간 요청 합치기, 요청 간격 제한과 오류 재시도 유예를 제공합니다. 사용자 영상/계정은 캐시에 넣지 않습니다.
|
|
153
|
+
|
|
154
|
+
```powershell
|
|
155
|
+
schale cache info
|
|
156
|
+
schale cache update # 이미 사용한 리소스 중 만료/누락만
|
|
157
|
+
schale cache update --refresh # 유효한 항목도 조건부 재검증
|
|
158
|
+
schale cache history
|
|
159
|
+
schale cache verify
|
|
160
|
+
schale cache policy --mode manual # 자동 재검증 끄기 (최초 누락은 받음)
|
|
161
|
+
schale cache policy --mode offline # 최초 누락도 받지 않음
|
|
162
|
+
schale cache policy --mode auto
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
캐시는 파일 단위 증분입니다. 서버가 변경을 알리면 해당 JSON/이미지를 다시 받으며, JSON 내부 개별 학생만 전송받는 delta API는 사용하지 않습니다. 실패 시 검증된 이전 버전만 사용하고 오류/재시도 시각을 기록합니다. 숫자 모델은 신뢰할 수 있는 로컬 번들을 별도 설치하며 자동 원격 교체하지 않습니다. [캐시 정책과 트래픽](docs/cache.md)을 참고하세요.
|
|
166
|
+
|
|
167
|
+
학생 비전은 한국어 16:9 정보 화면용입니다. 위치·균일 배율 차이를 보정하지만 모든 언어·레이아웃·촬영 조건을 지원하지 않습니다. `confirmed`는 다중 관측 일치이며 정답 보증이 아닙니다. Windows에서 배포본의 실제 영상 실행을 검증합니다. 다른 OS는 별도 실행 검증이 필요합니다.
|
|
168
|
+
|
|
169
|
+
## 문서
|
|
170
|
+
|
|
171
|
+
- [구조와 확장 계약](docs/architecture.md)
|
|
172
|
+
- [캐시 정책·증분 업데이트](docs/cache.md), [유연한 입력](docs/inputs.md)
|
|
173
|
+
- [로컬 비전 자원 설치·검증·구성](docs/assets.md)
|
|
174
|
+
- [학생 추출·검토·알고리즘 감독](docs/students.md)
|
|
175
|
+
- [인벤토리 판독·정확도 검증](docs/inventory.md)
|
|
176
|
+
- [개발 및 테스트](CONTRIBUTING.md)
|
|
177
|
+
- [배포 절차](docs/releasing.md), [변경 이력](CHANGELOG.md)
|
|
178
|
+
|
|
179
|
+
자체 코드는 MIT입니다. SchaleDB·Blue Archive의 공식 프로젝트가 아니며 모델·게임 이미지·상표의 권리는 원 권리자에게 있습니다. [제3자 고지](THIRD_PARTY_NOTICES.md)를 확인하세요.
|
schale-0.1.0/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Schale
|
|
2
|
+
|
|
3
|
+
**SchaleDB 데이터와 호환되는 Blue Archive 자동화 툴킷.**
|
|
4
|
+
|
|
5
|
+
게임의 기준 데이터와 사용자의 계정 상태를 연결하고, 반복적인 정보 수집·비교·갱신·계산을 재사용 가능한 Python API와 CLI로 제공합니다. 영상 인식은 여러 입력 방식 중 하나입니다. 새로운 도구도 같은 학생 ID와 공통 데이터 모델을 사용해 기존 도구와 조합할 수 있도록 확장합니다.
|
|
6
|
+
|
|
7
|
+
## 설계 원칙
|
|
8
|
+
|
|
9
|
+
- **SchaleDB 호환성:** 기준 ID를 재사용하고, 사이트 저장 형식은 어댑터에서 처리합니다.
|
|
10
|
+
- **관측과 사실의 구분:** 값, 확인 상태, 출처를 함께 보관합니다. 미확인은 0이 아니며, 화면에 없었다고 미보유로 판단하지 않습니다.
|
|
11
|
+
- **조합 가능한 도구:** 데이터 조회, 계정 처리, 보상 계산, 비전 추출을 독립적으로 실행하거나 Python에서 연결합니다.
|
|
12
|
+
- **가벼운 코어:** 일반 데이터 자동화에는 OpenCV·ONNX Runtime·PyTorch가 필요하지 않습니다.
|
|
13
|
+
- **검토 가능한 자동화:** 원본을 보존하고 병합·내보내기의 적용 및 보류 이유를 남깁니다. 사이트 업로드나 게임 조작은 자동 실행하지 않습니다.
|
|
14
|
+
|
|
15
|
+
## 현재 기능
|
|
16
|
+
|
|
17
|
+
| 기능 | CLI | 결과 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| SchaleDB 기준 데이터 조회 | `data fetch` | 정의 JSON + 출처·내용 해시 |
|
|
20
|
+
| 사이트 육성정보 가져오기 | `collection import` | 공통 `AccountSnapshot` |
|
|
21
|
+
| 영상 추출 결과 연결 | `collection from-extraction` | 19개 육성 필드·상태·시각 근거 |
|
|
22
|
+
| 계정 비교·안전한 갱신 | `collection diff`, `collection merge` | 변경 내역, 병합 결과·보류 보고서 |
|
|
23
|
+
| SchaleDB 호환 내보내기 | `collection export` | 사이트 가져오기 문자열 + 보고서 |
|
|
24
|
+
| 스테이지 보상 기대값 | `rewards calculate` | 서버·조건별 1회 보상 기대값 |
|
|
25
|
+
| 학생 정보 영상·스크린샷 분석 | `students extract`, `students inspect` | 학생별 이미지·판독·감독 화면 |
|
|
26
|
+
| 인벤토리 스캔 | `scan` | 아이템 ID·티어·수량 표기·칸별 판독 근거 |
|
|
27
|
+
|
|
28
|
+
소재 소요량 계산, 육성 계획 최적화, 새로운 화면/게임 조작 자동화는 향후 확장 대상이며 0.1.0의 구현 기능에 포함하지 않습니다.
|
|
29
|
+
|
|
30
|
+
## 설치
|
|
31
|
+
|
|
32
|
+
Python 3.12 이상이 필요합니다.
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
# CLI: 데이터·계정·보상 도구
|
|
36
|
+
uv tool install "schale==0.1.0"
|
|
37
|
+
# Python 프로젝트에 추가할 때
|
|
38
|
+
uv add "schale==0.1.0"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
학생 비전도 사용하려면 위 CLI 설치 대신 다음으로 설치합니다. 기본 설치가 이미 있다면 `uv tool install --reinstall`로 extras를 추가하세요.
|
|
42
|
+
|
|
43
|
+
```powershell
|
|
44
|
+
uv tool install "schale[student-ocr,scanner]==0.1.0"
|
|
45
|
+
schale assets install ".\my-vision-resources.zip"
|
|
46
|
+
schale students install-model ".\schale-student-numeric-v1.zip"
|
|
47
|
+
schale students doctor
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
영상 처리에는 별도 설치한 `ffmpeg`와 `ffprobe`가 PATH에 있어야 합니다. 학생 인식은 `student-ocr`, 인벤토리는 `scanner`, 템플릿 전용은 `vision` extra입니다. 학생·인벤토리 문자 인식은 같은 ONNX 엔진과 별도 설치한 문자 모델을 공유합니다.
|
|
51
|
+
|
|
52
|
+
**PyPI 패키지는 코드만 제공합니다.** 게임 이미지·UI 참조·장비 모델은 포함하지 않으며 자동으로 내려받지 않습니다. 비전 기능에는 사용자가 별도로 준비한 신뢰할 수 있는 로컬 참조 번들과 문자 모델이 필요합니다. 현재 공개 배포하는 게임 참조 번들은 없습니다. 자원 준비 전에도 데이터·계정·보상 기능은 사용할 수 있습니다. [로컬 비전 자원 구성](docs/assets.md)을 확인하세요.
|
|
53
|
+
|
|
54
|
+
모든 실행용 extras와 기본 개발·테스트 환경은 Torch/EasyOCR를 설치하지 않습니다. 학습·CNN 비교 실험만 `uv run --group training ...`으로 선택하며 CPU Torch를 사용합니다.
|
|
55
|
+
|
|
56
|
+
## 계정 워크플로
|
|
57
|
+
|
|
58
|
+
사이트의 기존 컬렉션을 보존하면서 새 영상의 확인된 값만 반영하는 예입니다. 출력 경로는 새 파일/폴더여야 합니다.
|
|
59
|
+
|
|
60
|
+
```powershell
|
|
61
|
+
schale data fetch students --region kr --output students.json
|
|
62
|
+
schale collection import existing-export.txt --catalog students.json --output account.json
|
|
63
|
+
schale students extract recording.mp4 --output recording-result
|
|
64
|
+
schale collection from-extraction recording-result/results.json --output observed.json
|
|
65
|
+
schale collection diff account.json observed.json --output differences.json
|
|
66
|
+
schale collection merge account.json observed.json --output merged.json
|
|
67
|
+
schale collection export merged.json --base existing-export.txt --output schaledb.txt
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
비전 없이 사이트 내보내기 두 개를 각각 가져와 비교·병합할 수도 있습니다. 기본 병합은 `confirmed`, `corrected`, `imported` 값만 수용합니다. 미확인 신원/필드는 보고서에 보류하며 원본 관측 파일에 남습니다. 관측 시각으로 자동 정렬하지 않으므로 **incoming은 사용자가 최신 또는 우선할 데이터로 선택**해야 합니다.
|
|
71
|
+
|
|
72
|
+
SchaleDB 가져오기는 컬렉션 전체를 교체합니다. 기존 사이트 내보내기를 보관하고 `--base`로 전달하세요. 도구는 사이트 계정을 변경하지 않습니다. 장비 자체 레벨은 공통 모델에 남지만 사이트 포맷에 없어 내보내지 못합니다. 잠긴 일반 스킬의 0은 사이트 최소값 1로 변환됩니다.
|
|
73
|
+
|
|
74
|
+
```powershell
|
|
75
|
+
schale rewards calculate --stage 1011101 --server Global --output rewards.json
|
|
76
|
+
schale rewards calculate --stage 1011101 --condition FirstClear --output first-clear.json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
기본은 조건 없는 보상이며 `--condition`은 해당 조건의 보상을 추가합니다. 기대값은 확정 드롭 수량이나 최적 파밍 계획이 아닙니다.
|
|
80
|
+
|
|
81
|
+
## 유연한 입력
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from pathlib import Path
|
|
85
|
+
from schale import ImageBatch, ImageInput
|
|
86
|
+
from schale.students.extract import extract
|
|
87
|
+
|
|
88
|
+
extract(Path("recording.mp4"), Path("out-video"))
|
|
89
|
+
extract(Path("screenshots"), Path("out-folder"))
|
|
90
|
+
extract([Path("a.png"), Path("b.webp")], Path("out-list"))
|
|
91
|
+
extract(ImageBatch([ImageInput(Path("a.png").read_bytes(), name="capture")]), Path("out-memory"))
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
단일 이미지, 디렉터리, 명시적 이미지 목록, 인코딩된 이미지 bytes, JSON 매니페스트를 받습니다. 동일 픽셀은 중복 제거하여 확인 근거를 부풀리지 않습니다. [입력 계약과 예시](docs/inputs.md)를 참고하세요.
|
|
95
|
+
|
|
96
|
+
## Python API
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
from pathlib import Path
|
|
100
|
+
from schale import AccountSnapshot, ReferenceCatalog, StageRewards
|
|
101
|
+
from schale.adapters.schaledb import from_schaledb, to_schaledb
|
|
102
|
+
from schale.collections import compare, merge
|
|
103
|
+
|
|
104
|
+
catalog = ReferenceCatalog.fetch("students", region="kr")
|
|
105
|
+
base = from_schaledb(Path("existing-export.txt").read_text(), catalog=catalog)
|
|
106
|
+
incoming = AccountSnapshot.model_validate_json(Path("observed.json").read_text())
|
|
107
|
+
changes = compare(base, incoming)
|
|
108
|
+
updated, merge_report = merge(base, incoming)
|
|
109
|
+
encoded, export_report = to_schaledb(updated)
|
|
110
|
+
rewards = StageRewards.from_stages([1011101], server="Global")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
학생 추출은 `schale.students.extract.extract`, 보상 계산은 `StageRewards`, 계정 교환은 `schale.adapters`에서 제공합니다. 학생 추출 결과는 `Extraction/results.json`과 원본 판독 근거로 구성됩니다.
|
|
114
|
+
|
|
115
|
+
## 캐시와 지원 범위
|
|
116
|
+
|
|
117
|
+
공유 캐시는 사용자 홈의 `.schale/cache`이며 `SCHALE_CACHE_DIR`로 변경합니다. 모든 SchaleDB JSON·이미지는 조건부 HTTP 캐시를 사용합니다. 기본 자동 모드는 사용 시 만료된 항목만 갱신하며, 유효 기간 안에는 HTTP 요청을 하지 않습니다. JSON 7일·이미지 30일 TTL, ETag/Last-Modified 재검증, SHA-256 무결성 확인, 콘텐츠 중복 제거, 프로세스 간 요청 합치기, 요청 간격 제한과 오류 재시도 유예를 제공합니다. 사용자 영상/계정은 캐시에 넣지 않습니다.
|
|
118
|
+
|
|
119
|
+
```powershell
|
|
120
|
+
schale cache info
|
|
121
|
+
schale cache update # 이미 사용한 리소스 중 만료/누락만
|
|
122
|
+
schale cache update --refresh # 유효한 항목도 조건부 재검증
|
|
123
|
+
schale cache history
|
|
124
|
+
schale cache verify
|
|
125
|
+
schale cache policy --mode manual # 자동 재검증 끄기 (최초 누락은 받음)
|
|
126
|
+
schale cache policy --mode offline # 최초 누락도 받지 않음
|
|
127
|
+
schale cache policy --mode auto
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
캐시는 파일 단위 증분입니다. 서버가 변경을 알리면 해당 JSON/이미지를 다시 받으며, JSON 내부 개별 학생만 전송받는 delta API는 사용하지 않습니다. 실패 시 검증된 이전 버전만 사용하고 오류/재시도 시각을 기록합니다. 숫자 모델은 신뢰할 수 있는 로컬 번들을 별도 설치하며 자동 원격 교체하지 않습니다. [캐시 정책과 트래픽](docs/cache.md)을 참고하세요.
|
|
131
|
+
|
|
132
|
+
학생 비전은 한국어 16:9 정보 화면용입니다. 위치·균일 배율 차이를 보정하지만 모든 언어·레이아웃·촬영 조건을 지원하지 않습니다. `confirmed`는 다중 관측 일치이며 정답 보증이 아닙니다. Windows에서 배포본의 실제 영상 실행을 검증합니다. 다른 OS는 별도 실행 검증이 필요합니다.
|
|
133
|
+
|
|
134
|
+
## 문서
|
|
135
|
+
|
|
136
|
+
- [구조와 확장 계약](docs/architecture.md)
|
|
137
|
+
- [캐시 정책·증분 업데이트](docs/cache.md), [유연한 입력](docs/inputs.md)
|
|
138
|
+
- [로컬 비전 자원 설치·검증·구성](docs/assets.md)
|
|
139
|
+
- [학생 추출·검토·알고리즘 감독](docs/students.md)
|
|
140
|
+
- [인벤토리 판독·정확도 검증](docs/inventory.md)
|
|
141
|
+
- [개발 및 테스트](CONTRIBUTING.md)
|
|
142
|
+
- [배포 절차](docs/releasing.md), [변경 이력](CHANGELOG.md)
|
|
143
|
+
|
|
144
|
+
자체 코드는 MIT입니다. SchaleDB·Blue Archive의 공식 프로젝트가 아니며 모델·게임 이미지·상표의 권리는 원 권리자에게 있습니다. [제3자 고지](THIRD_PARTY_NOTICES.md)를 확인하세요.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Third-party materials
|
|
2
|
+
|
|
3
|
+
The MIT license in `LICENSE` applies to the original schale source code. It does
|
|
4
|
+
not relicense third-party models, game artwork, trademarks, or downloaded data.
|
|
5
|
+
|
|
6
|
+
## Blue Archive and SchaleDB
|
|
7
|
+
|
|
8
|
+
The Python package contains no game artwork, UI excerpts, derived reference
|
|
9
|
+
descriptors, learned model weights, user recordings, or account exports. Runtime
|
|
10
|
+
skill icons, portraits, and game metadata are fetched from https://schaledb.com/
|
|
11
|
+
and cached locally when the corresponding tool is used. Local vision resources
|
|
12
|
+
must be supplied separately by the user; installation does not grant rights to
|
|
13
|
+
use or redistribute their contents. This project is not an official Blue Archive,
|
|
14
|
+
NEXON, or SchaleDB product.
|
|
15
|
+
|
|
16
|
+
Source of game materials: Blue Archive, NEXON / NEXON Games.
|
|
17
|
+
See https://bluearchive.nexon.com/ and NEXON's Game IP guide:
|
|
18
|
+
https://member.nexon.com/policy/policywrapper.aspx?policytype=37 .
|
|
19
|
+
No permission to redistribute game materials is represented by this project.
|
|
20
|
+
|
|
21
|
+
## Optional equipment model
|
|
22
|
+
|
|
23
|
+
The inventory reader supports a locally installed MobileNetV3-Small ONNX model
|
|
24
|
+
and its class mapping. Neither weights nor training images are distributed in
|
|
25
|
+
the source or wheel. The training code can initialize from TorchVision's
|
|
26
|
+
ImageNet weights. TorchVision's source license does not establish the rights to
|
|
27
|
+
every pretrained weight or its training data; review the terms of the assets you
|
|
28
|
+
choose to use or distribute:
|
|
29
|
+
https://github.com/pytorch/vision/blob/main/docs/source/models.rst .
|
|
30
|
+
|
|
31
|
+
## Student numeric model
|
|
32
|
+
|
|
33
|
+
The tested student numeric ONNX model is a separate local bundle, not embedded in
|
|
34
|
+
the Python wheel or source distribution. It was exported from OpenOCR
|
|
35
|
+
(https://github.com/Topdu/OpenOCR), revision
|
|
36
|
+
`0d522801ec6dc1df852c6b6d4ed6a08f5127ed97`.
|
|
37
|
+
The bundle retains `LICENSE-OpenOCR` (Apache-2.0) and `NOTICE.md`, plus source and
|
|
38
|
+
checkpoint hashes in `metadata.json`. The ONNX conversion and confidence-threshold
|
|
39
|
+
calibration were performed for this extraction tool. Use trusted model bundles;
|
|
40
|
+
checking a hash against adjacent metadata detects corruption, not publisher identity.
|
|
41
|
+
|
|
42
|
+
## Runtime dependencies
|
|
43
|
+
|
|
44
|
+
OpenCV, ONNX Runtime, NumPy, Pillow, Requests, Pydantic, Typer and their dependencies
|
|
45
|
+
are installed separately and retain their respective licenses. Student and inventory
|
|
46
|
+
inference do not require PyTorch or EasyOCR. PyTorch is confined to the optional
|
|
47
|
+
source training group. FFmpeg and FFprobe must be installed separately; their
|
|
48
|
+
binaries are not redistributed in these artifacts.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# 구조와 확장 계약
|
|
2
|
+
|
|
3
|
+
Schale은 SchaleDB 호환 데이터를 매개로 여러 자동화 도구를 조합합니다. 영상에서 읽는 과정과 계정 상태를 이용하는 과정은 독립적입니다.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
SchaleDB 정의 ── ReferenceCatalog ── 기준 ID·정의
|
|
7
|
+
|
|
8
|
+
사이트 export ── adapters.schaledb ─────────┐
|
|
9
|
+
영상/이미지 ── students ── adapters.extraction ── AccountSnapshot
|
|
10
|
+
향후 다른 입력 ── 해당 어댑터 ─────────────┘ │
|
|
11
|
+
collections.compare / merge
|
|
12
|
+
│
|
|
13
|
+
adapters.schaledb ── 사이트 export
|
|
14
|
+
|
|
15
|
+
스테이지·드롭 정의 ── StageRewards ── 보상 기대값
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 기준 데이터와 사용자 상태
|
|
19
|
+
|
|
20
|
+
`ReferenceCatalog`는 학생·아이템·장비·스테이지·가구·그룹 정의를 제공하며 계정의 보유/육성 상태를 뜻하지 않습니다. `entries`는 원본 ID-keyed 형식이고 `get(id)`는 복사본입니다. 지역은 언어 데이터 선택이며 계정 서버 판정이 아닙니다. 그룹 정의는 언어 공통입니다.
|
|
21
|
+
|
|
22
|
+
카탈로그 `sha256`은 키 정렬·UTF-8·공백 없는 JSON 직렬화의 내용 해시입니다. 들여쓰기에 의존하지 않습니다. 기존 `Extraction.catalog_sha256`은 원본 파일 해시 규칙을 유지하므로 두 종류의 해시를 직접 비교하지 않습니다.
|
|
23
|
+
|
|
24
|
+
`AccountSnapshot`은 `kind="schale.account"`, `schema_version=1`인 공통 계정 JSON입니다. `StudentState`는 SchaleDB `student_id`, 고유 `key`, 이름, 신원 상태, 육성 필드, 출처, 어댑터 확장 속성을 가집니다. 미확인 학생은 ID=null로 유지할 수 있습니다. 중복 ID·key, 지원하지 않는 필드, 범위 밖 값, 정수 대신 bool 입력은 거부합니다.
|
|
25
|
+
|
|
26
|
+
19개 필드는 성급, 레벨, 인연, EX/기본/강화/서브 스킬, 전용무기 성급·레벨, 애용품 티어, 장비 세 슬롯의 티어·레벨, 체력·공격·치유 능력 개방입니다. 이름과 현재 유효 범위는 `account.GROWTH_BOUNDS`가 기준입니다. 게임 상한 변경 시 모델·어댑터·테스트를 함께 검토합니다.
|
|
27
|
+
|
|
28
|
+
각 `GrowthValue`는 값, 상태, 출처를 포함합니다. 영상 근거의 시각·ROI·점수·방법도 보존합니다. 파일을 복사/업로드하지 않으므로 근거 이미지와 원본 추출 폴더를 함께 보관하세요. 공통 계정 파일은 원래 감독 보고서의 대체물이 아닙니다.
|
|
29
|
+
|
|
30
|
+
## 확인 상태와 병합
|
|
31
|
+
|
|
32
|
+
| 상태 | 의미 | 기본 병합·내보내기 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `unknown` | 알 수 없음, null | 보류 |
|
|
35
|
+
| `conflict` | 관측 충돌, null | 보류 |
|
|
36
|
+
| `observed` | 단일 관측 | 명시적 opt-in만 |
|
|
37
|
+
| `inferred` | 규칙으로 추론 | 명시적 opt-in만 |
|
|
38
|
+
| `confirmed` | 여러 관측 일치 | 수용 |
|
|
39
|
+
| `corrected` | 사람이 교정 | 수용 |
|
|
40
|
+
| `imported` | 외부 파일에 명시 | 수용 |
|
|
41
|
+
|
|
42
|
+
`imported`는 픽셀로 검증했다는 뜻이 아닙니다. 신뢰할 수 있는 사용자의 컬렉션을 입력으로 선택한다는 계약입니다. `confirmed`도 정답 확률이 아닙니다.
|
|
43
|
+
|
|
44
|
+
`merge(base, incoming)`은 입력을 수정하지 않고 새 스냅샷과 보고서를 반환합니다. incoming의 수용 가능한 값이 우선하며 불확실한 값은 base를 지우지 않습니다. 안 보인 학생을 삭제하지 않습니다. 미확인 신원/필드는 보고서로 보류하므로 원본 incoming 파일을 보관하세요. 자동 시각 비교는 하지 않으며 최신/우선 자료 선택은 호출자의 책임입니다.
|
|
45
|
+
|
|
46
|
+
동일 값의 근거를 합치고, 관측 수준의 같은 값이 기존 확인 상태를 낮추지 않도록 합니다. `extensions`의 설정은 base 우선으로 빠진 속성만 채웁니다. `compare`의 `missing_ids`는 새 스냅샷에 없는 ID이지 미보유/삭제 판정이 아닙니다. 값과 확인 상태 변화를 함께 비교합니다.
|
|
47
|
+
|
|
48
|
+
## 외부 형식과 의존성
|
|
49
|
+
|
|
50
|
+
SchaleDB 짧은 키, base64, `lock`, 최소 스킬 레벨 규칙은 `adapters.schaledb`에만 둡니다. 장비 자체 레벨은 사이트 형식에 없으므로 내부에 보존하고 변환 손실을 명시합니다. 미지의 사이트 속성은 `extensions.schaledb`에 보존합니다. 누락 값을 기본값으로 채우지 않으며 불완전한 신규 레코드는 내보내기에서 제외·보고합니다.
|
|
51
|
+
|
|
52
|
+
코어는 Pydantic·Requests·Typer·FileLock을 사용합니다. 공통 계정·컬렉션 모듈은 OpenCV·ONNX·학습 모델에 의존하지 않습니다. 비전 입력 어댑터는 결과 모델만 참조하고 인식기를 import하지 않습니다. 영상·이미지 묶음은 입력 계약으로 정규화하고, 모든 SchaleDB 소비자는 공유 HTTP 캐시를 사용합니다. 상세 계약은 [캐시](cache.md), [입력](inputs.md)을 참고하세요. 인벤토리 도구는 선택 기능입니다.
|
|
53
|
+
|
|
54
|
+
## 도구 추가 기준
|
|
55
|
+
|
|
56
|
+
1. 입출력 계약을 먼저 정하고 SchaleDB ID를 유지합니다.
|
|
57
|
+
2. 새 입력 형식은 어댑터에서 변환합니다. 모든 도구가 계정 모델을 쓸 필요는 없습니다. 보상 계산처럼 정의만 필요한 도구는 직접 조회합니다.
|
|
58
|
+
3. 계산은 파일/CLI와 독립적인 함수로 제공하고 CLI는 검증·입출력을 연결합니다.
|
|
59
|
+
4. 실제 필요한 공통 개념이 생길 때만 모델을 확장합니다. 학생 모델에 재료나 스테이지 필드를 억지로 넣지 않습니다.
|
|
60
|
+
5. 불확실성·변환 손실·출처를 드러내고 실패를 성공값으로 대체하지 않습니다.
|
|
61
|
+
6. 성공, 불완전 입력, 데이터 보존, 기존 API, 설치된 배포본 사용을 검증합니다.
|
|
62
|
+
|
|
63
|
+
런타임 플러그인 시스템·작업 큐·범용 게임 봇 프레임워크는 현재 필요하지 않아 도입하지 않았습니다. 향후 도구는 이 계약 위에 독립 모듈로 추가합니다.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# 로컬 비전 자원
|
|
2
|
+
|
|
3
|
+
Schale의 Git 소스·PyPI wheel·sdist에는 게임 이미지, UI 참조, 특징 기술자,
|
|
4
|
+
학습 모델을 넣지 않습니다. 비전 기능은 사용자가 준비한 자원을 사용합니다.
|
|
5
|
+
현재 프로젝트가 공개 배포하는 게임 참조 번들은 없습니다. `schale[scanner]`
|
|
6
|
+
설치만으로 인벤토리를 인식하거나, 빈 캐시에서 학생 화면을 인식하지는 못합니다.
|
|
7
|
+
데이터·계정·보상 도구는 이 자원이 필요하지 않습니다.
|
|
8
|
+
|
|
9
|
+
## 설치와 점검
|
|
10
|
+
|
|
11
|
+
```powershell
|
|
12
|
+
uv tool install "schale[student-ocr,scanner]==0.1.0"
|
|
13
|
+
schale assets install my-vision-resources.zip
|
|
14
|
+
schale assets info
|
|
15
|
+
schale students install-model schale-student-numeric-v1.zip
|
|
16
|
+
schale students doctor
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
게임 참조·장비 모델은 첫 번째 ZIP, 공통 문자 모델은 두 번째 ZIP입니다.
|
|
20
|
+
신뢰하는 출처와 사용 권한을 확인한 자료만 설치하세요. 체크섬은 손상 검사용이며
|
|
21
|
+
제공자의 신원이나 재배포 허락을 보증하지 않습니다. 이 명령은 다운로드하지 않습니다.
|
|
22
|
+
|
|
23
|
+
자원은 `SCHALE_CACHE_DIR/vision-resources`에 설치하며, 환경 변수가 없으면
|
|
24
|
+
`~/.schale/cache/vision-resources`를 사용합니다. 내용 해시별 `bundles/<hash>`와
|
|
25
|
+
현재 선택을 담은 `current.json`으로 관리합니다. 같은 번들의 재설치는 중복 저장하지
|
|
26
|
+
않고, 변경된 번들은 별도로 저장한 뒤 현재 선택을 원자적으로 바꿉니다. 검증 실패 시
|
|
27
|
+
이전 선택을 유지합니다. 이전 ZIP을 다시 설치하면 해당 버전으로 돌아갑니다.
|
|
28
|
+
설치 작업은 프로세스 잠금으로 직렬화하며 기존 파일을 덮어쓰지 않습니다.
|
|
29
|
+
|
|
30
|
+
`assets info`는 모든 파일의 SHA-256을 검사합니다. 학생/인벤토리 실행 시에도 필요한
|
|
31
|
+
번들을 검증하고, 없거나 손상됐으면 설치 안내와 함께 실패합니다. 조용히 낮은 정확도의
|
|
32
|
+
다른 알고리즘으로 전환하지 않습니다. HTTP 캐시의 `cache update`는 이 로컬 번들을
|
|
33
|
+
수정하거나 자동 교체하지 않습니다.
|
|
34
|
+
|
|
35
|
+
## 자신의 자원 번들 만들기
|
|
36
|
+
|
|
37
|
+
이미 준비한 참조 데이터나 직접 보정·학습한 결과를 아래 구조에 배치합니다.
|
|
38
|
+
`assets pack`은 포장과 무결성 검사를 수행하며 이미지에서 참조를 자동 생성하거나
|
|
39
|
+
모델을 학습하는 명령은 아닙니다. 다른 레이아웃의 자료는 별도 보정과 검증이 필요합니다.
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
my-resources/
|
|
43
|
+
students/
|
|
44
|
+
labels.json
|
|
45
|
+
layout_reference.npz
|
|
46
|
+
header.png
|
|
47
|
+
empty_gear.png
|
|
48
|
+
ghost_gloves.png
|
|
49
|
+
ghost_shoes.png
|
|
50
|
+
ghost_hat.png
|
|
51
|
+
potential_hp_25.png
|
|
52
|
+
potential_attack_25.png
|
|
53
|
+
<labels.json에서 지정한 마스크 PNG들>
|
|
54
|
+
inventory/
|
|
55
|
+
models/
|
|
56
|
+
equipment_classifier.onnx
|
|
57
|
+
equipment_classifier.onnx.data (ONNX가 외부 가중치를 사용하는 경우)
|
|
58
|
+
class_mapping.json
|
|
59
|
+
icons/ (선택: 로컬 참조 이미지)
|
|
60
|
+
equipment_icon_*.webp
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
schale assets pack my-resources --output my-vision-resources.zip
|
|
65
|
+
schale assets install my-vision-resources.zip
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
최소 하나의 완전한 구성요소(`students` 또는 `inventory`)가 필요합니다. 설치는 번들
|
|
69
|
+
전체를 선택하므로 둘 다 사용하려면 둘을 함께 포장하세요. 파일 목록과 SHA-256을 담은
|
|
70
|
+
`manifest.json`은 명령이 생성합니다. 학생 프로필은 한국어 16:9 화면용이며 번들 프로필
|
|
71
|
+
식별자는 `bluearchive-ko-16x9-v1`입니다.
|
|
72
|
+
|
|
73
|
+
- `labels.json`: `family` (`level`, `tier`, `skill`, `bond`), `value` (정수 또는 `MAX`),
|
|
74
|
+
`image` (같은 디렉터리 기준 마스크 파일명)를 담은 배열입니다. 마스크는
|
|
75
|
+
`schale.students.labels.label_mask`의 출력과 같은 40×160 형태입니다.
|
|
76
|
+
- `layout_reference.npz`: 1280×720 기준 좌표의 `left_points`, `right_points` (N×2)와
|
|
77
|
+
대응하는 OpenCV SIFT `left_descriptors`, `right_descriptors` (N×128)입니다.
|
|
78
|
+
기준 특징은 움직이지 않는 UI에서 수집해야 합니다. 원본 그림은 포함하지 않아도 됩니다.
|
|
79
|
+
- UI PNG는 `schale.students.vision`의 해당 ROI와 같은 의미의 BGR 참조입니다.
|
|
80
|
+
- 장비 모델 입력은 RGB 정규화 float32 N×3×116×146, 출력은 클래스별 logits입니다.
|
|
81
|
+
`class_mapping.json`은 `num_classes`, `class_to_name`, `name_to_class`, `categories`를
|
|
82
|
+
포함하며 학습한 모델의 순서와 일치해야 합니다. 학습·ONNX 내보내기는
|
|
83
|
+
`schale.scanner.training`에서 제공하며 기본 출력은 사용자 캐시의 `training/equipment`입니다.
|
|
84
|
+
- 장비 아이콘이 없으면 기존 공유 HTTP 캐시에서 읽거나 정책에 따라 SchaleDB에서
|
|
85
|
+
받습니다. 오프라인 상태의 누락은 결과의 `unavailable_icons`에 기록합니다.
|
|
86
|
+
|
|
87
|
+
번들은 개인 환경에서 보관하세요. 공개 배포 여부는 각 게임 자료·학습 데이터·모델의
|
|
88
|
+
권리 조건에 따라 별도로 판단해야 합니다. ZIP으로 분리했다는 이유로 재배포가 허용되는
|
|
89
|
+
것은 아닙니다. 문자 모델 번들 구성은 [학생 인식 문서](students.md)를 참고하세요.
|