24년 11월을 기준으로 작성되었습니다
https://github.com/AbstractTeen/AntiForgery
1. 간단한 논문 정리
연구 배경 및 문제점
- DeepFake는 개인의 프라이버시와 정치적 안보에 실질적인 위협이 되고 있음
- 기존의 수동적 DeepFake 탐지 방식은 사후 대응에 불과하며, 허위정보 확산을 사전에 막지 못함
- 현재의 능동적 방어 기술들은 적대적 노이즈를 추가하는 방식이나, 이미지 재구성 등으로 쉽게 우회가 가능함
핵심 아이디어
- Lab 색공간에서 지각적으로 자연스러운 교란을 생성하여 DeepFake 생성을 방해
- 기존 RGB 색공간 기반의 희소한 노이즈와 달리, 연속적이고 자연스러운 방식으로 교란을 생성
주요 특징
1. 시각적 자연스러움 유지
2. 입력 변환(재구성 등)에 대한 강건성
3. 다양한 DeepFake 유형에 대한 일반화 가능성
실험 결과
- 세 가지 유형의 DeepFake(속성 편집, 신원 교체, 얼굴 재연출)에 대해 효과적
- 기존 방식들과 비교했을 때 경쟁력 있는 성능 달성
- 특히 이미지 재구성 공격에 대한 강건성 입증
프로젝트 의의
1. 지각적 적대적 공격에 대한 새로운 연구 방향 제시
2. DeepFake 방어를 위한 실용적이고 강건한 해결책 제공
3. 소스 코드 공개를 통한 후속 연구 촉진
특히 DeepFake 방어 분야에서 수동적 탐지에서 능동적 방어로의 패러다임 전환을 시도했다는 점에서 큰 의의가 있다고 볼 수 있다.
2. utils.py 분석
주요 기능
이 파일은 AntiForgery 프로젝트의 유틸리티 함수들을 포함하고 있으며,
주로 이미지 처리와 적대적 공격을 위한 도구들을 제공한다.
핵심 함수들
1. 모델 관리 함수
- `load_model_weights()`: 사전 학습된 모델 가중치를 로드하며, 'preprocessing' 키를 제외한 가중치만 선택적으로 로드한다.
2. 이미지 정규화 함수
- `denorm()`: [-1, 1] 범위의 값을 [0, 1] 범위로 변환
- `rgb2lab()`, `lab2rgb()`: RGB와 LAB 색공간 간의 변환 (color_space.py에서 임포트)
3. 레이블 처리 함수
- `label2onehot()`: 레이블 인덱스를 원-핫 벡터로 변환
- `create_labels()`: CelebA나 RaFD 데이터셋에 대한 타겟 도메인 레이블 생성
4. 이미지 변환/비교 함수
- `random_transform()`: 무작위 이미지 변환(회전, 뒤집기, 자르기 등) 적용
- `compare()`: 두 이미지 간의 SSIM과 PSNR 계산
5. 적대적 공격 함수
- `lab_attack()`: LAB 색공간에서 적대적 공격을 수행하는 핵심 함수
lab_attack 함수 상세 분석
def lab_attack(X_nat, c_trg, model, epsilon=0.05, iter=100):
주요 매개변수
- X_nat: 원본 이미지
- c_trg: 타겟 조건
- model: 대상 모델
- epsilon: 교란의 최대 크기
- iter: 반복 횟수
동작 과정
1. LAB 색공간에서 a와 b 채널에 대한 교란 초기화
2. Adam 옵티마이저를 사용하여 교란 최적화
3. 반복적으로 다음 과정 수행:
- RGB → LAB 변환
- 교란 적용
- LAB → RGB 변환
- 모델 예측 및 손실 계산
- 역전파를 통한 교란 업데이트
이 함수는 논문에서 제안한 "perceptual-aware perturbations" 생성의 핵심 구현부라고 볼 수 있다.
3. color_space.py 분석
주요 기능
이 파일은 RGB와 Lab 색공간 간의 변환을 위한 핵심 함수들을 구현하고 있다.
색공간 변환은 RGB → XYZ → Lab 또는 그 반대 순서로 이루어진다.
색공간 변환 함수들
1) RGB ↔ XYZ 변환
def rgb2xyz(rgb):
- RGB 값을 [0,1] 범위에서 XYZ 색공간으로 변환
- sRGB 감마 보정을 적용 (임계값 0.04045 기준)
- 변환 행렬을 사용하여 선형 변환 수행
def xyz2rgb(xyz):
- XYZ 색공간에서 RGB로 역변환
- 음수 값을 0으로 클리핑
- sRGB 역감마 보정 적용 (임계값 0.0031308 기준)
2) XYZ ↔ Lab 변환
def xyz2lab(xyz):
- XYZ를 Lab 색공간으로 변환
- D65 표준 광원 사용 (0.95047, 1.0, 1.08883)
- 비선형 변환과 스케일링 적용
def lab2xyz(lab):
- Lab에서 XYZ로 역변환
- 음수 값 처리를 위한 클리핑 포함
- D65 표준 광원으로 스케일링
3) RGB ↔ Lab 직접 변환
def rgb2lab(rgb):
- RGB를 Lab으로 변환하는 편의 함수
- L 채널을 [-50,50] 범위로, ab 채널을 [-110,110] 범위로 정규화
def lab2rgb(lab_rs):
- 정규화된 Lab 값을 RGB로 역변환하는 편의 함수
- L 채널을 [0,100], ab 채널을 [-110,110] 범위로 복원
구현 특징
1. PyTorch 텐서 연산 사용으로 GPU 가속 지원
2. 배치 처리 지원 (B x C x H x W 형태의 텐서 처리)
3. 수치적 안정성을 위한 마스킹과 클리핑 처리
4. D65 표준 광원 기준의 정확한 색공간 변환 구현
이 구현은 AntiForgery 프로젝트에서 Lab 색공간에서의 적대적 공격을 수행하기 위한 핵심 기반을 제공한다.
4. data_loader.py 분석
주요 구성
이 파일은 CelebA 데이터셋을 로딩하고 처리하기 위한 데이터 로더를 구현하고 있다.
CelebA 클래스
class CelebA(data.Dataset):
이 클래스는 PyTorch의 Dataset 클래스를 상속받아 CelebA 데이터셋을 처리한다.
주요 메서드들
1. 초기화 메서드
def __init__(self, image_dir, attr_path, selected_attrs, transform, mode):
- image_dir: 이미지 디렉토리 경로
- attr_path: 속성 파일 경로
- selected_attrs: 선택된 속성들의 리스트
- transform: 이미지 변환을 위한 함수들
- mode: 'train' 또는 'test' 모드 지정
2. 전처리 메서드
def preprocess(self):
- 속성 파일을 읽어서 속성 이름과 인덱스 매핑 생성
- 데이터셋을 train/test로 분할 (처음 2000개는 테스트용)
- 랜덤 시드 1234로 고정하여 재현성 보장
3. 데이터 접근 메서드
def __getitem__(self, index):
- 인덱스에 해당하는 이미지와 레이블 반환
- 이미지는 PIL Image로 로드 후 transform 적용
- 레이블은 FloatTensor로 변환
데이터 로더 함수
def get_loader(image_dir, attr_path, selected_attrs, crop_size=178, image_size=256,
batch_size=1, dataset='CelebA', mode='test', num_workers=0):
이미지 변환 파이프라인
1. 학습 모드일 경우 랜덤 수평 뒤집기
2. 중앙 크롭 (crop_size)
3. 이미지 크기 조정 (image_size)
4. 텐서 변환
5. 정규화 (mean=0.5, std=0.5)
데이터 로더 설정
- 배치 크기 지정
- 학습 모드일 경우 셔플 활성화
- 멀티프로세싱을 위한 worker 수 지정
이 구현은 DeepFake 방지를 위한 이미지 데이터셋을 효율적으로 로드하고 전처리하는 기능을 제공한다.
5. model.py 분석
주요 구성요소
이 파일은 GAN(Generative Adversarial Network) 구조를 구현하며, 다음과 같은 주요 클래스들로 구성되어 있다.
1. ResidualBlock 클래스
class ResidualBlock(nn.Module):
- 잔차 연결(residual connection)을 포함한 기본 블록
- Instance Normalization과 ReLU 활성화 함수 사용
- 3x3 컨볼루션 레이어 2개로 구성
2. Generator 클래스
class Generator(nn.Module):
- U-Net 형태의 생성자 네트워크
- 구조:
- 입력 레이어 (7x7 컨볼루션)
- 다운샘플링 레이어 (2회)
- 병목 레이어 (ResidualBlock 반복)
- 업샘플링 레이어 (2회)
- 출력 레이어 (Tanh 활성화)
- 조건부 생성을 위한 도메인 정보 연결 기능
3. Discriminator 클래스
class Discriminator(nn.Module):
- PatchGAN 구조의 판별자 네트워크
- 특징:
- 점진적으로 증가하는 채널 수
- LeakyReLU 활성화 함수
- 소스 판별(out_src)과 클래스 분류(out_cls) 동시 수행
4. AvgBlurGenerator 클래스
class AvgBlurGenerator(nn.Module):
- Generator를 확장한 클래스
- 전처리 레이어를 추가하여 블러 효과 적용
- 기본 Generator와 동일한 구조를 공유
주요 특징
1. 정규화 기법
- Instance Normalization 사용 (배치가 아닌 개별 이미지 정규화)
- affine=True로 설정하여 학습 가능한 파라미터 포함
2. 조건부 생성
- 도메인 정보(c)를 입력 이미지와 결합하여 조건부 생성 구현
- 공간적 복제를 통한 도메인 정보 확장
3. 특징 맵 추출
- Generator의 중간 레이어 특징 맵 추출 기능
- 디버깅 및 분석을 위한 기능으로 추정
4. 블러 처리
def avg_smoothing_filter(channels, kernel_size):
- 평균 스무딩 필터 구현
- 적대적 공격에 대한 방어 메커니즘으로 추정
이 구현은 DeepFake 방지를 위한 적대적 학습에 초점을 맞추고 있으며,
특히 생성자 네트워크에서 중간 특징 맵의 추출과 블러 처리 기능이 중요한 역할을 하는 것으로 보인다.
5. main.py 분석
주요 기능
이 파일은 AntiForgery 프로젝트의 메인 실행 파일로, StarGAN을 이용한 DeepFake 방지 실험을 실행하는 코드
구조 분석
1. 설정 및 초기화
def main():
parser = argparse.ArgumentParser()
- 모델 설정 (G/D 구조, 이미지 크기 등)
- 데이터 설정 (배치 크기, 속성 등)
- 경로 설정 (이미지, 모델, 결과 디렉토리)
주요 매개변수
- c_dim: 도메인 레이블 차원 (기본값: 5)
- image_size: 이미지 해상도 (256x256)
- attack_iters: 적대적 공격 반복 횟수 (100)
- selected_attrs: CelebA 데이터셋의 선택된 속성들
2. 모델 초기화
G = Generator(config.g_conv_dim, config.c_dim, config.g_repeat_num)
D = Discriminator(config.image_size, config.d_conv_dim, config.c_dim, config.d_repeat_num)
- Generator와 Discriminator 모델 생성
- 사전 학습된 가중치 로드
3. 실험 루프
for i, (x_real, c_org) in enumerate(celeba_loader):
주요 처리 단계:
1. 입력 이미지 준비
2. Lab 색공간에서 적대적 공격 수행
3. 원본과 변조된 이미지에 대한 StarGAN 변환 수행
4. 메트릭 계산 (L2 오차, SSIM, PSNR)
4. 결과 저장 및 평가
x_concat = torch.cat(x_fake_list, dim=3)
save_image(denorm(x_concat.data.cpu()), result_path, nrow=1, padding=0)
- 결과 이미지 저장
- 평가 메트릭 출력:
- L2 오차
- SSIM (구조적 유사도)
- PSNR (최대 신호 대 잡음비)
- 왜곡된 이미지 비율
주요 특징
1. 실험 설정
- 배치 크기 1로 설정하여 이미지별 처리
- 첫 50개 이미지에 대해서만 실험 수행
- GPU 가속 사용
2. 평가 방식
- 원본 DeepFake와 방어된 결과 비교
- 다양한 품질 메트릭 사용
- 왜곡 임계값 0.05 사용
3. 결과 시각화
- 원본, 변조된 입력, 각각의 DeepFake 결과를 하나의 이미지로 연결
- 순차적 저장으로 비교 용이
이 구현은 논문에서 제안한 방법의 효과를 검증하기 위한 테스트 프레임워크를 제공한다.