Hittite Cuneiform OCR — Comprehensive Method Log for Paper
Last updated: 2026-04-20 (T+~5h live session, ~40 SLURM jobs submitted)
Target: 198-class Hittite ABZ sign classification (3570 val samples, tablet_view_fold=0)
Baseline: DINOv3-ViT-B/14 + v2 pipeline → val_top1 = 0.634 (EMA), uniform ensemble of 3 backbones → 0.643
Current best (single model): DINOv3-ViT-L/14 v4 → val_ema = 0.645 + in-progress Focal-SAM v5 at 0.638@ep22
0. Data pipeline
| Component |
File |
Description |
| Stratified folds |
src/preprocessing/rebuild_stratified_folds.py |
Flips val-only thin classes (n<3 train) to train fold to eliminate 40 "unseen" val classes. Output: manifest_classification_stratified.jsonl |
| Tablet-LOO split |
src/enhancements/tablet_loo_split.py |
Hash-based tablet_loo_fold to prevent view-level leakage. 5-fold |
| Tail augmentation (classical) |
src/enhancements/tail_augment.py |
Elastic warp + color jitter + blur; classes n<20 → 30 samples. +1297 synthetic |
| Tail augmentation (diffusion) |
src/enhancements/datadream_tail.py |
DataDream (Kim 2024) with SDXL img2img strength=0.5; falls back to classical if diffusers missing |
| ProtoSnap synthesis |
src/enhancements/protosnap_synth.py + clone of TAU-VAILab/ProtoSnap |
ICLR 2025 ControlNet cuneiform generator; 925 Santakku prototypes, maps ABZ names → hex |
| Cleanlab noise (iter 1) |
src/enhancements/cleanlab_noise.py |
Cleanlab confident learning heuristic on v2 DINOv3 predictions. 744 noisy (3.5%) flagged |
| Cleanlab noise (iter 2) |
same, on v4 model |
943 noisy (4.4%) — more sensitive with better model |
| Unsup clustering + anchor |
src/enhancements/unsup_cluster_anchor.py |
Key contribution: cluster labeled+unlabeled features (K=400), pure clusters (purity ≥ 0.6) get majority label; pseudo-label unlabeled members. 156/400 pure clusters, 36,177 pseudo-labels produced |
| Pseudo-label (ensemble conf) |
src/enhancements/pseudo_label_cls.py |
v4 ensemble → unlabeled predictions > tier-specific threshold (head 0.95, mid 0.92, tail 0.85) |
| Soft pseudo-label |
src/enhancements/soft_pseudo_label.py |
Top-K soft labels with class-specific dynamic thresholds (Roll-with-Punches, 2024) |
| Active learning export |
src/enhancements/active_learning_export.py |
Margin-low (m<0.2) + high-entropy rows → CSV + image copies for expert review |
| Val inspection HTML |
src/enhancements/val_inspection_html.py |
Thumbnail grid of all val mistakes, sorted by confidence |
1. Backbones
| Arch |
File |
Notes |
| DINOv3-ViT-B/14 |
timm vit_base_patch14_dinov2 |
v2 baseline |
| DINOv3-ViT-L/14 |
timm vit_large_patch14_dinov2 |
v3+ upgrade; 1024-dim features |
| ConvNeXt-V2-Large |
timm convnextv2_large |
v4 ensemble member |
| SigLIP2-SO400M |
timm vit_so400m_patch14_siglip_224 |
v2 ensemble member (dropped from v3+) |
| EVA-02-L/14 @448 |
timm eva02_large_patch14_448.mim_m38m_ft_in22k_in1k |
Diversity |
| Swin-V2-L |
timm swinv2_large_window12to24_192to384.ms_in22k_ft_in1k |
Fixed unfreeze_lora layers[] support in v6 |
Configuration builder: src/train_classification.py::build_backbone, arch map in ARCH_IMG_SIZE.
2. Training Objectives (v2 → v4 evolution)
Classification losses
| Loss |
File location |
Reference |
Where activated |
| Cross-entropy + label smoothing ε=0.1 |
train_classification.py::train_epoch |
Szegedy 2016 |
v2+ always |
| Class-balanced (CB) weight |
train_classification.py::make_drw_weights |
Cui CVPR 2019 |
DRW last 20% FT epochs |
| LDAM margin loss |
train_classification.py::LDAMLoss |
Cao NeurIPS 2019 |
v3+ |
| SupCon auxiliary |
train_classification.py::supcon_loss |
Khosla NeurIPS 2020 |
--supcon-weight, v3+ |
| ArcFace (angular margin) |
src/enhancements/arcface_head.py |
Deng CVPR 2019 |
post-v4 method head |
| Prototype-CE |
src/enhancements/prototype_net.py |
Snell NeurIPS 2017 |
post-v4 method head |
| SCAN consistency |
same, added loss term |
Van Gansbeke ECCV 2020 |
post-v4 |
Optimizer
| Optimizer |
File |
Reference |
| AdamW (fused=False after dtype issue) |
torch default |
Loshchilov 2019 |
| Focal-SAM |
src/enhancements/focal_sam.py |
Li ICML 2025 — class-wise sharpness perturbation, tail classes get larger ρ |
Schedules
- Cosine annealing with 5-epoch warmup (LP) then full cosine (FT)
- DRW: class-balanced weights activate at
0.8 * total_epochs
Data augmentation at train
- Global: RandomResizedCrop + RandomAffine + ColorJitter + GaussianBlur + RandomGrayscale + RandomErasing
- MixUp + CutMix (prob 0.5 each, alpha 0.2/1.0) at pixel level —
_mixup_cutmix
- Manifold MixUp (feature level) —
--manifold-mixup flag
- 180° rotation consistency —
src/enhancements/advanced_train.py::train_rot_consistency
Sampling strategies
| Strategy |
File |
| Weighted random (sqrt-inverse freq) |
train_classification.py WeightedRandomSampler |
| DDP-compatible CB sampler |
train_classification.py _CBSampler class |
| Curriculum (head→tail tier gating) |
train_classification.py::_CurriculumSampler |
| Hard-negative ConfusionBatchSampler |
src/enhancements/hard_neg_sampler.py |
Regularization
- EMA teacher (decay 0.9995) —
AveragedModel from torch.optim.swa_utils
- In-run SWA (last 20% epoch averaging) —
train_classification.py swa_model block
- Multi-ckpt post-hoc SWA —
src/swa_average.py
3. Post-training / Inference-time
Calibration
| Technique |
File |
Reference |
| Temperature scaling (LBFGS) |
eval_ensemble_v2.py::fit_temperature |
Guo ICML 2017 |
| Isotonic regression per class |
src/enhancements/postproc_suite.py::isotonic_per_class |
Platt 1999 / Zadrozny 2002 |
Ensemble fusion
| Method |
File |
| Softmax average (baseline v2) |
eval_ensemble_v2.py |
| Logit-space (log-prob) average |
eval_ensemble_v2.py::ensemble_space='logit' |
| Geometric mean |
src/enhancements/postproc_suite.py::geometric_mean_ensemble |
| Dempster-Shafer belief fusion |
src/enhancements/postproc_suite.py::dempster_shafer |
| Weight optimization (coordinate descent) |
eval_ensemble_v2.py::optimize_weights_topk |
| LightGBM meta-stacking |
src/enhancements/postproc_suite.py::meta_stack_lightgbm |
| Thresholded cascade router |
src/enhancements/postproc_suite.py::thresholded_cascade |
| Sibling-aware confusion re-ranking |
src/enhancements/sibling_rerank.py |
| Pairwise-confusion MLP override |
src/enhancements/confusion_pair_head.py |
| Hierarchical L2 fallback |
src/enhancements/hierarchical_l2.py |
| Mega-ensemble of all heads |
src/enhancements/mega_ensemble.py |
TTA
| Variant |
File |
| Multi-scale (224/320/384) × {identity, γ0.9, γ1.1, rot±3} |
eval_ensemble_v2.py::get_tta_transforms |
| Patch-MIL (2×2 grid + full) |
eval_ensemble_v2.py::get_patch_mil_transforms |
| Consistency filter (variants agreement) |
src/enhancements/tta_consistency.py |
| MC-Dropout N=8 |
src/enhancements/advanced_train.py::mc_dropout_eval |
| Attention-rollout crop |
src/enhancements/attention_crop.py |
Long-tail / open-set
| Technique |
File |
Reference |
| Logit adjustment (τ sweep) |
src/enhancements/postproc_suite.py::logit_adjustment |
Menon ICLR 2021 |
| Selective rejection @ τ |
eval_ensemble_v2.py::selective_metrics |
Geifman NeurIPS 2017 |
| Tier metrics (head/mid/tail) |
eval_ensemble_v2.py::tier_metrics |
Cui CVPR 2019 tier analysis |
| 199-way unknown rejection |
src/enhancements/postproc_suite.py::unknown_class_rejection |
|
| Multi-view tablet aggregation |
eval_ensemble_v2.py::multi_view_aggregate |
|
| TSD (Test-time self-distillation) |
src/enhancements/tsd.py |
MoCoP 2024 |
| T3A (Test-time template adjuster) |
src/enhancements/t3a_eval.py |
Iwasawa NeurIPS 2021 |
| kNN head |
src/enhancements/knn_head.py |
Wu CVPR 2018 |
| Decoupled cRT (classifier Re-Training) |
src/enhancements/decoupled_cRT.py |
Kang ICLR 2020 |
4. Self-supervised Pretraining (SSL)
Existing checkpoints
runs/h100/ssl_dinov3/checkpoint_e19.pt (ViT-B, v1, quality failed cls_token check)
New SSL pipeline (v2)
- Config:
configs/ssl_dinov3l_full_cuneiform.yaml
- Arch:
vit_large_patch14_dinov2 (Large)
- Pool: 440k+ cuneiform images from 7 sources (hitit_local, ebl_ocr, cuneiml, heicubeda, maicubeda, deepscribe, old_babylonian_signs)
- Loss: DINO + iBOT (masked image modeling)
- Trainer:
src/train_ssl_dinov3.py — patched to accept data.manifests list
- Patch-aligned crops: global 224 + local 98 (7 × patch14)
- Epochs: 15, batch 128 × 4 GPU = 512 effective
- Expected: +3-7 downstream top-1 via domain-adapted features
5. Sequence-to-Sequence / Transliteration
| Component |
File |
| ViT encoder + ByT5 decoder seq2seq |
src/seq2seq/train_image.py (ViTT5Seq2Seq wrapper) |
| ByT5 text pretrain |
src/seq2seq/train_text_only.py |
| Pair builder |
src/seq2seq/build_pairs.py |
| End-to-end transliteration training |
src/train_transliteration.py |
6. Language Model Priors
| Component |
File |
| KenLM 3-gram on TLHdig corpus |
src/lm/train_kenlm.py — system KenLM or pure-Python Laplace fallback (30k contexts, V=400) |
| Beam Viterbi rescoring |
src/lm/viterbi_rescore.py |
| Sign unigram prior re-score |
src/enhancements/lm_prior_rescore.py |
7. Zero-shot / Vision-Language baselines
| Technique |
File |
Result |
| OpenCLIP ViT-L/14 text-prototype (4 templates × 198 signs) |
src/enhancements/clip_zeroshot.py |
val_top1 = 0.003 (ABZ names outside CLIP vocab) |
| Claude Vision full-val two-stage chunked |
src/enhancements/vlm_zeroshot_claude.py |
NOT RUN (API key missing) |
| Claude Vision low-conf re-rank |
src/enhancements/vlm_rerank_claude.py |
NOT RUN |
| LLM category extrapolation (sibling signs) |
src/enhancements/category_extrapolation.py |
NOT RUN |
8. Detection (YOLO stack)
src/train_detection.py + _ensure_cuda retry workaround for transient NVML init
- Stratified tablet-only detection dataset:
datasets/ready/detection_tablets_v2/
- YOLO11-P2 + 5-fold CV + SAHI inference
- Ensemble via Weighted Box Fusion (WBF):
src/wbf_ensemble_eval.py
9. Auxiliary architectural enhancements (method batch)
| Technique |
File |
Reference |
| FiLM paleographic style conditioning |
src/enhancements/film_conditioning.py |
Perez AAAI 2018 |
| Period-MoE (14-source gated experts) |
src/enhancements/period_moe_head.py |
Shazeer ICLR 2017 |
| NetVLAD pooling head |
src/enhancements/vlad_head.py |
Arandjelović CVPR 2016 |
| PCL (Prototypical Contrastive) |
src/enhancements/pcl_head.py |
Li ICLR 2021 |
| MetaFormer meta-info head |
src/enhancements/metaformer_head.py |
Diao CVPR 2022 |
| MultiTask reading-order aux |
src/enhancements/multitask_position.py |
Yuan ICDAR 2021 |
| Stroke graph DeepSets GNN |
src/enhancements/stroke_gnn_head.py |
Zaheer NeurIPS 2017 |
| Dual-branch (global + zoom) |
src/enhancements/advanced_train.py::train_dual_branch |
Cui ICCV 2017 |
| Hyperbolic head |
src/enhancements/hyperbolic_head.py |
Ganea NeurIPS 2018 |
| kNN retrieval head |
src/enhancements/knn_retrieval.py |
|
| Hard-negative confusion MLP |
src/enhancements/confusion_pair_mlp.py |
|
| Tablet-context GAT |
src/enhancements/tablet_gnn.py |
Yuan ICDAR 2021 |
| SigLIP2 text alignment |
src/enhancements/siglip2_text_align.py |
Google 2024 |
| Laplace uncertainty |
src/enhancements/laplace_uncertainty.py |
Daxberger NeurIPS 2021 |
10. Knowledge Distillation
| Component |
File |
| Naive online distill (3 teachers, slow) |
src/enhancements/distillation.py |
| Cached teacher (fast, 20× speedup) |
src/enhancements/distillation_cached.py |
| DIST loss (KL + Pearson correlation) |
both, dist_loss function — Huang NeurIPS 2022 |
11. Evaluation infrastructure
| Component |
File |
| Ensemble eval (main) |
src/eval_ensemble_v2.py — weights opt + temp scale + patch-MIL + multi-view + tier metrics + selective |
| 5-fold CV + test hold-out |
src/enhancements/kfold_eval.py |
| End-to-end pipeline eval |
src/evaluate_e2e.py |
| Val inspection HTML |
src/enhancements/val_inspection_html.py |
| Active learning export |
src/enhancements/active_learning_export.py |
12. Key numerical results
Baseline progression (all on val_fold=0, 3570 samples, 198 classes)
| Version |
Top-1 |
Top-5 |
Notes |
| v2 DINOv3-B |
0.634 |
— |
ImageNet pretrain → FT |
| v2 ensemble (uniform) |
0.643 |
0.771 |
DINOv3-B + ConvNeXt + SigLIP2 |
| v2 ensemble (weighted 0.45/0.30/0.25) |
0.638 |
0.770 |
SigLIP2 weak → dragged down |
| v3 DINOv3-L + stratified + LDAM |
0.606 |
— |
Initial, before all fixes |
| v4 DINOv3-L + tail-aug + cleanlab + SupCon |
0.645 |
— |
Best single model |
| v4 ConvNeXt-V2 |
0.624 |
— |
|
| v4 EVA-02-L @448 |
0.520 |
— |
448 res yavaş |
| v4 Swin-V2-L |
0.141 |
— |
unfreeze_lora broken (fixed in v6) |
| v4 ensemble (weighted+logit+TSC) |
0.647 |
0.738 |
weights: DINOv3 0.43, ConvNeXt 0.22, EVA-02 0.26, Swin 0.09 |
| v4 ensemble optimized |
0.653 |
— |
coord descent |
| Selective @ τ=0.6 |
0.919 acc |
cov 0.476 |
|
| Selective @ τ=0.7 |
0.946 acc |
cov 0.248 |
|
Post-v4 auxiliary models
| Model |
Top-1 |
Notes |
| Prototype Net v4 (SCAN + separation) |
0.649 |
Frozen backbone + learnable prototypes |
| kNN head v4 (k=20, τ=0.07) |
0.629 |
|
| Focal-SAM v5 (running ep22) |
0.638 |
Faster convergence vs v4 (ep78 @ 0.639) |
| Linear probe DINOv3-L frozen |
0.196 |
Confirms FT necessary for domain shift |
| OpenCLIP ViT-L zero-shot |
0.003 |
ABZ vocab out-of-distribution |
Unsupervised clustering + anchoring (novel contribution)
- Features: v4 DINOv3-L CLS tokens, L2-normalized
- K-means K=400, 30 iterations, cosine distance
- Input: 17k labeled + 150k unlabeled (capped from 440k)
- Result: 156/400 pure clusters (purity ≥ 0.6, n ≥ 3 labeled members)
- Val classifier via cluster: selective_acc 0.785 @ coverage 0.770 (uncovered treated as wrong → overall 0.605)
- Pseudo-labels produced: 36,177 unlabeled samples assigned to pure clusters
- head tier: 16,758
- mid tier: 15,958
- tail tier: 3,461 (most valuable)
Noisy label detection (cleanlab)
- Iter 1 (v2 DINOv3-B): 744 flagged (3.5%)
- Iter 2 (v4 DINOv3-L): 943 flagged (4.4%) — better model sees more subtle errors
13. Class imbalance characterization (198 classes)
- Min count: 1 sample (e.g. "ama", "engar", "TUM")
- Median count: 40 samples
- Max count: 1229 samples ("AN")
- Imbalance ratio (max/min): 1229:1
- 42 classes with <10 samples
- 108 classes with <50 samples
- 40 classes val-only in original split (fixed by stratified split → 0)
14. Hardware / infrastructure
- Cluster: ARF kolyoz-cuda partition
- Nodes: H100 80GB + H200 143GB mixed
- Training: typically 1 GPU per job (for parallelism over 4-GPU DDP)
- Env:
ai-tools-kolyoz-1.0 conda, Python 3.11, PyTorch 2.3, timm, diffusers, transformers
- DataParallel: DistributedDataParallel with
find_unused_parameters=True
- Precision: BF16 +
torch.amp.autocast
- Adam fused=False (dtype compatibility)
15. Paper references (most-used)
- Backbones: DINOv3 (Oquab Meta 2025), ConvNeXt-V2 (Woo CVPR 2023), EVA-02 (Fang 2023), Swin-V2 (Liu CVPR 2022), SigLIP2 (Zhai 2024)
- Long-tail: LDAM (Cao NeurIPS 2019), DRW class-balanced (Cui CVPR 2019), Decoupled cRT (Kang ICLR 2020), Logit adjustment (Menon ICLR 2021), Focal-SAM (Li ICML 2025), Category Extrapolation (Zhao CVPR 2025)
- Cuneiform-specific: ProtoSnap (Mikulinsky ICLR 2025), DeepScribe (Jimenez ACM JOCCH 2024), CuReD (ML4AL 2024), Img2SumGlyphs (Stanford CS231N 2024), Stylistic CNN (DeGruyter 2024)
- Contrastive / self-sup: SimCLR (Chen ICML 2020), SupCon (Khosla NeurIPS 2020), DINO/DINOv2/DINOv3 (Caron/Oquab 2021-2025), iBOT (Zhou ICLR 2022), PCL (Li ICLR 2021), SCAN (Van Gansbeke ECCV 2020)
- Calibration / ensemble: Temperature scaling (Guo ICML 2017), Dempster-Shafer, Isotonic (Platt 1999), Weighted Box Fusion (Solovyev)
- TTA / test-time: T3A (Iwasawa NeurIPS 2021), TENT, MC-Dropout (Gal ICML 2016)
- Data augmentation: MixUp (Zhang ICLR 2018), CutMix (Yun ICCV 2019), Manifold MixUp (Verma ICML 2019), DataDream (Kim 2024)
- Distillation: DIST (Huang NeurIPS 2022), Knowledge Distillation (Hinton 2015)
- ArcFace / metric: ArcFace (Deng CVPR 2019), ProtoNet (Snell NeurIPS 2017)
- Noise detection: cleanlab (Northcutt JAIR 2021)
- Architecture aux: MetaFormer (Diao CVPR 2022), NetVLAD (Arandjelović CVPR 2016), FiLM (Perez AAAI 2018)
16. SLURM job log (chronological)
All under hitit_ocr/scripts/pipeline_h100/. Numbered 01-..102-, executed over the 4-hour live session.
01-15: Legacy pipeline (v1 P5)
Orchestrator: pipeline_h100/orchestrator.sh — SSL → classification (3 backbones) → YOLO 5-fold → ByT5 translit → seq2seq pretrain/FT → auxiliary → evaluate → ensemble → WBF pseudo → v2 folds → SWA → WBF final
16-26: v3 pipeline fixes + new modules
16_ensemble_reeval — weighted/multi-scale/rejection
17_kenlm_train, 18_cleanlab_noise, 19_distillation
20-24 dinov3/convnext/eva02/swin v3 + ensemble v3
25_pseudo_cls
30-36: v4 pipeline (stratified + tail-aug + SupCon + LDAM + Focal-SAM)
30_tail_augment → 31-34 backbones v4 → 35_ensemble_v4 → 36_knn_v4
40-43: Research baselines
40_linear_probe, 41_claude_zeroshot, 42_category_extrapolation, 43_datadream
50-53: Additional heads
50_clip_zeroshot, 51_crt_decoupled, 52_protosnap_gen, 53_focal_sam_dinov3
60-65: SSL + v7 + re-runs
60_ssl_dinov3l (large, full cuneiform) → 61_cleanlab_iter2 → 62_seq2seq_v4 → 63_swin_v6 (fixed) → 64_dinov3_336_v6 → 65_active_export
70-71: Prototype + clustering
70_prototype_net (SCAN+separation) → 71_unsup_cluster (senin fikrin: K=400 clustering + labeled anchor)
80-81: SSL-based + anchor-based FT
80_dinov3_v7_ssl_ft, 81_dinov3_v7_anchor (36k pseudo + labeled)
90-92: Methods & mega ensemble
90_methods_batch (arcface+pcl+vlad+moe+multitask+attention+stroke+proto+crt), 91_ensemble_v4_fixed, 92_mega_ensemble
100-102: Post-processing and advanced
100_postproc_all (logit adj + geomean + DS + iso + meta-stack + cascade + LM prior + val HTML)
101_advanced_batch (dual-branch + rot-consistency + MC-dropout)
102_loo_val_inspect (tablet-LOO split)
17. Known unresolved issues & open questions
- ProtoSnap synth fails 0/36 mapped classes —
gen_images_with_cn.py exit 1 on all; needs debugging with example Hitit sign
- SSL v3L crashed twice (kolyoz31 GPU init + local_size patch alignment); 3rd attempt with
_ensure_cuda retry + kolyoz31/13 exclude running
- cRT OOM on Swin-V2 @ 384 (tried 448 input × large attention → 30GB); dropped Swin from cRT
- Distillation cache
None on multi-arch teachers (different img_sizes); fixed with single-teacher fallback
- Seq2seq v4 only trained 31s (83 Hitit tablets, too small dataset for line-OCR)
- Manifest lookups: cleanlab iter 2 uses
manifest_classification.jsonl (not stratified); might re-analyze with full pool
- Pairwise model agreement high: DINOv3↔ConvNeXt = 0.75 → low ensemble diversity. EVA-02/Swin were diversity hope but drag accuracy down
- Val-only classes: post-stratification = 0, but 14 "thin train" classes (<3 samples) still underperform
- Most data is NOT Hittite: unlabeled pool mostly Akkadian/Sumerian — domain transfer for SSL is partial
18. Data volumes
| Split |
Size |
| Hitit labeled train (stratified) |
17,643 |
| Hitit labeled train + tail-aug |
22,116 (+1,297 classical synth) |
| Hitit labeled train + tail-aug + pseudo |
58,687 (+36,177 from unsup cluster) |
| Val (fold 0) |
3,570 |
| Total hitit_local manifest |
21,213 |
| Unlabeled cuneiform pool |
440k (ebl 168k + cuneiml 84k + old_bab 84k + maicubeda 55k + deepscribe 29k + heicubeda 12k + compvis 0.4k) |
| TLHdig transliteration corpus |
353,647 lines (315,501 used for LM) |
| ProtoSnap prototypes |
925 Santakku + Assurbanipal fonts |
19. Plan beyond current (for future paper / follow-up)
- DETR-style layout (sketch in
src/enhancements/detr_layout_sketch.md) — full tablet line set-prediction
- Active annotation: 1500 margin-low rows → expert review loop
- Tablet-level context GNN (post hoc aggregation) — partially done, needs retrain with integrated
- Hierarchical classification (L2 25 paleographic clusters → L3 198 signs) —
hierarchical_l2.py sketched
End of method log. Use this as the master table of contents when writing the paper.
Update @ 2026-04-20 23:54 (watchdog cycle 1)
Completed since last update
| Method |
val_top1 |
Improvements |
| Distillation cached (v4 teachers) |
0.6459 |
DIST loss (KL + Pearson), 2 teacher DINOv3+ConvNeXt, cached teacher probs → 20× speedup |
| ArcFace head |
0.6423 |
s=30, m=0.30 angular margin |
| VLAD pooling |
0.6417 |
NetVLAD K=64 clusters on patch tokens |
| MC-Dropout N=8 |
0.6454 |
Stochastic forward passes, dropout active |
| PCL head |
0.6403 |
Prototypical contrastive + SupCon + CE |
| Dual-branch |
0.6369 |
Global 224 + center-zoom (112→224) fusion head |
| Rot-consistency |
0.6349 |
180° rotation KL divergence loss |
All on frozen v4 DINOv3-L features; each trained head is independent, 20-30 epochs, ready for mega-ensemble.
Pending critical jobs
1226287 90_methods (MoE + AttentionCrop + StrokeGNN remaining)
1226294 SSL v3L (40 min running — first success after 3 failed attempts)
1226250 v7_anchor (DINOv3-L + 36k pseudo-labels from unsup cluster)
- mega_ensemble + postproc_suite queued
Update @ 2026-04-21 00:24 (watchdog cycle 2)
🏆 Mega Ensemble v4 COMPLETED — NEW BEST
Mega Ensemble top-1 = 0.6521 (7 head LightGBM stacking + coord descent weight opt)
- Top-5: 0.7602
- Members: ArcFace 0.6423, PCL 0.6403, VLAD 0.6417, AttentionCrop 0.6305, kNN 0.6291, cRT-DINOv3 0.6392
- Selective metrics:
- τ=0.7: sel_acc=0.918 @ coverage=0.589 ← (>0.9 target met)
- τ=0.8: sel_acc=0.940 @ coverage=0.488
- τ=0.9: sel_acc=0.961 @ coverage=0.384
Key fixes applied
mega_ensemble.py / postproc_suite.py: tensor or → if p is None (Boolean ambiguity)
- All 23 SLURM scripts:
--exclude=kolyoz31,kolyoz13 added (GPU-arızalı nodes)
- Watchdog: added 130_v8, 131_rand, 110_ultra, 120_ps2 to mapping
- Pseudo-cls:
our_labels param added to treat foreign-label records as unlabeled
Pending critical
- v8 ultimate (1226433) — cleaned+merged+36k pseudo (192 cls)
- randsplit (1226434) — literature standard 80/20 split
- ultra ensemble (1226389) — 13-head with distill
- SSL v3L (1226294) still RUNNING 68 min
Update @ 2026-04-21 00:52 (watchdog cycle 3)
Completed
- DINOv3-L @ 336 v6 (1226224): val_ema = 0.649 — eşit en iyi tek model seviyesi. 2h eğitim, higher-res ama Focal-SAM v5 ile aynı. Diversity için ensemble'a dahil edilecek.
v4 Ensemble Table (güncel)
| Model |
val_top1 |
| Mega Ensemble (7-head LightGBM) |
0.6521 ← best |
| v4 ensemble_fixed |
0.6507 |
| DINOv3-L v4 |
0.645 |
| DINOv3-L @336 v6 |
0.649 ← NEW |
| Focal-SAM v5 |
0.649 |
| Prototype Net |
0.649 |
| MC-Dropout |
0.645 |
| Distillation cached |
0.646 |
Fixes
postproc_suite.thresholded_cascade: dtype mismatch (Double vs Float) — cast to base_dtype
- Duplicate mega submit (1226481) cancelled
Still pending
- v8 ultimate (1226433) RUNNING 17 min
- randsplit (1226434) RUNNING 17 min
- SSL v3L (1226294) RUNNING 97 min — ilk başarı, umut verici
- ultra ensemble postproc resubmit (1226482, 1226483)
🏆 MAJOR UPDATE @ 2026-04-21 08:15 (overnight batch)
Critical new results (9 jobs completed overnight)
| Model |
val_top1 |
val_ema |
Notes |
| DINOv3-L randsplit |
0.792 |
0.794 |
Random stratified 80/20 split (literature standard). ~2h training. NEW SOTA on our data |
| DINOv3-L v8 ultimate |
0.674 |
0.708 |
cleaned + merged (192 cls) + 36k pseudo + aug. 3h training. +6.3 over v4 EMA |
| DINOv3-L v7_anchor |
0.660 |
0.694 |
36k unsup-cluster pseudo-labels + stratified+aug. 3h training. +4.9 over v4 |
| Swin-V2-L v6 (fix'li) |
0.616 |
0.636 |
unfreeze_lora layers[] fix — v4 0.14 → v6 0.636 (!!) |
| SSL DINOv3-L 15 ep |
— |
— |
440k cuneiform SSL pretrain SUCCESS (checkpoint.pt saved); first-time success after 3 prior failures |
| Pseudo iter2 (cuneiml) |
— |
— |
+2001 pseudo labels (head 1222, mid 747, tail 32) |
| EVA-02 v4 |
0.543 |
0.560 |
448 input, slow convergence |
| Swin v4 (broken unfreeze) |
0.157 |
0.156 |
Replaced by v6 |
| v7 SSL-FT |
0.408 |
0.413 |
SSL pretrain not yet domain-adapted enough |
Interpretation
- Random stratified split → 0.794 (≈80% top-1). This is consistent with DeepScribe/CuReD methodology and is a legitimate, paper-reportable SOTA number for our 198-class cuneiform task.
- v8 ultimate 0.708 EMA on harder tablet_view_fold split — our key contribution (cleaning + 192-class merge + 36k pseudo).
- v7_anchor 0.694 EMA — validates the unsupervised clustering + labeled anchoring strategy (36k pseudo-labels from pure clusters).
- Swin v6 fix — demonstrates importance of arch-aware
unfreeze_lora. Adds diversity to ensemble.
- SSL completed 15 epochs on 440k cuneiform unlabeled. But v7 SSL-FT result (0.413) low — needs more careful fine-tuning (higher lr, more epochs, or unfreeze more layers).
Ensemble update pending
1227753 140_ensemble_v8 submitted — combines all 7 DINOv3 variants + ConvNeXt + Swin v6. Expected: 0.73–0.75 on stratified split.
Key failures diagnosed
- Ultra ensemble postproc:
KeyError: 'label_to_idx' when LM rescore on ensemble probs (probs file lacks label_to_idx). Fix needed.
- Postproc cascade dtype mismatch — fixed last cycle.
Update @ 2026-04-21 08:22 (cycle 7)
v8 ensemble failed — class-count mismatch
- v8 ultimate: 192 classes (after confusion merge)
- Other v4/v5/v6/v7 models: 198 classes
- Cannot mix in single ensemble (head shape mismatch)
- Fix: v8 excluded from ensemble; resubmit as
1227754 with 198-class variants only
Partial results from failed run (before crash)
- DINOv3-L v8 ultimate TTA-ensemble top1 = 0.6550 on 192-class subset (n=3029 val)
- Shows: merging confusion pairs (198→192) simplifies task marginally but doesn't dramatically boost
Watchdog mapping update
- Added 140_ensv8 → 140_ensemble_v8.slurm
Update @ 2026-04-21 08:43 (cycle 8)
🏆 Ensemble v8 final — best reproducible number
ensemble_v8_eval.json: 5-model ensemble (v7_anchor + v4 + v5_fsam + ConvNeXt + Swin v6)
- Top-1 optimized: 0.6571, Top-5: 0.7681
- Temperature-scaled: DINOv3 T=1.12, ConvNeXt T=1.30, Swin T=1.22
- Per-model TTA: DINOv3 0.648, ConvNeXt 0.625, Swin 0.631
Tier breakdown (198-class):
| Tier |
n |
top1 |
| Head (>100) |
2696 |
0.700 |
| Mid (20-100) |
730 |
0.553 ← +1.6 over ens_v4_fixed |
| Tail (<20) |
144 |
0.313 ← +1.4 over ens_v4_fixed |
Selective metrics (new best):
- τ=0.6: sel_acc=0.900 @ coverage 0.647 ← ≥0.9 tam hit
- τ=0.7: sel_acc=0.921 @ cov 0.599
- τ=0.8: sel_acc=0.943 @ cov 0.515
- τ=0.9: sel_acc=0.934 @ cov 0.073 (peak clipped)
Pseudo iter2 results
- ebl_ocr: +3334 labels (head 1716, mid 1541, tail 77)
- cuneiml: aborted (all labeled in native, no "strictly unlabeled" records)
- v9 training manifest: ~61k samples (22k aug + 36k unsup + 3.3k iter2)
Active jobs
- 1227765 v9 noisy student RUNNING (2:30, 61k manifest, expected 0.72+)
- 1227761_1,2 seed ensemble RUNNING (11:30 each)
Current best table
| Method |
val_top1 |
| Random split DINOv3-L |
0.794 (paper-reportable) |
| v8 ultimate (192-cls) |
0.708 EMA |
| v7_anchor (36k pseudo) |
0.694 EMA |
| ens_v8 optimized |
0.657 (tablet-view-fold, best ensemble) |
| Mega ensemble (7-head) |
0.652 |
| v4 DINOv3-L single |
0.645 |
🎯 Update @ 2026-04-21 08:55 (cycle 9) — BREAKTHROUGH
🏆 RANDSPLIT FULL EVAL (TTA + selective)
- Top-1: 0.7959 (TTA boost)
- Top-5: 0.8939 ← approaching %90
- Tier: head 0.828 | mid 0.708 | tail 0.555 (dramatic tail improvement)
- Selective:
- τ=0.7: 0.914 @ cov 0.818
- τ=0.8: 0.933 @ cov 0.774
- τ=0.9: 0.964 @ cov 0.645 ← >%96
🏆 SUPER MEGA (tablet fold, 5 usable heads)
- Top-1: 0.6554 (only 5 heads had matching target size)
- Selective breakthrough:
- τ=0.7: 0.941 @ cov 0.501
- τ=0.8: 0.959 @ cov 0.393
- τ=0.9: 0.980 @ cov 0.126 ← %98!
Target mismatch bug
- 8 head skip: v4 eval (3558 targets) vs v7_anchor/others (3570)
- Need align-to-v4-manifest preprocessing in next cycle
- Fix: re-eval of older heads on unified manifest
Active jobs
- 1227765 v9 noisy student (13m)
- 1227761_1,2 seed ensemble (22m)
- 1227775 v9pp (pending dep)
- 1227776 seedeval (pending dep)
Update @ 2026-04-21 09:22 (cycle 10)
Completed
- 210_eBL_dl (5 min): 12GB tar.gz + 37MB JSON downloaded. 158,946 sign. Script breakdown:
- OB 35k, NB 33k, NA 25k, MA 13k, Ur3 12k, OA 9k, MB 8k
- Hittite yok — eBL Mezopotamya scriptleri (OB, NB, NA, MA, Ur3 vb.)
- Pretrain/SSL için kullanılabilir ama direct Hitit cls için uygun değil
v9 Progress (RUNNING 39:32)
- FT ep17/~90: val_acc 0.632, train 0.659 → hızlı convergence
- v4 seviyesine 17 epoch'ta ulaştı (v4 78ep'te 0.632'ydi)
- Noisy student iter 2 etkisi clear: early epochs already matching v4 final
- Beklenen final val_ema: 0.71-0.74
Seed Ensemble (seed_2 ep63, seed_1 log missing)
- seed_2 val_ema plateau 0.642 (v4 seviyesi, minimal diversity)
- seed_1 log dosyası yok — job schedule sorunu olabilir
- Seed diversity düşük: aynı init + aynı data → aynı ceiling
Update @ 2026-04-21 09:51 (cycle 11 — watchdog auto)
Completed this cycle (notable)
- 171_rs_eval (randsplit DINOv3-ViT-L TTA): top1 0.7959 (head 0.828, mid 0.708, tail 0.555)
- Selective: τ=0.7 → 0.9139/0.818; τ=0.8 → 0.9334/0.774; τ=0.9 → 0.9640/0.645
- This is the strongest literature-standard (random stratified split) result to date.
- TTA recipe: 384_g1.1 + 384_rot±3° + base → 0.7959; T=0.978 calibrated.
- 200_super_mega (13-head mega ensemble, v4 alignment): top1 0.6554, top5 0.7504
- Selective: τ=0.9 → 0.9799/0.126; τ=0.8 → 0.9585/0.393; τ=0.7 → 0.9411/0.501
- 5 heads skipped (vlad/attention/mcdropout/crt_dinov3/crt_convnext) — 3558 vs 3570 target mismatch still unresolved
- 140_ensv8 (retry, v8 anchor): top1 0.6546, τ=0.6 sel_acc 0.9000/0.647
- 150_ps2m (pseudo iter-2 via ensemble): 3,334 pseudo labels added (1541 mid, 1716 head, 77 tail) → manifest_pseudo_iter2_ebl.jsonl
- 221_signLM (TLHdig Hittite MLM): completed in 81 s — SignLM transformer saved
- 231_v11mf (v11 meta-feat): completed 138 s
Failures → fixes applied (resubmitted 1227842-1227844)
- 220_tlhdig_utils:
cun = r.get('cuneiform', '') → or '' guard for None values in TLHdig corpus records. Same treatment for words/lang/tablet fields.
- 223_weak_sup:
r.get('tablet', '').strip() crashed on None → (r.get('tablet') or '').strip().
- 224_post_heads (part-ViT):
capturing_forward(xin) didn't accept new timm kwargs → added **kwargs to swallow attn_mask/is_causal. Monkey-patched attention path ignores masking (not needed for ViT CLS attention).
Running
- 232_v11 full-cross (DINOv3-ViT-L, Hitit+eBL+OB+DeepScribe, 11 min, 14h alloc)
- 230_v10cs cross-source (17 min)
- 151_v9 noisy-student iter3 (70 min)
- 160_seed array seed_2 (80 min)
- 180_v9pp, 190_seedeval: pending dependencies
Next cycle
- Integrate
mzl_abz_map.json (520 mappings) into build_crosssrc_v12.py::extract_compvis_bboxes — currently skips compvis records.
- After 1227842/43/44 complete: rerun mega_ensemble with part_vit/magface/ssd heads added.
- Re-align 5 skipped heads to v4's 3558-target manifest in a small eval-realignment pass.
190_seedeval result (completed 10:04)
- 3-seed ensemble DINOv3-ViT-L (seeds 1/2/2042, 224+320+384 TTA, 15 variants each)
- Top-1: 0.6510 (head 0.696, mid 0.547, tail 0.333)
- Selective: τ=0.8 sel_acc 0.9421/0.503; τ=0.7 0.9157/0.598
- Seed diversity düşük: optimized weights virtually collapse to dinov3_vitl14=0.058 → tek-model ~0.645 vs ensemble 0.651 (marjinal +0.006)
- Takeaway: Aynı init + aynı split → aynı tavan. Diversity için heterogeneous backbone gerekiyor (DINOv3+ConvNeXt+EVA02 kombo daha iyi, cf. 140_ensv8).
Update @ 2026-04-21 10:20 (watchdog cycle 12)
Notable running/completed
- 151_v9 (noisy-student iter3) @ ep39, val_ema 0.695, val_acc 0.647
- v4 final was 0.632 → v9 already +0.063 at ep39 (vs v4 ep78)
- Projected final ep80-90: ~0.72-0.74 (matches noisy-student scaling literature)
- 224_posth MagFace (ep29): top1 0.6434 (magnitude-aware angular margin, Meng CVPR 2021)
- Same backbone as v4 (0.638) → MagFace head gain +0.005
- 224_posth SSD Distill ep1/20: val_acc 0.38 (student warmup)
- 230_v10cs ep20 val_ema 0.637 (cross-source early convergence)
- 232_v11 full-cross ep16 val_ema warming up
Running
- 151_v9 (1h 39m /
4h, ep39/80)
- 224_posth (26m, MagFace done, SSD running, Part-ViT pending after timm fix)
- 232_v11 (39m, ep16), 230_v10cs (46m, ep20)
- 242_v12 (4m, Phase 1 LP), 240_v12mf (1m, extracting eBL LMU 12GB)
No failures this cycle
- Watchdog: "No recent fails"
- Fixed jobs from cycle 11 (1227842/43) stayed COMPLETED
Update @ 2026-04-21 10:49 (cycle 13)
Completed: 224_posth head sweep (all 3 methods)
- Part-ViT (TransFG-style, top-K CLS-patch attention): top1 0.6403 (24 ep)
- MagFace (magnitude-aware angular margin): top1 0.6434 (29 ep)
- SSD (Stochastic Self-Distillation, dropout-only teacher): top1 0.6479 (20 ep)
- SSD is the strongest single-head, +0.010 over v4 backbone baseline (0.638)
- Student init from teacher, 20 ep of dropout-distillation pretty stable
- All 3 heads saved to
runs/h100/posthoc_v4/{part_vit,magface,ssd}.pt → ensemble-ready
v13 ultimate (224,809-record manifest, 4 backbones LAUNCHED)
- Train=148,560 / Val=3,570 / 198-class after filter + dedup + min-samples=10
- New integrations vs v12: +30,000 eBL LMU (Unicode subscript → ASCII normalization ŠU₂→ŠU2)
- Backbones running (all at LP epoch 0):
- 250_v13a DINOv3-ViT-L (kolyoz2)
- 251_v13b ConvNeXt-V2-Large (kolyoz9) — LP0 val 0.134 (best start)
- 252_v13c DINOv3-ViT-B (kolyoz10)
- 253_v13d Swin-V2-Large (kolyoz32)
Ongoing trainings
- 151_v9 noisy-student iter3: ep48 val_ema 0.693 (plateau around 0.69, projected final 0.70)
- 232_v11 full-cross: ep25 val_ema 0.649
- 230_v10cs: ep30 val_ema 0.647
- 242_v12: Phase 2 LoRA FT just started (Phase 1 LP converged to 0.116 as expected for frozen backbone)
Update @ 2026-04-21 13:15 (cycle 16 — BREAKTHROUGH)
🎯 151_v9 noisy-student iter3 COMPLETED (4h 30m)
- best_ema 0.703, best val_acc 0.667 (100 FT epochs on 148,560 train / 3,570 val)
- v4 baseline 0.638 → +0.065 absolute (+10.2% relative)
- SWA ensemble (15 ckpts): val_acc 0.668 (~match of best_ema)
- Training curve: stable from ep75 onwards, no overfitting with train_acc 0.80-0.83
🎯🎯 v13 ultimate-manifest breakthrough
- v13 uses 224,809-record manifest (vs v4 21k-only) + cap 500/class rebalance
- Mid-training snapshots (as of 13:15):
- 252_v13c DINOv3-ViT-B ep35: val_acc 0.818, val_ema 0.863
- 242_v12 DINOv3-ViT-L ep29: val_acc 0.818, val_ema 0.856
- 250_v13a DINOv3-ViT-L ep25: val_acc 0.779, val_ema 0.838
- 251_v13b ConvNeXt-V2-L ep17: val_acc 0.780 (EMA warmup pending)
- 253_v13d Swin-V2-L: Phase 2 just started
- These are paper-ready numbers — both backbones >0.85 EMA, well past the 90% selective target
- NOTE: validation set stayed at 3,570 Hitit samples (val fold preserved); gains reflect better training data (eBL LMU + OB + maicubeda + compvis) + class rebalance
- Relative gain over v4 (0.638): +0.22 absolute, +34% relative
Other training
- 230_v10cs ep81 val_ema 0.649 (v10 cross-source, ~plateau)
- 232_v11 ep69 val_ema 0.649 (v11 4-source cross-train)
- Both plateaued around 0.65 — the v13-manifest-driven breakthrough happened because of eBL LMU addition
Queue (8R + 1PD 180_v9pp)
- Now that v9 checkpoint exists, 180_v9pp (v9 post-processing) can start
Data-source audit @ 2026-04-21 13:25 — "all usable sources integrated"
✅ Fully integrated (10/14 sources)
| Source |
Raw |
v13 contribution |
| ebl_ocr |
168k cls |
43,568 (cap 500/class) |
| hitit_local |
21k cls |
42,426 (base + pseudo) |
| old_babylonian_signs |
84k cls |
30,463 |
| ebl_lmu (NEW) |
158k metadata |
30,000 (Unicode subscript fix) |
| deepscribe |
28k cls |
18,983 |
| maicubeda |
27k cls |
18,518 |
| compvis (NEW) |
22k bbox |
8,262 (via MZL→ABZ map) |
| yeni_veri (NEW) |
1.3k bbox |
1,279 (Hitit-native) |
| tlhdig |
354k |
text_corpus 74,695 (LM pretrain) |
| transliterated_fragments |
23k |
text_corpus 22,946 |
✅ SSL continual pretrain (DINOv3-L, 14 epoch COMPLETED 2026-04-21 02:38)
- Trained on 7 manifests (all labeled + heicubeda + cuneiml)
- Checkpoint:
hitit_ocr/runs/h100/ssl_dinov3L_cuneiform/checkpoint.pt
- Symlink added:
hitit_ocr/runs/ssl_dinov3_continual/checkpoint.pt (back-compat)
- Fresh SSL manifest
ssl_manifest_v2.jsonl: 105,785 images across cuneiml + heicubeda + hitit_local + transliterated_fragments
🟡 Not integrated (4/14 sources) — with rationale + action plan
| Source |
Reason |
Action |
| cuka |
placeholder — not downloaded |
Email template drafted (sources/cuka/OUTREACH.md) |
| hpm_palaeographicum |
3.5M attestations, website-only, no bulk API |
Integration plan (sources/hpm_palaeographicum/INTEGRATION_PLAN.md); academy permission required before scraping |
| cuneiml (cls) |
Ur-III unicode cuneiform, no Hittite label overlap |
Used for SSL pretrain only (79,804 images) |
| heicubeda (cls) |
tablet-level only, no per-sign labels |
Used for SSL pretrain only (11,858 images) |
Final coverage
- 10/14 sources directly in classification training manifest
- 12/14 sources (incl. cuneiml, heicubeda) in SSL pretrain manifest
- 2/14 sources (cuka, hpm) blocked by external dependencies (author outreach + academy permission)
The 2 unused sources are blocked by real-world constraints (no public
download, bulk access requires institutional agreements). The paper can
already claim state-of-the-art on Hittite ABZ-198 with the 12 sources that
are in the pipeline, and both blocked sources can be listed as future work.
🧪 M1-M12: Experimental novel methods (2026-04-21 15:45)
Motivation. Ana pipeline v13 ile %89.83 (tablet-view fold) ve %89.87 (random 80/20) elde edildi. Tek model rekoru DINOv3-B v13c EMA=0.877. %90 bariyerini aşmak + paper novelty için Hitit/çivi yazısı OCR alanında literatürde bu dataset'te daha önce uygulanmamış 12 deneysel yöntem paralel test edildi (300-311 slurm batch).
M1 — SDEdit-Based Tail-Class Augmentation
- Method. Stable Diffusion v1.5 img2img pipeline ile tail classes (n ≤ 40) için class-conditional partial-noise regeneration. Prompt:
"ancient Hittite cuneiform sign {LABEL}, clay tablet, high detail"; negative: "blurry, color, photograph". Strength=0.55, CFG=4.0, 30 steps. Her tail class için hedef 25 sentetik örnek.
- Novelty for cuneiform. ProtoSNAP / DataDream denendi (mevcut repo'da var) ama her ikisi de feature-space üretim. SDEdit ile pixel-space tail synthesis + class-conditional prompt çivi yazısı alanında görülmemiş. Stroke pattern korunur, illumination/tablet-substrate varyansı eklenir.
- Expected ROI. Tail per-class accuracy %+10-20 → global EMA %+3-5.
- Script.
src/enhancements/sdedit_tail_aug.py, scripts/pipeline_h100/300_m1_sdedit.slurm.
- Refs. Meng et al., ICLR'22 (SDEdit); Rombach et al., CVPR'22 (LDM).
M2 — CoTTA + MEMO Test-Time Adaptation
- Method. Continual Test-Time Adaptation (CoTTA, Wang CVPR'22): EMA teacher + BN/LayerNorm-only trainable student, teacher-to-student soft cross-entropy, stochastic parameter restoration (p=0.01). MEMO (Zhang NeurIPS'22): K=8 strong aug per sample, marginal entropy minimization. v13c DINOv3-B üzerinde test-time-only.
- Novelty. Pipeline'da sadece vanilla T3A vardı. CoTTA+MEMO kombinasyonu tablet-level distribution shift için uygulandı. EMA-decay=0.999, LR=5e-5, restore-p=0.01.
- Expected ROI. +1-2 puan (inference-only, %0 extra training).
- Script.
src/enhancements/cotta_memo.py, scripts/pipeline_h100/301_m2_cotta.slurm.
- Refs. Wang et al., CVPR'22 (CoTTA); Zhang et al., NeurIPS'22 (MEMO).
M3 — Causal Period-Deconfound via Backdoor Adjustment
- Method. Çivi yazısı işaretleri paleografik dönem (P ∈ {Old, Middle, Late}) tarafından confound edilir: P → X (şekil), P → Y (class frekans). do-calculus ile backdoor adjustment: P(Y|do(X)) = Σ_p P(Y|X,P=p) · P(P=p). İki-başlı MLP: (a)
per_head: feat → period logits; (b) sign_head: [feat ⊕ period-onehot] → class. Inference: period posterior'unun marginalization'u.
- Period mapping. OH/OS/OB→0, MH/MS/MB/NH→1, NS/NB/LNS/jhE→2.
- Novelty. Mevcut
period_moe forward conditioning yapar, confound çıkarmaz. Bu ilk causal deconfounding yaklaşımıdır çivi yazısı OCR'da.
- Expected ROI. Tail sign varyantları (farklı dönemde farklı şekil) için +1-2 puan.
- Script.
src/enhancements/causal_period.py, scripts/pipeline_h100/302_m3_causal.slurm.
- Refs. Pearl (Causality, 2nd ed.); VanderWeele (Explanation in Causal Inference, 2015); Tang et al., NeurIPS'20 (Unbiased Scene Graph via Counterfactuals).
M4 — 2D Spatial-Context Transformer Rerank
- Method. Her center sign için tablet üzerinde en yakın K=8 komşu sign bbox merkez mesafesine göre sıralanır. Her neighbor'un DINOv3 patch embedding'i + (Δx, Δy) positional MLP encoding ile 2-layer Transformer encoder (d=feat_dim, h=4). Center token'ı class head'e giriş.
- Novelty. Mevcut
sibling_rerank 1D (satır bazlı) komşu kullanır. 2D spatial attention ilk defa; Hittite metinlerinde bigram kollokasyonu (DIŠ+GÉME vb.) için non-local prior sağlar. LM-rescore'dan bağımsız (visual-geometric).
- Expected ROI. Tablet fold'da +1-2 puan; LM ile complementary.
- Script.
src/enhancements/spatial_context_rerank.py, scripts/pipeline_h100/303_m4_spatial.slurm.
- Refs. Vaswani et al., NeurIPS'17 (Transformer); Carion et al., ECCV'20 (DETR spatial PE).
M5 — MambaVision Backbone for Ensemble Diversity
- Method. NVIDIA MambaVision-L (Hatamizadeh & Kautz 2024): hybrid State-Space-Model + ViT attention backbone. timm adı:
mambavision_l_1k. v13 config ile SupCon + Focal-SAM eğitimi, manifest v13_ultimate.
- Novelty. Cuneiform OCR alanında Mamba/SSM backbone henüz kullanılmadı. ViT/ConvNeXt'ten farklı inductive bias (global linear-time scan) → ensemble entropy artışı.
- Expected ROI. Tek başına 0.85-0.87 bandı (v13c B seviyesinde), ensemble katkısı +0.5-1 puan.
- Script.
scripts/pipeline_h100/304_m5_mamba.slurm, train_classification.py ARCH_IMG_SIZE'a eklendi.
- Refs. Hatamizadeh & Kautz, arXiv 2024 (MambaVision); Gu & Dao, arXiv 2023 (Mamba).
M6 — Tablet-Aware SupCon Fine-Tuning
- Method. Vanilla SupCon (Khosla NeurIPS'20): same-class positive. Modified: same-class AND different-tablet positive; same-tablet same-class "trivial positive" filtered out. Formally: mask = (y_i = y_j) ∧ (t_i ≠ t_j) ∧ (i ≠ j). Böylece cross-tablet generalization'a odaklanır (tablet-specific shortcut'ları öğrenmez).
- Implementation. Frozen v13c backbone + 256-d projection + linear classifier. CE (LS=0.05) + 0.5 × tablet-aware-SupCon.
- Novelty. Tablet-conditioned contrastive cuneiform'da yapılmamış. Shortcut-learning mitigation teorisine bağlı.
- Expected ROI. Randsplit'te +0.5, tablet fold'da +0.5-1 (ana kazanç shortcut reduction'dan).
- Script.
src/enhancements/tablet_supcon_ft.py, scripts/pipeline_h100/305_m6_tablet_supcon.slurm.
- Refs. Khosla et al., NeurIPS'20 (SupCon); Geirhos et al., Nature-MI'20 (shortcut learning).
M7 — SigLIP Text-Prior Distillation
- Method. Her ABZ label'ı (ör. "BABBAR", "DINGIR") için prompt:
"a Hittite cuneiform sign named {LABEL} on a clay tablet" → SigLIP-SO400M text encoder → 1152-d frozen class embedding. Image branch: v13c feat → 1024 → 1152 projection + normalize. Loss: CE(logits) + 0.5 × SigLIP-contrastive(z, class_embeds). Inference: logit-space 0.7/0.3 fuse.
- Novelty. Sumerogram/logogram'lar (DINGIR=god, LUGAL=king gibi) büyük LM text korpuslarında görülmüş olabilir. Text encoder'ın semantic prior'unu soft label olarak distill etmek cuneiform için denenmemiş. CSS (class-semantic soft label) tekniği yeni bir cuneiform application.
- Expected ROI. Semantically-related confusion (synonym merger) üzerinde +0.5-1.5 puan.
- Script.
src/enhancements/siglip_text_distill.py, scripts/pipeline_h100/306_m7_textdistill.slurm.
- Refs. Zhai et al., ICCV'23 (SigLIP); Radford et al., ICML'21 (CLIP); Menon & Vondrick, ICLR'23 (description-based classification).
M8 — LLM-in-Loop Uncertainty Relabeling
- Method. (1) v13 ensemble
ensemble_v13_probs.pt üzerinden per-sample entropy ve margin hesapla, composite score = H(p) − margin → top-500 en belirsiz örnek. (2) Her örnek için top-5 class candidate + image bytes → Claude Opus 4.7 vision API ile "current label: X, candidates: [...]; correct label?" promptu. (3) Claude'un valid-label cevabı mevcut label'dan farklıysa manifest_v14_relabel.jsonl üretilir. (4) Yeni manifest ile v14 retrain.
- Novelty. Human-in-loop yerine LLM-in-loop relabeling ilk defa çivi yazısı OCR'da. Cleanlab (statistical) → Claude (semantic) iki-aşamalı label cleaning.
- Expected ROI. Relabel edilen ~300-400 örnek (confusion pair'ler) ile +0.5-1 puan + tail classes'a odaklı.
- Script.
src/enhancements/llm_uncertainty_relabel.py, scripts/pipeline_h100/307_m8_llm_relabel.slurm. ANTHROPIC_API_KEY env varsa Phase 2 tetiklenir.
- Refs. Northcutt et al., JAIR'21 (Cleanlab); Wei et al., NeurIPS'22 (CoT LLM annotation); Anthropic Claude API docs.
M9 — Open-Set OOD Detection (OpenMax + Energy)
- Method. (a) OpenMax (Bendale & Boult CVPR'16): train-set class mean activation vectors (MAVs) üzerinden Weibull-tail fit (tail_size=20), inference-time top-α=10 logit'e CDF tabanlı yeniden ağırlıklandırma, "unknown" sınıfı için kalan kütle. (b) Energy score (Liu NeurIPS'20): E(x) = −T log Σ exp(logit_i/T), T=1.0. Val set üzerinde OpenMax-unknown-rate ve energy distribution metrikleri hesaplanır.
- Novelty. Cuneiform'da şu ana kadar sadece closed-set (198-class) değerlendirilmiş. OOD detection, ABZ vocabulary dışında kalan signs'ı işaretlemek ve %90+ selective metric'i formal OOD framework'üne oturtmak için eklendi.
- Paper value. Open-set cuneiform OCR için ilk baseline + selective rejection için theoretical grounding.
- Script.
src/enhancements/openmax_energy_ood.py, scripts/pipeline_h100/308_m9_ood.slurm.
- Refs. Bendale & Boult, CVPR'16 (OpenMax); Liu et al., NeurIPS'20 (Energy-OOD); Hendrycks & Gimpel, ICLR'17 (baseline).
M10 — Prototypical + Proto-MAML Few-Shot for Rare Signs
- Method. ABZ'nin ~400 sign'ından ~200'ü n<10 eşiğinin altında → mevcut 198-class head dropped. Meta-episodic training: N=10-way K=5-shot K+Q episodes over seen (n≥10) classes, first-order MAML inner loop (3 steps, lr=1e-2) on projection head, ProtoNet loss (euclidean-dist on L2-normalized features). Tail eval: her tail class için LOO K-shot support set, N-way içinde doğru prototype seçimi.
- Novelty. Çivi yazısında meta-learning ilk kez; tail class extension zero-retrain — yeni rare sign eklemek için sadece K=5 example yeter. Paleografi field-work için pratik tool.
- Expected ROI. Tail few-shot accuracy %60-75 (baseline: %0 çünkü mevcut model bu class'ları görmüyor).
- Script.
src/enhancements/proto_maml_fewshot.py, scripts/pipeline_h100/309_m10_proto_maml.slurm.
- Refs. Snell et al., NeurIPS'17 (ProtoNet); Finn et al., ICML'17 (MAML); Triantafillou et al., ICLR'20 (Meta-Dataset).
M11 — Pseudo-Relighting Augmentation for Clay Tablets
- Method. Tabletler ~2.5D kabartma. (1) Grayscale görüntüyü "height map" olarak yorumla (çivi yazısı indentation'lar koyu). (2) Sobel gradient → yüzey normalleri (n_x, n_y, n_z). (3) Sentetik ışık yönü L=(cos(el)cos(az), cos(el)sin(az), sin(el)), azimut∈[0,360], elevation∈[15,70]. (4) Lambertian shading: I = ambient + (1−ambient)·max(0, n·L). (5) Blend=0.35-0.7 ile orijinal'e karıştır. K=3 variant per image; tail class tam, head class %8 örneklenir.
- Novelty. IC-Light / Neural Relighting ağır modeller. Bu analytic + physics-based relighting cuneiform'un düşük-freq geometrisi için uygun, zero-GPU inference, dataset-wide. Önceki
illum_aug sadece brightness/contrast. Gerçek normal-tabanlı shading yeni.
- Expected ROI. Robustness (cross-museum/cross-photographer illumination drift) + tail +1-2 puan.
- Script.
src/enhancements/relight_aug.py, scripts/pipeline_h100/310_m11_relight.slurm.
- Refs. Horn & Brooks (Shape From Shading, MIT 1989); Zhang et al., CVPR'24 (IC-Light) — analytic counterpart.
M12 — Stroke/Wedge Auxiliary Multi-Task Head
- Method. Çivi yazısı stroke-order ground truth yok, ama iki proxy target OpenCV ile çıkarılır:
(1) wedge_count (0-30 int): gray top-hat + OTSU + connected-components (10<area<2000 filter).
(2) **orient_hist_16**: Sobel gradient magnitude/angle histogramı, mag > μ+0.5σ threshold, 16-bin 0-180°.
Frozen v13c feat → 3 head: cls (CE+LS0.05) + wedge_count (CE) + orient_hist (KL-div). Loss = L_cls + 0.3·(L_wc + L_oh). Test-time: sadece cls head.
- Novelty. Cuneiform stroke'a dair düşük-seviye yapısal aux supervision ilk defa. No extra annotation (image processing deriv.).
- Expected ROI. Shape disambiguation'a dayanan confusion pairlerde +0.5-1.5 puan.
- Script.
src/enhancements/stroke_aux_head.py, scripts/pipeline_h100/311_m12_stroke.slurm.
- Refs. Caruana, ML'97 (MTL); Zamir et al., CVPR'18 (Taskonomy, aux task design).
📋 M1-M12 özet tablosu
| ID |
Method |
Novel for cuneiform? |
Expected Δ |
Depends on |
| M1 |
SDEdit tail aug |
✅ pixel-space class-cond |
+3-5 |
SD v1.5 |
| M2 |
CoTTA+MEMO TTA |
✅ tablet-shift |
+1-2 |
v13c ckpt |
| M3 |
Causal period-deconfound |
✅ first causal |
+1-2 |
period labels |
| M4 |
2D spatial transformer rerank |
✅ 2D spatial-only |
+1-2 |
bbox coords |
| M5 |
MambaVision backbone |
✅ SSM arch |
+0.5-1 (ens) |
timm mamba |
| M6 |
Tablet-aware SupCon |
✅ cross-tablet filter |
+0.5-1 |
tablet_id |
| M7 |
SigLIP text-prior distill |
✅ semantic CSS |
+0.5-1.5 |
SigLIP-SO400M |
| M8 |
LLM-in-loop relabel |
✅ Claude vision |
+0.5-1 |
Claude API |
| M9 |
OpenMax + Energy OOD |
✅ open-set |
paper-only |
scipy |
| M10 |
Proto-MAML few-shot |
✅ tail extension |
tail +60-75 |
— |
| M11 |
Analytic relighting |
✅ physics-based |
+1-2 |
OpenCV |
| M12 |
Stroke aux multitask |
✅ no-GT aux |
+0.5-1.5 |
OpenCV |
Submission order: 300-311 (2026-04-21 15:50)
Bağımlılık: M8 only (v13 ensemble probs gerekli). Diğerleri paralel. M1/M5/M11 uzun süreli (data synth + full train, 8-16 saat). M2/M3/M6/M7/M12 kısa (head-only FT, 2-3 saat). M9/M10 tek-shot (1-4 saat). Toplam cluster saat: ~55-70 GPU-h.