Spaces:
Running on Zero
Running on Zero
| base_model: openbmb/MiniCPM-V-4.6 | |
| license: apache-2.0 | |
| language: | |
| - en | |
| tags: | |
| - medical | |
| - vision-language | |
| - lab-report | |
| - ocr-free-extraction | |
| - minicpm-v | |
| - lora | |
| - build-small-hackathon | |
| pipeline_tag: image-text-to-text | |
| library_name: transformers | |
| # Blood Test Explainer — MiniCPM-V 4.6 (medical-reasoning fine-tune) | |
| A ~1.3B vision-language model that reads a photo or PDF of a blood test and extracts the markers, | |
| values, units, reference ranges and high/low status as structured JSON, fully offline. It powers | |
| the [Blood Test Explainer](https://huggingface.co/spaces/build-small-hackathon/blood-test-explainer) | |
| Space, built for the Build Small hackathon by Roman and Dimitris (American College of Greece / | |
| Deree AI Lab). | |
| ## What it is | |
| This is `openbmb/MiniCPM-V-4.6` fine-tuned with a LoRA that was **merged back into the base**, so it | |
| is a single standalone model with no adapter to load. The fine-tune did not touch the extraction | |
| task directly. Instead, we froze the vision encoder and trained only the language layers on a | |
| general medical-reasoning dataset, and that made the model a better lab-report reader. | |
| ## How it was trained | |
| - **Method:** LoRA on the language layers (vision encoder frozen), then merged into the base. | |
| - **Data:** [FreedomIntelligence/medical-o1-reasoning-SFT](https://huggingface.co/datasets/FreedomIntelligence/medical-o1-reasoning-SFT) (general medical reasoning, text only — no extraction examples). | |
| - **Why:** fine-tuning on our own extraction schema caused catastrophic forgetting and collapsed | |
| accuracy. Teaching the model general medical knowledge improved extraction instead. | |
| - **Infra:** ms-swift LoRA on Modal (A100). A small amount of reasoning data worked best. | |
| ## Results | |
| Field-level marker extraction on hand-labeled real reports: | |
| | Model | Marker F1 | Recall | Precision | | |
| |---|---|---|---| | |
| | Base MiniCPM-V 4.6 | 0.655 | 0.529 | 0.857 | | |
| | **This model** | **0.746** | **0.647** | **0.880** | | |
| (Small evaluation set, so treat the numbers as directional.) | |
| ## Intended use | |
| Educational extraction and explanation of routine blood-test results, running locally / in-Space. | |
| The app pairs this model with a curated medical knowledge base so explanations are grounded and not | |
| hallucinated. | |
| ## How to use | |
| ```python | |
| from transformers import AutoModelForImageTextToText, AutoProcessor | |
| model_id = "build-small-hackathon/blood-test-minicpmv-4_6-medreason" | |
| processor = AutoProcessor.from_pretrained(model_id) | |
| model = AutoModelForImageTextToText.from_pretrained(model_id, device_map="auto").eval() | |
| # Prompt the model with the lab-report image and ask for the markers as JSON. | |
| ``` | |
| The full extraction prompt and pipeline are in the | |
| [app repository](https://github.com/r0m4k/blood-test-explainer). | |
| ## Limitations and safety | |
| This is an **educational tool, not a diagnosis**. It can misread values, especially on noisy scans, | |
| and the evaluation set is small. It is meant to help someone understand their results and ask better | |
| questions of a clinician, not to replace one. License follows the base model, | |
| `openbmb/MiniCPM-V-4.6`. | |