카테고리 없음

멀티모달 LLM(Large Multimodal Model)을 이용한 딥페이크 탐지 모델(이미지 분류 모델) 개발 일기

깜포메 2025. 2. 18. 14:22

1. 서론

딥페이크(DeepFake)는 인공지능을 이용해 조작된 이미지나 영상을 생성하는 기술로, 점점 더 정교해지고 있다. 하지만 현재 딥페이크를 탐지하는 대부분의 기술은 머신러닝ㆍ딥러닝 기반으로 이루어져 있어, 전문적인 지식과 복잡한 환경 설정이 필요하기 때문에 접근성이 떨어진다.

 

따라서 탐지 성능은 비교적 떨어지지만, 간편한 접근성과 단서 제공과 의견만을 자연어 형태로 제공하여 최종 판단을 사용자에게 맡기는 LLM 기반의 딥페이크 탐지가 새로운 방법으로 사용될 수 있지 않을까? 하는 마음에 이번 프로젝트를 시작하게 되었다.

 

 

같은 생각을 가진 개발자 분들이 해외에 꽤 계셨고, 선행 연구가 어느정도 진행되어 있었다. 따라서 이번 프로젝트에서는 RAG(Retrieval-Augmented Generation)를 활용한 딥페이크 탐지 모델의 정확도를 향상시키는 것을 목표로 하여 차별점을 두었다. 본 글에서는 먼저 프로젝트의 초기 설계, 데이터 수집 및 처리 과정, 그리고 모델 학습 과정에서의 주요 이슈를 정리한다.


2. 자료 조사

본 프로젝트를 진행하기 전, 관련 연구들을 조사하여 기존 접근법과 한계를 분석하였다.

(1) Can ChatGPT Detect DeepFakes?

  • 멀티모달 LLM을 이용한 딥페이크 탐지 성능을 측정한 연구.
  • 기존 머신러닝 및 딥러닝 기반 탐지 기법은 통계적 특성에 의존하며 전용 프로그램이 필요하다는 단점이 있음.
  • GPT-4 모델은 실제 이미지를 구분하는 것은 다소 약하지만, AI 생성 이미지 탐지 성능은 높은 것으로 평가됨.
  • 프롬프트 전략을 통해 성능 향상 가능성을 논의.
  • 논문 링크

(2) FakeBench

  • 단순한 이진분류 방식의 한계를 지적하며, 모델의 편향성을 분석.
  • FakeBench 데이터셋을 구축하고, NLP 프롬프팅 기법을 활용하여 모델 성능을 벤치마킹.
  • 논문 링크

(3) FFAA: Open-World Face Forgery Analysis

  • GPT 기반의 데이터셋 구축 및 프롬프팅 기법을 활용.
  • Multi-answer Intelligent Decision System (MIDS)를 도입하여 모델의 강건성을 강화.
  • 본 프로젝트는 FFAA와 달리 RAG 기반 정확도 향상을 목표로 한다.
  • https://arxiv.org/pdf/2408.10072

3. 데이터 수집 및 레이블링

(1) 데이터 수집

  • 데이터셋은 OpenRL/DeepFakeFace에서 확보.
  • 다양한 생성 방식 활용:
    • text2img: Stable Diffusion V1.5 사용
    • insight: InsightFace Toolbox 활용
    • inpainting: Stable Diffusion Inpainting 모델 사용
    • wiki: 원본(real) 이미지

(2) 데이터 레이블링

  • 초기에는 Llama 3.2 11B 모델을 이용하여 딥페이크 이미지 분류 시도.
    • 하지만 모델이 딥페이크 단서를 제대로 찾지 못하는 경우가 빈번히 발생.
    • 90B 모델은 정책상 답변을 거부하는 경우가 다수 존재.
  • GPT-4o를 이용한 레이블링 진행
    • 원래 정책상 딥페이크 여부를 판단하는 내용은 답변을 거부함.
    • 하지만 딥페이크 여부를 알려주고, 이유를 설명하게 함으로써 레이블링 작업 수행 가능.
    • 팀원의 레이블링 정보 + Llama 3.2 11B 모델의 출력을 일부 활용하여 few-shot 프롬프트 기법 적용.
    • 비용: 이미지 1개당 약 10원, 580개 기준 약 6,000원 발생.

GitHub를 활용한 이미지 참조 방식 개선

# GitHub API를 사용하여 파일 목록 가져오기
url = f"https://api.github.com/repos/{username}/{repo}/contents/{folder_path}?ref={branch}"
response = requests.get(url)
files = response.json()

# 이미지 URL 생성
image_urls = [
    f"https://raw.githubusercontent.com/{username}/{repo}/{branch}/{folder_path}/{file['name']}"
    for file in files if file["name"].lower().endswith((".jpg", ".jpeg", ".png"))
]

GPT 모델을 활용한 이미지 레이블링

def process_batch(batch, jsonl_file):
    for image_url in batch:
        image_data = requests.get(image_url).content
        image_base64 = base64.b64encode(image_data).decode("utf-8")
        image_data_url = f"data:image/jpeg;base64,{image_base64}"

        response = client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": system_message},
                {"role": "user", "content": [
                    {"type": "text", "text": prompt_text},
                    {"type": "image_url", "image_url": {"url": image_data_url}},
                ]},
            ],
        )

4. 모델 학습 및 파인튜닝

LLM 모델들은 모두 범용적인 목적을 가지고 설계되었으므로, 딥페이크 탐지와 같이 특정 작업을 수행하기 위해서는 튜닝해주는 것이 필요하다. 이번 프로젝트에서는 파인 튜닝 기법 중 가장 대중적인 Instruction-tuning(지시 학습)을 이용하여 모델을 튜닝하여 전체적인 딥페이크 탐지 성능을 향상하고자 했다.

(1) 초기 모델 설정 및  한계

  • 프로젝트 진행 초기 가장 최신 모델인 Llama 3.2 11B Vision 모델로 진행 계획.
  • 기존 unsloth 라이브러리는 Llama 3.2 11B Vision 모델을 지원하지 않음.
  • 이미지와 텍스트 데이터를 함께 활용하는 파인튜닝 자료 부족.
  • JSON 데이터 변환 및 모델 학습에 맞는 포맷 적용 필요.

(2) Few-shot 프롬프트 적용

# JSON 데이터 로드
with open("/workspace/output_data.jsonl", "r") as f:
    labeled_data = [json.loads(line) for line in f]

# Few-shot 프롬프트 생성
train_data = Dataset.from_dict({
    "text": [create_few_shot_prompt([item]) for item in labeled_data]
})

(3) 스페셜 토큰 추가

# 특수 토큰 추가
special_tokens = {
    "additional_special_tokens": [
        "<|begin_of_text|>", "<|start_header_id|>", "<|end_header_id|>", "<|eot_id|>", "<|image|>"
    ]
}

# 토크나이저 업데이트
num_added_tokens = tokenizer.add_special_tokens(special_tokens)
model.resize_token_embeddings(len(tokenizer))

# 저장
tokenizer.save_pretrained("path_to_model_directory")

 

(4) QLoRA 4비트 양자화, Peft 등의 최적화 기법 적용

# 모델 설정
base_model = "meta-llama/Llama-3.2-11B-Vision-Instruct"
fine_tuning_model_name = f'{base_model}-finetuned-deepfakes'
quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=False,
)
# LoRA 구성
peft_params = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
;    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"]
)
model = get_peft_model(model, peft_params)

 

파인튜닝을 하는 과정에서, 이미지와 텍스트를 모두 처리하는 모델을 튜닝해보는 것이 처음이었기에 많은 시행착오들이 있었다. 예를 들어 기존 텍스트 모델의 튜닝은 텍스트 가중치만 병합해주면 되는 간단한 과정이었지만, 멀티모달의 경우 이미지와 텍스트 가중치를 각각 병합하는 방법을 몰라 꽤 많은 시간을 투자하였다.

 


5. 결론 및 향후 계획

  • GPT-4o 기반의 레이블링이 기존 Llama 3.2 11B 대비 정확도가 높았음.
  • GitHub 활용으로 이미지 참조 및 레이블링 자동화 가능.
  • Few-shot 프롬프트 및 스페셜 토큰을 적용하여 학습 안정성 확보.
  • 24.10월 당시 멀티모달 파인튜닝 자료가 부족하여 고전하였음. 향후 튜닝 모델 변경 고려.
  • 모델 성능 평가 및 RAG 적용 실험 진행 예정.