欢迎光临散文网 会员登陆 & 注册

1202-1205工作小结

2022-06-26 22:56 作者:Nofear-wave  | 我要投稿


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

(一)1202工作小结

1、manipulate.py分析

输入参数

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

参数含义

编辑部分

首先看懂id_invert中manipulate代码

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实现)

可以看到有溶解现象存在【-5,5】

(二)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对应

看着还凑活,牙有点出戏(lll¬ω¬)


(5)蒙娜丽莎图片尝试


每一步都可能改变方向 uniform(-0.3,0.3)
初次分段插值 random4
美女微笑 {阴森}
为什么总要露牙齿


2、直接修改边界向量b - 1205

通过一系列操作,上头默认的边界向量不会是露牙齿的叭(ˉ▽ˉ;)...

(1)一些问题

ID_invert支持分层语义编辑,可以指定在GAN某些特征层上进行操作

--关于数据格式:(这里使用的GAN特征层为14)

首先查看了数据格式是(14,512),对应GAN的特征层数为14,每一层的512维向量都不同

b.shape=(14,512)

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

源代码中GAN的层数


(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

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


[-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的网址,家人们太好用了)


1202-1205工作小结的评论 (共 条)

分享到微博请遵守国家法律