OppaiOracle experimental-X1
TEST MODEL โ experimental preview, not a full release. This is a from-scratch anime/illustration tagger released for testing and feedback while dataset issues are investigated. Further tuning is planned to refine those issues; predictions and tag behavior should be treated as provisional.
This FP32 ONNX release uses epoch 21, update 127,974, at 320ร320. Training was cut short after tag-level regression appeared beyond epoch 21. Epoch 21 was selected as the experimental release checkpoint while unstable tags and their training data are reviewed. Aggregate AP had continued to improve after epoch 21; the stop was driven by concerns about individual tags, not a claim that every metric or every tag had worsened. Planned higher-resolution stages and cooldown were not completed for this checkpoint.
The author's initial expectation was that X1 would likely beat OppaiOracle V1 and might beat V1.1. That was a hypothesis, not an established benchmark result. The direct V1.1 comparison below now gives measured evidence; V1 has not been measured head-to-head here. This preview is not a blanket recommendation to replace either earlier model.
Setup and example
Use Python 3.11 in a fresh environment. Download the release and install CPU dependencies:
python -m pip install huggingface_hub
python -c "from huggingface_hub import snapshot_download; snapshot_download('Grio43/OppaiOracle-experimental-X1', local_dir='OppaiOracle-experimental-X1')"
cd OppaiOracle-experimental-X1
python -m pip install -r requirements.txt
python infer.py path/to/image.jpg --device cpu --output predictions.json
For NVIDIA GPU use, install requirements-gpu.txt instead of the CPU requirements
in a separate environment, with compatible CUDA/cuDNN dependencies. See
ONNX Runtime's CUDA installation requirements.
An existing compatible PyTorch installation can provide the CUDA DLLs.
python -m pip install -r requirements-gpu.txt
python infer.py image1.jpg image2.png --device cuda --batch-size 2 --output predictions.json
The same FP32 model.onnx works on CPU and CUDA. The script handles preprocessing,
reads the embedded vocabulary, excludes PAD/UNK and returns tag names with scores.
The default development-tuned threshold is 0.698492. Change it with --threshold;
--top-k 30 returns up to 30 tags that also pass the threshold. To inspect the highest
scores regardless of threshold:
python infer.py image.jpg --device cpu --threshold 0 --top-k 30
Scores already have sigmoid applied. Do not apply it again. Scores are not calibrated probabilities that a label is correct.
Comparison with OppaiOracle V1.1
Both downloaded ONNX models were evaluated on the same images and labels, with one-to-one matching of shared tag names. X1's category prefixes were mapped to V1.1's bare names; tag text after the category prefix was preserved, and ratings were matched by their full names. Each model used its native resolution: X1 at 320px, V1.1 at 448px. Both used FP32 inference, RGB, downscale-only centered LANCZOS letterboxing, normalization mean/std 0.5 and the required padding mask. Macro AP includes the same shared tags with positive support. Each model's best grid micro-F1 uses its own threshold selected on this same development set.
Matched vocabulary: 13,569 tags, of which 13,394 contribute to macro AP.
| Measurement on shared tags | experimental-X1 | V1.1 |
|---|---|---|
| Exact mAP | 0.531655 | 0.592716 |
| Binned mAP | 0.529091 | 0.588611 |
| Best grid micro-F1 | 0.651513 | 0.665864 |
| Threshold for that micro-F1 | 0.703518 | 0.798995 |
V1.1 scored higher than X1 on shared-tag exact AP in this run. X1 minus V1.1 exact mAP: -0.061061. X1 had higher exact AP on 2,466 shared supported tags; V1.1 had higher AP on 9,572; 1,356 tied.
These are development-image results, not an independent generalization test. V1.1 may have seen some of these images during its earlier training; that overlap is unverified. The comparison therefore does not establish superiority on unseen images. Different resolutions and vocabularies also affect deployment choices. See comparison details and all shared-tag AP results.
Regression and high-suspect tags
The last checkpoint spot check compared E21 โ E22 โ partial E23, with E23 at 79.95% of its training epoch. The lists below concern the behavior of checkpoints after the released E21 checkpoint; they are priorities for further testing and dataset review. Partial recovery still counts as high suspect until the behavior is understood. A flag does not prove that a tag's annotations are wrong or that a small AP movement is statistically meaningful.
| List | Tags | Definition |
|---|---|---|
| Continued declines | 2,007 | E21 AP > E22 AP > partial E23 AP |
| Partial recoveries โ high suspect | 1,959 | E22 AP < partial E23 AP < E21 AP |
| New declines since E22 | 4,543 | Partial E23 fell from E22 after E22 had held or improved over E21 |
Each CSV contains the complete tag list, AP at each checkpoint and the signed changes. These counts include any numerical decrease, including tiny ones. Definitions are also saved in regression_summary.json.
The previously highlighted tags that remain below E21 are:
| Tag | E21 AP | E22 AP | Partial E23 AP | Review status |
|---|---|---|---|---|
gen:aiming |
0.466795 | 0.416097 | 0.392755 | Continued decline |
gen:cannon |
0.389553 | 0.336859 | 0.336645 | Continued decline |
gen:mismatched_legwear |
0.457621 | 0.405985 | 0.394570 | Continued decline |
gen:yellow_neckerchief |
0.675055 | 0.623700 | 0.600971 | Continued decline |
copyright:goddess_of_victory:_nikke |
0.857901 | 0.790998 | 0.803409 | Partial recovery; high suspect |
gen:black_sweater |
0.388958 | 0.327761 | 0.340505 | Partial recovery; high suspect |
gen:blanket |
0.362744 | 0.300508 | 0.310602 | Partial recovery; high suspect |
gen:grey_dress |
0.259744 | 0.195336 | 0.238347 | Partial recovery; high suspect |
gen:holding_polearm |
0.441218 | 0.386997 | 0.397173 | Partial recovery; high suspect |
gen:miko |
0.757999 | 0.706227 | 0.732054 | Partial recovery; high suspect |
gen:missionary |
0.579921 | 0.507168 | 0.526651 | Partial recovery; high suspect |
gen:pool |
0.619430 | 0.554731 | 0.602463 | Partial recovery; high suspect |
gen:rock |
0.284336 | 0.220410 | 0.256568 | Partial recovery; high suspect |
gen:sailor_shirt |
0.357904 | 0.290515 | 0.328652 | Partial recovery; high suspect |
gen:toenail_polish |
0.469647 | 0.402728 | 0.447554 | Partial recovery; high suspect |
gen:vision_(genshin_impact) |
0.592079 | 0.515976 | 0.531040 | Partial recovery; high suspect |
Of the original 20 highlighted declines, gen:carrot, gen:blunt_ends,
gen:hug_from_behind and gen:vampire recovered above their E21 scores in the
partial E23 check. They are not included in the partial-recovery list.
Model, preprocessing and files
- 147,362,868 parameters: ViT patch16, width 896, 18 layers, 14 attention heads, MLP width 2320, QK normalization and LayerScale.
- 14,996 output positions: 14,994 tags plus PAD/UNK at indices 0 and 1. Categories include general, artist, copyright, character, metadata and four ratings.
model.onnx: FP32, about 590 MB, single file, ONNX opset 20 / IR 10; vocabulary and preprocessing metadata embedded. CPU and CUDA checks passed.infer.py,requirements.txt,requirements-gpu.txt: standalone setup and inference.vocabulary.json,selected_tags.csv: exact output ordering and category mapping.preprocessing.json,model_config.json: inference and architecture specifications.thresholds.json,validation.json,inference_checks.json: development tuning and export verification. The original export AP uses all supported X1 tags; it is a different denominator from the shared-vocabulary V1.1 comparison above.- Regression/comparison CSVs,
release_manifest.jsonandSHA256SUMS: review evidence and file integrity information.
| Input/output | Type | Shape |
|---|---|---|
pixel_values |
float32 | [batch, 3, 320, 320] |
padding_mask |
bool | [batch, 320, 320] |
probabilities |
float32 | [batch, 14996] |
Batch is dynamic; image dimensions are fixed. Apply EXIF orientation, convert to
RGB, composite transparency onto [114,114,114], downscale with LANCZOS without
upscaling, and center on a 320ร320 canvas. Mark padding True. Divide pixel values
by 255, normalize with mean/std [0.5,0.5,0.5], and transpose to NCHW. The supplied
script implements this. The four ratings are independent sigmoid outputs.
This two-input NCHW model requires a frontend that supports its preprocessing and padding mask; it is not interchangeable with a single-input raw-NHWC tagger graph.
Scope and next work
This remains a test model, not a full release. It is intended for experimental tagging, comparison and feedback. Further tuning will be used to investigate and refine dataset issues, especially unstable tag families. Training data contains noisy and incomplete labels, and visually similar or rare concepts can be unreliable. Review predictions before using them to modify a dataset or make moderation decisions. The vocabulary includes sexual-content labels; this is not a validated safety classifier. No source images, optimizer state or training checkpoints are included.
Provenance and license
Released checkpoint: Phase 1, epoch 21, update 127,974. Source checkpoint SHA256:
019d665185348b40679911dec3528abd61d1c9f9310036ae3c07d3c4f33d8777.
The exported ONNX weights are unchanged from the validated FP32 E21 artifact.
The release retains the repository's Educational Use Only License. See the license text for permitted uses, attribution and restrictions.