add chamfer loss
This commit is contained in:
@@ -18,6 +18,52 @@ from models.depth_estim import DepthEstimation
|
||||
from models.convnext import ConvNeXt
|
||||
|
||||
|
||||
|
||||
|
||||
def plot3d(depth, mask):
|
||||
import kornia
|
||||
import plotly.graph_objects as go
|
||||
from data.render import intrinsic
|
||||
K = torch.tensor(intrinsic()[None, :, :], device='cuda')
|
||||
pc = kornia.geometry.depth.depth_to_3d(depth, K, normalize_points=True)
|
||||
pc = pc[0,:,mask[0]].detach().cpu().numpy()
|
||||
|
||||
go.Figure(data = [go.Scatter3d(x=pc[0,:], y=pc[1,:], z=pc[2,:], marker=dict(size=3, line=dict(width=0)), mode='markers'),
|
||||
]).show()
|
||||
|
||||
|
||||
def chamfer_loss(depth_image, vertices, depth_mask, mesh_mask):
|
||||
import kornia
|
||||
import pytorch3d
|
||||
from data.render import intrinsic
|
||||
from pytorch3d.structures import Pointclouds
|
||||
from utils.pytorch3d_chamfer import chamfer_distance
|
||||
from pytorch3d.ops.points_normals import estimate_pointcloud_normals
|
||||
from utils.data_utils import get_normals_from_depth
|
||||
K = torch.tensor(intrinsic()[None, :, :], device='cuda')
|
||||
pc = kornia.geometry.depth.depth_to_3d(depth_image, K, normalize_points=True)
|
||||
pc = [torch.permute(pc[i,:,depth_mask[i]], [1,0]) for i in range(depth_image.shape[0])]
|
||||
pc_pc = Pointclouds(pc)
|
||||
mesh_gt = [vertices[i, mesh_mask[i], :] for i in range(vertices.shape[0])]
|
||||
mesh_gt_pc = Pointclouds(mesh_gt)
|
||||
pc_norm = get_normals_from_depth(depth_image, depth_mask, K)
|
||||
mesh_norm = estimate_pointcloud_normals(mesh_gt_pc, neighborhood_size=50)
|
||||
|
||||
chamfer = chamfer_distance(pc_pc, mesh_gt_pc, x_normals=pc_norm, y_normals=mesh_norm)
|
||||
|
||||
return chamfer
|
||||
|
||||
|
||||
def normal_loss(depth_image, depth_mask, normal_image_gt):
|
||||
import kornia
|
||||
import pytorch3d
|
||||
from data.render import intrinsic
|
||||
K = torch.tensor(intrinsic()[None, :, :], device='cuda')
|
||||
pc = kornia.geometry.depth.depth_to_3d(depth_image, K, normalize_points=True)
|
||||
pc = torch.stack([pc[i,:,depth_mask[i]] for i in range(depth_image.shape[0])])
|
||||
normal_image = get_normals_from_depth(depth_image[None,:,:], depth_mask[None,:,:], K)
|
||||
pass
|
||||
|
||||
def train_step(batch):
|
||||
### Training
|
||||
model.train() # train mode is on by default after construction
|
||||
@@ -26,7 +72,9 @@ def train_step(batch):
|
||||
y_pred = model([batch['rgb_image'], batch['view']])
|
||||
|
||||
# 2. Calculate loss
|
||||
loss = loss_fn(y_pred * batch['depth_mask'][:,None,:,:], batch['depth_image'][:,None,:,:] * batch['depth_mask'][:,None,:,:])
|
||||
mse = loss_fn(y_pred * batch['depth_mask'][:,None,:,:], batch['depth_image'][:,None,:,:] * batch['depth_mask'][:,None,:,:])
|
||||
chamfer, _ = chamfer_loss(y_pred, batch['mesh_posed'], batch['depth_mask'], batch['mesh_mask'])
|
||||
loss = mse + 1e-1 * chamfer
|
||||
|
||||
# 3. Zero grad optimizer
|
||||
optimizer.zero_grad()
|
||||
@@ -46,9 +94,11 @@ def valid_step(batch):
|
||||
# 1. Forward pass
|
||||
with torch.inference_mode():
|
||||
pred = model([batch['rgb_image'], batch['view']])
|
||||
|
||||
|
||||
# 2. Calculate the loss
|
||||
loss = loss_fn(pred * batch['depth_mask'][:,None,:,:], batch['depth_image'][:,None,:,:] * batch['depth_mask'][:,None,:,:])
|
||||
mse = loss_fn(pred * batch['depth_mask'][:,None,:,:], batch['depth_image'][:,None,:,:] * batch['depth_mask'][:,None,:,:])
|
||||
chamfer, _ = chamfer_loss(pred, batch['mesh_posed'], batch['depth_mask'], batch['mesh_mask'])
|
||||
loss = mse + 1e-1 * chamfer
|
||||
|
||||
return { 'valid/loss': loss.detach().cpu().numpy() }
|
||||
|
||||
@@ -63,14 +113,18 @@ def batch_to_device(batch, device):
|
||||
if __name__ == '__main__':
|
||||
device = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
|
||||
train_dataset = Dataset('dataset/CLOTH3D/train', 'dataset/CLOTH3D2RGB/train', 'frames_small.txt')
|
||||
valid_dataset = Dataset('dataset/CLOTH3D/train', 'dataset/CLOTH3D2RGB/train', 'frames_small.txt')
|
||||
train_dataloader = DataLoader(train_dataset, batch_size=2, drop_last=True, num_workers=0)
|
||||
valid_dataloader = DataLoader(valid_dataset, batch_size=2, drop_last=True, num_workers=0)
|
||||
random_view = False
|
||||
use_skip = False
|
||||
batch_size = 2
|
||||
|
||||
train_dataset = Dataset('dataset/CLOTH3D/train', 'dataset/CLOTH3D2RGB/train', 'frames_small.txt', random_view=random_view, device=device)
|
||||
valid_dataset = Dataset('dataset/CLOTH3D/train', 'dataset/CLOTH3D2RGB/train', 'frames_small.txt', random_view=random_view, device=device)
|
||||
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, drop_last=True, num_workers=0)
|
||||
valid_dataloader = DataLoader(valid_dataset, batch_size=batch_size, drop_last=True, num_workers=0)
|
||||
train_accumulator = Accumulator()
|
||||
valid_accumulator = Accumulator()
|
||||
|
||||
model = DepthEstimation(device=device)
|
||||
model = DepthEstimation(device=device, use_skip=use_skip)
|
||||
|
||||
loss_fn = nn.MSELoss()
|
||||
optimizer = optim.Adam(model.parameters(), lr=0.001)
|
||||
|
||||
Reference in New Issue
Block a user