1 概述
如果还没有阅读第一篇文章,建议先阅读。再阅读本章内容
《让您的照片动起来first motion model(1)-关键点抽取模型深度解析》
在第一篇文章中详细介绍了关键点抽取模型的技术关键点以及其雅各比矩阵。相关的数学理论是taylor级数的一阶展开式。关于数学理论部分会单独写文章为大家剖析。在关键点抽取出来之后,我们需要使用关键点位移以及其周边像素的仿射变换,来构建其密集变换模型(dense motion network)。
2、Dense Motion Network
2.1 kp2gaussian
- 该函数会将关键点信息转化为一个区域,涵盖了关键点以及其周围的邻域
- 实现公式
𝑒𝑥𝑝((𝑇𝑆←𝑅(𝑝𝑘)−𝑧)2/𝛿)exp((TS←R(pk)−z)2/δ) - 同时用来计算 原图与驱动图在与本地高斯坐标系对齐情况下的变化,在后续会详细讨论
相关源码如下
def kp2gaussian(kp, spatial_size, kp_variance):
"""
Transform a keypoint into gaussian like representation
"""
#关键点T(pk),shape [batch_size,10,2] 10个关键点
mean = kp['value']
#z 本地坐标关键点 shape [height,width,2]
coordinate_grid = make_coordinate_grid(spatial_size, mean.type())
# 2
number_of_leading_dimensions = len(mean.shape) - 1
# (1,1,hegit,width,2)
shape = (1,) * number_of_leading_dimensions + coordinate_grid.shape
# (1,1,hegit,width,2)
coordinate_grid = coordinate_grid.view(*shape)
#(1, 10, 1, 1, 1)
repeats = mean.shape[:number_of_leading_dimensions] + (1, 1, 1)
# [1, 10, 64, 64, 2]
coordinate_grid = coordinate_grid.repeat(*repeats)
# Preprocess kp shape
[1,10,1,1,2]
shape = mean.shape[:number_of_leading_dimensions] + (1, 1, 2)
mean = mean.view(*shape)
#T(pk)-z
mean_sub = (coordinate_grid - mean)
out = torch.exp(-0.5 * (mean_sub ** 2).sum(-1) / kp_variance)
return out
注意 下面代码
out = torch.exp(-0.5 * (mean_sub ** 2).sum(-1) / kp_variance)
之所以会有0.5出现是因为将两个通道相加需要求均值
相关测试代码如下
gaussian=kp2gaussian(key_point,(64,64),0.01)
figure,ax=plt.subplots(1,2,figsize=(8,4))
ax[0].imshow(gaussian[0][0].data)
ax[1].imshow(kp_test_data)
效果如下
2.2 计算
用于表示关键点与邻域的变化
取 0.01
相关源码如下
def create_heatmap_representations( source_image, kp_driving, kp_source):