1202-1205工作小结

仍旧是尝试在隐空间中随机游动,并尝试寻找一个子空间,该子空间对应所有“笑”的属性,进而对一张图片笑的状态提取情感space;现实意义,生成同一属性不同情感的图片,可以达到对图片进行情感编辑,或者同一段台词的不同情感演绎效果

(一)1202工作小结
1、manipulate.py分析

`distance` is sign sensitive.表示distance这个参数值对正负值有不同表现(符号敏感)

编辑部分

np.tile(A, reps)
复制数组元素输入,A是数组,reps是个list,reps的元素表示对A的各个axis进行重复的次数
np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y
key_idea:代入语义边界和latent_code,定义L插值向量和步长,生成每一步对应的code
大概意思能够get√到,今天暂时只看懂了部分代码,如何分层操作还没有很懂;
基于已有语义向量做一些尝试。
2、manipulate代码初步修改
首先利用manipulate代码对图片语义进行线性编辑,效果不是很好,编辑的幅度过大了😓

#随机漫步修改插值方式 - 对l进行修改即可
l = np.random.uniform(-1,1,step) #左右随机游动
l = (np.cumsum(l)).reshape([step if axis == 1 else 1 for axis in range(x.ndim)])
results = np.where(is_manipulatable, x + l*b, results)


1202尝试如上,效果都没有特别好,但是明显看到上边这幅图的溶解现象不那么明显了!
上边效果不好的原因是随机游动左右横跳间隔时间过短,导致不真实;
下一步工作考虑将l进行分段,每一小段上之后只朝着一个方向移动,随机选择每段移动的方向(1203实现)
3、video
插值方法生成video不逼真的主要原因:插值过程有新数据产生,类似像素变换;video变化是几何变换。
不是现有GAN的generater生成图片不够真实的问题
也不是考虑单纯某个部位动而其他部位不动(例如微笑只是嘴动,那是不可能的)
关键在于真实的视频每一帧之间单纯是像素点的移动,而每个个体或事物一旦在视频中出现,以物体为例,它的整体像素是确定的,视频中的“动”是物体像素进行了几何变换,而不是像素变换的结果。

而利用插值生成video中随着步长变动,原始个体进行了像素变换并非像素整体的几何变换,所以才会有溶解的效果。(联想到stylegan3做的平移旋转不变性,其实它下一步应该进行的工作就是video生成了)
-------溶解现象的实质:对个体的像素进行了像素值的变换(以下图为例,可以看到肩膀部分出现了像素变换,即将原始肩膀对应像素值变小0对应黑色)。
我们希望在插值过程中,发生的是几何变换并非像素变换。-还是想试下MH算法,如果不变帧比较多的话是否能缓解这种现象?(1203实现)

(二)1204探路尝试
1、尝试分段函数进行语义编辑
(1)思路简单,就是将step分为几个小区间,区间内移动方向相同,相邻区间之间符号相反
但首次运行后结果出现了很大的问题
l = np.ones(step)
temp = [0.35,0.58,0.75,0.85,1]
for i in range(len(temp)):
m = -2*(i%2)+1
if i == 0:
l[0] = m*np.random.uniform(0,0.3)
for j in range(int(step*temp[i]-1)):
l[j+1] = l[j] + m*np.random.uniform(0,0.3)
else:
a = int(step*temp[i-1])
for j in range(int(step*temp[i]-a)):
l[a+j] = l[a+j-1] + m*np.random.uniform(0,0.3)
l0 = l.reshape([step if axis == 1 else 1 for axis in range(x.ndim)])
results = np.where(is_manipulatable, x + l0*b, results)
#我的问题,这段代码中定义的正负方向变量b和语义边界向量b重名导致结果出错
#这里其实就对应我修改了语义向量b得到的结果,提供另一种探索路径,直接修改语义向量b!

(2)修正上述错误之后,得到如下结果
l = np.ones(step)
temp = [0.35,0.58,0.75,0.85,1] #摆动列标
for i in range(len(temp)):
m = -2*(i%2)+1
if i == 0:
l[0] = m*np.random.uniform(0,0.3) #0.3变动幅度
for j in range(int(step*temp[i]-1)):
l[j+1] = l[j] + m*np.random.uniform(0,0.3)
else:
a = int(step*temp[i-1])
for j in range(int(step*temp[i]-a)):
l[a+j] = l[a+j-1] + m*np.random.uniform(0,0.3)

(3)对摆动频率temp和幅度值0.3进行微调

(4)设置flag,指定方向{1,-1,0}
(1)中初步想法是设置相邻区间移动方向相反,即flag=[1,-1,1,-1]交替进行,进一步考虑添加过渡的不变帧 flag = [1,0,-1,0,1,0,-1,1] ,长度与temp对应

(5)蒙娜丽莎图片尝试




2、直接修改边界向量b - 1205
通过一系列操作,上头默认的边界向量不会是露牙齿的叭(ˉ▽ˉ;)...
(1)一些问题
ID_invert支持分层语义编辑,可以指定在GAN某些特征层上进行操作
--关于数据格式:(这里使用的GAN特征层为14)
首先查看了数据格式是(14,512),对应GAN的特征层数为14,每一层的512维向量都不同

其次interfacegan中默认的语义向量中默认分层语义编辑,且包含了具体在哪些层上进行编辑


(2)根据(1)中分析的数据格式,有两种思路,自定义分层编辑的层数和指定层数(或者不分层),直接修改边界向量b。两种方向都可以进行尝试。
(3)保持b不变,修改编辑层数(对应code中manipulate.py)
if isinstance(boundary_file, dict):
boundary = boundary_file['boundary']
manipulate_layers = boundary_file['meta_data']['manipulate_layers']
codes = manipulate(latent_codes=latent_codes,
boundary=boundary,
start_distance=args.start_distance,
end_distance=args.end_distance,
step=step,
layerwise_manipulation=True, #进行逐层操作
num_layers=generator.num_layers,
manipulate_layers=manipulate_layers, #指定修改的层数
is_code_layerwise=True, #不进行逐层操作
is_boundary_layerwise=True) #不进行逐层操作
(a)不逐层操作
layerwise_manipulation=False
is_code_layerwise=False
is_boundary_layerwise=False

只看变化效果差不多,但不分层图像背景颜色发生了变化

[-3,3] step=100 linear
(b)逐层操作指定层数
num_layers=[1,2,3,4]
(4)不进行逐层语义编辑,直接修改语义向量
首先自定义b向量为512空间的标准正交基-512个,慢慢尝试
参考
https://ezgif.com/maker/ezgif-5-21a103f5-gif(一键生成gif的网址,家人们太好用了)