{"id":49465086,"url":"https://github.com/nihildigit/anvil","last_synced_at":"2026-04-30T12:05:13.780Z","repository":{"id":348203983,"uuid":"1190514572","full_name":"NihilDigit/anvil","owner":"NihilDigit","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-31T08:27:48.000Z","size":244,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T09:16:34.513Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NihilDigit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-24T11:04:31.000Z","updated_at":"2026-03-31T08:27:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NihilDigit/anvil","commit_stats":null,"previous_names":["nihildigit/anvil"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/NihilDigit/anvil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihilDigit%2Fanvil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihilDigit%2Fanvil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihilDigit%2Fanvil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihilDigit%2Fanvil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NihilDigit","download_url":"https://codeload.github.com/NihilDigit/anvil/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihilDigit%2Fanvil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32463934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-30T12:04:18.745Z","updated_at":"2026-04-30T12:05:13.756Z","avatar_url":"https://github.com/NihilDigit.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ANVIL Open-Source Reproduction Bundle\n\n\u003e **Paper**: [ANVIL: Accelerator-Native Video Interpolation via Codec Motion Vector Priors](https://arxiv.org/abs/2603.26835)\n\nThis folder is a cleaned release candidate for training, evaluation, and ONNX export of the ANVIL models presented in the paper.\n\n## Included Scripts\n\n- `scripts/train_v3b.sh` — Train final ANVIL-S / ANVIL-M (prealign v2)\n- `scripts/train_capacity_sweep.sh` — Train 5 capacity sweep models D-tiny through D-unet-l (prealign v1, Table ablation_capacity)\n- `scripts/eval_vimeo.py` — Vimeo90K evaluation (PSNR / SSIM / LPIPS)\n- `scripts/eval_xiph.py` — Xiph 1080p evaluation\n- `scripts/eval_baselines.py` — Zero-network baseline evaluation (Naive Blend, MV Blend)\n- `scripts/eval_rife_native.py` — RIFE HDv3 native-resolution baseline (Table main_quality)\n- `scripts/eval_rife_reduced_res.py` — RIFE reduced-resolution ORT INT8 evaluation (Table rife_reduced, ORT column)\n- `scripts/eval_rife_qnn_int8.py` — RIFE reduced-resolution QNN HTP INT8 evaluation (Table rife_reduced, QNN column)\n- `scripts/eval_int8_cross_method.py` — Cross-method ORT INT8 quality comparison (Table int8_quality)\n- `scripts/eval_int8_instrumented.py` — Per-operator instrumented quantization analysis (Table instrumented)\n- `scripts/export_rife_onnx.py` — Export RIFE HDv3 to flow/frame ONNX variants\n- `scripts/export_ifrnet_onnx.py` — Export IFRNet to frame/flow ONNX variants\n- `scripts/export_onnx.sh` — Export ANVIL models to ONNX\n- `scripts/prealign_v2.sh` — Generate prealignment v2 data (smoothed MV flow)\n- `scripts/bench_htp_latency.py` — HTP INT8/FP16 latency benchmark (Table latency)\n- `scripts/bench_operators.py` — Operator-level NPU latency benchmark (Table operator_compat, HTP column)\n- `scripts/eval_deploy_fusion.py` — Deploy-time BN fusion mathematical equivalence verification\n- `scripts/eval_temporal_consistency.py` — Temporal consistency evaluation (tOF / WE metrics)\n- `scripts/gen_fig_visual_comparison.py` — Figure 6: visual quality comparison on Xiph 1080p\n- `scripts/smoke_test.sh` — Smoke test for all scripts (`--limit 2`)\n- `docs/DATA_LAYOUT.md` — Expected dataset directory layout\n- `docs/MEDIATEK_PIPELINE.md` — MediaTek NeuroPilot Public deployment pipeline (Table operator_compat, APU column)\n- `pixi.toml` — Complete runtime environment for training and evaluation\n\n## What Is Not Included\n\n- Device-side Android app (see [mpv-android-anvil](https://github.com/NihilDigit/mpv-android-anvil) repo)\n\n## Environment\n\n```bash\npixi install\n```\n\nIf you are working from the full research monorepo instead of the standalone release repo, run `cd open_source_release` first.\n\n## Data Setup\n\n### Vimeo90K\n\nDownload and prepare the Vimeo90K triplet dataset:\n\n```bash\n# 1. Download (~30 GB for full dataset, ~1.7 GB for test-only)\npixi run python -m anvil_exp01.data.download_vimeo90k --output-dir data/vimeo_triplet\n\n# 2. Extract H.264 motion vectors\npixi run python -m anvil_exp01.data.extract_mv --data-dir data/vimeo_triplet\n\n# 3. Convert block MVs to dense flow fields\npixi run python -m anvil_exp01.data.mv_to_dense --data-dir data/vimeo_triplet\n```\n\n### Prealignment\n\nTwo prealignment versions exist. Which one you need depends on the models you want to train or evaluate:\n\n```bash\n# Prealignment v1 (basic block-level MV warp)\n# Required for: capacity sweep models (D-tiny-nomv through D-unet-l-nomv)\npixi run python -m anvil_exp01.data.prealign --data-dir data/vimeo_triplet\n\n# Prealignment v2 (median + Gaussian smoothed MV flow)\n# Required for: final ANVIL-S / ANVIL-M models\npixi run prealign-v2\n```\n\n### Xiph 1080p\n\n```bash\npixi run python -m anvil_exp01.data.download_xiph --data-dir data/xiph_1080p\n```\n\nAfter download, run MV extraction, dense flow, and prealignment on Xiph the same way as Vimeo90K (adjusting `--data-dir` to `data/xiph_1080p`).\n\n### Expected Layout\n\nSee `docs/DATA_LAYOUT.md` for the full directory structure. Typical layout:\n\n```text\nopen_source_release/\n  data/\n    vimeo_triplet/\n      sequences/\n      tri_trainlist.txt\n      tri_testlist.txt\n      mv_cache/\n      prealigned/        # v1, for capacity sweep\n      prealigned_v2/     # v2, for ANVIL-S/M\n      motion_labels.csv\n    xiph_1080p/\n      sequences/\n      prealigned_v2/\n  artifacts/\n    checkpoints/\n    checkpoints_capacity/\n    eval/\n    onnx/\n```\n\n## Pretrained Weights\n\nDownload pretrained checkpoints and ONNX models from [HuggingFace](https://huggingface.co/NihilDigit/anvil):\n\n```bash\n# All checkpoints + ONNX (~258MB)\npixi run download-weights\n\n# Or individual models:\npixi run -- huggingface-cli download NihilDigit/anvil checkpoints/D-unet-v3bs-nomv/best.pt --local-dir artifacts  # ANVIL-S (10MB)\npixi run -- huggingface-cli download NihilDigit/anvil checkpoints/D-unet-v3bm-nomv/best.pt --local-dir artifacts  # ANVIL-M (31MB)\n```\n\n## Quick Start\n\nTrain final models (ANVIL-S and ANVIL-M):\n\n```bash\npixi run train-anvil-s\npixi run train-anvil-m\n```\n\nEvaluate on Vimeo90K:\n\n```bash\npixi run python scripts/eval_vimeo.py \\\n  --model D-unet-v3bm-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --data-dir data/vimeo_triplet \\\n  --prealigned-dir data/vimeo_triplet/prealigned_v2 \\\n  --motion-csv data/vimeo_triplet/motion_labels.csv \\\n  --output-dir artifacts/eval/vimeo/D-unet-v3bm-nomv\n```\n\nEvaluate on Xiph 1080p:\n\n```bash\npixi run python scripts/eval_xiph.py \\\n  --model D-unet-v3bm-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --data-dir data/xiph_1080p \\\n  --prealigned-dir data/xiph_1080p/prealigned_v2 \\\n  --output-dir artifacts/eval/xiph/D-unet-v3bm-nomv\n```\n\nExport ONNX:\n\n```bash\npixi run export-onnx\n```\n\n## Reproduction Scripts\n\nEach paper table has a corresponding `pixi run reproduce-*` shortcut.\nSome tables require external vendor repos (RIFE, IFRNet/AMT) or hardware\n(QAIRT SDK + Qualcomm device). See the dependency column below.\n\n```bash\n# Offline tables (GPU only, no vendor repos needed)\npixi run reproduce-main-quality      # Table main_quality: ANVIL models + baselines\npixi run reproduce-ablation          # Table ablation_capacity: 5-model sweep\npixi run reproduce-deploy-fusion     # Deploy-time fusion verification\npixi run reproduce-prealign-v2       # Prealign v2 improvement (+1.28 dB)\npixi run reproduce-fig-visual        # Figure 6: visual comparison\n\n# Offline tables (require RIFE/IFRNet/AMT vendor repos)\npixi run reproduce-rife-reduced      # Table rife_reduced: RIFE 360p/480p ORT INT8\npixi run reproduce-int8-quality      # Table int8_quality: cross-method INT8 (note: ANVIL\n                                     #   INT8 deltas are archived QNN device measurements,\n                                     #   not live ORT quantization — see script docstring)\npixi run reproduce-instrumented      # Table instrumented: per-operator CosSim\npixi run reproduce-temporal          # Temporal consistency (tOF / WE)\n\n# ALL offline tables in one go (needs vendor repos for RIFE/IFRNet rows)\npixi run reproduce-all-offline\n\n# Device-dependent (require QAIRT SDK + Android device)\npixi run reproduce-latency           # Table latency: HTP FP16/INT8\npixi run reproduce-operator-compat   # Table operator_compat: HTP column\n```\n\n## Reproducing Paper Tables\n\n### Table main_quality — Main Quality Comparison\n\nANVIL models on Vimeo90K and Xiph 1080p, plus RIFE native-resolution baseline:\n\n```bash\n# ANVIL-S on Vimeo90K\npixi run python scripts/eval_vimeo.py \\\n  --model D-unet-v3bs-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bs-nomv/best.pt \\\n  --data-dir data/vimeo_triplet \\\n  --prealigned-dir data/vimeo_triplet/prealigned_v2 \\\n  --output-dir artifacts/eval/vimeo/D-unet-v3bs-nomv\n\n# ANVIL-M on Vimeo90K\npixi run python scripts/eval_vimeo.py \\\n  --model D-unet-v3bm-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --data-dir data/vimeo_triplet \\\n  --prealigned-dir data/vimeo_triplet/prealigned_v2 \\\n  --output-dir artifacts/eval/vimeo/D-unet-v3bm-nomv\n\n# ANVIL-S on Xiph 1080p\npixi run python scripts/eval_xiph.py \\\n  --model D-unet-v3bs-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bs-nomv/best.pt \\\n  --data-dir data/xiph_1080p \\\n  --prealigned-dir data/xiph_1080p/prealigned_v2 \\\n  --output-dir artifacts/eval/xiph/D-unet-v3bs-nomv\n\n# ANVIL-M on Xiph 1080p\npixi run python scripts/eval_xiph.py \\\n  --model D-unet-v3bm-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --data-dir data/xiph_1080p \\\n  --prealigned-dir data/xiph_1080p/prealigned_v2 \\\n  --output-dir artifacts/eval/xiph/D-unet-v3bm-nomv\n\n# NAFNet-ceiling (17.1M params, quality upper bound) on Vimeo90K\npixi run python scripts/eval_vimeo.py \\\n  --model D-nafnet-nomv \\\n  --checkpoint artifacts/checkpoints/D-nafnet-nomv/best.pt \\\n  --data-dir data/vimeo_triplet \\\n  --prealigned-dir data/vimeo_triplet/prealigned_v2 \\\n  --output-dir artifacts/eval/vimeo/D-nafnet-nomv\n\n# NAFNet-ceiling on Xiph 1080p\npixi run python scripts/eval_xiph.py \\\n  --model D-nafnet-nomv \\\n  --checkpoint artifacts/checkpoints/D-nafnet-nomv/best.pt \\\n  --data-dir data/xiph_1080p \\\n  --prealigned-dir data/xiph_1080p/prealigned_v2 \\\n  --output-dir artifacts/eval/xiph/D-nafnet-nomv\n\n# Zero-network baselines (Naive Blend, MV Blend)\npixi run python scripts/eval_baselines.py \\\n  --output-dir artifacts/eval/baselines\n\n# RIFE HDv3 native-resolution baseline\npixi run python scripts/eval_rife_native.py \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --data-dir data/vimeo_triplet \\\n  --xiph-dir data/xiph_1080p \\\n  --output-dir artifacts/eval/rife_native\n```\n\n### Table rife_reduced — RIFE Reduced-Resolution Deployment\n\n```bash\n# Export RIFE ONNX models first\npixi run python scripts/export_rife_onnx.py \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --weights vendor/ECCV2022-RIFE/train_log/flownet.pkl \\\n  --output-dir artifacts/onnx/rife\n\n# ORT INT8 evaluation (offline, no device needed)\npixi run python scripts/eval_rife_reduced_res.py \\\n  --onnx-dir artifacts/onnx/rife \\\n  --xiph-dir data/xiph_1080p \\\n  --vimeo-dir data/vimeo_triplet \\\n  --output-dir artifacts/eval/rife_reduced\n\n# QNN HTP INT8 evaluation (requires QAIRT SDK + Snapdragon device)\npixi run python scripts/eval_rife_qnn_int8.py \\\n  --onnx-dir artifacts/onnx/rife \\\n  --xiph-dir data/xiph_1080p \\\n  --qairt-root /opt/qcom/aistack/qairt/2.42.0.251225 \\\n  --output-dir artifacts/eval/rife_qnn_int8\n```\n\n### Table int8_quality — Cross-Method INT8 Quality\n\n```bash\n# Export the ONNX baselines needed by this table\npixi run python scripts/export_rife_onnx.py \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --weights vendor/ECCV2022-RIFE/train_log/flownet.pkl \\\n  --output-dir artifacts/onnx/int8_cross \\\n  --resolutions 360p \\\n  --modes flow\n\npixi run python scripts/export_ifrnet_onnx.py \\\n  --amt-repo vendor/AMT \\\n  --weights vendor/IFRNet_Vimeo90K.pth \\\n  --output-dir artifacts/onnx/int8_cross\n\npixi run python scripts/eval_int8_cross_method.py \\\n  --onnx-dir artifacts/onnx/int8_cross \\\n  --xiph-dir data/xiph_1080p \\\n  --vimeo-dir data/vimeo_triplet \\\n  --prealigned-dir data/xiph_1080p/prealigned_v2 \\\n  --anvil-s-ckpt artifacts/checkpoints/D-unet-v3bs-nomv/best.pt \\\n  --anvil-m-ckpt artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --output-dir artifacts/eval/int8_cross_method\n```\n\n### Table instrumented — Per-Operator Instrumented Quantization\n\n```bash\n# RIFE flow and IFRNet flow are both required\npixi run python scripts/export_rife_onnx.py \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --weights vendor/ECCV2022-RIFE/train_log/flownet.pkl \\\n  --output-dir artifacts/onnx/int8_instrumented \\\n  --resolutions 360p \\\n  --modes flow\n\npixi run python scripts/export_ifrnet_onnx.py \\\n  --amt-repo vendor/AMT \\\n  --weights vendor/IFRNet_Vimeo90K.pth \\\n  --output-dir artifacts/onnx/int8_instrumented \\\n  --modes flow\n\npixi run python scripts/eval_int8_instrumented.py \\\n  --onnx-dir artifacts/onnx/int8_instrumented \\\n  --xiph-dir data/xiph_1080p \\\n  --vimeo-dir data/vimeo_triplet \\\n  --models rife_flow_360p ifrnet_flow \\\n  --output-dir artifacts/eval/int8_instrumented\n```\n\n### Table latency — HTP Latency Benchmark\n\nRequires QAIRT SDK and an Android device with Snapdragon SoC.\n\nINT8 benchmarks require calibration data (.raw files + input_list.txt). Generate it first:\n\n```bash\n# Generate INT8 calibration data (100 samples, NCHW .raw files)\n# Paper protocol: Vimeo90K training set (no test-set leakage)\npixi run python -m anvil_exp01.gen_calibration_data \\\n  --source vimeo \\\n  --prealigned-dir data/vimeo_triplet/prealigned_v2 \\\n  --train-list data/vimeo_triplet/tri_trainlist.txt \\\n  --n-samples 100 \\\n  --resolution 1080p \\\n  --out-dir artifacts/calib/anvil_s_1080p\n\n# Legacy fallback: Xiph 1080p (NOT recommended — uses test set for calibration)\n# pixi run python -m anvil_exp01.gen_calibration_data \\\n#   --source xiph \\\n#   --xiph-dir data/xiph_1080p \\\n#   --n-samples 100 \\\n#   --resolution 1080p \\\n#   --out-dir artifacts/calib/anvil_s_1080p\n\n# Run latency benchmark (FP16 + INT8)\npixi run python scripts/bench_htp_latency.py \\\n  --onnx-dir artifacts/onnx \\\n  --calib-dir artifacts/calib/anvil_s_1080p \\\n  --qairt-root /opt/qcom/aistack/qairt/2.42.0.251225 \\\n  --output-dir artifacts/eval/latency\n```\n\nUse `--precision fp16` to skip INT8 (no calibration needed for FP16-only).\n\n### Table operator_compat — Operator-Level NPU Compatibility\n\n#### Qualcomm HTP Column\n\nRequires QAIRT SDK and an Android device:\n\n```bash\npixi run python scripts/bench_operators.py \\\n  --qairt-root /opt/qcom/aistack/qairt/2.42.0.251225 \\\n  --output-dir artifacts/eval/operator_compat\n```\n\n#### MediaTek APU Column\n\nThe MediaTek APU column uses a different toolchain: `mtk_converter` (ONNX to TFLite) and an NDK-compiled benchmark binary using the NeuroPilot TFLite Shim API.\n\nSee `docs/MEDIATEK_PIPELINE.md` for the full build and evaluation pipeline.\n\nKey findings: PReLU and LayerNorm are NEURON_UNMAPPABLE on MediaTek APU. GridSample converts to `MTKEXT_GRID_SAMPLE_2D` custom op requiring the Premium SDK (not available via Public SDK). RIFE is completely non-deployable on the MediaTek NeuroPilot Public path.\n\n**Disclaimer**: Latency data uses NeuroPilot Public SDK (runtime compilation), not Premium SDK (offline DLA compilation). Absolute latencies are conservative and should not be directly compared with Qualcomm QNN (offline-compiled) numbers.\n\n### Table ablation_capacity — Capacity Sweep Ablation\n\nTrain 5 models with prealign v1, then evaluate:\n\n```bash\n# Train all 5 capacity sweep models\nbash scripts/train_capacity_sweep.sh\n\n# Evaluate each on Vimeo90K\nfor model in D-tiny-nomv D-mini-nomv D-mid-nomv D-unet-s-nomv D-unet-l-nomv; do\n  pixi run python scripts/eval_vimeo.py \\\n    --model \"$model\" \\\n    --checkpoint \"artifacts/checkpoints_capacity/$model/best.pt\" \\\n    --data-dir data/vimeo_triplet \\\n    --prealigned-dir data/vimeo_triplet/prealigned \\\n    --output-dir \"artifacts/eval/capacity_sweep/$model\"\ndone\n```\n\n### Prealignment v2 Improvement (+1.28 dB)\n\nThe paper claims MV Blend improves from 29.92 to 31.20 dB (+1.28 dB) with prealign v2 smoothing. To reproduce, evaluate MV Blend with both prealignment versions:\n\n```bash\n# MV Blend with basic prealignment — requires prealign v1 data\npixi run python scripts/eval_baselines.py \\\n  --dataset vimeo \\\n  --methods mv_blend \\\n  --prealigned-v1-vimeo data/vimeo_triplet/prealigned \\\n  --output-dir artifacts/eval/baselines_v1\n\n# MV Blend with smoothed prealignment (median + Gaussian)\npixi run python scripts/eval_baselines.py \\\n  --dataset vimeo \\\n  --methods mv_blend_v2 \\\n  --output-dir artifacts/eval/baselines_v2\n```\n\nGenerate prealign v1 data with `pixi run prealign-v1` before running the v1 comparison.\n\n### Deploy-Time Fusion Verification\n\nVerifies that BN fusion is mathematically exact (max abs diff \u003c 1.5e-5):\n\n```bash\n# ANVIL-S\npixi run python scripts/eval_deploy_fusion.py \\\n  --model D-unet-v3bs-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bs-nomv/best.pt \\\n  --output-dir artifacts/eval/deploy_fusion/D-unet-v3bs-nomv\n\n# ANVIL-M\npixi run python scripts/eval_deploy_fusion.py \\\n  --model D-unet-v3bm-nomv \\\n  --checkpoint artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --output-dir artifacts/eval/deploy_fusion/D-unet-v3bm-nomv\n```\n\n### Temporal Consistency (tOF / WE)\n\nEvaluates temporal fidelity using optical flow magnitude (tOF) and warping error (WE) on Xiph 1080p. Requires CUDA (~8 GB for RAFT-Small at 540p):\n\n```bash\npixi run python scripts/eval_temporal_consistency.py \\\n  --xiph-dir data/xiph_1080p \\\n  --anvil-s-ckpt artifacts/checkpoints/D-unet-v3bs-nomv/best.pt \\\n  --anvil-m-ckpt artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --output-dir artifacts/eval/temporal_consistency\n```\n\nTakes ~2 hours for 12 sequences x 30 pairs. Use `--max-pairs 5` for a quick check (~20 min).\n\n### Figure 6 — Visual Comparison\n\nGenerate the 3-scenario visual comparison figure (ANVIL-M vs RIFE HDv3 vs Ground Truth):\n\n```bash\npixi run python scripts/gen_fig_visual_comparison.py \\\n  --xiph-dir data/xiph_1080p \\\n  --anvil-ckpt artifacts/checkpoints/D-unet-v3bm-nomv/best.pt \\\n  --rife-repo vendor/ECCV2022-RIFE \\\n  --output-dir artifacts/figures\n```\n\nOutput: `artifacts/figures/fig_visual_comparison.pdf`\n\n### Table e2e_latency — End-to-End System Latency\n\nThe end-to-end pipeline runs in the [mpv-android-anvil](https://github.com/NihilDigit/mpv-android-anvil) repository, a research demo fork of mpv-android with ANVIL integrated as a native video filter (`vf_anvil`, ~2800 lines C). A pre-built release APK is available in that repo's [Releases](https://github.com/NihilDigit/mpv-android-anvil/releases) page.\n\n**Paper claim**: median VFI latency = **28.4 ms** on SM8650, measured over 54,623 consecutively logged frame pairs during a 30-minute continuous playback of 1080p H.264 30fps content (94.9% within the 33.3 ms budget). See `bench_paper_e2e/` in the mpv-android-anvil repo for raw data. Note: full-frame logging adds ~4°C thermal overhead; the released APK uses sampled logging (every 30th frame) for normal use.\n\n**Three-accelerator pipeline** (CPU + GPU Vulkan + HTP INT8, pipelined):\n\n| Stage | Hardware | Latency | Description |\n|-------|----------|---------|-------------|\n| P1a | CPU | 2.9 ms | MV densify + downsample + YUV pack (NEON) |\n| P1b+P2 | GPU (Adreno 750) | 3.7 ms | Prealign v2 + quantized warp |\n| Copy | CPU | 0.9 ms | 12 MB uint8 NHWC memcpy (NEON prefetch) |\n| P3 | HTP V75 (INT8) | 17.0 ms | ANVIL-S inference (pipelined async) |\n| P4 | GPU (Adreno 750) | 3.3 ms | Residual + RGB→YUV420 |\n| **Total** | | **28.4 ms** | Median over 30-min 30fps playback (n=54,623) |\n\n**Stress test data** (in the mpv-android-anvil repo under `bench_paper_e2e/`):\n- `anvil_timing.csv` — parsed per-stage timings (n=54,623)\n- `timing_summary.json` — paper-ready statistics (median, p95, min, max)\n- `telemetry.csv` — system telemetry (battery, thermal, CPU/GPU freq, 10s interval)\n- `meta.json` — device info, battery drop, duration\n\n**Key source files** (in the mpv-android-anvil repo):\n- `anvil/filter/vf_anvil.c` — core VFI filter (~2800 lines, three-accelerator pipeline)\n- `anvil/shaders/*.comp` — 4 Vulkan compute shaders (median, Gauss, warp+quant, residual+YUV)\n- `app/src/main/assets/anvil/context.serialized.bin` — pre-compiled QNN HTP INT8 model (ANVIL-S 1080p)\n\n**Build prerequisites:**\n- Linux x86_64, Qualcomm QAIRT SDK 2.42+, Android NDK r29\n- ~20 GB disk space for NDK/SDK + dependencies\n- See the [mpv-android-anvil README](https://github.com/NihilDigit/mpv-android-anvil) for full build instructions\n\n## External Dependencies\n\n### RIFE HDv3\n\nRequired for: Tables main_quality, rife_reduced, int8_quality, instrumented.\n\n```bash\ngit clone https://github.com/megvii-research/ECCV2022-RIFE vendor/ECCV2022-RIFE\n# Download pretrained weights into vendor/ECCV2022-RIFE/train_log/\n```\n\n### IFRNet\n\nRequired for: Tables int8_quality and instrumented.\n\nIFRNet weights and architecture are loaded from the AMT vendor repository (`vendor/AMT`), which bundles IFRNet as a baseline for comparison. This avoids maintaining a separate IFRNet clone.\n\n```bash\ngit clone https://github.com/MCG-NKU/AMT vendor/AMT\n# Download IFRNet_Vimeo90K.pth and place it at vendor/IFRNet_Vimeo90K.pth\n```\n\n### QAIRT SDK\n\nRequired for: Tables rife_reduced (QNN column), latency, operator_compat.\n\nInstall the Qualcomm AI Engine Direct SDK. Scripts expect the path via `--qairt-root` or `QAIRT_SDK_ROOT` environment variable.\n\n### Android Device\n\nRequired for: device-side QNN/HTP benchmarks and the end-to-end demo app. Tested on Snapdragon 8 Gen 2 (SM8550), 8 Gen 3 (SM8650), 7+ Gen 2 (SM7475), and MediaTek Dimensity 9300/9400+.\n\n## Smoke Tests\n\nRun a quick sanity check on all scripts (requires data + checkpoints in place):\n\n```bash\nbash scripts/smoke_test.sh\n```\n\nThis runs each evaluation script with `--limit 2` (or equivalent). Device-dependent scripts (HTP benchmarks) are skipped. Use `--skip-rife` to also skip RIFE-dependent tests.\n\n## Notes\n\n- The release bundle assumes CUDA is available for training and LPIPS evaluation.\n- `cv2`, `scipy`, `onnxruntime`, `lpips`, and `motion-vector-extractor` are included in `pixi.toml`.\n- Capacity sweep models use prealign v1 (basic); final ANVIL-S/M use prealign v2 (smoothed). Do not mix them.\n- Device-specific deployment code lives in the [mpv-android-anvil](https://github.com/NihilDigit/mpv-android-anvil) repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihildigit%2Fanvil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnihildigit%2Fanvil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihildigit%2Fanvil/lists"}