精华内容
下载资源
问答
  • 苏生不惑第227 篇原创文章,将本公众号设为星标,第一时间看最新文章。这两天在微博上看到个网站能老照片动起来,效果如图:网址为https://www.myheritage.com/dee...

    苏生不惑第227 篇原创文章,将本公众号设为星标,第一时间看最新文章。

    这两天在微博上看到个网站能让老照片动起来,效果如图:

    网址为https://www.myheritage.com/deep-nostalgia,上传图片就能让图片中的人活灵活现的动起来,还可以导出视频。

    而且已经有了对应的APP,比如ios上的avatarify https://github.com/alievk/avatarify,演示效果见https://github.com/PaddlePaddle/PaddleGAN/blob/develop/README_cn.md

    我下载的是安卓(公众号后台回复 照片 获取下载地址),里面有很多的模板,比如老照片动起来,ai换头,多人合唱等。

    用了哥哥的一张图 。

    生成的视频见视频号(欢迎关注视频号):

    我把网页上下载的视频转成GIF(之前文章分享过如何将视频轻松转换为 GIF蚂蚁呀嘿的效果:动起来的效果:

    最近原创文章:

    不限速的阿里云盘预约公测即将截止,快来领取3T容量

    一键去除腾讯/优酷/爱奇艺/b站视频水印

    5分钟搞定b站答题成为正式会员,每天自动刷经验值升级账号

    2021 微信运动一键刷步数,让你成功占领封面

    来领钱了,手把手教你申报 2020 个人所得税

    又一视频下载神器,一键下载b站收藏夹视频和up主所有视频

    建了个微信交流群,和我一起在 b 站学 Python

    如果文章对你有帮助还请 点赞/在看/分享 三连支持下, 感谢各位!

    公众号苏生不惑

    扫描二维码关注或搜索微信susheng_buhuo
    展开全文
  • 虽然图片已经能够记录那些幸福快乐的时刻,却难以还原那种喜悦的氛围,而相册视频比起一般的图片展示更为生动灵活。假如你想知道如何制作相册视频,接下来为你提供了4种好的方法。 推荐:Top 10 Best Fre...

    如何制作相册视频

    张小白于2018-04-10更新

    制作图片视频

    你是否曾想过通过一种动态的方式向身边的人们展示你觉得有趣的事情,比如展现某地的秀美风光,你的自拍或是用照片串联记录你成长的痕迹等等。虽然图片已经能够记录那些幸福快乐的时刻,却难以还原那种喜悦的氛围,而相册视频比起一般的图片展示更为生动灵活。假如你想知道如何制作相册视频,接下来为你提供了4种好的方法。

    推荐:Top 10 Best Free Android Photo Editors in 2018

    四种制作图片音乐视频的好方法

    ApowerShow
    Windows Movie Maker
    视频转换王
    苹果iMovie

    利用在线应用

    ApowerShow是一款可以专门用于制作照片视频的多功能软件。相比其他的在线相册影片创作器,它的操作流程更简单。首先访问ApowerShow官网并点击“在线启动”,再完成以下几步,你就可以轻松创做个性非凡的视频。

    • 选择主题:点击右侧对应的主题模板,你可以预览每个主题的效果。如果你还没有添加想要的主题,可以点击主题图片上的下载图标,它会自动帮你加载。预览完毕,单击选择你喜欢的主题模板。

      预览ApowerShow主题模板

    • 导入照片:点击“添加文件”按钮,然后从你电脑硬盘中选择需添加的照片。你也可选中照片直接拖拽到添加区域进行导入。

      添加照片

    • 配乐:点击“配乐”标签,点击“添加音乐”按钮,从电脑中选择你喜欢的音乐。点击“播放”按钮,你可以直接预览添加音乐后的整体效果。

      添加音乐

    • 导出:点击“导出”标签,再选择导出的尺寸为720P或1080P,最后点击“导出”就可以导出你的视频了。

    推荐: Top 5 Best Cameras Apps for Android to Take the Perfect Selfie

    导出视频

    除了使用ApowerShow快速制作各种主题形式的相册视频外,你还可以创建其他风格独特的分屏视频。它不仅提供了丰富的分屏样式及滤镜效果,而且支持使用电脑里的音乐作为你视频的背景音乐。另外,它还是一款超级实用的屏幕录制软件、视频下载软件及视频编辑软件。

    推荐:How to Hide Private Pictures on Any Android Phone

    利用Windows系统内置软件

    在Windows系统有一款内置的软件叫作Movie Maker,是一款专业制作相册视频并且十分好用的工具。这款软件能利用不同的素材轻松的制作视频或是电影。如果你的电脑中没有Movie Maker,那你则需要进入微软公司的官方网页去下载。而通过以下步骤你就能轻松的制作图片音乐视频。

    • 添加视频和图片:开启软件后,你可以直接将图片或者音乐拖进主面板,也可以通过点击左左上角的“Add videos and photos”和“Add music”按钮,你还可以点击主面板右边的“Click here to browse for videos and photos”。
    • 制作视频:当图片和音乐都加载好了后,你能够拖动图片来调整他们的播放顺序。然后你可以在“Home”标签下的“Theme”和旁边的“Animation”标签中找到自己需要的效果。
    • 保存视频:在预览视频并且确定完成后,点击“File”按钮然后选择“Save movie”- “Recommended for this project”。

    Windows Movie Maker

    Windows Movie Maker因为是由微软自主开发的软件,无疑是Windows系统中非常好用的工具,你可以用它轻松制作相册视频。但是偶尔会遇上一些问题比如编辑时候崩溃,所以使用这款软件的时候你需要经常储存工程文件以避免努力白费。如果你想要不再为程序崩溃而提心吊胆的话,你最好选择一个第三方的相册视频制作软件。

    使用第三方平台软件

    许多的第三方应用程序都能够弥补上文提到的Movie Maker具有的缺点,而Apowersoft视频转换王则是其中备受好评的一款软件,使用它制作相册视频的话无论是图片的格式还是音乐的格式都没有限制。除此以外,它还具有多款实用好看的专场特效比如气泡、弹珠,中间波纹等。而且这款软件的界面风格简约清新,操作十分简便。你可以跟着以下操作指南,首先你需要下载软件并且安装到电脑中。

    马上下载

    • 添加图片:打开软件然后选择最上方的“图片MV”这个模块,点击面板中间的“添加图片”或者直接将你的图片拖入面板当中。
    • 制作视频:导入了图片后,点击图片,然后在右侧“转场”效果中选择合适的特效,如果你需要添加背景音乐,点击“配乐”中的“添加音乐”就可以导入你所需要的音乐。在第三个标签“尺寸”中,你能够自由调整图片的尺寸以及持续的时间,而且你可以随时通过点击“预览”来观看视频的效果。
    • 保存视频:点击“保存MV”按钮就能够将你自己的相册视频保存到电脑当中。

    视频转换王

    作为一款高效又强劲的视频转换王,它能够让你轻松制作图片音乐视频,储存的默认格式是MP4。如果你想要在线分享这段视频或者导入到其他的设备当中,你就可能需要格式的转换。而你刚好就能够利用这款软件实现这项操作。除此以外视频转换王还内置了一个视频编辑器和一个在线视频下载器,使用视频编辑器让你能够在MV制作完成后再进行一些编辑操作比如调整亮度,对比度,透明度等;而使用在线下载器则能够帮助你在无需插件的情况下下载在线视频。视频转换王用着强大的功能,其兼容性也非常好,能够在Windows 10系统中完美运行。

    使用苹果Mac iMovie

    对于Mac系统的用户来说,iMovie绝对是用来制作相册视频的高效工具。当制作完成后你还能一键上传到众多社交媒体的网站上。以下就是操作的步骤。

    • 首先打开软件点击顶端的“库”,然后点击“新建”按钮来开启视频的制作。
    • 点击“导入”按钮来添加所需要的图片和音乐。
    • 在导入图片和音乐后,移动鼠标到它们上面会有一个“+”号,然后点击这个加号就能够添加到编辑面板中。
    • 在左下角的“内容资源库”中,你可以通过“转场”、“字幕”、“声音效果”等对你的图片进行编辑调整。当你完成制作后,点击“共享”按钮就能够导出视频。

    苹果iMovie

    目前iMovie只能够导出格式为MOV的视频,如果你想要让你制作的视频适配更多的设备和社交网站的话,你最好将这个视频转换成一个更加通用流行的格式。而且这个方法只能在Mac上面使用,如果你不是Mac用户恐怕就无法体验。

    Source: 10 Best Photo Video Maker Apps for Android with Awesome Music & Effects

    总结

    以上的4种方法都能够帮助用户轻松制作图片音乐视频,在你阅读完这篇文章后你能够选择出最适合你的方法。尽管内置软件在理想状态下是最好的,但是第三方的软件或许能够帮助到你更多。使用Apowersoft视频转换王的话,你不仅能制作一款精美的图片音乐视频还能够进一步对它编辑,这的确是个更好的选择。

    展开全文
  • 可以是你的图片动起来哦可以是你的图片动起来
  • 照片中的水动起来 可设置下雪下雨。水流。做成GIF。屏保。等。照片中的水动起
  • 作者 | 李秋键责编 | 李雪敬头图 | CSDN 下载自视觉中国出品 | AI科技大本营(ID:rgznai100)引言:近段时间,一个梦娜丽莎图像动起来的项目火遍了朋友圈。而今天我...

    作者 | 李秋键

    责编 | 李雪敬

    头图 | CSDN 下载自视觉中国

    出品 | AI科技大本营(ID:rgznai100)

    引言:近段时间,一个让梦娜丽莎图像动起来的项目火遍了朋友圈。而今天我们就将实现让图片中的人物随着视频人物一起产生动作。

    其中通过在静止图像中动画对象产生视频有无数的应用跨越的领域兴趣,包括电影制作、摄影和电子商务。更准确地说,是图像动画指将提取的视频外观结合起来自动合成视频的任务一种源图像与运动模式派生的视频。

    近年来,深度生成模型作为一种有效的图像动画技术出现了视频重定向。特别是,可生成的对抗网络(GANS)和变分自动编码器(VAES)已被用于在视频中人类受试者之间转换面部表情或运动模式。

    根据论文FirstOrder Motion Model for Image Animation可知,在姿态迁移的大任务当中,Monkey-Net首先尝试了通过自监督范式预测关键点来表征姿态信息,测试阶段估计驱动视频的姿态关键点完成迁移工作。在此基础上,FOMM使用了相邻关键点的局部仿射变换来模拟物体运动,还额外考虑了遮挡的部分,遮挡的部分可以使用image inpainting生成。

    而今天我们就将借助论文所分享的源代码,构建模型创建自己需要的人物运动。具体流程如下。


    实验前的准备

    首先我们使用的python版本是3.6.5所用到的模块如下:

    • imageio模块用来控制图像的输入输出等。

    • Matplotlib模块用来绘图。

    • numpy模块用来处理矩阵运算。

    • Pillow库用来加载数据处理。

    • pytorch模块用来创建模型和模型训练等。

    • 完整模块需求参见requirements.txt文件。


    模型的加载和调用

    通过定义命令行参数来达到加载模型,图片等目的。

    (1)首先是训练模型的读取,包括模型加载方式:

    def load_checkpoints(config_path, checkpoint_path, cpu=False):
        with open(config_path) as f:
            config = yaml.load(f)
        generator = OcclusionAwareGenerator(**config['model_params']['generator_params'],
                                            **config['model_params']['common_params'])
        if not cpu:
            generator.cuda()
        kp_detector = KPDetector(**config['model_params']['kp_detector_params'],
                                 **config['model_params']['common_params'])
        if not cpu:
            kp_detector.cuda()
        if cpu:
            checkpoint = torch.load(checkpoint_path, map_location=torch.device('cpu'))
        else:
            checkpoint = torch.load(checkpoint_path)
        generator.load_state_dict(checkpoint['generator'])
        kp_detector.load_state_dict(checkpoint['kp_detector'])
        if not cpu:
            generator = DataParallelWithCallback(generator)
            kp_detector = DataParallelWithCallback(kp_detector)
        generator.eval()
        kp_detector.eval()
        return generator, kp_detector 
    

    (2)然后是利用模型创建产生的虚拟图像,找到最佳的脸部特征:

    def make_animation(source_image, driving_video, generator, kp_detector, relative=True, adapt_movement_scale=True, cpu=False):
        with torch.no_grad():
            predictions = []
            source = torch.tensor(source_image[np.newaxis].astype(np.float32)).permute(0, 3, 1, 2)
            if not cpu:
                source = source.cuda()
            driving = torch.tensor(np.array(driving_video)[np.newaxis].astype(np.float32)).permute(0, 4, 1, 2, 3)
            kp_source = kp_detector(source)
            kp_driving_initial = kp_detector(driving[:, :, 0])
            for frame_idx in tqdm(range(driving.shape[2])):
                driving_frame = driving[:, :, frame_idx]
                if not cpu:
                    driving_frame = driving_frame.cuda()
                kp_driving = kp_detector(driving_frame)
                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)           predictions.append(np.transpose(out['prediction'].data.cpu().numpy(), [0, 2, 3, 1])[0])
        return predictions
    def find_best_frame(source, driving, cpu=False):
        import face_alignment
        def normalize_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
        fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=True,
                                          device='cpu' if cpu else 'cuda')
        kp_source = fa.get_landmarks(255 * source)[0]
        kp_source = normalize_kp(kp_source)
        norm  = float('inf')
        frame_num = 0
        for i, image in tqdm(enumerate(driving)):
            kp_driving = fa.get_landmarks(255 * image)[0]
            kp_driving = normalize_kp(kp_driving)
            new_norm = (np.abs(kp_source - kp_driving) ** 2).sum()
            if new_norm < norm:
                norm = new_norm
                frame_num = i
    return frame_num
    

    (3)    接着定义命令行调用参数加载图片、视频等方式:

    parser = ArgumentParser()
        parser.add_argument("--config", required=True, help="path to config")
        parser.add_argument("--checkpoint", default='vox-cpk.pth.tar', help="path to checkpoint to restore")
        parser.add_argument("--source_image", default='sup-mat/source.png', help="path to source image")
        parser.add_argument("--driving_video", default='sup-mat/source.png', help="path to driving video")
        parser.add_argument("--result_video", default='result.mp4', help="path to output")
        parser.add_argument("--relative", dest="relative", action="store_true", help="use relative or absolute keypoint coordinates")
        parser.add_argument("--adapt_scale", dest="adapt_scale", action="store_true", help="adapt movement scale based on convex hull of keypoints")
        parser.add_argument("--find_best_frame", dest="find_best_frame", action="store_true", 
                            help="Generate from the frame that is the most alligned with source. (Only for faces, requires face_aligment lib)")
        parser.add_argument("--best_frame", dest="best_frame", type=int, default=None,  
                            help="Set frame to start from.")
        parser.add_argument("--cpu", dest="cpu", action="store_true", help="cpu mode.")
        parser.set_defaults(relative=False)
        parser.set_defaults(adapt_scale=False)
        opt = parser.parse_args()
        source_image = imageio.imread(opt.source_image)
        reader = imageio.get_reader(opt.driving_video)
        fps = reader.get_meta_data()['fps']
        driving_video = []
        try:
            for im in reader:
                driving_video.append(im)
        except RuntimeError:
            pass
        reader.close()
        source_image = resize(source_image, (256, 256))[..., :3]
        driving_video = [resize(frame, (256, 256))[..., :3] for frame in driving_video]
        generator, kp_detector = load_checkpoints(config_path=opt.config, checkpoint_path=opt.checkpoint, cpu=opt.cpu)
        if opt.find_best_frame or opt.best_frame is not None:
            i = opt.best_frame if opt.best_frame is not None else find_best_frame(source_image, driving_video, cpu=opt.cpu)
            print ("Best frame: " + str(i))
            driving_forward = driving_video[i:]
            driving_backward = driving_video[:(i+1)][::-1]
            predictions_forward = make_animation(source_image, driving_forward, generator, kp_detector, relative=opt.relative, adapt_movement_scale=opt.adapt_scale, cpu=opt.cpu)
            predictions_backward = make_animation(source_image, driving_backward, generator, kp_detector, relative=opt.relative, adapt_movement_scale=opt.adapt_scale, cpu=opt.cpu)
            predictions = predictions_backward[::-1] + predictions_forward[1:]
        else:
            predictions = make_animation(source_image, driving_video, generator, kp_detector, relative=opt.relative, adapt_movement_scale=opt.adapt_scale, cpu=opt.cpu)
    imageio.mimsave(opt.result_video, [img_as_ubyte(frame) for frame in predictions], fps=fps)
    
    

    模型的搭建

    整个模型训练过程是图像重建的过程,输入是源图像和驱动图像,输出是保留源图像物体信息的含有驱动图像姿态的新图像,其中输入的两张图像来源于同一个视频,即同一个物体信息,那么整个训练过程就是驱动图像的重建过程。大体上来说分成两个模块,一个是motion estimation module,另一个是imagegeneration module。

    (1)其中通过定义VGG19模型建立网络层作为perceptual损失。

    其中手动输入数据进行预测需要设置更多的GUI按钮,其中代码如下:

    class Vgg19(torch.nn.Module):
        """
        Vgg19 network for perceptual loss. See Sec 3.3.
        """
        def __init__(self, requires_grad=False):
            super(Vgg19, self).__init__()
            vgg_pretrained_features = models.vgg19(pretrained=True).features
            self.slice1 = torch.nn.Sequential()
            self.slice2 = torch.nn.Sequential()
            self.slice3 = torch.nn.Sequential()
            self.slice4 = torch.nn.Sequential()
            self.slice5 = torch.nn.Sequential()
            for x in range(2):
                self.slice1.add_module(str(x), vgg_pretrained_features[x])
            for x in range(2, 7):
                self.slice2.add_module(str(x), vgg_pretrained_features[x])
            for x in range(7, 12):
                self.slice3.add_module(str(x), vgg_pretrained_features[x])
            for x in range(12, 21):
                self.slice4.add_module(str(x), vgg_pretrained_features[x])
            for x in range(21, 30):
                self.slice5.add_module(str(x), vgg_pretrained_features[x])
            self.mean = torch.nn.Parameter(data=torch.Tensor(np.array([0.485, 0.456, 0.406]).reshape((1, 3, 1, 1))),
                                           requires_grad=False)
            self.std = torch.nn.Parameter(data=torch.Tensor(np.array([0.229, 0.224, 0.225]).reshape((1, 3, 1, 1))),
                                          requires_grad=False)
            if not requires_grad:
                for param in self.parameters():
                    param.requires_grad = False
        def forward(self, X):
            X = (X - self.mean) / self.std
            h_relu1 = self.slice1(X)
            h_relu2 = self.slice2(h_relu1)
            h_relu3 = self.slice3(h_relu2)
            h_relu4 = self.slice4(h_relu3)
            h_relu5 = self.slice5(h_relu4)
            out = [h_relu1, h_relu2, h_relu3, h_relu4, h_relu5]
            return out
    

    (2)创建图像金字塔计算金字塔感知损失:

    class ImagePyramide(torch.nn.Module):
        """
        Create image pyramide for computing pyramide perceptual loss. See Sec 3.3
        """
        def __init__(self, scales, num_channels):
            super(ImagePyramide, self).__init__()
            downs = {}
            for scale in scales:
                downs[str(scale).replace('.', '-')] = AntiAliasInterpolation2d(num_channels, scale)
            self.downs = nn.ModuleDict(downs)
        def forward(self, x):
            out_dict = {}
            for scale, down_module in self.downs.items():
                out_dict['prediction_' + str(scale).replace('-', '.')] = down_module(x)
            return out_dict
    

    (3)等方差约束的随机tps变换

    class Transform:
        """
        Random tps transformation for equivariance constraints. See Sec 3.3
        """
        def __init__(self, bs, **kwargs):
            noise = torch.normal(mean=0, std=kwargs['sigma_affine'] * torch.ones([bs, 2, 3]))
            self.theta = noise + torch.eye(2, 3).view(1, 2, 3)
            self.bs = bs
            if ('sigma_tps' in kwargs) and ('points_tps' in kwargs):
                self.tps = True
                self.control_points = make_coordinate_grid((kwargs['points_tps'], kwargs['points_tps']), type=noise.type())
                self.control_points = self.control_points.unsqueeze(0)
                self.control_params = torch.normal(mean=0,
                                                   std=kwargs['sigma_tps'] * torch.ones([bs, 1, kwargs['points_tps'] ** 2]))
            else:
                self.tps = False
        def transform_frame(self, frame):
            grid = make_coordinate_grid(frame.shape[2:], type=frame.type()).unsqueeze(0)
            grid = grid.view(1, frame.shape[2] * frame.shape[3], 2)
            grid = self.warp_coordinates(grid).view(self.bs, frame.shape[2], frame.shape[3], 2)
            return F.grid_sample(frame, grid, padding_mode="reflection")
        def warp_coordinates(self, coordinates):
            theta = self.theta.type(coordinates.type())
            theta = theta.unsqueeze(1)
            transformed = torch.matmul(theta[:, :, :, :2], coordinates.unsqueeze(-1)) + theta[:, :, :, 2:]
            transformed = transformed.squeeze(-1)
           if self.tps:
                control_points = self.control_points.type(coordinates.type())
                control_params = self.control_params.type(coordinates.type())
                distances = coordinates.view(coordinates.shape[0], -1, 1, 2) - control_points.view(1, 1, -1, 2)
                distances = torch.abs(distances).sum(-1)
                result = distances ** 2
                result = result * torch.log(distances + 1e-6)
                result = result * control_params
                result = result.sum(dim=2).view(self.bs, coordinates.shape[1], 1)
                transformed = transformed + result
            return transformed
        def jacobian(self, coordinates):
            new_coordinates = self.warp_coordinates(coordinates)
            grad_x = grad(new_coordinates[..., 0].sum(), coordinates, create_graph=True)
            grad_y = grad(new_coordinates[..., 1].sum(), coordinates, create_graph=True)
            jacobian = torch.cat([grad_x[0].unsqueeze(-2), grad_y[0].unsqueeze(-2)], dim=-2)
            return jacobian    
    
    

    (4)生成器的定义:生成器,给定的源图像和和关键点尝试转换图像根据运动轨迹引起要点。部分代码如下:

    class OcclusionAwareGenerator(nn.Module):
        def __init__(self, num_channels, num_kp, block_expansion, max_features, num_down_blocks,
                     num_bottleneck_blocks, estimate_occlusion_map=False, dense_motion_params=None, estimate_jacobian=False):
            super(OcclusionAwareGenerator, self).__init__()
            if dense_motion_params is not None:
                self.dense_motion_network = DenseMotionNetwork(num_kp=num_kp, num_channels=num_channels,
                                                               estimate_occlusion_map=estimate_occlusion_map,
                                                               **dense_motion_params)
            else:
                self.dense_motion_network = None
            self.first = SameBlock2d(num_channels, block_expansion, kernel_size=(7, 7), padding=(3, 3))
            down_blocks = []
            for i in range(num_down_blocks):
                in_features = min(max_features, block_expansion * (2 ** i))
                out_features = min(max_features, block_expansion * (2 ** (i + 1)))
                down_blocks.append(DownBlock2d(in_features, out_features, kernel_size=(3, 3), padding=(1, 1)))
            self.down_blocks = nn.ModuleList(down_blocks)
            up_blocks = []
            for i in range(num_down_blocks):
                in_features = min(max_features, block_expansion * (2 ** (num_down_blocks - i)))
                out_features = min(max_features, block_expansion * (2 ** (num_down_blocks - i - 1)))
                up_blocks.append(UpBlock2d(in_features, out_features, kernel_size=(3, 3), padding=(1, 1)))
            self.up_blocks = nn.ModuleList(up_blocks)
            self.bottleneck = torch.nn.Sequential()
            in_features = min(max_features, block_expansion * (2 ** num_down_blocks))
            for i in range(num_bottleneck_blocks):
                self.bottleneck.add_module('r' + str(i), ResBlock2d(in_features, kernel_size=(3, 3), padding=(1, 1)))
            self.final = nn.Conv2d(block_expansion, num_channels, kernel_size=(7, 7), padding=(3, 3))
            self.estimate_occlusion_map = estimate_occlusion_map
            self.num_channels = num_channels
    

    (5)判别器类似于Pix2PixGenerator。

    def __init__(self, num_channels=3, block_expansion=64, num_blocks=4, max_features=512,
                     sn=False, use_kp=False, num_kp=10, kp_variance=0.01, **kwargs):
            super(Discriminator, self).__init__()
            down_blocks = []
            for i in range(num_blocks):
                down_blocks.append(
                    DownBlock2d(num_channels + num_kp * use_kp if i == 0 else min(max_features, block_expansion * (2 ** i)),
                                min(max_features, block_expansion * (2 ** (i + 1))),
                                norm=(i != 0), kernel_size=4, pool=(i != num_blocks - 1), sn=sn))
            self.down_blocks = nn.ModuleList(down_blocks)
            self.conv = nn.Conv2d(self.down_blocks[-1].conv.out_channels, out_channels=1, kernel_size=1)
            if sn:
                self.conv = nn.utils.spectral_norm(self.conv)
            self.use_kp = use_kp
            self.kp_variance = kp_variance
        def forward(self, x, kp=None):
            feature_maps = []
            out = x
            if self.use_kp:
                heatmap = kp2gaussian(kp, x.shape[2:], self.kp_variance)
                out = torch.cat([out, heatmap], dim=1)
            for down_block in self.down_blocks:
                feature_maps.append(down_block(out))
                out = feature_maps[-1]
            prediction_map = self.conv(out)
            return feature_maps, prediction_map
    

    最终通过以下代码调用模型训练“python demo.py--config config/vox-adv-256.yaml --driving_video path/to/driving/1.mp4--source_image path/to/source/7.jpg --checkpointpath/to/checkpoint/vox-adv-cpk.pth.tar --relative --adapt_scale”

    效果如下:

    完整代码:

    https://pan.baidu.com/s/1nPE13oI1qOerN0ANQSH92g

    提取码:e4kx

    作者简介:

    李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等等

    更多精彩推荐
    
    展开全文
  • 一个可以眼睛和嘴巴动起来的人物头像处理工具,很有娱乐性,看看有没有需要的小伙伴可以试试 在线工具地址:https://www.lmcjl.com/index/images/head.html

    一个可以让眼睛和嘴巴动起来的人物头像处理工具,很有娱乐性,看看有没有需要的小伙伴可以试试

    在线工具地址:https://www.lmcjl.com/index/images/head.html

    展开全文
  • Matlab小技巧 -- 动起来

    千次阅读 2020-02-15 23:12:17
        在文章 YOLOv3 + Matlab Robotics ToolBox 实战 -- 软包装药品的机器人分拣系统设计与仿真 最后的展示视频 软包装药品的机器人分拣系统设计与仿真中,使用到了将一组JPG格式的图片转换为MP4格式的视频,解决...
  • 使用AE插件你的卡通人物动起来

    千次阅读 2019-07-30 21:40:04
    Limber for Mac是一款特别的插件,有了它,您的人物将会根据您的设定进行一些肢体动作,使得那些不会的卡通人物变得更加鲜活。这款插件工作起来十分简单,只需您使用控制器层为肢体的髋部和脚踝点设置动画就可以...
  • 老照片转成新照片编辑软件+教程 照片制作成动画 会动的旧照片制作合成修复动态动起来 抖音快手实用制作图片转视频软件(1).zip把一张旧照片制作成新照片,并且能照片的人物动起来 一款制作软件
  • 偶然发现的几款软件,XX-CAKE。...先截几张图片: 教材观看: http://www.tudou.com/programs/view/FO4e0u8OwN8/ 教材视屏和弹幕下载:http://www.400gb.com/file/24986288 备份:http://64pan.co
  • 软件测试入门知识了解

    万次阅读 多人点赞 2018-09-05 14:59:58
    1.软件测试定义两面性 2.测试的生命周期 测试需求分析--&gt;测试设计--&gt;测试计划--&gt;测试执行--&gt;质量评估 3.软件测试过程: 需求评审和设计评审是验证软件产品的需求定义和设计...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    不能,定义抽象类就是其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息: 14. 接口和抽象类有什么区别? 实现:抽象类...
  • 教您如何Gif动画动起来(表情)

    千次阅读 2012-03-23 23:56:46
    Android 中是不支持直接使用Gif 图片关联播放帧动画,如下动画在Android 中是无法播放的,我们将教会您使用有效方法Gif图片在Android下动起来。 使用软件:easygifanimator 下载地址:click me xmln
  • 技术改变世界,现在照片也能动起来啦!“Yanderify”。这是一个可以将视频和照片合成、照片按照视频人脸一样动起来,是一个十分有意思的应用。就连脸部细节的微表情也十分逼真。图片左侧分...
  • 2021年前端面试题及答案

    万次阅读 多人点赞 2020-02-11 19:29:34
    前端工程化是使用软件工程的技术和方法来进行前端的开发流程、技术、工具、经验等规范化、标准化,其主要目的为了提高效率和降低成本,即提高开发过程中的开发效率,减少不必要的重复工作时间,而前端工程本质上是...
  • 网页设计\网页制作常用软件大全

    千次阅读 多人点赞 2014-03-04 12:08:26
    网页设计\网页制作常用软件 一、专业的网页设计、网页制作软件: 1、CorelDraw:通过CorelDRAW9的全方面的设计及网页功能融合到现有的设计方案中,制作矢量的插图、设计及图像,出色地设计公司标志、简报、彩页、...
  •    从本文开始,在之后的一段时间里,我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,本文作为本系列的第一篇文章,主要介绍如何小车动起来。 一、硬件的选择    1、底盘和电机  ...
  • CSS Sprites为一些大型的网站节约了带宽,提高了用户的加载速度和用户体验,不需要加载更多的图片 6. 如何用原生js给一个按钮绑定两个onclick事件? Var btn=document.getElementById(‘btn’); //事件监听 绑定...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统测试之后) 11 回归测试: 11 4.测试过程...
  • 使用js实现图画人物动起来的方法

    千次阅读 2014-08-13 17:29:54
    ; charset=UTF-8" pageEncoding="UTF-8"%> canvas元素示例 src="/js/jquery-1.9.1.js"> function draw(id) { var canvas
  • 【微信小程序控制硬件①】 全网首发,...【微信小程序控制硬件③】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分! 【微信小程序控制硬件④】 深度剖析微信公众号...
  • K8s基础

    万次阅读 多人点赞 2018-07-16 22:50:52
    Kubernetes(简称 k8s)是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是部署容器化的应用简单并且高效(powerful),k8s提供了应用部署,规划,更新,维护的一种机制。 k8s一个核心的特点...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
  • SDN

    千次阅读 多人点赞 2017-06-29 11:35:37
    SDN的本质定义就是软件定义网络,也就是说希望应用软件可以参与对网络的控制管理,满足上层业务需求,通过自动化业务部署简化网络运维。 1 SDN标准:ONF 网站:https://www.opennetworking.org/ 参考:...
  • 第五章-Linux实操篇

    千次阅读 多人点赞 2019-10-24 18:45:20
    title: 第五章 Linux实操篇 categories: Linux tags: linux typora-root-url: … abbrlink: 93414991 date: 2019-08-15 15:27:58 ...第五章 Linux实操篇 ...5.2 xhell5(windows)远程登录软件 需要Linux开启sshd服...
  • 作者 | 李秋键责编 | 李雪敬头图 | CSDN 下载自视觉中国出品 | AI科技大本营(ID:rgznai100)近段时间,一个蒙娜丽莎图像动起来的项目火遍了朋友圈。而今天我们就将...
  • 盘点那些被AI换脸、一键“脱”衣所滥用的AI模型

    万次阅读 多人点赞 2019-09-13 11:37:57
    ,CycleGAN使用循环一致性损失函数来实现训练,从而完成将图片中一个域到另一个域的无缝转换。具体什么是循环一致性损失函数咱们可以找时间详解,简单来说CycleGAN能将图像的主题风格或者某一域主体完美进行切换,...
  • 怎么用EDIUS将静帧图片做出动态特效

    万次阅读 2016-06-08 11:37:19
    在实际工作中,我怕恩经常需要使用一张大尺寸的图片来制作推拉摇移的镜头效果
  • 可以使稀有价值摇起来,使静态的图片动起来,像布丁之类的
  • 哪个软件可以制作GIF动态图

    千次阅读 2019-07-10 17:40:02
    表情包已经成为我们必备的一个聊天小功能,各式各样的GIF给我们带来了很多的乐趣,但是我们很少有自己去制作GIF的经历,其实制作起来会很有趣,那哪个软件可以制作GIF动态图呢? 1、在电脑上运行迅捷GIF制作工具...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,469
精华内容 38,187
关键字:

怎么让图片动起来的软件