3D Gaussian Splatting代码中的train和render两个文件代码解读

现在来聊一聊训练和渲染是如何进行的

training

train.py
line 31
def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):
    # 初始化第一次迭代的索引为0
    first_iter = 0
    
    # 准备输出和日志记录器
    tb_writer = prepare_output_and_logger(dataset)
    
    # 初始化高斯模型,参数为数据集的球谐函数(SH)级别
    gaussians = GaussianModel(dataset.sh_degree)
    
    # 创建场景对象,包含数据集和高斯模型
    scene = Scene(dataset, gaussians)
    
    # 设置高斯模型的训练配置
    gaussians.training_setup(opt)
    
    # 加载检查点(如果有),恢复模型参数和设置起始迭代次数
    if checkpoint:
        (model_params, first_iter) = torch.load(checkpoint)
        gaussians.restore(model_params, opt)

    # 设置背景颜色,如果数据集背景为白色,则设置为白色([1, 1, 1]),否则为黑色([0, 0, 0])
    bg_color = [1, 1, 1] if dataset.white_background else [0, 0, 0]
    
    # 将背景颜色转换为CUDA张量,以便在GPU上使用
    background = torch.tensor(bg_color, dtype=torch.float32, device="cuda")

    # 创建两个CUDA事件,用于记录迭代开始和结束的时间
    iter_start = torch.cuda.Event(enable_timing=True)
    iter_end = torch.cuda.Event(enable_timing=True)

    # 初始化视点堆栈为空
    viewpoint_stack = None
    
    # 用于记录指数移动平均损失的变量,初始值为0.0
    ema_loss_for_log = 0.0
    
    # 创建进度条,用于显示训练进度,从起始迭代数到总迭代数
    progress_bar = tqdm(range(first_iter, opt.iterations), desc="Training progress")
    
    # 增加起始迭代数,以便从下一次迭代开始
    first_iter += 1

    for iteration in range(first_iter, opt.iterations + 1):
        # 尝试连接网络GUI,如果当前没有连接
        if network_gui.conn == None:
            network_gui.try_connect()

        # 如果已经连接网络GUI,处理接收和发送数据
        while network_gui.conn != None:
            try:
                # 初始化网络图像字节为None
                net_image_bytes = None

                # 从网络GUI接收数据
                custom_cam, do_training, pipe.convert_SHs_python, pipe.compute_cov3D_python, keep_alive, scaling_modifer = network_gui.receive()

                # 如果接收到自定义相机数据,则进行渲染
                if custom_cam != None:
                    # 使用自定义相机数据、当前的高斯模型、管道和背景颜色进行渲染
                    net_image = render(custom_cam, gaussians, pipe, background, scaling_modifer)["render"]

                    # 将渲染结果转为字节格式,并转换为内存视图
                    net_image_bytes = memoryview(
                        (torch.clamp(net_image, min=0, max=1.0) * 255).byte()
                        .permute(1, 2, 0).contiguous().cpu().numpy()
                    )

                # 发送
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值