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

背景

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

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

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

方案选取

最开始我们想到 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. Gymnasium 环境搭建

    [默认在链接公网环境]!!!! 一.      Conda虚拟环境搭建[安装则忽略] 1.1 检查本地适配python版本 >python -V 1.2根据版本下载并安装aconda[这里默认使 ...

  2. 【Java】【常用类】Comparable 可比较接口 Comparator 比较器接口

    我们需要对对象进行排序,但是对象不是像基本类型的那样,是具体的数值 如果要对对象比较,需要实现两个接口的任意一个即可 Comparable 可比较接口 Comparator 比较器接口 String包 ...

  3. 【C】Re02

    一.命令行参数 #include <stdio.h> /** * 运行执行程序的命令携带 一些附加参数,传递给程序执行 * @param argc 命令行参数的个数 * @param ar ...

  4. Google的jax框架在TPU上的循环控制 —— 向量计算设备的循环结构控制

    相关: https://jax.readthedocs.io/en/latest/pallas/tpu.html 向量计算设备,如:GPU.TPU等,都是通过向量计算来进行加速的,因此在这类设备中进行 ...

  5. 【转载】 PID原理与参数调试

    原文地址: http://m.elecfans.com/article/1153309.html --------------------------------------------------- ...

  6. Illegal key size or default parameters 解决方案

    1.背景 在做aes加密时,报错 Illegal key size or default parameters...有的jdk版本报错,有的不报错,原因在于: jdk 或jre\lib\securit ...

  7. vba for excel 随笔

    q1: excel 没有vba入口 1. 快捷键:Alt + F11 2.调出开发工具 1. 打开文件后,依次点击菜单项[文件]-[选项]: 2.在"Excel"选项界面中点击左侧 ...

  8. 公众号3w粉丝了,说说我的下一步计划吧

    终于30000了 不知不觉,已经3w粉丝了,2020年8月8日到现在一共1年零6个月. 到目前为止,原创文章一共 194 篇, 文章头条阅读量基本在1000-3000, 也终于有了两篇文章阅读过万. ...

  9. 防止npm被墙的小技巧

    方法一: 全局安装中国服务器的包管理工具 npm i cnpm --global 下载包的时候用cnpm取代npm 方法二: 在小黑板输入:npm config set registry https: ...

  10. AI驱动的PlantUML:快速生成专业级UML类图和用例图

    承接前文关于如何运用 AI 工具生成时序图的内容[1],今天我们继续探讨 AI 驱动的 PlantUML:高效创建专业的 UML 类图与用例图. [1]: https://juejin.cn/post ...