新智元报导
来历:GitHub
修改:白峰
【新智元导读】最近,为应对Zoom的隐私走漏问题,国外一名开发者在GitHub开源了自己的替身项目代码,让你在Zoom视频通话运用中运用替身变成或许,项目运用了NIPS2019一篇论文中的模型作为中心组件,完结了视频流中的动态图画搬迁,让你实时切换替身。「新智元急聘编缉、高档主任修改,增加HR微信(Dr-wly)或扫描文末二维码了解概况。」
此前Zoom的安全缝隙引发了全球重视,15000个视频被公开到网上,形成视频中的个人隐私信息走漏,尽管Zoom采取了许多安全行动来修补缝隙,但由于产品自身的规划缺点,修正一切问题远非一日之功。在此期间,怎么经过自己的设置,来保证信息安全呢?
近来,一位开发者在GitHub开源了自己的解决方案avatarify,为Zoom、Skype这类视频通话运用增加自己的替身。
让马斯克参加你的Zoom会议
哇哦,马斯克参加了咱们的群聊!
当然这并不是真的马斯克。你或许会问这跟DeepFake有啥差异?咱们咱们都知道DeepFake的练习和推理速度是十分慢的,满意不了视频通话的实时性要求,这个项目大大缩短了时间延迟,并且不需求很多的替身图片信息,一张就够!
项目中心组件:一阶运动模型
avatarify项目站在了伟人的膀子上,项目中运用的一个中心模型first order model来历于下面这篇NIPS论文。
这个模型能够精确的经过驱动视频的运动,对源图画中的方针进行动画处理,以生成视频序列,而无需运用任何注释或有关特定方针的先验信息。模型选用自监督的办法将外观和运动信息别离,运用了视频中方针的要害点及其部分仿射改换进行特征表明。生成器网络对方针运动期间呈现的遮挡进行建模,并将源图画中提取的外观与从驱动视频取得的运动进行组合。
能够精确的看出模型由两个首要模块组成:运动估量模块和图画生成模块。运动估量模块的意图是猜测密布的运动场。咱们假定存在一个笼统的参阅结构,然后独登时估量了两种转化:从参阅到源以及从参阅到驱动,这样的规划使模型能够独立处理源帧和驱动帧。
咱们咱们能够运用这个模型轻松地将特朗普的说话搬迁到权游中的人物,也能够让形状类似的静态马奔驰起来,还能一键完结模特的换装,对需求制造很多换装图片的美工来说简直是神器!
来,让Lecun仿照下Hinton。
对比下FaceSwap的作用,高低立判。
还有一个较为重要的操作便是人脸对齐,作者运用了另一个开源项目face_alignment来提取人脸要害点。
怎么在Zoom会议中运用替身
有了这两个中心组件,咱们就能够来完结视频中的替身制造了,来看下完结替身生成的几个要害操作。
加载练习好的模型
def load_checkpoints(config_path, checkpoint_path, device='cuda'):
with open(config_path) as f: config = yaml.load(f)
generator = OcclusionAwareGenerator(**config['model_params']['generator_params'], **config['model_params']['common_params']) generator.to(device)
kp_detector = KPDetector(**config['model_params']['kp_detector_params'], **config['model_params']['common_params']) kp_detector.to(device)
checkpoint = torch.load(checkpoint_path, map_location=device) generator.load_state_dict(checkpoint['generator']) kp_detector.load_state_dict(checkpoint['kp_detector'])
generator = DataParallelWithCallback(generator) kp_detector = DataParallelWithCallback(kp_detector)
generator.eval() kp_detector.eval()
return generator, kp_detector
要害点的归一化
def normalize_alignment_kp(kp): kp = kp - kp.mean(axis=0, keepdims=True) area = ConvexHull(kp[:, :2]).volume area = np.sqrt(area) kp[:, :2] = kp[:, :2] / area return kp
图片的取舍和扩展
def crop(img, p=0.7): h, w = img.shape[:2] x = int(min(w, h) * p) l = (w - x) // 2 r = w - l u = (h - x) // 2 d = h - u return img[u:d, l:r], (l,r,u,d)
def pad_img(img, orig): h, w = orig.shape[:2] pad = int(256 * (w / h) - 256) out = np.pad(img, [[0,0], [pad//2, pad//2], [0,0]], 'constant') out = cv2.resize(out, (w, h)) return out
猜测图片生成
def predict(driving_frame, source_image, relative, adapt_movement_scale, fa, device='cuda'): global start_frame global start_frame_kp global kp_driving_initial
with torch.no_grad(): source = torch.tensor(source_image[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2).to(device) driving = torch.tensor(driving_frame[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2).to(device) kp_source = kp_detector(source)
if kp_driving_initial is None: kp_driving_initial = kp_detector(driving) start_frame = driving_frame.copy() start_frame_kp = get_frame_kp(fa, driving_frame)
kp_driving = kp_detector(driving) kp_norm = normalize_kp(kp_source=kp_source, kp_driving=kp_driving, kp_driving_initial=kp_driving_initial, use_relative_movement=relative, use_relative_jacobian=relative, adapt_movement_scale=adapt_movement_scale) out = generator(source, kp_source=kp_source, kp_driving=kp_norm)
out = np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0] out = out[..., ::-1] out = (np.clip(out, 0, 1) * 255).astype(np.uint8)
return out
完结了这几步,在Zoom中设置摄像头运用avatarify,就能够将生成的图画经过OpenCV实时推送到视频流了。主张运用头像缩放功用,使你的脸在预览窗口中的份额和方位尽或许挨近替身头像。对齐后,点击 X 来运用这个帧作为参阅帧,驱动视频的生成。
将你想用的替身图片(经过快捷键1-9还能够实时替换)放在avatars文件夹下就能完结该功用了,赶忙去给你的Zoom增加个替身吧,再也不需求过多的忧虑隐私走漏了!
参阅链接:
http://papers.nips.cc/paper/8935-first-order-motion-model-for-image-animation
https://aliaksandrsiarohin.github.io/first-order-model-website/
https://github.com/alievk/avatarify