LoRA adapter that fine-tunes
Qwen/Qwen3-VL-32B-Instruct to transcribe phone photos of folk-music sheet music into
ABC notation.
This is the larger of two trained variants. The 32B has a meaningfully lower training loss than its 8B sibling and beats it on uncropped phone photos, but it also tends to use a different ABC dialect (slash notation for short durations, V:1 treble voice tags) that diverges stylistically from the training corpus.
1from PIL import Image
2from unsloth import FastVisionModel
3
4model, processor = FastVisionModel.from_pretrained(
5 "folk-abc/learn-abc-qwen3vl32b",
6 load_in_4bit=True,
7)
8FastVisionModel.for_inference(model)
9
10img = Image.open("sheet_music_photo.jpg").convert("RGB")
11messages = [{
12 "role": "user",
13 "content": [
14 {"type": "image"},
15 {"type": "text", "text":
16 "Transcribe this sheet music into ABC notation. "
17 "Output only the ABC, no explanation."},
18 ],
19}]
20text = processor.apply_chat_template(messages, add_generation_prompt=True)
21inputs = processor(images=img, text=text, add_special_tokens=False,
22 return_tensors="pt").to(model.device)
23out = model.generate(**inputs, max_new_tokens=800, do_sample=False)
24abc = processor.decode(out[0][inputs["input_ids"].shape[1]:],
25 skip_special_tokens=True)
26print(abc)
The 4-bit weights need ~20 GB VRAM to load; ~25 GB total during inference. Won't fit on most consumer GPUs.
The 32B converges to a noticeably lower training loss but generates ABC in a different dialect (slash-notation for short notes, V:1 treble voice tags) that the smaller 8B doesn't. This dialect is musically equivalent but parses to different quarterLength values via music21, which hurts the note-accuracy metric on cropped photos where the model is most confident. On raw, harder photos the model becomes less verbose and aligns better with the training-data dialect — yielding a clear win on pitch- and duration-accuracy there.
Apache-2.0 (matching the base model). Note that the training corpus is governed by separate licenses: