lukbit/devision

Model

deVision v0.3

0

6 commits

2 linked in READMEs

updated Oct 14, 2026

See the code

README

deVision v0.3

deVision

Image + English questions → structured answers with calibrated probabilities. deVision pairs a SigLIP2 vision encoder with Laya's ModernBERT decision model. It scores the options of yes/no (noul) and multiple-choice (choice) questions instead of generating text, follows the Jev answer format, and runs without a GPU. Several questions about one image share a single image encoding.

Usage

pip install devision
import devision

model = devision.load("lukbit/devision")   # latest release; device defaults to auto
result = model.predict(
    image="photo.jpg",   # a path, an http(s) URL, a data URI, base64, bytes or a PIL image
    state="",            # text context; "" when there is none
    questions={
        "has_fork": {"type": "noul", "instructions": "Is there a fork in the image?"},
        "room": {"type": "choice", "instructions": "Which room is this?",
                 "criteria": {"kitchen": None, "bathroom": None, "bedroom": None}},
    },
)
print(result["answers"]["has_fork"]["noul"])        # probability of yes
print(result["answers"]["room"]["probabilities"])   # one probability per option, summing to 1

HTTP server with a browser demo at http://127.0.0.1:8000:

devision-serve --checkpoint lukbit/devision --port 8000
curl -s http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' \
  -d '{"image": "https://example.com/photo.jpg", "state": "", "questions": {"has_fork": {"type": "noul", "instructions": "Is there a fork in the image?"}}}'

Over HTTP, image is an http(s) URL, a data URI or base64; the server never reads its own files. Responses follow Jev; confidence for choice is (n * p_max - 1) / (n - 1). Invalid requests return 422 (devision.InvalidRequest in Python).

Good for: whether something is present and how many (ask counts as a choice), what kind of thing or scene, colours and materials, up/down and left/right in photos (as a choice). Not for: comparing two places on a diagram, chart or map; relative-position yes/no questions; small text; other languages or several images. Use the probabilities as thresholds and send uncertain cases to a person or a stronger model, after checking the thresholds on your own data.

Evaluation

Accuracy through decide with the fitted temperatures. Mismatched: the same questions with every picture swapped for an unrelated one. These are project evaluation subsets, not official leaderboard scores. Although test pictures are excluded from training, these sets have informed successive experiments and release decisions; they are not a fresh independent test. See the release limitations below.

SetQuestionsAccuracyMismatchedNLLECE
COCO object presence1,1200.9470.5040.1630.034
VQAv2 multiple choice1,4200.9090.3800.2710.038
COCO size1,1000.8720.5110.3360.029
POPE, project filtered set8,6760.8500.5270.3680.039
GQA val subset9920.7900.5500.4100.040
COCO position1,2740.8850.4930.2880.029
VQAv2 yes/no subset1,0000.7040.5120.5740.026
COCO relative position1,9500.7550.4960.4900.038
VSR, project held-out split9040.6610.4870.6200.046
Visual7W, project held-out split1,0000.7210.4190.6730.041
Fresh counting test (unseen pictures)6000.7630.4050.5740.054
CountBench, 0–10 choices4910.3560.1041.6020.052
COCO mirrored position6400.8470.4770.3590.044
COCO mirrored relative position1,4920.6980.5070.5450.030
GQA binding test1,4840.6760.4980.5590.028
What'sUp8200.2870.2451.4910.245

Against Laya Vision 201M on the same questions (its published per-question predictions; difference in points, 95% interval from paired resampling by picture):

SetQuestionsLaya VisiondeVisionDifference
VQAv2 yes/no4,8870.7170.725+0.8 [-0.8, +2.4]
A-OKVQA1,1380.5980.613+1.4 [-1.8, +4.7]
ScienceQA with images2,0970.8240.789-3.5 [-5.6, -1.4]
ScienceQA natural science, needs the picture3230.7000.495-20.4 [-27.2, -13.3]

On the full POPE random / popular / adversarial sets (3,000 questions each) deVision scores 0.880 / 0.859 / 0.805, against Laya Vision's published 0.836 / 0.819 / 0.777 (aggregate scores only, not paired).

CPU latency: P50 175 ms, P95 190 ms (Darwin arm64, 4 threads, FP32, one question per request, warm-up excluded).

Model

VisionSigLIP2-B/16, 256 × 256 letterboxed input, 64 visual tokens after a 2 × 2 merge and an MLP projector; training policy described below
DecisionLaya-initialised ModernBERT-large and Laya's decision head; each option is scored at its [MASK], then a temperature-scaled softmax
SizeAbout 518M parameters, FP32, 2.07 GB (LoRA merged)

This release continues v0.2 with 81,875 questions of counting, object presence, mirrored spatial questions, VSR and broad replay, for one 10,235-step schedule (seed 1). The first 2,000 steps were run as exp19; r15 resumes that exact training state. SigLIP2's top four encoder layers and final LayerNorm were fine-tuned at 5e-6 alongside the projector, decision head and ModernBERT LoRA. LoRA is merged into the released weights. The input remains 256×256 with 64 visual tokens; S2 question conditioning is not enabled.

Temperatures were fitted on the designated calibration set, by question type and option-count bucket. Missing buckets fall back to the question-type temperature:

BucketTemperature
Choice, 11+ options1.2012
Choice, 2 options1.9488
Choice, 3–5 options1.7575
Noul (yes / no)1.8258
Choice, any other count1.5922

The owner adopted v0.3 as a trade-off: counting, relations and ScienceQA improved, while four old-capability protection conditions were not met. The original automated verdict remains candidate=false. See the adoption decision and v0.2 comparison, original acceptance report and training configuration.

Limitations

  • English, one image, yes/no and choice questions only. score is not implemented. At 256×256, small text and fine diagram details are hard to read.
  • CountBench improved by 16.7 points over v0.2, but absolute accuracy is only 35.6%. Answer-order sensitivity increased (39.5% change their answer when options are reversed, versus 16.9%); this is not a general-purpose accurate counter.
  • VSR accuracy is 1.8 points lower and A-OKVQA 1.3 points lower than v0.2; their overall intervals contain zero, but non-inferiority was not established. VSR positive recall fell by 5.3 points. A-OKVQA and What'sUp have worse probability quality than v0.2. No prewritten NLL warning was triggered; that does not mean all probabilities improved.
  • Diagram, chart and map comparisons and question-to-region binding remain weak. On natural-science ScienceQA questions that require the picture, accuracy is 49.5% versus Laya Vision's 70.0%.
  • Calibration reflects the calibration distribution, not every deployment domain. Validate thresholds on your own examples.
  • Test sets have repeatedly informed experiment and release decisions. This is one training seed, not a fresh independent confirmation. Gains cannot be attributed solely to unfreezing the vision encoder.

Licence

Weights and code: Apache-2.0, like the three base models (Laya, SigLIP2, ModernBERT). The training datasets (listed in this card's metadata) have their own terms, some non-commercial (e.g. ScienceQA, CC BY-NC-SA 4.0); check them against your use.

Code and training records (this release: tag model-v0.3) · evaluation details · provenance · Laya Vision

calibrated-probabilities
devision
model-index
rlcd
safetensors
system-one
visual-decisions
visual-question-answering

lukbit/devision

Model

deVision v0.3

0

6 commits

2 linked in READMEs

updated Oct 14, 2026

See the code

README

deVision v0.3

deVision

Image + English questions → structured answers with calibrated probabilities. deVision pairs a SigLIP2 vision encoder with Laya's ModernBERT decision model. It scores the options of yes/no (noul) and multiple-choice (choice) questions instead of generating text, follows the Jev answer format, and runs without a GPU. Several questions about one image share a single image encoding.

Usage

pip install devision
import devision

model = devision.load("lukbit/devision")   # latest release; device defaults to auto
result = model.predict(
    image="photo.jpg",   # a path, an http(s) URL, a data URI, base64, bytes or a PIL image
    state="",            # text context; "" when there is none
    questions={
        "has_fork": {"type": "noul", "instructions": "Is there a fork in the image?"},
        "room": {"type": "choice", "instructions": "Which room is this?",
                 "criteria": {"kitchen": None, "bathroom": None, "bedroom": None}},
    },
)
print(result["answers"]["has_fork"]["noul"])        # probability of yes
print(result["answers"]["room"]["probabilities"])   # one probability per option, summing to 1

HTTP server with a browser demo at http://127.0.0.1:8000:

devision-serve --checkpoint lukbit/devision --port 8000
curl -s http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' \
  -d '{"image": "https://example.com/photo.jpg", "state": "", "questions": {"has_fork": {"type": "noul", "instructions": "Is there a fork in the image?"}}}'

Over HTTP, image is an http(s) URL, a data URI or base64; the server never reads its own files. Responses follow Jev; confidence for choice is (n * p_max - 1) / (n - 1). Invalid requests return 422 (devision.InvalidRequest in Python).

Good for: whether something is present and how many (ask counts as a choice), what kind of thing or scene, colours and materials, up/down and left/right in photos (as a choice). Not for: comparing two places on a diagram, chart or map; relative-position yes/no questions; small text; other languages or several images. Use the probabilities as thresholds and send uncertain cases to a person or a stronger model, after checking the thresholds on your own data.

Evaluation

Accuracy through decide with the fitted temperatures. Mismatched: the same questions with every picture swapped for an unrelated one. These are project evaluation subsets, not official leaderboard scores. Although test pictures are excluded from training, these sets have informed successive experiments and release decisions; they are not a fresh independent test. See the release limitations below.

SetQuestionsAccuracyMismatchedNLLECE
COCO object presence1,1200.9470.5040.1630.034
VQAv2 multiple choice1,4200.9090.3800.2710.038
COCO size1,1000.8720.5110.3360.029
POPE, project filtered set8,6760.8500.5270.3680.039
GQA val subset9920.7900.5500.4100.040
COCO position1,2740.8850.4930.2880.029
VQAv2 yes/no subset1,0000.7040.5120.5740.026
COCO relative position1,9500.7550.4960.4900.038
VSR, project held-out split9040.6610.4870.6200.046
Visual7W, project held-out split1,0000.7210.4190.6730.041
Fresh counting test (unseen pictures)6000.7630.4050.5740.054
CountBench, 0–10 choices4910.3560.1041.6020.052
COCO mirrored position6400.8470.4770.3590.044
COCO mirrored relative position1,4920.6980.5070.5450.030
GQA binding test1,4840.6760.4980.5590.028
What'sUp8200.2870.2451.4910.245

Against Laya Vision 201M on the same questions (its published per-question predictions; difference in points, 95% interval from paired resampling by picture):

SetQuestionsLaya VisiondeVisionDifference
VQAv2 yes/no4,8870.7170.725+0.8 [-0.8, +2.4]
A-OKVQA1,1380.5980.613+1.4 [-1.8, +4.7]
ScienceQA with images2,0970.8240.789-3.5 [-5.6, -1.4]
ScienceQA natural science, needs the picture3230.7000.495-20.4 [-27.2, -13.3]

On the full POPE random / popular / adversarial sets (3,000 questions each) deVision scores 0.880 / 0.859 / 0.805, against Laya Vision's published 0.836 / 0.819 / 0.777 (aggregate scores only, not paired).

CPU latency: P50 175 ms, P95 190 ms (Darwin arm64, 4 threads, FP32, one question per request, warm-up excluded).

Model

VisionSigLIP2-B/16, 256 × 256 letterboxed input, 64 visual tokens after a 2 × 2 merge and an MLP projector; training policy described below
DecisionLaya-initialised ModernBERT-large and Laya's decision head; each option is scored at its [MASK], then a temperature-scaled softmax
SizeAbout 518M parameters, FP32, 2.07 GB (LoRA merged)

This release continues v0.2 with 81,875 questions of counting, object presence, mirrored spatial questions, VSR and broad replay, for one 10,235-step schedule (seed 1). The first 2,000 steps were run as exp19; r15 resumes that exact training state. SigLIP2's top four encoder layers and final LayerNorm were fine-tuned at 5e-6 alongside the projector, decision head and ModernBERT LoRA. LoRA is merged into the released weights. The input remains 256×256 with 64 visual tokens; S2 question conditioning is not enabled.

Temperatures were fitted on the designated calibration set, by question type and option-count bucket. Missing buckets fall back to the question-type temperature:

BucketTemperature
Choice, 11+ options1.2012
Choice, 2 options1.9488
Choice, 3–5 options1.7575
Noul (yes / no)1.8258
Choice, any other count1.5922

The owner adopted v0.3 as a trade-off: counting, relations and ScienceQA improved, while four old-capability protection conditions were not met. The original automated verdict remains candidate=false. See the adoption decision and v0.2 comparison, original acceptance report and training configuration.

Limitations

  • English, one image, yes/no and choice questions only. score is not implemented. At 256×256, small text and fine diagram details are hard to read.
  • CountBench improved by 16.7 points over v0.2, but absolute accuracy is only 35.6%. Answer-order sensitivity increased (39.5% change their answer when options are reversed, versus 16.9%); this is not a general-purpose accurate counter.
  • VSR accuracy is 1.8 points lower and A-OKVQA 1.3 points lower than v0.2; their overall intervals contain zero, but non-inferiority was not established. VSR positive recall fell by 5.3 points. A-OKVQA and What'sUp have worse probability quality than v0.2. No prewritten NLL warning was triggered; that does not mean all probabilities improved.
  • Diagram, chart and map comparisons and question-to-region binding remain weak. On natural-science ScienceQA questions that require the picture, accuracy is 49.5% versus Laya Vision's 70.0%.
  • Calibration reflects the calibration distribution, not every deployment domain. Validate thresholds on your own examples.
  • Test sets have repeatedly informed experiment and release decisions. This is one training seed, not a fresh independent confirmation. Gains cannot be attributed solely to unfreezing the vision encoder.

Licence

Weights and code: Apache-2.0, like the three base models (Laya, SigLIP2, ModernBERT). The training datasets (listed in this card's metadata) have their own terms, some non-commercial (e.g. ScienceQA, CC BY-NC-SA 4.0); check them against your use.

Code and training records (this release: tag model-v0.3) · evaluation details · provenance · Laya Vision

calibrated-probabilities
devision
model-index
rlcd
safetensors
system-one
visual-decisions
visual-question-answering