PAYATHON 2026

Python 初学者如何在一个月内实现基于元数据的 deepfake 检测 MVP?

AI 小顾

可以尝试在不到一个月内完成一个范围受控的 MVP,交付目标是提取元数据、展示可疑线索并说明局限。仅凭元数据通常无法可靠判断文件是否为 deepfake,项目也不能保证课程成绩。应尽早将项目范围与课程评分要求对齐。

先明确元数据能说明什么

开发时间短,你还在学习 Python。如果同时处理图片和视频、训练检测模型并开发完整网站,项目很容易失控。

建议先选择一种媒体类型,例如图片,只分析单个文件。可以用 ExifTool 提取文件元数据,再用 Python 调用工具、整理字段并生成报告。

分析结果要区分以下情况:

  • 出现编辑软件字段:说明文件记录了相关软件信息,不能据此认定内容经过深度伪造。
  • 缺少拍摄设备或时间字段:可能与文件格式、导出方式或平台处理有关,不能直接认定为伪造。
  • 元数据看起来完整:同样不能证明内容真实,因为元数据可以被修改或复制。

结果页可以显示“发现编辑软件记录”“未发现选定字段”或“无法仅凭元数据判断”,避免直接输出“真实”“伪造”或没有依据的置信度百分比。

把 MVP 收敛到一个完整流程

第一版让用户提供一个本地文件,再完成以下步骤:

  1. 检查文件是否存在。
  2. 调用 ExifTool 提取元数据。
  3. 展示选定字段及其原始值。
  4. 输出说明和 JSON 报告。

先做命令行程序,等提取和报告功能稳定后,再决定是否增加简单界面。一开始不要投入账号系统、批量上传或部署。

用 Python 调用 ExifTool

下面的示例假设你已单独安装 ExifTool,并且能在终端执行 exiftool -ver。ExifTool 是外部程序,安装同名或相关的 Python 包不一定会提供这个命令。

import json
import subprocess
import sys
from pathlib import Path


def inspect_metadata(filename):
    path = Path(filename).expanduser().resolve()
    if not path.is_file():
        raise ValueError("文件不存在或不是普通文件")

    result = subprocess.run(
        ["exiftool", "-j", "-G1", str(path)],
        capture_output=True,
        text=True,
        encoding="utf-8",
        errors="replace",
        timeout=15,
        check=False,
    )
    if result.returncode != 0:
        raise RuntimeError(result.stderr.strip() or "ExifTool 执行失败")

    records = json.loads(result.stdout)
    if not records or not isinstance(records[0], dict):
        raise ValueError("未获得有效的元数据结果")
    metadata = records[0]

    errors = [
        value for key, value in metadata.items()
        if key.rsplit(":", 1)[-1] == "Error"
    ]
    if errors:
        raise ValueError(f"读取失败:{errors}")

    selected_names = {
        "Make", "Model", "DateTimeOriginal", "Software", "CreatorTool"
    }
    selected = {
        key: value for key, value in metadata.items()
        if key.rsplit(":", 1)[-1] in selected_names
    }

    return {
        "file": path.name,
        "selected_fields": selected,
        "metadata": metadata,
        "assessment": "已完成元数据提取,无法仅凭这些字段判断是否为 deepfake。",
    }


if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.exit("用法:python metadata_check.py <文件路径>")
    try:
        report = inspect_metadata(sys.argv[1])
        print(json.dumps(report, ensure_ascii=False, indent=2))
    except (OSError, ValueError, RuntimeError, subprocess.TimeoutExpired) as exc:
        sys.exit(f"分析失败:{exc}")

运行示例:

python metadata_check.py sample.jpg

-j 让 ExifTool 输出 JSON,-G1 为字段加上分组信息,便于区分不同位置的同名字段。示例保留了全部读取结果,同时筛选几个便于展示的字段。不同格式包含的字段不同,筛选结果为空时也需要正常处理。

这段代码完成了元数据提取和报告骨架,没有实现经过验证的 deepfake 分类器。后续增加规则时,每条提示都应包含触发它的字段、原始值和解释,方便检查判断依据。

用样本验证功能和局限

准备一批来源和处理过程已知、允许用于项目的文件。如果能取得来源可靠的 deepfake 样本,可以纳入评估。普通裁剪、调色或重新保存的图片应单独标记,不能直接当作 deepfake。

对同一文件保留原始版本、重新导出版本和移除元数据的版本,比较报告变化。通过比较,可以检查工具能否正常读取文件、选定字段是否按预期出现,以及元数据变化是否容易造成误导。

如果课程要求报告检测效果,需要另外明确标签定义和判定规则,并使用未参与规则制定的样本评估。元数据读取成功率与 deepfake 检测准确率是不同指标,不能互相替代。没有足够可靠的标签时,应如实展示功能结果和案例分析。

按不到一个月安排开发

  • 第 1 至 3 天:确认课程是否接受基于规则的元数据分析,选定一种媒体类型,收集少量样本。
  • 第 4 至 10 天:完成命令行提取、异常处理和 JSON 报告。
  • 第 11 至 17 天:整理字段解释,补充样本对比;核心流程稳定后再添加界面。
  • 第 18 至 24 天:检查不同文件和错误输入,整理评估结果、局限及演示材料。
  • 剩余时间:修复问题并准备答辩,避免继续扩展功能。

如果课程明确要求实现 deepfake 二分类,单独提取元数据可能不足以满足要求,需要尽早调整范围。项目报告应写清楚已经实现的能力、样本支持的发现和仍无法判断的情况。

备注:内容仅供参考。