Detect Face PS Effect

Reference

Configure Environment

  1. Install PyTorch
    1. Install Anaconda.
    2. Install CUDA, if your machine has a CUDA-enabled GPU. (GPU的TyTorch做实验的时候有问题,所以我跳过,只用CPU的PyTorch做实验了)
    3. Install PyTorch
      # select: Stable(1.8.1), Windows, Conda, Python, CUDA None
      # open an Anaconda prompt via Start | Anaconda3 | Anaconda Prompt
      $conda update -n base -c defaults conda # update conda
      $conda create -n pytorch python=3.6
      $conda activate pytorch
      # 因为GPU的PyTorch出问题,所以跳过 $conda install pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=9.0 -c pytorch # 下载很慢 # CUDA 9.0
      $conda install pytorch torchvision torchaudio cpuonly -c pytorch
    4. To ensure that PyTorch was installed correctly
      $python
      # import torch
      # x = torch.rand(5, 3)
      # print(x)
    5. To check if your GPU driver and CUDA is enabled and accessible by PyTorch
      $python
      # import torch
      # torch.cuda.is_available()
  2. Install packages
    1. 一键安装
      $conda activate pytorch
      $pip install -r requirements.txt
    2. 安装dlib
  3. Download model weights
    1. Download 64-bit ZIP of Wget for Windows (wget-1.21.1-1-win64.zip).
      1. 解压缩,并存放至硬盘合适的目录 (C:/Path/wget/)
      2. 配置环境变量: 系统属性 -> 高级系统设置 -> 高级 -> 环境变量 -> Path -> 编辑 -> 浏览 -> 选择存放 wget 程序文件的位置 -> 一路点击确定
      3. 查看是否应用成功: $wget -V
    2. Download model weights
      # 在根目录下打开Git命令行
      $bash weights/download_weights.sh # 大概2分钟
  4. Download validation dataset for evaluation which consisting of 500 original and 500 modified images.
    1. original folder: original faces
    2. modified folder: modified faces
    3. reference folder: the same faces in the modified folder, but those are before modification (original)

Run Program

Run Example

  1. Global classifer

    $python global_classifier.py --input_path examples/modified.jpg --model_path weights/global.pth
    # Probibility being modified by Photoshop FAL: 98.00%
  2. Local classifer

    $python local_detector.py --input_path examples/modified.jpg --model_path weights/local.pth --dest_folder out/

evaluate the dataset

# Run evaluation script. Model weights need to be downloaded.
$python eval.py --dataroot data --global_pth weights/global.pth --local_pth weights/local.pth --gpu_id 0
Accuracy AP PSNR Increase
93.9% 98.9% +2.66

Project Analysis

advantage

  1. 里面吸引我注意的是“自动生成脸上各种部位被拉伸过的假图”,这个东西可用用来做数据增强(data arguementation)。对于带有语义标签的图片,用这个能多出很多数据来,可能会像random crop一样好用。
    • 里面的“瘦脸”操作,类似于PS的“液化”可以用来做图片增强。以前的crop操作,是全图进行放大/缩小,现在用“瘦脸/液化”操作,就能放大/缩小图中的某几个目标。既能得到更多的图片,又不需要丢弃/填充边缘的某些像素。缺点是容易造成目标的扭曲。
  2. 利用光流场?还真是个好主意!思路新颖。
  3. 让我想到了国产动画《超级肥皂》,制毒剂和解毒剂都来自同一个商家,营销学的典范hhh(滑稽),以子之矛陷子之盾,何如?左右手互搏玩得真溜。技术发展,向可回退可延伸方向发展。

weakness

  1. 项目需要原始图片,文章中也提到了需要原图,都有原图了,谈何还原?如果有原图,就不需要机器说P了哪里吧?人眼就可以看出。如果人眼无法看出的,那PS在美颜的场景下的作用也就不存在了。猜测这个项目要有未经过ps的图训练。
  2. 这个训练方法只能针对特定的优化算法去还原,在此项目背景下特定为PS中的“图片液化方法”,所以它只能检测图片的拉伸和扭曲。不同人使用的美颜软件、P图软件以及方式和效果都不同,不能够泛化,需要所有这些软件、P图方式和效果的先验知识才行。
    • 例如,对于如果把图片P成黑白的P图方式和效果,无法还原为原来的颜色,现在AI的技术也只是利用GAN去猜测并合成的颜色,并不知道真实的颜色是什么样的。同样,对于图片全涂白,也无法还原,因为整个光流场改变或者说是“消失”,模型失去了推理条件。
    • 所以这个技术就针对液化有效,毕竟液化是改变了原有光照的位置,光照射在同一材质的连续曲面上,衰减或增强也应该是连续的,分析光在曲面上的强弱差异可能会有一些效果。
      破坏这个“光场”的方法估计不少。国内的美颜效果比如磨皮之类的,应该还没法还原,因为改变了整个光流场。
    • “然后,在真图和假图之间,计算出一个光流场 (Optical Flow Field) 。”—-引用自原文。光流法是cv常用的算法,用于计算两帧图像间的差异,并不是(也不能)用来检测图像是否被PS过(也不是用来检测图像是否是真实图像)。文章说了光流场变化了,明显就和真实图片的分布有了差距,在这上面训的,怎么泛化到真实数据集。
    • “训练完成之后,给网络输入一张假图,它便能自己预测光流场” —-引用自原文。用光流法进行数据标记,训练得到的网络可以预测“光流场”发生的变化。用这种方法进行训练,是有问题的。当你输入一张真实图片,那么这个网络也会用输出一个光流场。Adobe之前也出过卸妆的网络,输入化妆图片,输出素颜。但是输入素颜图片,它也能输出素颜的“卸妆”图来。请注意,这一次的研究没有和以前一样把代码开源到github上。
  3. 项目不能在Windows平台上运行,只能在Unix平台上运行。
  4. 最后,项目只开源了测试的部分,并没有开源训练数据集的部分,所以也不知道它训练使用的数据集处理方法和训练的方法,只能验证此项目,没办法扩展。

knowledge

  1. PS的真正原理:
    • 默认导入图片就自动上传服务器,并形成链接关系,任你如何PS都逃不过原图,简单粗暴。
    • 基于图像分析不可能“一秒还原”,况且真实的人的相貌就是各种各样的,怎么判断哪里是假的哪里是正常的?所以我认为ps还是有后门的,所谓的快速还原只是标记了曾经修改过的特征,然后“还原”的时候把以前隐藏起来的原始特征重现。
  2. 一秒你知道是什么概念么:
    • FLOPS,即每秒浮点运算次数(亦称每秒峰值速度 Floating-point operations per second)被用来评估电脑效能,尤其是在使用到大量浮点运算的科学计算领域中。每秒浮点运算次数所量测的实际上就是浮点运算器的执行速度。
      一个MFLOPS(megaFLOPS)= 每秒一百万(=10^6)次的浮点运算
      一个GFLOPS(gigaFLOPS)= 每秒十亿(=10^9)次的浮点运算
      一个TFLOPS(teraFLOPS)= 每秒一万亿(=10^12)次的浮点运算
      一个PFLOPS(petaFLOPS)= 每秒一千万亿(=10^15)次的浮点运算
      一个EFLOPS(exaFLOPS) = 每秒一百亿亿(=10^18)次的浮点运算
    • 一块显卡的计算能力是以TFlops为单位的,也就是10^12次单精度运算。网络结构的参数量在百万级别应该完全可以在主流显卡上一秒出结果。
    • 但是仍然和算法的时间复杂度还有效果的实现方法息息相关。
  3. 图片也换:
    • 液化滤镜可用来推、拉、旋转、反射、缩拢及膨胀影像的任何区域。您建立的扭曲可细微、可夸张,这使得「液化」指令成为一项功能强大的工具,可用来润饰影像以及建立艺术效果。「液化」滤镜适用于8 位元/色版或16 位元/色版的影像。
  4. 类似去马赛克理论上不可能,至少现在还是没法百分百还原的,主要是靠“猜”。只要片看的够多,那么有码也是无的,AI去码的原理类似。
Author: ElaineXHZhong
Link: https://elainexhzhong.github.io/2021/06/03/Detect-Face-PS-Effect/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.