Pytorch 基于加权平滑过渡的无缝拼接
基于加权平滑过渡的无缝拼接
背景
在做照片数字人视频生成的时候,为了达到快速响应实时播放的需求,即视频的生成速度 必须小于 音频的播放速度。
因此,我们截取了一部分较小的可动区域进行推理生成,然后把生成的图像贴回到原区域。
通常情况下,推理生成图像的 清晰度和色彩 对比 原图 有些许差异,这样导致贴图后的图像区域有明显的边界感和分割感。 如下图所示:

方案选取
最开始我们想到 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 基于加权平滑过渡的无缝拼接的更多相关文章
- 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段 ...
- 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...
- 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...
- Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...
- Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...
- Unity3d Material(材质) 无缝拼接
Unity3d Material(材质) Edit by @灰太龙 在做一个项目的过程中,遇到动态切换壁纸的功能,问题点在无缝拼接! 那我们先查查Unity3d 中的材质球,里面有个参数 Tiling ...
- js实现网页全屏切换(平滑过渡),鼠标滚动切换
实现效果为页面平滑过渡全屏切换,点击导航和鼠标滚动都可以切换. 效果图: html代码: <!DOCTYPE html> <html> <head lang=" ...
- 关于图片无缝拼接的学习(PTGui)
一.简介 在用到单反.无人机.手机等拍照工具,需要无缝拼接. 二.下载 官网:http://www.ptgui.com/download.html 其他:http://pan.baidu.com/sh ...
- 【转】Android循环滚动广告条的完美实现,封装方便,平滑过渡,从网络加载图片,点击广告进入对应网址
Android循环滚动广告条的完美实现,封装方便,平滑过渡,从网络加载图片,点击广告进入对应网址 关注finddreams,一起分享,一起进步: http://blog.csdn.net/finddr ...
- MyBatis3与Spring3无缝集成-从iBatis平滑过渡
从2010开始接触iBatis到现在,一直到现在把iBatis作为数据访问层ORM.为了演示一个Web应用,今天又搭了个SpringMVC应用,由于应用比较简单,Spring版本直接用最新版本3.2. ...
随机推荐
- 【Java】ElasticSearch 在项目里的应用
一.前言: 好久没写笔记了,最近忙一个项目,用到ES查询,以往的笔记写ES都是搭建环境,用Kibana玩一玩 这次是直接调用API操作了,话不多说,进入主题 二.环境前提: 公司用的还是纯Elasti ...
- 低端hdmi视频采集卡的替代方案——向日葵远控
前一阵看直播推货入手了一款hdmi视频采集卡,如下: ======================================================= 使用这个视频采集卡发现两个问题: ...
- SeaTunnel 发布成为 Apache 顶级项目后首个版本 2.3.2,进一步提高 Zeta 引擎稳定性和易用性
近日,Apache SeaTunnel 正式发布 2.3.2 版本.此时距离上一版本 2.3.1 发布已有两个多月,期间我们收集并根据用户和开发者的反馈,在 2.3.2 版本中对 SeaTunnel ...
- SQL Server序列号的获取
建表: 1 USE [JX_IMS_CPK] 2 GO 3 4 SET ANSI_NULLS ON 5 GO 6 7 SET QUOTED_IDENTIFIER ON 8 GO 9 10 CREATE ...
- 国产崛起,Solon:我们的性能是 Spring 的 300%
Solon 应用开发框架(java framework).是从零开始构建,有自主的标准规范与开放生态.纯血国产. 追求: 更快.更小.更简单 提倡: 克制.简洁.高效.开放.生态 相对于 Spring ...
- WIN32下的模拟时钟
#include <Windows.h> #include <math.h> #include <tchar.h> #include "resource. ...
- 动物园 (APIO 2007) 状压DP
动物园 \([APIO \ 2007]\) · 题意: 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物.如下图所示: 你是动物园的公关主管. ...
- js_for循环的错误
本段代码实现的效果是遍历数组中的每个元素,给每个元素插入一个类名 for (var i = 0; i < dropdownLi.length; i++) { if(i == 1){ contin ...
- echarts x轴下绘制表
效果图: 把下面代码复制到官网实例的js代码编辑中即可预览( 附连接:Examples - Apache ECharts) let map = { 销售单价: [2200.0,4000.9,700.0 ...
- Visual Studio Code 配置文件关联
在编写 Linux 的 .service 文件的时候,我发现 .service 文件的本质是 INI 文件.然而 VS Code 却并没有使用 INI 格式进行语法高亮.于是我通过如下设置使 VS C ...