Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

face detect failed by dlib #16

Open
Pudge-tao opened this issue May 19, 2023 · 16 comments
Open

face detect failed by dlib #16

Pudge-tao opened this issue May 19, 2023 · 16 comments

Comments

@Pudge-tao
Copy link

Pudge-tao commented May 19, 2023

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
Copy link

Arg-Li commented Jul 3, 2023

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

@Pudge-tao
Copy link
Author

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

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

@Arg-Li
Copy link

Arg-Li commented Jul 3, 2023

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

@Pudge-tao
Copy link
Author

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

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

@Arg-Li
Copy link

Arg-Li commented Jul 3, 2023

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

@Pudge-tao
Copy link
Author

请问你能帮我提供一下思路吗? 如何从数据集中的四种不同伪造方法的视频里提取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
Copy link
Author

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

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

@Arg-Li
Copy link

Arg-Li commented Jul 4, 2023

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

@Pudge-tao
Copy link
Author

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

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

@WWDCREATE
Copy link

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

@WWDCREATE
Copy link

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

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

@Pudge-tao
Copy link
Author

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

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

@WWDCREATE
Copy link

WWDCREATE commented Aug 8, 2023 via email

@LonelyPlanetIoT
Copy link

您好,我查找了下,钛盘可以最高上传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文件了吗 能否给我传一份 邮箱[email protected]

@Ablott123
Copy link

您好,您有mask的文件吗?如果有的话,能否发我一下,谢谢! [email protected]

@ZengqiangChen
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants