LLaVA-1.5-7B Skin Disease Fine-tuned Model (LoRA)

Model Description

이 λͺ¨λΈμ€ llava-hf/llava-1.5-7b-hf 베이슀 λͺ¨λΈμ„ 기반으둜 νŒŒμΈνŠœλ‹λœ LoRA μ–΄λŒ‘ν„°μž…λ‹ˆλ‹€. μ•ˆλ©΄ ν”ΌλΆ€ μ§ˆν™˜μ„ μ§„λ‹¨ν•˜κ³ , κ΄€λ ¨ μΌ€μ–΄ κ°€μ΄λ“œλ₯Ό μ œκ³΅ν•˜λŠ” 데 νŠΉν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄ λ²”μš© λͺ¨λΈμ΄ 동양인(ν•œκ΅­μΈ) ν”ΌλΆ€ μž„μƒ 데이터 ν•™μŠ΅μ΄ λΆ€μ‘±ν•΄ λ°œμƒν•˜λŠ” μ˜€μ§„μœ¨κ³Ό ν• λ£¨μ‹œλ„€μ΄μ…˜(μž„μ˜ 처방)을 ν•΄κ²°ν•˜κ³ μž κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • Base Model: llava-hf/llava-1.5-7b-hf
  • Finetuning Method: 8-bit QLoRA & SFT
  • Primary Use Case: μ•ˆλ©΄ ν”ΌλΆ€ μ§ˆν™˜ μΆ”λ‘  및 닀쀑 ν„΄(Multi-turn) μ§ˆμ˜μ‘λ‹΅ (μžκ°€ 진단 챗봇)

Training Details

  • Training Data: AI Hub의 'μ•ˆλ©΄λΆ€ ν”ΌλΆ€μ§ˆν™˜ 이미지 ν•©μ„± 데이터' 9,600μž₯을 기반으둜, 이미지 λ‹Ή 4개의 단일 ν„΄ μ§ˆμ˜μ‘λ‹΅μ„ ν•˜λ‚˜μ˜ λŒ€ν™” μ„Έμ…˜μœΌλ‘œ λ¬ΆλŠ” λ©€ν‹°ν„΄ μ„Έμ…˜ 체이닝(Multi-turn Session Chaining) 기법을 μ μš©ν•˜μ—¬ 38,400 Turn λŒ€ν™”μ…‹(QA쌍)으둜 κ°€κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.
  • Results: ν”ΌλΆ€ μ§ˆν™˜ 진단 Accuracy μ•½ 60% ν–₯상 (0.093 βž” 0.148), Macro F1-Score μ•½ 65% ν–₯상 (0.126 βž” 0.208). 반볡 생성 루프(Repetition Loop) 버그λ₯Ό 데이터 μ „μ²˜λ¦¬ λ ˆλ²¨μ—μ„œ μ›μ²œ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ Multi-turn Chaining νŠΉμ„±

λ³Έ λͺ¨λΈμ€ 이미지 1μž₯λ‹Ή 4개의 연속적인 μ§ˆμ˜μ‘λ‹΅(QA)을 ν•˜λ‚˜μ˜ λŒ€ν™” μ„Έμ…˜μœΌλ‘œ λ¬ΆλŠ” λ©€ν‹°ν„΄ μ„Έμ…˜ 체이닝(Multi-turn Session Chaining) κΈ°λ²•μœΌλ‘œ ν›ˆλ ¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

[ν•™μŠ΅ 데이터셋 μ˜ˆμ‹œ]

USER: <image>\nWhat skin disease is visible in this image?
ASSISTANT: Psoriasis
USER: What part of the body is this image of?
ASSISTANT: Face
USER: What symptoms are visible in this image?
ASSISTANT: itching
USER: Describe this disease.
ASSISTANT: An inflammatory skin condition that presents as red papules or plaques covered with scales.

⚠️ μΆ”λ‘  μ‹œ μ£Όμ˜μ‚¬ν•­ (Repetition Behavior) λͺ¨λΈμ΄ μœ„μ™€ 같은 'λ©€ν‹°ν„΄ 흐름'에 μ™„λ²½ν•˜κ²Œ 적응(과적합)λ˜μ–΄ μžˆμœΌλ―€λ‘œ, λ‹¨μˆœνžˆ 1개의 질문만 λ˜μ Έλ„ λͺ¨λΈ 슀슀둜 λ‹€μŒ 질문(USER:)을 μƒμƒν•˜μ—¬ 전체 λŒ€λ³Έμ„ λκΉŒμ§€ 좜λ ₯ν•˜λ €λŠ” νŠΉμ§•μ„ λ³΄μž…λ‹ˆλ‹€. λ”°λΌμ„œ μΆ”λ‘  μ‹œμ—λŠ” 파이썬 μ½”λ“œλ₯Ό 톡해 λ¬Έμžμ—΄μ„ 적절히 μŠ¬λΌμ΄μ‹±(Slicing)ν•˜μ—¬ μ›ν•˜λŠ” λ‹΅λ³€λ§Œ μΆ”μΆœν•˜λŠ” ν›„μ²˜λ¦¬(Post-processing)κ°€ ν•„μš”ν•©λ‹ˆλ‹€.


πŸš€ How to Get Started

1. Requirements (라이브러리 버전)

μ΅œμ‹  peft 라이브러리의 μ–΄λŒ‘ν„° λ‘œλ“œ ν˜Έν™˜μ„±μ„ μœ„ν•΄ μ•„λž˜ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ˜ 버전이 ν•„μš”ν•©λ‹ˆλ‹€. (특히 torchao >= 0.16.0 ν•„μˆ˜)

pip install -U transformers peft accelerate bitsandbytes requests Pillow "torchao>=0.16.0"

2. λͺ¨λΈ 및 μ–΄λŒ‘ν„° λ‘œλ“œ (Model Loading)

λͺ¨λΈμ€ 8-bit QLoRA둜 νŠœλ‹λ˜μ—ˆμœΌλ―€λ‘œ, 데이터 νƒ€μž… μΆ©λŒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ 베이슀 λͺ¨λΈμ„ 8-bit둜 λ‘œλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€.

from transformers import AutoProcessor, LlavaForConditionalGeneration, BitsAndBytesConfig
from peft import PeftModel
import torch

# 8-bit μ–‘μžν™” μ„€μ •
quantization_config = BitsAndBytesConfig(
    load_in_8bit=True,
    llm_int8_threshold=200.0,
    llm_int8_skip_modules=["lm_head", "vision_tower", "multi_modal_projector"]
)

# Base Model λ‘œλ“œ
base_model_id = "llava-hf/llava-1.5-7b-hf"
base_model = LlavaForConditionalGeneration.from_pretrained(
    base_model_id,
    quantization_config=quantization_config,
    device_map="auto"
)

# νŒŒμΈνŠœλ‹λœ LoRA Adapter λ‘œλ“œ (κ²½κ³  λ°©μ§€ μ˜΅μ…˜ μΆ”κ°€)
adapter_id = "jun47/llava-7b-skin"
model = PeftModel.from_pretrained(base_model, adapter_id, ensure_weight_tying=True)

# Processor λ‘œλ“œ (μ»€μŠ€ν…€ ν…œν”Œλ¦Ώ 보쑴을 μœ„ν•΄ μ–΄λŒ‘ν„° κ²½λ‘œμ—μ„œ λ‘œλ“œ)
processor = AutoProcessor.from_pretrained(adapter_id)

3. ν…μŠ€νŠΈ μΆ”λ‘  및 νŒŒμ‹± (Inference & Parsing)

ν•™μŠ΅ λ°μ΄ν„°μ˜ νŠΉμ„±μ„ μ‚΄λ € μ˜μ–΄ ν”„λ‘¬ν”„νŠΈλ₯Ό μ‚¬μš©ν•΄μ•Ό κ°€μž₯ μ •ν™•ν•œ 진단을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

from PIL import Image
import requests

# ν…ŒμŠ€νŠΈ 이미지 λ‘œλ“œ
image_url = "https://example.com/your_skin_image.jpg"
image = Image.open(requests.get(image_url, stream=True).raw)

# 첫 번째 질문 ν”„λ‘¬ν”„νŠΈ
prompt = "USER: <image>\nWhat skin disease is visible in this image?\nASSISTANT:"
inputs = processor(text=prompt, images=image, return_tensors="pt").to("cuda")

# ν…μŠ€νŠΈ 생성 (λͺ¨λΈμ΄ 전체 λŒ€ν™”λ₯Ό μƒμ„±ν•˜λ„λ‘ λ„‰λ„‰ν•œ 토큰 λΆ€μ—¬)
outputs = model.generate(**inputs, max_new_tokens=200, temperature=0.2, do_sample=True)

input_length = inputs["input_ids"].shape[1]
raw_full_text = processor.decode(outputs[0][input_length:], skip_special_tokens=True)

방법 1: 진단λͺ…λ§Œ κΉ”λ”ν•˜κ²Œ μΆ”μΆœν•˜κΈ°

λͺ¨λΈμ΄ λ‹€μŒ 질문(USER:)을 상상해내기 μ „κΉŒμ§€λ§Œ ν…μŠ€νŠΈλ₯Ό μžλ¦…λ‹ˆλ‹€.

diagnosis = raw_full_text.split("USER:")[0].strip()

print("==== AI 진단 κ²°κ³Ό ====")
print(f"진단λͺ…: {diagnosis}")
# 좜λ ₯ μ˜ˆμ‹œ: Rosacea

방법 2: λͺ¨λΈμ˜ λ©€ν‹°ν„΄ ν•™μŠ΅ νŠΉμ„±μ„ μ—­μ΄μš©ν•˜μ—¬ 진단λͺ… + 상세 μ„€λͺ… ν•œ λ²ˆμ— μΆ”μΆœν•˜κΈ°

λͺ¨λΈμ΄ 슀슀둜 μƒμ„±ν•œ 전체 4ν„΄ λŒ€ν™”(ν™˜κ°) 슀크립트 μ†μ—μ„œ μ •κ·œμ‹ νŒŒμ‹±μ„ 톡해 진단λͺ…κ³Ό μ΅œμ’… μ„€λͺ…을 λͺ¨λ‘ λ‚šμ•„μ±„λŠ” μ΅œμ ν™” λ°©μ‹μž…λ‹ˆλ‹€.

# 1. 진단λͺ… μΆ”μΆœ
diagnosis = raw_full_text.split("USER:")[0].strip()

# 2. 증상 μ„€λͺ… μΆ”μΆœ ('Describe this disease' μ΄ν›„μ˜ λ‹΅λ³€λ§Œ κ°€μ Έμ˜΄)
try:
    description = raw_full_text.split("Describe this disease. ASSISTANT:")[-1].split("USER:")[0].strip()
except Exception:
    description = "상세 μ„€λͺ…을 μΆ”μΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€."

print("==== AI 볡합 진단 κ²°κ³Ό ====")
print(f"진단λͺ…: {diagnosis}")
print(f"상세 μ„€λͺ…: {description}")
Downloads last month
60
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for jun47/llava-7b-skin

Adapter
(153)
this model