《Neural Pose Transfer by Spatially Adaptive Instance Normalization》

该博客介绍了使用PointNet进行3D人体姿态迁移的方法,通过提取点特征并保持identity风格。关键在于确保生成mesh的点顺序与identitymesh一致。文中提到两种处理posemesh的方式,一种是max pooling后直接返回,另一种是进行归一化后再复制,以证明点的顺序不影响结果。Decoder部分借鉴了图像领域的技术。博客探讨了3D卷积与2D卷积的区别,并指出此方法在处理mesh数据时不会改变点的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概括: 对identity mesh 做pose transfer, 实际上是让提供目标pose的human mesh 学到identity的style。关键在于要让生成的mesh的点的顺序和identity mesh的一致而不是pose mesh。

 

传统的做法是学习在同一个pose下,不同identity style 之间的correspondence,利用correspondence 去算displacement。

做法:这里用PointNet提取点的特征,把每个vertex当做一个point , 但是注意,mesh和point cloud还是不同的,在mesh里我们还需要考虑face, 也就是每个面上的顶点,点与点的连接方式会影响我们的最后结果。

input data中包含identity mesh和pose mesh,用mesh = pymesh.load_mesh读出来是(6890,3) ,也就是6890个点,3通道代表坐标,mesh.faces 还可以得到这个human body的面(13776,3),一共13776个面,这里的3通道指的是组成一个面的3个连接点的index。

对于pose_mesh,文章里用到两种处理方式, 这里贴出代码可以直观一点。

class PoseFeature(nn.Module):
    def __init__(self, num_points = 6890):
        super(PoseFeature, self).__init__()

        self.conv1 = torch.nn.Conv1d(3, 64, 1)
        self.conv2 = torch.nn.Conv1d(64, 128, 1)
        self.conv3 = torch.nn.Conv1d(128, 1024, 1)

        self.norm1 = torch.nn.InstanceNorm1d(64)
        self.norm2 = torch.nn.InstanceNorm1d(128)
        self.norm3 = torch.nn.InstanceNorm1d(1024)

        ### torch.nn.InstanceNorm1d [N,C,L] -> [N,C,L]
        self.num_points = num_points

    def forward(self, x): # B, 3,6890

        x = F.relu(self.norm1(self.conv1(x)))
        x = F.relu(self.norm2(self.conv2(x)))
        x = F.relu(self.norm3(self.conv3(x)))
############# model_maxpool
        x,_ = torch.max(x, 2) #归一化 B 1024 1
        x = x.view(-1, 1024)
        x = x.view(-1, 1024, 1).repeat(1, 1, self.num_points)  # B 1024 6890

        return x

一种处理方式是在### model__maxpool 上面就结束了,在这一步就把x=F.relu(xxx) 作为最终结果return, 一种处理方式是加上下面三行代码,用torch.max 先对dim=2 归一化,然后再复制6890个,这样子做应该是为了证明无论所有点的Order如何,都不影响最终的结果,因为都是取最大的那个点再复制。

需要注意的是,不同于我们在图像上做2维卷积,会对图像的大小进行改变,随着叠加卷积层,特征图会越来越小(如果不考虑Padding的话),而在3d上做1维卷积,用的都是kernel=1的卷积核,不会改变大小,整个过程只改变了通道数。

后面的decoder是参考图像上spade的方法,之前也有介绍过,就不详述了。

<think>好的,我现在要解决用户关于Batch Normalization(BN)和Instance Normalization(IN)的适用场景及最佳实践的问题。首先,我需要回顾一下这两种归一化方法的基本原理,然后比较它们的差异,再找出各自的适用场景和使用建议。 用户提供的引用资料已经比较全面,我需要仔细阅读这些引用内容,确保理解正确。根据引用[4],BN是对一个批次中所有样本的同一通道进行归一化,而IN是对单个样本的单个通道进行归一化。这说明BN依赖于批次的大小,而IN则不,这可能影响它们在训练和测试时的表现。 接下来,适用场景方面,引用[4]提到BN在大型数据集和深层网络中表现良好,比如图像分类任务。而IN更适用于生成任务,如风格迁移,因为生成任务中每个样本需要独立处理,保持样本内的特征。引用[2]和[3]也支持这一点,指出IN在图像生成中的优势。 关于内部协变量偏移的问题,引用[5]提到BN通过减少这种偏移来稳定训练,而IN可能在这方面效果不同,因为它处理的是单个样本。此外,引用[1]和[3]讨论了不同的归一化方法,包括Group Normalization和Layer Normalization,但用户主要关注BN和IN,所以需要集中在这两者。 最佳实践方面,用户可能需要知道何时选择BN或IN,如何调整参数,比如在BN中批次大小的选择,或者IN在GAN中的应用。另外,测试时的处理也很重要,BN在测试时使用移动平均,而IN则不需要,这一点需要强调。 最后,生成相关问题时要考虑用户可能进一步想了解的内容,比如与其他归一化方法的对比,具体应用案例,或者实验中的调参技巧。需要确保问题覆盖用户可能的后续疑问,帮助他们深入学习。 现在需要整理这些思路,确保回答结构清晰,符合用户的要求,使用中文,正确应用引用标注,并生成相关问题。同时,检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$。</think>### Batch NormalizationInstance Normalization的对比与最佳实践 #### 一、核心原理对比 1. **Batch Normalization (BN)** - **归一化维度**:对批次中所有样本的**同一通道**进行归一化。 公式:$$ \mu_c = \frac{1}{N \cdot H \cdot W} \sum_{n=1}^N \sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ 其中,$N$为批次大小,$H$和$W$为特征图的高宽,$c$为通道索引[^4]。 - **优点**:减少内部协变量偏移,加速训练,允许更大的学习率[^5]。 - **依赖**:对批次大小敏感,小批次时效果不稳定。 2. **Instance Normalization (IN)** - **归一化维度**:对**单个样本的单个通道**独立归一化。 公式:$$ \mu_{n,c} = \frac{1}{H \cdot W} \sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ 其中,$n$为样本索引,$c$为通道索引[^4]。 - **优点**:保留样本内风格特征,适合生成任务。 #### 二、适用场景 | **方法** | **适用场景** | **典型案例** | |--------------------|----------------------------------------------------------------------------|---------------------------| | **Batch Norm** | - 大规模数据集(如ImageNet)<br>- 深层网络(ResNet)<br>- 分类/检测任务 | 图像分类、目标检测[^1] | | **Instance Norm** | - 生成对抗网络(GAN)<br>- 风格迁移<br>- 小批次或单样本任务 | StyleGAN、Neural Style | #### 三、最佳实践 1. **BN的使用技巧** - **批次大小**:建议至少32,避免小批次导致统计量估计不准确。 - **位置**:通常置于卷积层后、激活函数前。 - **推理阶段**:使用训练时计算的移动平均$\mu$和$\sigma$[^3]。 2. **IN的使用技巧** - **风格敏感任务**:在风格迁移中,IN可分离内容与风格信息[^4]。 - **与Dropout的兼容性**:IN通常不与Dropout共用,避免破坏样本独立性。 - **轻量级模型**:适合移动端生成任务(如滤镜应用)。 #### 四、实验对比示例 ```python # BN层(PyTorch实现) nn.BatchNorm2d(num_features=64) # IN层(PyTorch实现) nn.InstanceNorm2d(num_features=64) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值