Animatable Neural Radiance Fields for Modeling Dynamic Human Bodies对着这篇论文作一个讲解

为什么想去讲一下,因为我还是去搜了一下关于这个文章的讲解,基本上没有说讲的很透彻的,基本上就是把论文里的内容选择性的去翻译了一下,我也不知道那样有啥用。那么接下里我去讲解一下这篇论文的实现。按照惯例还是先上图,这个图也就是这个论文的大致框架。按照这个图来讲解。先说一下哈,如果有感觉不清楚的,去看一下我前几个论文。我在这只去讲解关于这篇论文的独特的地方,共性,不会花很长时间去讲解。

首先看这个图由几部分组成,横向去看一共四部分吧分别是observation space,还有一个混合权重场和那个Eq.4这个可以看成一个,这个东西其实他就是相当于前门几篇文章中的bending网络(对光线进行偏移变形的也可以说是对射线上采样点的偏移对把,还有如果不明白这里的去看一下我前面的文章,我不想重复的去讲一个东西,太浪费时间了)接下来就是canonical space这个是和前几篇文章的概念一样的一点都没有变就是一个标准的空间(也就是它这里面存在的信息是就是某一个时刻的物体的状态,不理解可以看一下前面几篇文章,那里细讲了)接下来就是一个原始的nerf,这个标准空间中的物体姿态信息都是在这个标准的nerf中存储的对吧,其实它和原始的nerf还是有一个地方不一样的就是它在预测颜色的时候是多加了一个appearance codeLi 也就是上面图片也标出来了,原始nerf在预测颜色的时候就多加了方向d。然后nerf的下面是不是还有一个混合权重场(neural blend weight field)这个其实和前面那个一样,是不是看到这一脸懵,这都是什么啊,别急我接下来去逐个的去讲解一下。

首先看第一个图,也就是observation space 这个视角采样,这些东西我就都不讲了,前面讲过,然后选择其中的一个样本点x举例,去看整个流程,首先这个样本点是不是要经过这个神经混合权重场的东西,这是算了个什么东西啊,为啥要用这个东西呢,为啥不能像前面几篇论文讲的一样直接用一个全连接层的一个网络去进行偏转呢,因为这篇文章是不是重点是放在重建人体上,因为只是一种物体,它是不是有很多共性,比如说正常人的骨头关节是不是都是固定的,这些是不是一些先验知识,我们之前就知道的,正是因为这些它才用这里的这个结构,他是不是可以增加一些“约束”(因为加了先验知识对它的限制)去使结果更容易逼近全局最优解,相比之前那种直接加个多层感知机(MLP)要有更多的限制,也就更不会去使得到的结果是局部最优对吧,我刚才一直说是不是其实它这个结构就是一个使样本点发生器偏转的一个东西,并且它是加了人体一些先验知识的,它具体是什么样的呢,首先这个neural blend weight 这是个什么东西,还是得先了解与一下SMPL,什么是SMPL呢?就可以把它认为是一个它定义了人体大致的结构,就是有6890 个顶点和 13776 个三角形面的三维网格并且模型由 24 个关节组成,每个关节有对应的旋转矩阵,并且个顶点有一个 24 维的混合权重向量,表示该顶点受不同关节的影响程度,这里的混合权重向量的概念就出来了,其实咱们要求得也就是这个24维的混合权重向量,再往下的话我觉得来看这个公式更好理解一点

这个公式就是描述的是这个部分首先这个是代表的什么呢这就是代表的这个上面这个网络,ψi是作为一个输入,这个是这一帧的一个潜在编码(这个是什么东西我前面文章也详细讲过)还有就是那个样本点作为输入,然后输出的就是这个东西,它是个24维的对吧,接下来看这个是什么东西呢,它其实就是用咱们刚才说的那个SMLP算出来的,咱们训练的时候不是输入的是视频么,视频的每一帧然后提取出来,就是一张张图像,然后SMPL那6890 个顶点和 13776 个三角形面的三维网格尽可能的去拟合这个咱们给的这个照片中人物的姿态,然后SMPL是不是就能给出它每一个点的混合权重,但是它这些点并不是我们的采样点对吧,然后用我们的采样点去查找在它拟合的这个三维的的三角网格中离得最近的那个三角平面(这个可以用最近点搜索算法实现),因为这个三角平面的每个顶点的混合权重(SMPL计算得到的)我们是知道对吧,然后再用重心坐标插值计算目标点的混合权重,这样我们就计算出来了一个大致的有偏差的混合权重对吧,这时候就用咱们前面计算的那个神经多层感知机计算出来的这个东西对它进行调整,其实也就可以理解为,我这个东西就是给SMPL那个计算出来的结果进行微调的,占大头的还是SMPL那个对吧,之后这个Wi就算出来了,还有刚才不是说过SMPL有24个关节这24个关节都对应了一个SE(3)变换矩阵,这个东西你就可以理解为,我要训练的这个图片中人体的姿态要变化到标准空间中的姿态(在SMPL中它定义的标准空间中的姿态就是T字形的,也就是最上面的大图中的canonical space中的人的姿态)要怎么旋转平移(也就是这个变换矩阵)然后这24个关节的变换矩阵组成了变换矩阵集合 {G^{_{k}}},(还有这里插一点东西,刚才不是说人体的先验知识就是体现在SMPL上包括他的这个SE(3)因为人体每个关节旋转什么的都是有限度的对吧)好了接下来就可以讲解这个东西了现在再看这里面的每一个东西是不是所有的都讲过了,w就是那个样本点混合权重(混合权重有什么作用呢?是不是就是表示这个点被哪个关节运动影响大一点,其实就是相当于一个权重),然后这个点分别被这24个关节运动共同影响(比如说w1描述的是它被第一个关节影响的权重w24那就是被第24个关节影响的权重)然后通过上面这个(线性混合蒙皮算法)就可以算出来这个样本点的偏移,v'就是偏移的样本点,v是咱们输入的样本点。(这个公式也就是Eq.4那个过程)。前面的偏转就讲解完了,再看后面的是不是偏转以后就可以弄到nerf里进行预测然后这个点的颜色和密度然后再进行渲染然后再对渲染后的照片每一个像素颜色去和原始图像颜色做对比计算损失然后反向传播(这个过程我就不细说了,前面几篇文章详细讲过)只不过它这里有个appearance codeLi是原nerf没有的,它就是在预测颜色的时候相当于去多加了更详细的对这个照片(训练的)外表的信息嘛,去更精准的去预测它的颜色剩下就没什么了,接下来再看一下这个nerf下面这个这也是神经混合权重网络,市区计算canonical space中的点的混合权重,至于为什么去计算这个,我接下来会讲,它计算出来之后怎么去对它进行反向传播呢,得有个损失函数吧有个损失值才可以反向传播,这里它用了点混合权重的一致性,说人话就是我采样的那个样本点x,通过神经混合权重网络映射到canonical space 对应的那个点x'这两个点是不是他们的混合权重是一样的(因为就是姿态不同了,但是相对位置没变对吧)然后这个网络就是用前面那个神经混合权重的值去和后面的这个神经混合权重的值做一个相减作为后面这个损失(因为前面那个神经混合权重网络的参数是可以通过图像上颜色的损失去进行调整的对吧)具体公式就是前面的这个w就是前面的那个神经混合权重网络计算出来的,后面的这个w^{can}就是后面那个神经混合权重网络计算出来的x就是原始没有被偏移的样本点,而T_{i}(x)就是被偏移到canonical space空间的那个点,至于后面这个混合权重网络有什么用接下里生成新的视角下中会用到它输出的值(再强调一遍,这个,损失是不是使后面这个混合权重网络输出的值与其前面那个混合权重网络输出的值基本一样)。接下来去讲一下第二个混合权重网络有什么作用,它的作用在合成新的姿态的人体图像的时候体现出来,具体来看一下,合成新姿态的人体图像的流程,为了方便观看我复制一下图片到这

如果想渲染一个新的“这个人(有皮肤的)的姿态”是不是要给出一个“姿态(只有姿态,没有“皮肤”)”和潜在编码(latent code)并且还有这个appearance code Li 但是这里没办法去训练优化啊,这个是我很纳闷的,我没看代码实现,环境有点问题,这块保留,我猜应该是直接拿latent code ψi直接去拿到那用了,因为都是这两个潜在编码其实都是对这个图片的描述嘛,只不过这个ψi是侧重于这个物体的姿态信息,而这个Li更侧重于表面颜色之类的信息,我明天调一下环境然后再去看代码实现吧,现在接着去讲这个流程有了姿态这个信息是不是可以用SMLP计算出新的G_{k}然后是不是也可以计算出采样点(提一下这里的采样点是怎么去采样的,咱们不是把姿态信息给了SMLP,他不是拟合一个三角网格的一个三维的轮廓也就意味着长宽高(一个立方体)都有,然后在观察点向这个立方体内去进行射线然后采样)的混合权重,这个计算方法和上面那训练时的步骤一样,然后计算出来w_{i}然后这个时候是不是这个姿态下的latent code ψi还是一个初始的值没有经过优化呢,它还不能准确描述这个姿态的信息,也就不能准确的给出w_{i}对吧,这时候也就没办法去做一个很准确的一个映射,比如说这个latent code ψi是描述输入的姿态的姿态信息的,但是初始化一般就是随机的它,完全就是随机的一个姿态信息,谁都不知到它代表的是那个姿态的信息,那么比如说我随即出来的这个ψi是描述一个蹲着的姿态的一个信息,那么那个射线上的采样的点是我屁股上的一个点比如这个图(我屁股上的这个点的坐标和手叉腰手上这个点的坐标是一样的)有点抽象,但是理解意思就好,是不是虽然我姿态给的是这个姿态但是我一开始我的潜在编码不知道啊,还没有被优化过,是初始的,并且我初始化的那个潜在编码恰好表示的就是我上面画的那个图的姿态这里补充一下一点上面说的,看这个公式是不是就是去求w_{i}的,上面讲过,S_{i}是什么还记得么?他是不是就是描述这个站立姿态的信息的,然后用这个站立姿态的信息去求x这个点的混合权重意味着什么,是不是这个部分求出来的是站立姿态下x点处的混合权重(也就是手叉腰那个手上的点),但是这个是求得什么的,是不是我蹲着的那个姿态下x点位置对应的去调整混合权重的那个值这个,这个上面讲过,一个点的混合权重的值主要由去决定的对吧,这个是由SMPL算出来的,SMPL它是一个传统方法,它是不是可解释性更强,但是它的精度不够,所以用神经网络也就是这部分去对它相当于进行个微调其实就相当于这个又上下加了一个调整它的数对吧,好再去细讲了一下这里,接着上面的思路接着说,这个东西用的姿态信息(ψi)是不是蹲着那个,而这个用的姿态是不是手叉腰站着的那个,那么这完全就是不是一个对应的姿态对吧,所以它计算出来的这个w_{i}本应该是去计算手叉腰的那个点的,但是是不是其实不是,因为这个是调整屁股上的那个点混合权重的,意味着用调整屁股上的那个点的值去调整手叉腰手上的那个点的值,所以求出来的w_{i}的混合权重的值肯定不是手叉腰手上那个点的值对吧(这个w_{i}的值对应到了其他别的其他地方得值了,比如说脚上的一个点的值),然后这个w_{i}又带入到这里面是不是算出来的那个v'肯定不是“正确的”(因为用脚上的那个点的w_{i}值去计算v这个点(也就是手叉腰手上的那个点)发生的偏转,这是不是很离谱,所以v这个点映射到canonical space中的那个点在肚子上接着看括号外面的字),就是说这个点v本应该映射到手上的,我映射到了其他地方(比如说肚子)那我肚子这个点用第二这混合权重场求出来的w^{can}的值肯定和w_{i}不一样对吧,说一下为什么肯不一样有两点原因:1.是不是这两个点完全就是各玩各的,就不是对应的点,2.计算wi的时候这个公式中这俩值根本不对应一个点,算出来的wi那是啥东西(其实这2导致了1问题的产生对吧),但是Eq.4中的变换矩阵集合 {G^{_{k}}}是不是描述的是这个姿态的变换到标准空间人姿态(T字形的人姿态)的变换矩阵,这样就导致,然后canonical sapce中的那个点去计算的w^{can}应该是正确的混合权重,因为这个是在训练阶段已经训练好的,并且在这个阶段不去改动它了,将它就认为是对的,计算出来的w^{can}是不是和w_{i}肯定不是一样的对吧,因为代表的点都不是一样的,所以所有的都是固定的只有新姿态的潜在编码是可以优化的(因为认为其他的都是对的,因为训练过,只能是潜在编码不对,它是错的,它表示的那个姿态不是我给的那个姿态,所以我要去把我这个潜在编码调整到确实是描述我这个姿态为止)这也就是第二个神经混合权重场的用处,(总结一下上面描述的问题简单来概括一句话就是我human skeleton(也就是变换矩阵集合 {G^{_{k}}})它描述的是站立叉腰姿态,而这个潜在编码描述的是我蹲着那个姿态,又因为所以求出来的wi是一个错误的,因为wi是错误的所以我想映射的那个点v映射到canonical space中的v'不是正确对应的),然后调整好了以后,是不是就可以用nerf进行渲染了,然后输入到nerf中,(在调整他的潜在编码的时候不会去让nerf进行渲染的,就是不对让nerf进行预测它的颜色和密度信息)因为那还没有调整好,渲染出来也是错的,比如原本是叉腰的手指上的一个点,但是映射过来是脑袋上一个点,是不是我nerf渲染出来的颜色和密度都是脑袋上点的那个值,也就是说,我把脑袋上的那个点的值(颜色,和密度)给了手上那个点。这个点说完了,这是不是渲染出来的是一个平面的图像,接下里看怎么渲染三维的。

首先咱们不是训练好了原始nerf然后再再通过给几个视角然后去生成不同视角下的canonical space中人体姿态的图像,然后通过这些图像到SMPL中去拟合一个人体的一个三维体,是不是这个三维体的长宽高都是可以求出来的,然后再把这个立方体分为一个个体素尺寸为 5mm × 5mm × 5mm然后再去用nerf估计估计各个体素的密度,一个体素中不是有好几个顶点么,用这几个顶点输入到nerf中给出密度然后取平均值,作为这个体素的密度,然后用Marching Cubes 算法提取人体网格(就是找密度的一个等值面),然后用神经混合场w^{can}去计算网格顶点的混合权重,然后给出一个新的姿态用去变化每一个顶点,就得到了变换后的3d人体,后续取补充我上面的疑问

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常抱歉,我理解错了你的需求。如果你希望固定大小的文本框内展示长文字,并实现跑马灯效果,可以使用`Box`和`Animatable`来实现。以下是修改后的代码示例: ```kotlin @Composable fun MarqueeText(text: String) { val offsetX = remember { Animatable(0f) } LaunchedEffect(text) { offsetX.animateTo( targetValue = -text.width.toFloat(), animationSpec = infiniteRepeatable( animation = tween(durationMillis = 3000), repeatMode = RepeatMode.Restart ) ) } Box( modifier = Modifier .fillMaxWidth() .height(30.dp) .background(Color.LightGray) ) { Text( text = text, modifier = Modifier.offset(x = offsetX.value), style = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.Bold), overflow = TextOverflow.Visible ) } } ``` 在这个示例中,我们使用了`Animatable`来控制文本的偏移量。通过调用`animateTo`方法,并设置`targetValue`为负文本的宽度,可以实现跑马灯效果。在`LaunchedEffect`中,我们监听了`text`参数的变化,当文本发生变化时,会重新开始动画。 你可以像这样使用`MarqueeText`函数: ```kotlin @Composable fun MyScreen() { // ... MarqueeText(text = "这是一个跑马灯效果的长文本,它会在固定大小的文本框内展示,并实现跑马灯效果") // ... } ``` 在这个示例中,文本会在一个固定大小的文本框内展示,并实现跑马灯效果。你可以根据具体需求调整文本框的大小和其他样式。希望这次修改后能满足你的需求!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值