Deepfake Detection
Phát hiện Deepfake
Bạn nhận video call Zalo từ người thân xin chuyển tiền gấp. Video trông thật. Làm sao biết có phải deepfake?
Chọn một trong 4 khuôn mặt. Mỗi khuôn mặt sẽ trả về hồ sơ đầy đủ: tín hiệu sinh học, vân tay tần số, và xác suất detector.
Hình minh họa
Detector output — Khuôn mặt A
Ground truth: REALDetector trả về xác suất fake = 8%. Ngưỡng quyết định thường là 0.5 (tùy use-case có thể điều chỉnh để ưu tiên precision hoặc recall).
Tín hiệu sinh trắc và vân tay
Người thật: 12-20 lần/phút
Đọc từ thay đổi màu da
2 mắt phản chiếu giống
Ảnh thật: 5-20%
Người thật: 55-70%
Người thật có micro-movement
Ảnh chụp từ camera DSLR, có EXIF gốc. rPPG phát hiện nhịp tim 74 bpm từ thay đổi màu da vùng trán.
Manh mối pháp y (4):
- ›Có lỗ chân lông tự nhiên, phân bố ngẫu nhiên
- ›Hai mắt phản chiếu CÙNG nguồn sáng (cửa sổ bên trái)
- ›Phổ tần số: dốc 1/f tự nhiên, không có đỉnh lạ
- ›Bóng mũi khớp với hướng ánh sáng từ trên-trái
Detector huấn luyện trên deepfake tạo bởi StyleGAN. Khi gặp deepfake tạo bởi Stable Diffusion, kết quả sẽ thế nào?
Một video call nghi ngờ là deepfake. Bạn muốn dùng ACTIVE CHALLENGE nhanh trong vòng 5 giây. Cách nào tốt nhất?
Giải thích
Deepfake Detection là các phương pháp phát hiện nội dung ảnh/video giả mạo tạo bởi AI (GAN, Diffusion). Để phòng chống toàn diện, detection thường kết hợp với AI watermarking và content provenance (C2PA) để xác minh nguồn gốc nội dung ngay từ khâu sinh. Detection truyền thống có yếu điểm căn bản: luôn đi sau generator một bước.
1. Phân tích sinh trắc: Kiểm tra blink rate, lip-sync, eye-reflection, rPPG pulse. Dễ hiểu nhưng deepfake mới đã vượt qua nhiều tiêu chí.
2. Phân tích tần số (Fourier): Deepfake để lại "vân tay" trong phổ tần số cao. Mỗi kiến trúc (GAN, Diffusion) có vân tay riêng — nhưng tái train generator có thể xóa được.
3. Neural detector: CNN/ViT (XceptionNet, EfficientNet, ConvNeXt) train trên tập ảnh thật + giả. Accuracy ~95% trên tập in-domain nhưng tụt mạnh trên deepfake mới.
4. Temporal analysis (video): Kiểm tra nhất quán giữa frames — flickering, jitter, micro-movements không tự nhiên. Dùng 3D-CNN hoặc TimeSformer.
5. Provenance / watermark: Không phát hiện artifact — chứng nhận nguồn gốc bằng chữ ký số. C2PA, SynthID. Đây là hướng bền vững nhất.
Công thức phân tích tần số — deepfake có energy bất thường ở high frequency:
là Fourier transform của ảnh, là ngưỡng tần số (thường 0.5 * Nyquist). Ảnh thật tuân theo phổ : năng lượng giảm dần khi tần số tăng. Deepfake có bump bất thường do upsampling layers (deconvolution artifact).
Kiến trúc detector CNN cơ bản (face-forensics):
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms, models
from PIL import Image
class DeepfakeDetector(nn.Module):
"""
Kiến trúc detector 2 nhánh:
- Nhánh 1: EfficientNet-B4 đọc ảnh RGB gốc
- Nhánh 2: CNN đọc phổ FFT (high-freq features)
- Fusion: concat + FC head
"""
def __init__(self, num_classes: int = 2):
super().__init__()
# Nhánh RGB
backbone = models.efficientnet_b4(weights=None)
backbone.classifier = nn.Identity()
self.rgb_branch = backbone
self.rgb_dim = 1792
# Nhánh tần số
self.freq_branch = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
)
self.freq_dim = 128
# Fusion head
self.head = nn.Sequential(
nn.Linear(self.rgb_dim + self.freq_dim, 512),
nn.ReLU(inplace=True),
nn.Dropout(0.3),
nn.Linear(512, num_classes),
)
@staticmethod
def compute_spectrum(x: torch.Tensor) -> torch.Tensor:
"""x: [B, 3, H, W] -> log-magnitude spectrum [B, 1, H, W]."""
gray = x.mean(dim=1, keepdim=True)
fft = torch.fft.fft2(gray, norm="ortho")
mag = torch.abs(torch.fft.fftshift(fft, dim=(-2, -1)))
return torch.log1p(mag)
def forward(self, x: torch.Tensor) -> torch.Tensor:
rgb_feat = self.rgb_branch(x)
spectrum = self.compute_spectrum(x)
freq_feat = self.freq_branch(spectrum)
fused = torch.cat([rgb_feat, freq_feat], dim=1)
return self.head(fused)
# ============== Inference pipeline ==============
def predict_deepfake(model, image_path: str, device: str = "cuda"):
transform = transforms.Compose([
transforms.Resize((380, 380)),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225],
),
])
img = Image.open(image_path).convert("RGB")
x = transform(img).unsqueeze(0).to(device)
model.eval()
with torch.no_grad():
logits = model(x)
probs = F.softmax(logits, dim=-1)
p_fake = probs[0, 1].item()
if p_fake > 0.5:
print(f"[CẢNH BÁO] Deepfake — confidence {p_fake:.1%}")
print("Không nên tin tưởng. Xác minh qua kênh khác.")
else:
print(f"[OK] Có vẻ thật — confidence {1 - p_fake:.1%}")
print("Vẫn nên xác minh nếu có yêu cầu tài chính/pháp lý.")
return p_fake
if __name__ == "__main__":
model = DeepfakeDetector(num_classes=2)
model.load_state_dict(torch.load("checkpoints/detector_ff++_cdf.pth"))
model.to("cuda")
predict_deepfake(model, "evidence/zalo_call_frame_001.jpg")Zalo video call: Kẻ lừa đảo dùng deepfake giả khuôn mặt người thân, gọi Zalo xin chuyển tiền gấp. Hàng nghìn vụ/năm, thiệt hại trung bình 50-500 triệu mỗi vụ.
Giả mạo KOL/diễn viên: Deepfake giả MC/diễn viên quảng cáo sản phẩm lừa đảo trên Facebook/TikTok. Đã có các vụ giả MC Lại Văn Sâm, NSƯT Lê Khanh.
Phòng tránh: (1) Gọi lại qua số quen/Zalo chính chủ, (2) Hỏi câu bí mật gia đình, (3) Active challenge (đưa tay che mặt, nhấn mũi), (4) KHÔNG chuyển tiền trong cùng cuộc gọi — hẹn 10 phút sau, (5) Báo công an 113 nếu nghi ngờ.
Liên quan: khi generator cũng học từ detector feedback (adversarial examples), detector phải được train với adversarial training để không bị qua mặt bằng perturbation nhỏ.
Hình minh họa
Từ 2017 đến 2025: ai đang thắng?
Mỗi khi detector đạt ~99% trên tập hiện có, generator mới ra đời và kéo accuracy xuống ~60%. Đây là ví dụ điển hình của arms race trong AI safety.
Sau 8 năm, detector accuracy giảm từ 99% xuống 55% trên mỗi thế hệ generator mới. Không có detector nào "giải quyết" được deepfake mãi mãi. Giải pháp bền vững phải là:
- Provenance-first: C2PA chữ ký số vào mọi ảnh/video từ camera + AI — verify bằng public key
- Watermark bắt buộc: Mỗi AI generator phải nhúng watermark không xóa được (SynthID của Google)
- Social verification: Xác minh qua kênh khác là cuối cùng — không thay thế được
Bước 1 — Đóng băng cảm xúc (3 giây): Lừa đảo luôn tạo áp lực khẩn cấp. Dừng, hít thở, không hành động ngay.
Bước 2 — Active challenge (10 giây): "Bố ơi," con muốn xem rõ mặt bố, bố đưa tay lên má trái rồi nói "chào con" nhé. Deepfake yếu ở occlusion + biến dạng da.
Bước 3 — Câu hỏi bí mật (30 giây): Chọn câu mà chỉ người thật biết và khó tra cứu: "Năm lớp 8, con bị gì ở tay trái?" — câu có thông tin rất riêng tư.
Bước 4 — Gọi lại qua kênh khác (2 phút): Cúp máy, gọi lại qua số đã lưu trong danh bạ. KHÔNG dùng số người gọi đến. Nếu không liên lạc được, gọi người thân khác xác nhận.
Bước 5 — Nếu đã chuyển tiền: Báo ngân hàng khóa giao dịch trong 24h, báo công an 113, giữ lại mọi tin nhắn/lịch sử cuộc gọi làm chứng cứ.
- 5 nhóm dấu hiệu: sinh trắc (blink, rPPG), tần số (FFT fingerprint), neural (CNN/ViT), temporal (video), provenance (C2PA).
- Deepfake để lại 'vân tay' trong phổ Fourier — StyleGAN khác Diffusion khác Sora. Detector phải train đa dạng.
- Generalization gap là yếu điểm lớn nhất: detector train loại A thường fail trên loại B mới.
- rPPG đo nhịp tim từ thay đổi màu da — deepfake không có pulse signal nhất quán, khó giả.
- Arms race: từ 2017 đến 2025, detector accuracy rớt từ 99% xuống 55% mỗi thế hệ. Provenance/watermark là hướng bền vững.
- Tại VN: Zalo lừa đảo video call → playbook 5 bước: đóng băng, active challenge, câu hỏi bí mật, gọi lại kênh khác, báo 113 nếu cần.
Kiểm tra hiểu biết
Bạn nhận video call Zalo từ 'bố' xin chuyển 50 triệu gấp. Dấu hiệu nào ĐỂ NGHI là deepfake?