Vytváření vícemodálního modelu pro analýzu rentgenových snímků v češtině: Praktický návod
Vývoj lékařských AI řešení v češtině naráží na nedostatek hotových nástrojů a datových sad. V tomto článku rozebíráme praktický případ sestavení a trénování modelu VisionEncoderDecoder pro generování lékařských závěrů z rentgenogramů, který kombinuje vizuální enkodér ViT a jazykový model ruGPT-3.
Architektonická řešení a úprava modelů
Vytvoření vícemodálního modelu od nuly vyžaduje značné výpočetní zdroje. Alternativním přístupem je spojení předtrénovaných komponent přes architekturu VisionEncoderDecoderModel od Hugging Face. Jako enkodér byl zvolen google/vit-base-patch16-224-in21k pro extrakci vizuálních znaků. Dekodérem je český jazykový model ai-forever/rugpt3small_based_on_gpt2.
Klíčový problém: ruGPT-3 původně nepodporuje křížovou pozornost pro příjem dat od enkodéru. Řešení vyžaduje úpravu konfigurace modelu před inicializací:
from transformers import AutoConfig, AutoModelForCausalLM, AutoModel
encoder = AutoModel.from_pretrained("google/vit-base-patch16-224-in21k")
decoder_config = AutoConfig.from_pretrained("ai-forever/rugpt3small_based_on_gpt2")
decoder_config.is_decoder = True
decoder_config.add_cross_attention = True
decoder = AutoModelForCausalLM.from_pretrained("ai-forever/rugpt3small_based_on_gpt2", config=decoder_config)
Po sestavení modelu jsou inicializovány nové váhy pro vrstvy křížové pozornosti a projekční vrstvy, které podléhají dalšímu trénování.
Příprava a zpracování dat
Absence českých datových sad párů "rentgenový snímek – lékařský závěr" vyžaduje kreativní řešení. Jako základ byl použit anglický datový set Indiana University Chest X-Ray (IU X-Ray), obsahující asi 7500 snímků a zpráv. Překlad lékařských závěrů do češtiny byl proveden pomocí modelu strojového překladu Helsinki-NLP/opus-mt-en-ru přímo v prostředí Kaggle.
Práce se soubory v Kaggle přináší specifické výzvy. Standardní metody načítání obrázků často vidí pouze náhledové soubory. Pro správné mapování je potřeba hluboké prohledávání souborového systému:
import os
file_map = {}
for root, dirs, files in os.walk('/kaggle/input'):
for file in files:
if file.lower().endswith(('.png', '.jpg', '.jpeg')):
base_name = os.path.splitext(file)[0]
file_map[base_name] = os.path.join(root, file)
Tento přístup zajišťuje stabilní propojení identifikátorů z CSV souborů s reálnými cestami k obrázkům.
Proces trénování a řešení technických problémů
Trénování probíhalo na dvou GPU NVIDIA T4 s použitím smíšené přesnosti (fp16) a akumulace gradientů (gradient_accumulation_steps=4) pro efektivní využití paměti při virtuální velikosti dávky 32.
Typické problémy a jejich řešení:
- Pády při ukládání kontrolních bodů: Seq2SeqTrainer v určitých verzích transformers způsobuje chyby při pokusu o automatické uložení složených modelů s nestandardními parametry. Řešení – vypnutí mezilehlého ukládání (save_strategy="no") a ruční správa parametrů generace přes GenerationConfig před finálním uložením modelu.
- Timeouty sezení Kaggle: Pro prevenci automatického ukončení dlouhých procesů trénování kvůli neaktivitě lze použít jednoduchý JavaScript skript v konzoli prohlížeče, simulující periodické klikání.
Výsledky, inferování a nasazení
Po 15 epochách trénování model demonstruje schopnost generovat souvislé lékařské závěry v češtině, správně používat odbornou terminologii. Model se naučil identifikovat základní vzory, jako jsou čisté plíce, známky pneumotoraxu a kardiomegalie. Omezení malého datového setu se projevují v občasných halucinacích – například model může naznačit přítomnost lékařských zařízení, které na snímku chybí.
Základní příklad inferování:
import torch
from transformers import VisionEncoderDecoderModel, ViTImageProcessor, AutoTokenizer
from PIL import Image
model_id = "livadies/Russian-Radiologist-ruGPT-ViT"
model = VisionEncoderDecoderModel.from_pretrained(model_id)
feature_extractor = ViTImageProcessor.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
image = Image.open("xray.jpg").convert("RGB")
pixel_values = feature_extractor(images=image, return_tensors="pt").pixel_values
generated_ids = model.generate(pixel_values, max_length=128, num_beams=4)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
Pro demonstraci možností modelu bylo nasazeno Gradio aplikace na platformě Hugging Face Spaces, fungující na CPU s časem generování odpovědi 10–15 sekund. Celý zdrojový kód, včetně pipeline pro přípravu dat a trénovacích notebooků, je dostupný v otevřeném repozitáři.
Co je důležité
- Hybridní architektura: Úspěšné spojení předtrénovaného vizuálního enkodéru ViT a českého jazykového modelu ruGPT-3 úpravou konfigurace pro podporu křížové pozornosti.
- Řešení problémů s daty: Překonání absence českých lékařských datových sad překladem existujících anglických dat a obcházení specifických omezení platformy Kaggle při práci se soubory.
- Praktické opravy: Vypnutí problematického automatického ukládání v Seq2SeqTrainer a ochrana před timeouty sezení pro stabilní dlouhodobé trénování.
- Ověření životaschopnosti: Model trénovaný na omezeném datovém setu demonstruje funkčnost architektury "Vision + Language" pro generování strukturovaných lékařských textů v češtině.
- Otevřenost a dostupnost: Kompletní kód projektu a interaktivní demo jsou veřejně dostupné pro studium, testování a další rozvoj komunitou.
— Editorial Team
Zatím žádné komentáře.