HIKARI-Sirius is our best-performing skin disease diagnosis model, fine-tuned from Qwen/Qwen3-VL-8B-Thinking on the SkinCAP Thai dermatology dataset.
The key innovation is RAG-in-Training — retrieval-augmented generation is embedded during fine-tuning itself (not only at inference). The model learns to compare a query image against retrieved reference images and their clinical captions, making it robust to visual similarity across diseases.
Property
Value
Task
10-class skin disease diagnosis (Stage 2 of HIKARI pipeline)
📷 Image
│
▼
[Stage 1] HIKARI-Subaru-8B-SkinGroup ──► group label (4 classes)
│
▼
[Stage 2] HIKARI-Sirius-8B-SkinDx-RAG ──► disease label (10 classes) ← YOU ARE HERE
│
▼
[Stage 3] HIKARI-Vega-8B-SkinCaption-Fused ──► clinical caption
Quick Inference — transformers
python
1from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
2import torch
3from PIL import Image
45model_id ="E27085921/HIKARI-Sirius-8B-SkinDx-RAG"67processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)8model = Qwen3VLForConditionalGeneration.from_pretrained(9 model_id,10 torch_dtype=torch.bfloat16,11 device_map="auto",12 trust_remote_code=True,13)1415image = Image.open("skin_lesion.jpg").convert("RGB")16group ="inflammatory"# from Stage 1 (HIKARI-Subaru)1718PROMPT =(19"This skin lesion belongs to the group '{group}'. "20"Examine the lesion morphology (papules, plaques, macules), "21"color (red, violet, white, brown), scale/crust, border sharpness, "22"and distribution pattern. Based on these visual features, "23"what is the specific skin disease?"24)2526messages =[{"role":"user","content":[27{"type":"image","image": image},28{"type":"text","text": PROMPT.format(group=group)},29]}]3031text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)32inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)3334with torch.no_grad():35 out = model.generate(**inputs, max_new_tokens=64, temperature=0.0, do_sample=False)3637result = processor.batch_decode(38 out[:, inputs["input_ids"].shape[1]:], skip_special_tokens=True39)[0].strip()40print(result)# → "atopic_dermatitis"
Production — vLLM BnB-4bit ⚡ (RTX 5070 Ti / 16 GB VRAM)
Throughput: 5.57 img/s at batch=4
python
1from vllm import LLM, SamplingParams
2from transformers import AutoProcessor
3from PIL import Image
45model_id ="E27085921/HIKARI-Sirius-8B-SkinDx-RAG"67llm = LLM(8 model=model_id,9 quantization="bitsandbytes",10 load_format="bitsandbytes",11 trust_remote_code=True,12 max_model_len=2048,13 gpu_memory_utilization=0.88,14)15processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)16sp = SamplingParams(max_tokens=64, temperature=0.0)1718PROMPT =(19"This skin lesion belongs to the group '{group}'. "20"Examine the lesion morphology (papules, plaques, macules), "21"color (red, violet, white, brown), scale/crust, border sharpness, "22"and distribution pattern. Based on these visual features, "23"what is the specific skin disease?"24)2526defclassify_disease(image: Image.Image, group:str)->str:27 messages =[{"role":"user","content":[28{"type":"image","image": image},29{"type":"text","text": PROMPT.format(group=group)},30]}]31 text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)32 n =max(text.count("<|vision_start|>"),1)33 out = llm.generate({"prompt": text,"multi_modal_data":{"image":[image]* n}}, sp)34return out[0].outputs[0].text.strip()3536img = Image.open("skin_lesion.jpg").convert("RGB")37print(classify_disease(img, group="inflammatory"))# → "atopic_dermatitis"
Production — SGLang FP8 🚀 (maximum throughput, 9.11 img/s at batch=4)
python
1import sglang as sgl
2from transformers import AutoProcessor
3from PIL import Image
45model_id ="E27085921/HIKARI-Sirius-8B-SkinDx-RAG"67engine = sgl.Engine(8 model_path=model_id,9 dtype="bfloat16",10 quantization="fp8",11 context_length=2048,12 mem_fraction_static=0.88,13 trust_remote_code=True,14 disable_cuda_graph=True,15)16processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)1718PROMPT =(19"This skin lesion belongs to the group '{group}'. "20"Examine the lesion morphology (papules, plaques, macules), "21"color (red, violet, white, brown), scale/crust, border sharpness, "22"and distribution pattern. Based on these visual features, "23"what is the specific skin disease?"24)2526defclassify_disease_sglang(image: Image.Image, group:str)->str:27 messages =[{"role":"user","content":[28{"type":"image"},29{"type":"text","text": PROMPT.format(group=group)},30]}]31 text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)32 out = engine.generate(33 prompt=text,34 image_data=image,35 sampling_params={"max_new_tokens":64,"temperature":0.0},36)37return(out["text"]ifisinstance(out,dict)else out[0]["text"]).strip()3839# engine.shutdown() # call when done
Parse Disease Label (fuzzy matching)
python
1from rapidfuzz import process as fuzz_process
23DISEASES =[4"acne_vulgaris","atopic_dermatitis","melanocytic_nevi","psoriasis",5"sccis","seborrheic_dermatitis","skin_tag","tinea_versicolor",6"urticaria","photodermatoses",7]89defmatch_disease(raw:str)->str:10 result, score, _ = fuzz_process.extractOne(raw.lower(), DISEASES)11return result if score >=50else"unknown"1213print(match_disease("The patient has atopic dermatitis"))# → atopic_dermatitis
* Polaris requires ground-truth group at inference — for research comparison only.
📄 Citation
bibtex
1@misc{hikari2026,
2 title = {HIKARI: RAG-in-Training for Skin Disease Diagnosis
3 with Cascaded Vision-Language Models},
4 author = {Watin Promfiy and Pawitra Boonprasart},
5 year = {2026},
6 institution = {King Mongkut's Institute of Technology Ladkrabang,
7 Department of Information Technology, Bangkok, Thailand}
8}
Made with ❤️ at King Mongkut's Institute of Technology Ladkrabang (KMITL)
Department of Information Technology