Spaces:
Sleeping
Sleeping
| # `scripts/experiments/` — bản lưu lịch sử của các `.bat` thí nghiệm đã chạy | |
| **Đây KHÔNG phải launcher.** Launcher chạy tay vẫn nằm ở `D:\Khoa luan\` (thư | |
| mục CHA, ngoài git) theo quy ước cũ — xem mục "Quy ước repo" trong | |
| `../../CLAUDE.md`. Thư mục này chỉ giữ **bản sao byte-for-byte** của những | |
| `.bat` đã thực sự sinh ra số liệu, để chúng không biến mất cùng thư mục cha. | |
| Vì sao cần: các file này chứa thứ `git log` không tải nổi — **lý do chạy** và | |
| **ngưỡng nghiệm thu** ghi ngay trong comment đầu file, tức là ý định lúc đó chứ | |
| không phải diễn giải lại về sau. Riêng `run_qfield_20260721.bat` là **lệnh | |
| tái lập `models/qfield_20260721/qfield.pt`** — model của 5 tuần nghiên cứu RL | |
| (app thôi dùng nó từ 31/07/2026, nhưng nó là bằng chứng luận văn trích). | |
| ## Có gì ở đây | |
| > **31/07/2026 (BRIEF việc D):** bản lưu của các thí nghiệm thuộc engine đã xoá | |
| > (oracle/hybrid/zone-V1: probe_zone*, eval_runout*, check_zone_parity, | |
| > bench_space_latency, check_api_drift bản oracle/hybrid) đã RỜI `main` cùng | |
| > script của chúng — tất cả sống nguyên vẹn ở nhánh **`v1-full`** (commit | |
| > `3ae4572`), nơi mọi đối chứng sau này (σ-sweep) sẽ chạy. Ở đây chỉ còn bản | |
| > lưu của phần NGHIÊN CỨU RL (train/BC/qfield — nội dung luận văn) và của | |
| > kiến trúc còn sống trên app (render lười). | |
| | file | ngày | chạy gì | ngưỡng nghiệm thu ghi trong file | | |
| |---|---|---|---| | |
| | `run_experiments_20260712.bat` | 12/07 | PPO 300k với `scratch_penalty −0.5`, rồi SAC 300k giữ `−0.3` | không có ngưỡng số — câu hỏi là "scratch giảm mà pot giữ được không", và so off-policy với PPO trên cùng reward | | |
| | `run_experiments_20260720.bat` | 20/07 | 4 phase: relabel canonical + sweep `pocket-margin {0.05, 0.10, 0.15}` + bản `--limit 2000` → BC train 5 run → eval 1000 cú từng model → eval 2 model BC v1 làm mốc FAIL cho luận văn | gate G1: `Q\|pot > 0.65` và `pot ≥ 10%` | | |
| | `run_bc_v3_20260720.bat` | 20/07 | BC v3 classification head (label `(V0, side, vert)` trên grid 10×5×5 = 250 combo rời rạc, `phi` giữ regression) → distill sang SB3 zip → eval 1000 cú bản distill | tầng 2: `Q\|pot > 0.65`; gate G1 trên bản distill: `Q\|pot > 0.65`, `pot ≥ 10%` | | |
| | `run_qfield_20260721.bat` | 21/07 | `train_qfield.py --run-name qfield_20260721` — **sinh ra đúng model app đang dùng** | tầng 1 (kill-switch): `Q\|pot(xb2) ≥ 0.60`, `pot ≥ 25%` · tầng 2 (gate G1): `Q\|pot > 0.65` ngoài 2·SE, `pot ≥ 10%` | | |
| | `run_check_lazy_render.bat` | 30/07 (chiều) | `check_lazy_render.py` — **gate G6.1 + G6.2** của render lười: `/api/recommend` chỉ còn dựng quỹ đạo cho cú rank 1, ba cú kia lấy qua `/api/trajectory` | G6.1 đúng 1 cú có `trajectories`, và là cú rank 1 · G6.2 quỹ đạo khớp **từng điểm** với bản `n_render` = mọi cú · G6.2b `balls_final` khớp cái `/api/recommend` đã trả. **Cả ba đạt** trên 2 thế bàn × 3 engine × 4 cú. Chính phép kiểm này bắt được lỗi làm tròn `phi`/`v0` trong response (v0 lưới `0.8888888888888888` → `0.889` là sim ở ô KHÁC) | | |
| | `run_eval_failcounts.bat` | 04/08 | `eval_failcounts.py` cả 2 bộ (`--source random` + `--source break`, 200 thế/bộ, seed base 20260804, `POOLCOACH_WORKERS=6`) — đo PHÂN RÃ "hết đường" của V2 theo từng tiêu chí (i)–(v) bằng mask đủ (`debug_candidates`) + one-left-out per criterion; đo lường thuần cho câu hỏi treo "48%" 31/07 | G3 tự kiểm trong script (số thế đủ · có_cú + hết_đường = tổng · thế có cú ⇔ ∃ ứng viên pass đủ 5, mask trùng engine từng thế · one-left-out(X) ≥ số thế chỉ-trượt-X): **12/12 ĐẠT** (2 bộ × 6). Số chính: hết đường random 80/200 = 40.0%, break 63/157 = 40.1% (loại 43/200: scratch 38 + golden 5); one-left-out (i) cứu 93.8%/96.8% số thế hết đường | | |
| | `run_cv_train_baseline.bat` | 05/08 | F2 CV baseline (BRIEF 05/08 bước 3): YOLO11n fine-tune COCO trên pix2pockets (CC BY 4.0), split 80/20 seed 20260805 (198/49), epochs 30 · imgsz 640 · batch 8. Lần chạy sinh số 05/08 sáng chạy **CPU** (venv chung torch CPU-build), gọi thẳng `train_baseline.py --epochs 30` với env var y hệt `.bat`. **Ngoại lệ có lệnh (BRIEF bàn giao 17, 05/08 chiều)**: bản lưu + launcher được trỏ sang venv `poolcoach-cv-env` (torch 2.12.1+cu130) + `--device 0` — bản CPU đã sinh số baseline còn nguyên trong git (`e93fb17`) | G3: chạy trọn không crash trong timebox, KHÔNG gate theo ngưỡng AP. Đo được (bản CPU): wall 40.6 min, val mAP50 **0.674**, mAP50-95 **0.473**, per-class trong `cv_baseline_20260805\metrics.json` (Cue thấp nhất 0.438) | | |
| | `run_cv_train_full.bat` | 05/08 | Bản đầy đủ của dòng trên, chạy **GPU** trên `poolcoach-cv-env` (bàn giao 17): epochs 150 · batch 32 (16→32 cho vừa 8GB VRAM RTX 3070; thực đo ~4.7GB) · seed 20260805 + imgsz 640 giữ nguyên để so với baseline; run name + artifact tách riêng (`cv_full_20260805\`). Lần chạy sinh số 05/08 chiều gọi đúng lệnh + env var của `.bat` qua `cmd /c` chạy nền (bỏ `pause`/`type`) — `.bat` là lệnh tái lập | như G3 (chạy trọn, số trung thực), không gate AP. Đo được: wall **7.8 min** GPU, val mAP50 **0.893**, mAP50-95 **0.678**, per-class trong `cv_full_20260805\metrics.json` (Dot thấp nhất 0.713; so baseline CPU 30ep: 0.674/0.473, wall 40.6 min) | | |
| | `run_cv_pick_conf.bat` | 05/08 | Chọn **conf vận hành** cho CV worker (bàn giao 18 bước 1): F1-curve any-ball trên val bằng ĐÚNG validator merged của `eval_anyball.py` (val-pipeline), conf = argmax smooth-F1 (cùng smooth 0.1 ultralytics dùng). Lần chạy sinh số 05/08 tối gọi đúng lệnh của `.bat` bằng interpreter venv CV trực tiếp — `.bat` là lệnh tái lập | Self-check AP50 khớp `anyball.json` ±0.005 (đo được: lệch **0.0000**); conf phải trong [0.1, 0.9] ngoài khoảng là DỪNG báo Cowork. Đo được: **conf 0.299**, F1 0.9322 · P 0.9642 · R 0.9023 (val-pipeline — KHÔNG so ngang predict-pipeline, hai-cái-thước bàn giao 17) → `cv_full_20260805\opconf.json`, bake làm default `scripts/cv_worker.py` | | |
| | `run_cv_eval_deploy_pr.bat` | 05/08 | Đo **P/R/F1 predict-pipeline** tại conf vận hành 0.2993 — "số lúc deploy" (bàn giao 19, trả lời câu hỏi 1 HANDOFF 18): tái lập đúng pipeline worker (`resize` max-dim 1280 INTER_AREA + `model.predict` imgsz 640, NMS multi_label=False), merge any-ball loại Dot 2 phía, matcher greedy IoU 0.5 theo conf giảm dần. Lần chạy sinh số 05/08 tối gọi đúng lệnh của `.bat` bằng interpreter venv CV trực tiếp — `.bat` là lệnh tái lập | Neo: GT ball từ file nhãn khớp `counters.gt_kept` 563 của `opconf.json`; P và R ≥ 0.5 (thấp hơn là script tự DỪNG — BRIEF "Nếu bí"). Đo được: **P 0.9679 · R 0.9094 · F1 0.9377** (TP 512 · FP 17 · FN 51) — CAO hơn val-pipeline cùng conf (0.9642/0.9023/0.9322), ngược kỳ vọng BRIEF nhưng có cơ chế (multi_label=True tạo box trùng cross-class thành FP trên thước GỘP; pre-resize INTER_AREA nét hơn letterbox thẳng — A/B trong HANDOFF) → `cv_full_20260805\opconf_predict.json` | | |
| | `run_cv_worker.bat` | 05/08 | CV worker phục vụ gate **G3/G4** bàn giao 18: Redis (docker compose) + `scripts/cv_worker.py` trên venv CV (CUDA), load `cv_full_20260805\best.pt` một lần, queue `pc:jobs:scan`, heartbeat riêng. Lần chạy sinh số 05/08 tối gọi đúng lệnh + env var của `.bat` (`REDIS_URL` + interpreter venv CV) chạy nền — `.bat` là lệnh tái lập | G3: 2 ảnh val (114, 130) qua HTTP → 200, bi trong bàn, **cue đúng 1**, Dot không xuất hiện, latency **282–403 ms/ảnh** (127.0.0.1; job thuần trong worker 40–110 ms); kill worker → **503 sau 30.4s** message chỉ đích danh cv_worker. G4: FE upload → chấm 4 góc → 9+cue bi lên canvas (DOM/pixel probe từng viên) → sửa 1 bi → recommend 200 `scan_id`+`edited=true`; không sửa → `edited=false`. **Tất cả ĐẠT** | | |
| | `run_bb9_extract.bat` | 11/08 | P0 pilot Broadcast Billiards Analyzer (BRIEF 11/08 bước 1): cắt frame 10 cú Danh chọn tay (52:52–57:57 stream Florida Open `pFV7sdBJ42M`, trận Dương Quốc Hoàng–Kazakis) theo `shots.json`, GIỮ timestamp PTS thật per-frame cho RoPE §6. Lần chạy sinh số gọi đúng lệnh của `.bat` bằng interpreter venv CV trực tiếp — `.bat` là lệnh tái lập | 10 cú × [start,end] đều ra frame; đo được: 2020 frame, fps 30.000, seek đúng giây yêu cầu, dt-jitter **0** (container CFR — nhưng xem dup-rate ở `run_bb9_measure`) | | |
| | `run_bb9_click.bat` | 11/08 | P0 bước 2: Danh click 4 pocket góc từng cú (foreground OpenCV, bẫy BG21) → homography mặt chơi 2.54×1.27m, tái dụng `poolcoach_cv.homography` + `orient_corners` không sửa | 10/10 cú có `homography.json`, preview top-view mắt kiểm từng cú; spread góc giữa các cú vài px (camera tĩnh trong cảnh, design §4.3). Cú 8 pocket bị che — Danh ước chừng (lệch BRIEF, khai HANDOFF) | | |
| | `run_bb9_track.bat` | 11/08 | P0 bước 3: detector 0.893 **zero-shot** (weights `cv_full_20260805\best.pt`, conf vận hành 0.2993, imgsz 640 — đúng cấu hình cv_worker, không chỉnh) + track cue ball NN gating ≤11 m/s theo dt timestamp thật; xuất detections/track CSV + overlay.mp4 + contact_sheet per shot | Gate G-P0.2: Danh xem overlay 10 cú xác nhận track không nhảy bi — **ĐẠT**. Đo được: coverage frame 75.7–100% (9/10 cú ≥80%), cue-det-rate = coverage (gating không loại ứng viên nào) | | |
| | `run_bb9_measure.bat` | 11/08 | P0 bước 4: số gate G0 → CSV `bb9_p0_*` ra root + plots; noise bi đứng yên per-ball, đề xuất ngưỡng đứng-yên/gãy-khúc từ percentile (raw + đã-loại-frame-trùng, dán nhãn), verifier vật lý thô (fit PCA + giảm tốc tuyến tính giữa 2 gãy khúc) | **G0 ĐẠT**: 9/10 cú coverage(thời lượng) ≥80% (cần ≥7/10); noise r p50 0.32mm · p95 2.13mm · max 6.3mm (37 bi); usable 10/10 trên 2 rack (đếm tay). Đề xuất: v_still p99 ≈ 55 mm/s, kink p95 ≈ 31.8° (nhiễm jitter-blur — Cowork chốt); dup-rate frame 10.9% (stream 30fps từ nguồn 25fps); spin-unidentifiable 2/10 | | |
| | `run_bb9_synth.bat` | 11/08 (tối) | BG26 bước 2: sinh dataset synthetic `bb9_synth` 150k train + 5k held-out cho net suy ngược P2 — pooltool bàn default (venv APP, CPU, 10 worker), nhiễu P0 ba đặc trưng bắt buộc (ellipse dị hướng theo vận tốc, chu kỳ dup 1/6 khi 30fps upconvert, dropout đầu cú 0–25% + gap ≤0.3s), split rng `[20260811, split, idx]` chốt trước khi sinh (spec: `scripts\broadcast\synth_spec.json`). Lần chạy sinh số gọi đúng lệnh của `.bat` bằng interpreter venv trực tiếp, tách `--only heldout` rồi `--only train` (lần chạy nền đầu bị giết nhầm giữa chừng — chẩn đoán sai "kẹt" khi thật ra là import pooltool ổ D lạnh; 10 shard con orphan ghi xong vẫn dùng được vì nội dung tất định theo seed, resume bỏ qua shard đã có — khai HANDOFF 26b); `.bat` là lệnh tái lập trọn gói | G-26.3: đủ 150k+5k (identifiable 95.9%/96.0%, scratch 23.7%/23.1%); histogram 4 label phủ đều đúng dải; contact sheet 20 cú mắt kiểm; `--verify 100` sinh lại 100 cú đầu **BIT-GIỐNG** (kiểm luôn shard orphan). Sinh 87.5k cuối: 13.5 phút/10 worker | | |
| | `run_bb9_baseline.bat` | 11/08 (tối) | BG26 bước 3: analytic baseline (`broadcast.py` SAU fix (b′) `953b2b4`) trên 5k held-out — harness trung lập `run_eval(shots, predict_fn)` cho BG27 cắm net làm predictor thứ hai, cùng 3 chỉ số gate; bàn patch theo spec (0.9906×1.9812); V0 báo cả `raw` lẫn `/K_V 1.277`; GT: dấu b (\|b\|≤0.1 stun) · dấu a (a>0 = side-L theo probe, \|a\|≤0.1 neutral riêng); null tính riêng. Lần chạy sinh số gọi đúng lệnh của `.bat` bằng interpreter venv trực tiếp — `.bat` là lệnh tái lập | G-26.4 (số mốc gate BG27, KHÔNG phải gate cứng): median \|Δφ\| **62.6°** (null 63%) · V0 rel err med **0.64 raw / 0.71 phys** (null 10%) · spin dấu trên identifiable: side **66.7%** (630 cú đọc được, null 82%) · vert **29.6%** (~mức đoán 3 lớp). Lát chậm v0<1.5: \|Δφ\| med **2.0°**. Validity harness kiểm trên cú sạch: Δφ 0.9–1.2°, meas/launch 0.69–0.94 khớp 5/7 trượt→lăn → số yếu là điểm mù thật của baseline (che đầu cú + chạm trong cửa sổ V0) = cửa thắng của net. 41.5 phút/5k (chạy chồng lúc gen) | | |
| | `run_shotnet_train.bat` | 11–12/08 (đêm) | BG27 bước 2: train ShotNet (net suy ngược thông số cú đánh, P2 design §6) trên bb9_synth 150k, venv CV GPU — val 2% cắt từ train theo seed 20260811, held-out không đụng; đúng 3 config chạy trọn theo ngân sách BRIEF, mỗi config một dòng giả thuyết trong `CONFIGS` (`train_shotnet.py`); checkpoint chọn theo val_score = dphi/2 + v0rel/0.10 + (1−side)/0.20 + (1−vert)/0.20. Lần chạy sinh số gọi đúng lệnh của `.bat` bằng interpreter venv trực tiếp (3 lần, `--config c1/c2/c3`) — `.bat` là lệnh tái lập config thắng | G-27.2 ĐẠT (kỷ luật): c1 d128×4L score **13.44** (spin sập về hằng — gradient ab yếu 20–40×); c2 +Δxy +cân ab +aux ball **11.53** (spin bắt đầu học, chưa hội tụ); c3 +Huber-góc φ +huber_v0 0.10 +d192×6L 60ep **9.87** (best ep55: dphi 7.66° · v0rel 0.117 · side 0.667 · vert 0.361) — thắng theo val, curve + spec từng run trong `models\shotnet_20260811_c*\` | | |
| | `run_shotnet_eval.bat` | 12/08 (rạng sáng) | BG27 bước 3: chấm ShotNet trên 5k held-out bằng harness BG26 — predictor thứ hai cắm vào `eval_baseline_synth.py` (`--predictor shotnet`), CÙNG loader/thước/held-out với baseline, logic chấm không đổi; bảng gate so bar tuyệt đối + vế thắng baseline trên đúng tập con 630/186 cú baseline đọc được; chạy MỘT lần với ckpt c3 chọn theo val. Lần chạy sinh số gọi đúng lệnh của `.bat` bằng interpreter venv trực tiếp — `.bat` là lệnh tái lập | **G-27.3 TRƯỢT bar tuyệt đối cả 4 ô, THẮNG baseline cả 4 ô** (kết quả âm nhập phễu, DỪNG đúng luật): dphi **8.14°** (bar 2; baseline 62.6) · v0rel raw **11.52%** (bar 10; baseline 63.6) · side **66.9%** toàn ident, **69.5%**/630 (baseline 66.7) · vert **38.2%** toàn ident, **34.4%**/186 (baseline 29.6). Lỗi dồn cú chạm đầu <0.2s (75% cú) + dropout đầu cú — số lát cắt trong HANDOFF 27 | | |
| | `run_bb9_target_eval.bat` | 12/08 | BG28 bước 1: đo lát **target-matched** (chạm đầu = min t_first_bb/t_first_cush ≥ 0.3s sau strike — quần thể khớp clip thật P0, vùng thiết kế broadcast.py) trên 5k held-out cho CẢ HAI predictor qua `--target-slice` của `eval_baseline_synth.py` (CHỈ thêm filter, logic chấm không đổi); CSV prefix MỚI `bb9_synth_target_{baseline,shotnet}_*`. Lần chạy sinh số gọi đúng 2 lệnh của `.bat` bằng interpreter venv trực tiếp, hai predictor chạy SONG SONG (baseline venv app CPU, shotnet venv CV GPU — kết quả tất định, không phụ thuộc thứ tự); `.bat` là lệnh tái lập tuần tự | Kỳ vọng ghi trước (BRIEF 28): dphi c3 2.5–7° · vert 40–72% — **cả hai TRONG khoảng**. Đo được (n=669/5000, toàn identifiable; per-shot khớp CSV BG27 đã nghiệm thu trên cả 669 cú × 2 predictor): shotnet dphi_med **3.03°** (p90 14.7) · v0rel raw **9.73%** (p90 24.5) · side **0.697** (518 cú) · vert **0.653** (669 cú), null 0; baseline dphi_med 1.34° nhưng **φ null 61.6%** · v0rel raw 22.5% · side 0.759/54 cú (null 89.6%) · vert 0.263/19 cú (null 97.2%). Số MỐC cho gate P2′ BG29 (bar giữ 2°/10%/80/80) | | |
| | `run_shotnet_train_c4.bat` | 12–13/08 (đêm) | BG29 bước 2: train lại ShotNet với **augmentation "detections thưa bi mục tiêu"** — chẩn đoán BG28 là khe sim→real nằm ở PHÂN PHỐI mật độ detection (cú 11 = 1.01 det không-cue/frame, cú 12 = 3.09, synth train 95–96% visibility ≈ 5.3 det/frame), không phải kiến trúc hay input path. Đúng 2 config theo ngân sách chốt trước: `c4a` = c3 + dropout slot bi mục tiêu (keep ~U[0.10, 0.95] trên 75% cú, cue KHÔNG dropout, on-the-fly từ 150k có sẵn — không sinh dataset mới ra đĩa); `c4b` = c4a + reweight loss về lát target ≥0.3s (w=3.0; **weight loss chứ không oversample** để giữ nguyên số bước/epoch như c3). Augmentation TẮT khi val nên val_score còn so được với c3. Lần chạy sinh số gọi đúng 2 lệnh của `.bat` bằng interpreter venv CV trực tiếp (chạy nền không trả lời được `pause`) — `.bat` là lệnh tái lập | Chọn theo VAL: **c4b thắng** (score **9.8733**; c4a 10.9682; c3 mốc 9.8662). c4b best ep54: dphi 7.87° · v0rel **0.1122** · side 0.659 · vert **0.378** — hơn c3 ở v0rel và vert, thua ở dphi. Dropout một mình (c4a) làm xấu cả 4 ô trên val mật độ đầy đủ; reweight mua lại gần hết. Wall 212.2′ (c4a) + 198.9′ (c4b) vs 194.8′ của c3 — số BƯỚC y hệt, phần chậm là CPU của loader. Curve + spec cả hai run trong `models\shotnet_20260812_c4{a,b}\`, `best.pt` (LFS) chỉ của config thắng | | |
| | `run_shotnet_eval_p2prime.bat` | 13/08 | BG29 bước 2.3: chấm **gate P2′** cho config thắng (c4b) trên lát target-matched ≥0.3s của 5k held-out (n=669) — cùng harness/thước/mapping BG28, `eval_baseline_synth.py` CHỈ thêm cờ `--prefix`, logic chấm không đổi một dòng; prefix MỚI `bb9_synth_p2prime_*` không đè bộ số 26–28. Lệnh 2 = stress 5k đầy đủ, **báo kèm chứ không phải gate** (kết quả âm BG27 đứng nguyên, không chấm lại). Lần chạy sinh số gọi đúng 2 lệnh của `.bat` bằng interpreter venv CV trực tiếp — `.bat` là lệnh tái lập | **G-29.2 ĐỎ — hơn mốc c3 CẢ 4 Ô nhưng chỉ V0 qua bar**: dphi **2.24°** (bar 2, c3 3.03) · v0rel raw **8.56% ĐẠT** (bar 10, c3 9.73) · side **74.3%** (bar 80, c3 69.7) · vert **72.9%** (bar 80, c3 65.3). Ghép cặp trên đúng 669 cú: dphi **−0.79°** CI95 [−1.08, −0.46], v0 **−1.17pp** CI95 [−2.31, −0.24]; thắng từng cú 59.0%/58.3%; p90 14.71→10.31° và 24.5→21.1%. Lát cắt: V0<1.5 (n=408) dphi **1.89** · v0 **7.72%** · vert **83.1%** → 3/4 bar qua; V0≥1.5 (n=261) vert sập 57.1% ⇒ trần ở cú NHANH. Stress 5k: 8.06°/11.14%/68.6%/38.9% (c3: 8.14/11.52/66.9/38.2) — không thụt lùi | | |
| | `run_analyzer_a1_vod.bat` | 13/08 | Lát A1 — đo **"trọn 1 VOD một rack"** cho Analyzer đa cú (gate A1.2): cắt 52:45–58:05 (320s, re-encode mốc chính xác) từ VOD pilot Florida Open → upload `/api/analyzer/videos` (corners tái dụng homography shot_01 pilot — cùng góc máy) → segment tự cắt cú → 14 job analyze per cú NGUYÊN TRẠNG → JSON per cú ra đĩa `data\analyzer\<id>\`. Chạy trên bộ `run_analyzer_local.bat` (Redis + CV worker + app queue) | Ngưỡng ghi trước: ≥7/10 cú đếm tay cắt đúng · 0 cú ma · JSON per cú trên đĩa. Đo được: **14 cú** — khớp **10/10** cú tay (onset lệch +0.5–2.1s so start clip tay) + 1 cú **break thật** ngoài danh sách tay (v0 bi 7.13 m/s) + **3 CÚ MA** (idx 7/8/9 = chuyển động XẾP RACK/đặt bi bằng tay giữa 2 rack, phân xử bằng frame; cả 3 tự khai V0 0.27/None/0.99 ngoài khoảng tin + coverage 39–60%) → **gate ĐỎ ở vế "0 cú ma"**, DỪNG đúng luật, phân tích + câu hỏi trong HANDOFF 13/08. Thời gian: scan 177.7s (9600 frame, dup 789) + analyze 14 cú 40.3s, wall ~5.5 phút ≈ **24s/cú** (RTX 3070); FE hiện dần 0/14→14/14 kiểm DOM sống | | |
| | `run_analyzer_a2_vod.bat` | 13/08 | Lát A2 — đo nghiệm thu **van cờ + RMSE resim + overlay.mp4 + CSV export** bằng cách chạy lại TRỌN VOD rack_a1 (TÁI DÙNG byte-for-byte `rack_5245_5805.mp4` đã cắt ở A1 — cùng input, không re-encode) trên bộ Redis + CV worker (boot thêm JIT pooltool cho resim) + app queue. Video_id `bd1ac59b...`, kết quả bền `data\analyzer\bd1ac59b...\` (JSON + overlay per cú) | Ngưỡng ghi trước (gate A2): van **3/3 cú ma (idx 7/8/9), 0/11 cú thật oan** · overlay đủ 14 cú phát NGOÀI app, khớp mắt <1 đường kính bi trên 3 cú thật · RMSE bảng==JSON kèm tên bộ params · CSV UTF-8 BOM đủ 14 hàng + cờ van + RMSE. **Đo được: cả 4 vế ĐẠT** — van nổ đúng {7,8,9}; overlay 14/14 H.264 (11.2MB), mắt kiểm cú 1/5/10; RMSE bộ shotnet 412–1603mm (sim2real gap V0 model + φ basin — hiện trung thực), cú 8 null vì không motion_start; CSV 15 dòng BOM chuẩn. **Đối chiếu số analyze A1↔A2: KHÔNG LỆCH ô nào** (numpy 2.4.4→2.3.5 khi cài pooltool vào cv-env: vô hại). Thời gian: scan 180.1s + analyze lõi 43.6s + resim/overlay ~7.5s/cú → wall ~6 phút | | |
| | `run_analyzer_a2b_vod.bat` | 14/08 | Lát A2b — đo nghiệm thu **gate 4 (bi màu + số theo BallID trên bàn metric)**: worker mới (`67aca97`) gắn `number` vào `balls_init` từ CÙNG nguồn màu với overlay.mp4 (identify_balls frame đầu + bbox RecordingModel, map qua homography bù độ cao của job) → chạy lại TRỌN VOD rack_a1 (byte-for-byte cùng input A1/A2) để có JSON mang số. Video_id `c9fda71c...`, kết quả bền `data\analyzer\c9fda71c...\` | Ngưỡng ghi trước: balls_init mang số ở các cú thật, không trùng số trong cú; kiểm mắt 3 cú thật đối chiếu overlay.mp4 cùng cú. **Đo được: ĐẠT** — 13/14 cú có số (cú 8 chỉ thấy cue); mắt kiểm cú 1/5/13: số + màu == overlay từng viên (kể cả chỗ BallID nhận nhầm bi cam→"8" ở cú 13: overlay A2 CŨ đã nghiệm thu gán Y HỆT — hạn chế màu đã biết, hai nơi NHẤT QUÁN); van nổ đúng {7,8,9} như A2. **BẤT NGỜ (HANDOFF 14/08): số analyze run mới LỆCH A2 ở 131 ô dù cùng input/model/ngưỡng** — analytic lệch nhỏ (±0.005–0.05 m/s, ±0.2°, biên cú ±1 frame; nghi YOLO GPU không tất định giữa hai lần boot worker), shotnet khuếch đại (cú 1 φ 172.5→188.6; cú 13/14 lật follow→stun; RMSE 1146→258) — khớp chữ ký "φ_model bất ổn định theo nhiễu input" BG32. Số A2 (`bd1ac59b`) GIỮ làm mẫu đối chiếu; run này CHỈ phục vụ gate 4 | | |
| | `run_autocorner_eval.bat` | 14/08 | Việc A BRIEF 14/08 — **phép đo đầu tiên** của gợi ý 4 góc bàn tự động (`poolcoach_cv.autocorner`, thuần cv2 + numpy, không train): lệch px per-corner so với corner CHẤM TAY đã lưu (10 cú pilot có `homography.json` + đúng frame đã chấm, + VOD rack_a1 dùng corner của run `c9fda71c`) và tỉ lệ qua **van sanity** (decompose homography, biên BG32 — biên KHÔNG nới). 10 clip `cu11–cu20` không có corner tay nên chỉ góp tỉ lệ van | BRIEF không đặt bar phải "đạt"; mốc đọc kết quả: **median > ~15px thì phải ghi rõ "gợi ý chưa đáng tin"**. Đo được: qua van **18/21 ca (86%)** (chặn cu11/cu12/cu20); lệch per-corner trên 11 ca có chuẩn (44 góc) **median 14.6px · TB 15.4px · max 57.8px**; **0/11 ca gán nhầm cặp băng ngắn**. Lệch dồn về băng ngắn ĐẦU XA (góc gần 1–14px, góc xa 15–58px — 1px ở đầu xa là hàng chục cm trên bàn). ⇒ **NGAY VẠCH ~15px**: dùng làm điểm xuất phát để kéo chỉnh, KHÔNG thay được chấm tay; và chỉ đo trên MỘT camera | | |
| | `run_analyzer_local.bat` | 11/08 (chiều) | Bàn giao 24 — bộ đã chạy **smoke end-to-end thật gate G-24.3**: Redis + CV worker + app mode queue MỘT lệnh; Danh upload cú 11 MỚI (58:14–58:24, chưa qua pipeline, cắt ffmpeg `-ss 00:58:14 -t 10` re-encode) → click 4 pocket trong browser → job `pc:jobs:analyze` → kết quả trên tab Analyzer | Pipeline không crash, luồng browser trọn vẹn Danh xác nhận không vướng: **ĐẠT** — 4.02s/clip 10s (GPU), coverage 97.3%, 34/300 frame trùng bị loại (11.3%), track thẳng dọc bàn khớp cú lăn chậm. V0 trong 1–8 m/s: **ĐỎ có chẩn đoán** — cú được chọn là cú lăn chậm ~1 m/s sát biên dưới VÀ kink giả Δθ 164.7° ngay motion_start (heading bước đầu dưới sàn nhiễu) cắt cụt cửa sổ V0 → V0 0.568/φ null; root cause + đề xuất guard trong HANDOFF 24, chờ Cowork chốt. Bản lưu này chưa bật engine worker (tab Gợi ý 503 fast-fail đúng thiết kế trong phiên launcher) — bản root đã thêm sau, bản lưu giữ nguyên byte đã chạy | | |
| ## Luật của thư mục này | |
| - **Không sửa các file `.bat` ở đây.** Chúng là ảnh chụp của lần chạy đã xảy ra; | |
| sửa là mất đúng thứ chúng tồn tại để giữ. Muốn chạy biến thể → thêm `.bat` | |
| mới ở thư mục cha, chạy xong mới copy vào đây. | |
| - **Copy, không move.** Bản ở `D:\Khoa luan\` phải còn nguyên để double-click. | |
| Hai bản khớp nhau kiểm bằng checksum: | |
| ``` | |
| Get-FileHash "D:\Khoa luan\run_qfield_20260721.bat" -Algorithm SHA256 | |
| Get-FileHash "scripts\experiments\run_qfield_20260721.bat" -Algorithm SHA256 | |
| ``` | |
| - **Đường dẫn trong file là tuyệt đối** (`D:\Khoa luan\...`) và cố ý giữ nguyên | |
| như lúc chạy. Chạy lại trên máy khác thì phải sửa — nhưng sửa ở **bản copy | |
| mới**, không sửa bản lưu. | |
| - `.gitattributes` khai `*.bat text eol=crlf`: `cmd` của Windows cần CRLF, nên | |
| file phải được checkout ra CRLF kể cả trên máy clone bằng cấu hình khác. | |