liangchen527 / SLADD

Official code for Self-supervised Learning of Adversarial Example: Towards Good Generalizations for Deepfake Detection (CVPR 2022 oral)
Apache License 2.0
134 stars 16 forks source link

face detect failed by dlib #16

Open Pudge-tao opened 1 year ago

Pudge-tao commented 1 year ago

image how to extract faces from video。i got margined boxes from source video by retinaface model to crop faces and masks that seems be not work。

import os
import cv2
import numpy as np
import json
import argparse
import glob
from retinaface.pre_trained_models import get_model
import torch
from tqdm import tqdm
import warnings

warnings.filterwarnings('ignore')

parse = argparse.ArgumentParser()
parse.add_argument('--path', default=None, type=str, help='videos root path')
parse.add_argument('--dest',
                   type=str,
                   default=None,
                   help='image save root path')
parse.add_argument('--comp',
                   type=str,
                   default='c23',
                   help='compress (raw, c23, c40)')
parse.add_argument(
    '--t',
    type=str,
    default='real',
    help='all, Deepfakes, Face2Face, FaceSwap, NeuralTextures, real')
parse.add_argument('--mode',
                   type=str,
                   default='test',
                   help='train, val, test')
parse.add_argument('--cnt',
                   type=int,
                   default=25,
                   help='select num frames from video')
args = parse.parse_args()
seed = 1
torch.cuda.manual_seed(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
face_detector = get_model("resnet50_2020-07-20",
                          max_size=1024,
                          device=torch.device('cuda'))
face_detector.eval()

def write_imgs(data_t, mode):
    fakes = {
        'Deepfakes': 'FF-DF',
        'Face2Face': 'FF-F2F',
        'FaceSwap': 'FF-FS',
        'NeuralTextures': 'FF-NT',
        'real': 'real'
    }
    root_p = ''
    list_dict = json.load(open(args.path + f'{mode}.json', 'r'))
    filelist = []
    for i in list_dict:
        filelist += i
    if data_t == 'real':
        root_p = args.path + f'original_sequences/youtube/{args.comp}/videos/*'
    else:
        root_p = args.path + f'manipulated_sequences/{data_t}/{args.comp}/videos/*'
    video_list = sorted(glob.glob(root_p))
    video_list = [i for i in video_list if os.path.basename(i)[:3] in filelist]

    for video in tqdm(video_list):
        mask_cap, mask_frame = '', ''
        cap = cv2.VideoCapture(video)
        if not cap.isOpened():
            print(f'Cannot open: {video}')
            # sys.exit()
            continue
        frame_count_org = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        frame_idxs = np.linspace(0,
                                 frame_count_org - 1,
                                 args.cnt,
                                 endpoint=True,
                                 dtype=int)
        if data_t != 'real':
            mask_video = video.replace(args.comp, 'masks')
            mask_cap = cv2.VideoCapture(mask_video)
            if not mask_cap.isOpened():
                print(f'Cannot open: {mask_video}')
                # sys.exit()
                continue
        cnt = 0
        for cnt_f in range(frame_count_org):
            ret, frame = cap.read()
            if not ret:
                break
            if data_t != 'real':
                mask_ret, mask_frame = mask_cap.read()
                if not mask_ret:
                    break
            if cnt_f not in frame_idxs:
                continue
            cnt += 1
            if not os.path.exists(args.dest + f'image/'):
                os.mkdir(args.dest + f'image/')
                os.mkdir(args.dest + f'mask/')
            if not os.path.exists(args.dest + f'image/{fakes[data_t]}'):
                os.mkdir(args.dest + f'image/{fakes[data_t]}')
                os.mkdir(args.dest + f'mask/{fakes[data_t]}')
            if not os.path.exists(args.dest + f'image/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}'):
                os.mkdir(args.dest + f'image/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}')
                os.mkdir(args.dest + f'mask/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}')
            if os.path.exists(args.dest + f'image/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}/{cnt-1:04d}.png'):
                continue
            rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            faces = face_detector.predict_jsons(rgb)
            if len(faces[0]['bbox']) == 0:
                continue
            size_list = []
            for face_idx in range(len(faces)):
                x0, y0, x1, y1 = faces[face_idx]['bbox']
                size_list.append((x1 - x0) * (y1 - y0))
            max_id = np.argmax(size_list)
            x0, y0, x1, y1 = faces[max_id]['bbox']
            w_margin = (x1 - x0) / 8
            h_margin = (y1 - y0) / 8
            y0_new = max(0, int(y0 - h_margin))
            y1_new = min(frame.shape[0], int(y1 + h_margin) + 1)
            x0_new = max(0, int(x0 - w_margin))
            x1_new = min(frame.shape[1], int(x1 + w_margin) + 1)
            cv2.imwrite(args.dest + f'image/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}/{cnt-1:04d}.png',
                        frame[y0_new:y1_new, x0_new:x1_new])
            if data_t != 'real':
                cv2.imwrite(args.dest + f'mask/{fakes[data_t]}/{video.split("/")[-1].split(".")[0]}/{cnt-1:04d}_mask.png',
                            mask_frame[y0_new:y1_new, x0_new:x1_new])
        cap.release()
        if data_t != 'real':
            mask_cap.release()

if __name__ == "__main__":
    fakes = ['Deepfakes', 'Face2Face', 'FaceSwap', 'NeuralTextures', 'real']
    if args.t == 'all':
        for fake in fakes:
              write_imgs(fake, args.mode)
    else:
          write_imgs(args.t, args.mode)
Arg-Li commented 1 year ago

@Pudge-tao 请问一下这段代码是从FF++数据集中抽取图片,最后变成作者readme中的data目录结构吗?

Pudge-tao commented 1 year ago

@Pudge-tao 请问一下这段代码是从FF++数据集中抽取图片,最后变成作者readme中的data目录结构吗?

嗯,生成readme的data目录结构,但不是作者提供的。训练时出现了face detect failed,不知道怎么解决

Arg-Li commented 1 year ago

请问你的数据集是original的还是kaggle上下载的

Pudge-tao commented 1 year ago

请问你的数据集是original的还是kaggle上下载的

官方的git repository里的数据集下载脚本

Arg-Li commented 1 year ago

请问你能帮我提供一下思路吗? 如何从数据集中的四种不同伪造方法的视频里提取image和mask对应的文件,以及作者readme中的config目录里面是什么呢?非常感谢

Pudge-tao commented 1 year ago

请问你能帮我提供一下思路吗? 如何从数据集中的四种不同伪造方法的视频里提取image和mask对应的文件,以及作者readme中的config目录里面是什么呢?非常感谢

FF++ 有3个标签文件train.json test.json val.json解析这个json文件可以找到需要提取image和mask的源文件,作者训练代码,每个视频抽样了270帧。我贴出的代码里有video_list = [i for i in video_list if os.path.basename(i)[:3] in filelist]

Pudge-tao commented 1 year ago

请问你能帮我提供一下思路吗? 如何从数据集中的四种不同伪造方法的视频里提取image和mask对应的文件,以及作者readme中的config目录里面是什么呢?非常感谢

config下是train.json test.json val.json标签文件,我的思路是在源视频用detect获取人脸box,再用得出的box宽高上同比例扩充得到新的box(为了crop后检测还能出框),再在源文件和mask相同帧序上crop得到image和mask。因为作者没提供预处理方案,我也不知道我的对不对

Arg-Li commented 1 year ago

您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ 如果你方便的话能发送我(1436355573@qq.com)一下mask文件吗,非常感谢~
image

Pudge-tao commented 1 year ago

您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ 如果你方便的话能发送我(1436355573@qq.com)一下mask文件吗,非常感谢~ image

image我用的faceforensics_download_v4.py,不知道现在背墙了没有,发你试下

WWDCREATE commented 1 year ago

您好,我使用了faceforensics_download_v4.py进行mask文件的下载,但是仍然显示是无法响应服务器,不知能否麻烦您给我发送一下mask文件(1250280527@qq.com),十分感谢!

WWDCREATE commented 1 year ago

您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ 如果你方便的话能发送我(1436355573@qq.com)一下mask文件吗,非常感谢~ image

您好,请问您mask文件下载成功了吗?我这里即使使用faceforensics_download_v4.py也无法下载成功,如果您下载成功,不知是否方便给我发送一分mask文件(1250280527@qq.com)十分感激!

Pudge-tao commented 1 year ago

您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ 如果你方便的话能发送我(1436355573@qq.com)一下mask文件吗,非常感谢~ image

您好,请问您mask文件下载成功了吗?我这里即使使用faceforensics_download_v4.py也无法下载成功,如果您下载成功,不知是否方便给我发送一分mask文件(1250280527@qq.com)十分感激! 文件太大了,40几个G,上传不了网盘

WWDCREATE commented 1 year ago

您好,我查找了下,钛盘可以最高上传50g的文件,同时不用下载只需要网页端进行(https://www.tmp.link/),能否麻烦您上传钛盘然后给我发一下链接,感谢

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年8月8日(星期二) 上午10:22 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [liangchen527/SLADD] face detect failed by dlib (Issue #16)

您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ @.***)一下mask文件吗,非常感谢~

@.***)十分感激! 文件太大了,40几个G,上传不了网盘

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

LonelyPlanetIoT commented 1 year ago

您好,我查找了下,钛盘可以最高上传50g的文件,同时不用下载只需要网页端进行(https://www.tmp.link/),能否麻烦您上传钛盘然后给我发一下链接,感谢! ------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年8月8日(星期二) 上午10:22 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [liangchen527/SLADD] face detect failed by dlib (Issue #16) 您好,我用你的方法提取图像帧。我才发现我的原始数据集(kaggle下载的)中只有videos文件没有mask文件,也就是说这一步mask_video = video.replace(args.comp, 'masks') ,无法实现。 我从官网脚本欲下载mask文件,三个服务器好像都被墙了~ @.***)一下mask文件吗,非常感谢~ @.)十分感激! 文件太大了,40几个G,上传不了网盘 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.>

你好,请问你有mask文件了吗 能否给我传一份 邮箱1967355531@qq.com

Ablott123 commented 1 year ago

您好,您有mask的文件吗?如果有的话,能否发我一下,谢谢! 1715547342@qq.com

ZengqiangChen commented 1 year ago

行mask文件的下载,但是仍然显示是无法响应服务器,不知能否麻烦您给我发送一下mask文件(1250280527@qq.com),十分感谢!

您好,batch_size=32,1个GPU的话,您训练一轮需要多长时间呀?