Ochevid Jev-VL 2B
One image, many independent typed answers. No training required.
An experimental execution architecture by Mike Dantsiger using original Qwen weights. Image encoding and decoder image-prefix prefill happen once; question tails run independently on separate batch rows. No LoRA, new learned weights or training from scratch. The custom loader is required; this is not a drop-in Transformers AutoModel or Inference Provider endpoint.
Complete model package: original upstream safetensors, processor and
configuration are included under base/, together with our execution code.
The package is approximately 4.27 GB and needs no training. The base identity
and revision remain explicit. OCHEVID_MODEL_PATH can optionally reuse an
existing local checkpoint. Actual full-package save/reload passed.
Run
git clone https://huggingface.co/Mikemugen/ochevid-jev-vl-2b
cd ochevid-jev-vl-2b
pip install -r requirements.txt
from PIL import Image
from branch_model import OchevidBranches
model = OchevidBranches.from_pretrained("Mikemugen/ochevid-jev-vl-2b")
result = model(
Image.open("your_frame.jpg"),
"Is a person visible? | Yes | No | Cannot determine\n"
"Is a bicycle visible? | Yes | No | Cannot determine",
)
print(result["results"])
print(result["execution"]) # 1 encoding, 1 shared prefill, 1 branch call
Up to eight questions / nine options; default options Yes / No / Cannot determine. Questions may differ in length and wording. Context/rules use the same explicit routing as the demo. All-skipped requests encode nothing. This prototype supports typed options; it does not generate free text. Validated on CUDA BF16 / Transformers 5.17.0 and a bounded CPU FP32 smoke. The live demo uses this shared-prefix graph for typed answers; visual reuse remains selectable and handles free answers. First load is slower than warm requests.
Evidence
100 distinct questions, one image read: 0.634 s with a full batch, or 0.743 s with groups of eight and 4.29 GiB peak allocated tensors. Original image-per-question execution: 5.144 s. Same RTX 3090, BF16, one 560 px COCO fixture, three warm repeats. Includes preprocessing, transfer and readout; excludes decoding, loading, network and queue. The weights stay constant; batch allocation grows.
Research harness only beyond eight questions. The public loader and demo still accept up to eight; this plot is a scaling experiment, not a 100-question accuracy claim. All tested Ochevid answers matched original serial execution on this fixture. Method and limits · Measurements and exact question catalog.
| Movie frame | Serial shared-prefix branches | Batched branches |
|---|---|---|
| 1 question | 49.6 ms | 49.3 ms |
| 2 questions | 65.6 ms | 56.1 ms |
| 4 questions | 95.3 ms | 66.5 ms |
| 8 questions | 155.7 ms | 91.9 ms |
RTX 3090, BF16, five warm repeats. Includes preprocessing, cache copying and readout; excludes model loading, network and queue. Eight-question peak allocated tensors: 4.048 GiB serial / 4.252 GiB batched. These are allocated tensors, not total VRAM. More branches still require more decoder work and KV storage. Samples and fixture controls.
On the frozen 48-photo COCO object-presence set, eight questions at two resolutions: 767/768 answers match the original Qwen baseline. Annotation accuracy is 368/384 (95.83%) at 224 px and 370/384 (96.35%) at 560 px, with zero readout failures. One changed answer does not establish superior quality. Maximum BF16 probability differences vs original: 6.83 / 3.12 percentage points at 224 / 560 px. Scores are conditional and uncalibrated. Labels describe original annotation presence; small objects may be unobservable after downsampling, and annotations are not guaranteed exhaustive negatives. Quality + full-package save/reload check.
Five fixtures / forty answers match baseline. Question ordering, adding questions and unequal tail lengths preserve tested answers. Logical attention isolation does not guarantee numerically identical BF16 scores. The full offline package reproduced movie-example outputs exactly after save/reload. Results are bounded pilots, not universal 100% accuracy.
Runtime 0.2
Image preprocessing and CPU-to-GPU pixel transfer now happen once too. All 768 frozen answers and option probabilities remain exactly equal to runtime 0.1; request-failure cleanup and CPU loading checks pass. On the same movie frame with eight repeated presence questions, seven warm paired runs with alternating engine order: 91.6 to 85.2 ms. Includes preprocessing, transfer, inference and readout; excludes image decoding, model loading, network and queue. This is a separate fixture from the original scaling plot. Raw measurements.
Run python benchmark.py --image your_frame.jpg --questions questions.txt
to compare engines on your own image. Training and context guide.
Next experiments and model-size decision.
One question, multiple images (experimental)
frames = [Image.open("frame_1.jpg"), Image.open("frame_2.jpg")]
result = model.answer_images(frames, "Is a person visible? | Yes | No | Cannot determine")
print(result["results"]) # Separate answer for each frame.
print(result["execution"]) # images_encoded counts every distinct image.
Up to eight images and exactly one typed question. Independent batch rows; no cross-image cache or temporal summary. Every image is encoded. A single batched encoder call does not mean one image worth of computation. Frozen pilot: 767/768 answers agree with the original engine; maximum BF16 option-probability drift is 8.73 / 3.52 percentage points at 224 / 560 px. Four frames: 197 to 164 ms; eight: 397 to 359 ms, with allocated GPU tensors 4.04 to 4.33 GiB for eight. Mixed-aspect-ratio images incur padding overhead. Method, quality and raw samples.
Offline export
model.save_pretrained("ochevid-offline", include_base_weights=True)
reloaded = OchevidBranches.from_pretrained("ochevid-offline", local_files_only=True)
The export includes original upstream weights, processor and execution code. Preserve this repository's LICENSE/NOTICE and upstream attribution when redistributing. Do not call unmodified upstream parameters newly trained weights. Before deployment: wider scene/question checks, numerical threshold validation and supported-runtime checks. Later small heads/adapters are optional ways to specialize behavior; full pretraining is not necessary.
Attribution
Base: Qwen3-VL-2B-Instruct,
revision 89644892e4d85e24eaac8bacfd4f463576704203, Apache-2.0 as declared
upstream. Architecture/runtime code: Copyright 2026 Mike Dantsiger, Apache-2.0.
The measured movie still is Big Buck Bunny (2008), Blender Foundation;
screenshot by Church of emacs, resized and JPEG-compressed, CC BY 3.0.
Photographs/movie assets are not redistributed in this model repository.
COCO annotation-derived evaluation targets remain CC BY 4.0; photograph
rights are separate. See the linked
evaluation provenance.