Zpět na domů

Ruský AI pro analýzu rentgenu: sestavení modelu ViT + ruGPT-3

Článek popisuje praktické zkušenosti s vytvořením multimodální neuronové sítě pro analýzu rentgenových snímků a generování lékařských závěrů v ruštině. Jsou zváženy etapy sloučení modelů ViT a ruGPT-3, přípravy dat, trénování a nasazení řešení.

Sestavil jsem AI-rentgenologa v ruštině: od architektury po inferování
Advertisement 728x90

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í:

Google AdInline article slot
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:

Google AdInline article slot
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í:

Google AdInline article slot
  • 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

Advertisement 728x90

Číst dál