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

背景

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

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

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

方案选取

最开始我们想到 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. 【Java】自制查找工具

    需求:查找后台代码中写的SQL是否包含拆分表,如果存在,则返回那些表名 Context.txt 粘贴我们找到的DAO层代码,因为所有方法封装的SQL都在DAO层里[就理解为筛查的字符串] Dictio ...

  2. 深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢

    经常会遇到有人在网上说,TensorFlow的计算结果比pytorch的高上几个百分点,也有人说RTX3090的计算结果没有A100的好,还有人说NPU的计算结果比GPU的高,而且这种说法在业内也是极 ...

  3. docker容器挂载host宿主机的本地目录,docker容器与宿主机之间互相拷贝文件

    docker容器挂载host宿主机的本地目录,docker容器与宿主机之间互相拷贝文件 参考于: https://blog.csdn.net/weixin_37773766/article/detai ...

  4. 腾达Tenda电力猫PA3的无线名称和密码

    趁着2023年的双11,买了一对腾达电力猫,毕竟在家里长距离使用这东西还是蛮方便的. =============================== 配置其实蛮简单的,配对嘛,就是两个都插上电,然后在 ...

  5. linux终端alacritty导致计算机死机的解决方式——Ubuntu18.04系统Nvidia显卡

    如题所述,近日在自己Ubuntu18.04的系统上安装了alacritty终端,安装这个终端主要原因就是可以出现透明桌面,说白了就是漂亮,beautiful,但是这个终端安装后系统就变得极不稳定,经常 ...

  6. 安装华为软件昇腾mindspore-gpu-1.9.0失败记录

    官网安装地址: https://www.mindspore.cn/install PS: 不得不说华为的软件是愈发的不好用了,这个mindspore老版本去年我是使用过的,安装也是比较方便的,搞不清这 ...

  7. php日常收获

    php 1.sprintf 用法(晚上写成blog w3cschool可查) 2.使用thinkphp getfield 方法时只查询一个字段默认返回第一条数据, 如果想要返回数组需要写成: $thi ...

  8. 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试

    playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了. 怎么用 既然是 ...

  9. 教程 | 使用 Apache SeaTunnel 同步本地文件到阿里云 OSS

    一直以来,大数据量一直是爆炸性增长,每天几十 TB 的数据增量已经非常常见,但云存储相对来说还是不便宜的.众多云上的大数据用户特别希望可以非常简单快速的将文件移动到更实惠的 S3.OSS 上进行保存, ...

  10. 华为交换机S5700-52C-EI配置以太网和snmp服务

    配置以太网 通过超级终端Hyper Terminal和console串口线链接华为交换机 # 用超级终端打开,配上串口线,用9600波特率链接 system-view interface Vlanif ...