基于加权平滑过渡的无缝拼接

背景

在做照片数字人视频生成的时候,为了达到快速响应实时播放的需求,即视频的生成速度 必须小于 音频的播放速度。

因此,我们截取了一部分较小的可动区域进行推理生成,然后把生成的图像贴回到原区域。

通常情况下,推理生成图像的 清晰度和色彩 对比 原图 有些许差异,这样导致贴图后的图像区域有明显的边界感和分割感。 如下图所示:

方案选取

最开始我们想到 cv2.seamlessClone 贴回原区域后效果非常不错,能有效的消除边界,但是有个致命缺陷:不支持GPU加速,单帧的处理速度超过40ms。

也试过其他的机器学习融合算法,他们都有速度慢的缺陷。

因此,为了能达到最快的单帧处理速度,我们采用最为朴素的加权平滑过渡方案,并且把运算放在GPU中。

实现

加权平滑过渡,越靠近边缘 底图的权重 越高;越靠近中心 贴图的权重越高。可以设计这样一个mask矩阵,权重从边缘到中心平滑过渡,贴图的时候直接相乘即可。

# h:高,w:宽,d:过渡距离
def create_mask(h, w, d):
mask = torch.full((h,w),fill_value=1.0) step = 1.0 / d
range_1 = torch.arange(0, 1, step)[0:d].reshape(1, d)
range_2 = torch.reshape(range_1, (d, 1))
range_3 = torch.fliplr(range_1)
range_4 = torch.flipud(range_2) mask[:h, :d] *= range_1 # left
mask[:d, :w] *= range_2 # top
mask[:h, w-d:w] *= range_3 # right
mask[h-d:h, :w] *= range_4 # bottom return mask

后续实现

import time
import cv2
import torch
import numpy as np
import matplotlib.pyplot as plt center_x = 382
center_y = 333
# 贴图坐标和宽高
x = int(382-(698/2))
y = int(333-(667/2))
r_w = 698
r_h = 667 # 原图
full = cv2.imread("9638fa56.png")
full = cv2.cvtColor(full, cv2.COLOR_BGR2RGB)
full = np.transpose(full, [2, 0, 1]).astype(np.float16) # h w c -> c h w
full = torch.from_numpy(full).to('cuda') # 贴图区域
copy_area = full[:,y:r_h+y,x:r_w+x]
print('copy_area', copy_area.shape) # 贴图
head = np.load('head.npy')
head = cv2.resize(head, (r_w, r_h))
head = np.transpose(head, [2, 0, 1]).astype(np.float16) # h w c -> c h w
head = torch.from_numpy(head).to('cuda')
print('head', head.shape) # mask矩阵
h = head.shape[1]
w = head.shape[2]
d = int( w / 9 )
mask_head = create_mask(h, w, d).to('cuda')
mask_src = 1-mask_head # 加权融合
t0 = time.time()
mix = None
for idx in range(1):
head[0,:,:] *= mask_head
head[1,:,:] *= mask_head
head[2,:,:] *= mask_head copy_area[0,:,:] *= mask_src
copy_area[1,:,:] *= mask_src
copy_area[2,:,:] *= mask_src mix = head + copy_area print('cost=', (time.time()-t0)) # 贴回原区域
full[:,y:r_h+y,x:r_w+x] = mix full = np.transpose(full.data.cpu().numpy().astype(np.uint8), [1, 2, 0])
plt.imshow(full)

效果图

结论

加权平滑过渡的无缝拼接,能很好的消除贴图的边界和分割,并且单帧的处理速度在0.15ms左右(V100),满足实时数字人的生成需求。

缺陷

肩部水平位移过大时,拼接会出现明显的分割和重影。解决方法:通过计算 光流 或者 图像模式匹配 得出运动位移,然后对位移区域进行形变,可以缓解。

Pytorch 基于加权平滑过渡的无缝拼接的更多相关文章

  1. 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现

    一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段 ...

  2. 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...

  3. 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...

  4. Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。

    实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...

  5. Opencv Sift和Surf特征实现图像无缝拼接生成全景图像

    Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...

  6. Unity3d Material(材质) 无缝拼接

    Unity3d Material(材质) Edit by @灰太龙 在做一个项目的过程中,遇到动态切换壁纸的功能,问题点在无缝拼接! 那我们先查查Unity3d 中的材质球,里面有个参数 Tiling ...

  7. js实现网页全屏切换(平滑过渡),鼠标滚动切换

    实现效果为页面平滑过渡全屏切换,点击导航和鼠标滚动都可以切换. 效果图: html代码: <!DOCTYPE html> <html> <head lang=" ...

  8. 关于图片无缝拼接的学习(PTGui)

    一.简介 在用到单反.无人机.手机等拍照工具,需要无缝拼接. 二.下载 官网:http://www.ptgui.com/download.html 其他:http://pan.baidu.com/sh ...

  9. 【转】Android循环滚动广告条的完美实现,封装方便,平滑过渡,从网络加载图片,点击广告进入对应网址

    Android循环滚动广告条的完美实现,封装方便,平滑过渡,从网络加载图片,点击广告进入对应网址 关注finddreams,一起分享,一起进步: http://blog.csdn.net/finddr ...

  10. MyBatis3与Spring3无缝集成-从iBatis平滑过渡

    从2010开始接触iBatis到现在,一直到现在把iBatis作为数据访问层ORM.为了演示一个Web应用,今天又搭了个SpringMVC应用,由于应用比较简单,Spring版本直接用最新版本3.2. ...

随机推荐

  1. 基于Hive的大数据分析系统

    1.概述 在构建大数据分析系统的过程中,我们面对着海量.多源的数据挑战,如何有效地解决这些零散数据的分析问题一直是大数据领域研究的核心关注点.大数据分析处理平台作为应对这一挑战的利器,致力于整合当前主 ...

  2. 【郝斌C ST】指针 swap问题

    C语言 指针 swap问题 在主函数种实现变量的交换 现在我们把这交换的行为封装进方法中 swap函数确实进行了交换,打印也是10和5了,但是下面a和b的结果还是5和10 - 形参i 和 形参j 并不 ...

  3. 【SpringBoot】06 探索配置方式 Part2 占位符的使用

    配置占位符? 随机数配置生成 RandomValuePropertySource 在配置文件中使用随机数 uid = ${random.value} uid = ${random.int} uid = ...

  4. 【DataBase】SQL50 Training 50题训练

    原文地址: https://blog.csdn.net/xiushuiguande/article/details/79476964 实验数据 CREATE DATABASE IF NOT EXIST ...

  5. 第四范式开源强化学习框架——OpenRL

    维护者信息: 知乎地址: https://www.zhihu.com/people/huangshiyu.me 个人主页: http://tartrl.cn/people/huangshiyu/ Gi ...

  6. 【转载】 GPU地址空间的相关概念

    为了结合上篇 文章   https://www.cnblogs.com/devilmaycry812839668/p/13264080.html 对RTX显卡是否能够实现P2P通信功能,同时专业级别显 ...

  7. ( Ubuntu系统下 ) vim插件安装 supertab 实现tab键的补全功能 (vim+python环境下)

    本文前提已经安装了  Vundle   : 下载  supertab : git clone https://github.com/ervandew/supertab ~/.vim/bundle/ 编 ...

  8. 【转载】 python之理解super及MRO列表

    原文地址:   https://www.jianshu.com/p/de7d38c84443 ----------------------------------------------------- ...

  9. 视频推荐: Linux 的make自动化编译和通用makefile

    1.Linux 的make自动化编译原理 2.makefile编写规则 3.通用makefile的编写 ================================================ ...

  10. java Hutool工具类之Excel的操作

    1.背景 程序中上传下载excel是家常便饭,因此hutool给我们提供了非充强大的工具类,使用如下...... 2.使用 官方地址:https://hutool.cn/docs/#/poi/Exce ...