If you have great ideas,
Let's talk!

blog

LRM 代码精读 2-[Loss]

3d相关export

很简短的总结一下3种loss

1. LIPIS(Learned Perceptual Image Patch Similarity) Loss

截屏2024-11-15 下午12.22.55.png

基本上就是有很多层feature map 提取 然后每层都算loss

这3种其中 Squeeze-Net 模型最小

这里实现时候只get 两个模型[‘alex’, ‘vgg’]

记得用torch.compile(model(这里model为任何nn.module子类))加速

最后forward时做了一个判断

training时用vgg inference时用’alex’?

2. Pixelwise

从’MSE’ 和’L1’选

这里澄清一下之前说的

@staticmethod并不是和 @abstractmethod 对立才出现的

而是什么情况都可以用

代表该function不用接受self 和class 内部数据

因此不用create instance可以从class.func() 直接调用

注意这里和之前都用了 loss_fn().mean(dim=[1, 2, 3])

input, output dim为(N*M, C, H, W)

N * M = Batch * views

average across 3 dims

这里注意剩下两个dim时 需要拆开来分别mean 最后求整个bath mean

image_loss = self.loss_fn(x, y).mean(dim=[1, 2, 3])
batch_loss = image_loss.reshape(N, M).mean(dim=1)
all_loss = batch_loss.mean()

3. TVLoss

encourage相邻pix的值相近 生成更加natural的图像

截屏2024-11-15 下午1.43.47.png

先分别看 difference in nearby x, y value

diff_i = x[..., 1:, :] - x[..., :-1, :]
diff_j = x[..., :, 1:] - x[..., :, :-1]

分别对diff_i, j Count number of elements(除了 N*M)

def numel_excluding_first_dim(self, x):
    return x.numel() // x.shape[0]

之后就是将sum squared diff/number of ele

最后将tv_i, j 相加 然后和之前一样算总mean