VV overall

Volumetric Video 简介

立体视频和360视频的区别:

  • 360度视频:三个自由度旋转(yaw, pitch, roll),人不动,头360度旋转。

  • volumetric视频(立体视频):再增加三个自由度(X, Y, Z),可以在场景中自由走动,头自由旋转。

  • 普通视频和360度视频:像素点。像素点越多,视频越大,越清晰。

  • 立体视频:用Point Cloud表示,分布在3维空间。密度越大,视频越大,越清晰。
    假设一个3D点是15bytes,一帧有200K个点,帧率为30FPS,那么stream这个视频需要的带宽为:15×200K×20×8=720Mbps。

    因此,需要优化带宽。

  • 360度视频:viewport-adaptation。分割出tile。为不同的tile分配不同的码率。

  • 立体视频:分割出3D cells。为不同的cell分配不同的码率。

分块方式:

img
  • VV(Viewport Visibility, VV):跟360度视频一样,用户只能看到一部分区域,所以看不到的我们可以不要下载。
  • OV (Occlusion Visibility, OV):后面的cell可能会被前面的cell遮挡,所以可以稍微降低密度。
  • DV(Distance Visibility,DV):离得近的物体,需要清晰点,密度高;离得远的则相反。

建模方式:

  • 3D Mesh(3D网格)
  • cloud-point(点云),目前流行

网络协议的选择:

​ 在实时获取和重建的VR游戏体验的背景下,《Quality of Experience for 3-D Immersive Media Streaming》研究了网格重建质量以及网络延迟的影响,涉及网络协议的选择。

​ 即用户数据报协议 (UDP) 和传输控制协议 (TCP),研究了滞后和帧丢弃对最终QoE的影响。TCP依靠握手来确保可靠性并防止数据包丢失。但是延迟会变高。另一方面,UDP更加敏捷,但没有针对丢失数据包的恢复机制和拥塞控制。实验结果表明,UDP优于TPC,这表明相对于大延迟,分组和帧丢失被认为更可接受。

​ Dash的方法,目前有mpeg-dash(Mesh),Dash-PC(PC)

传输方式:

目前体积视频主要的传输方式有两种:直接传输和转码传输

直接传输direct streaming比如本文VIVO,点云视频存储在服务器端,然后(点云)编码传输到客户端,由客户端基于用户的注视点(Viewpoint)渲染为2D video进行播放。又因为体积视频的点云文件体积太大,传输的带宽要求较高,就提出了yuzu在传输低密度的点云视频然后在客户端进行超分

转码传输transcoded streaming比如Vues,在服务器端预先预测出用户的注视点,然后将点云视频渲染为2D video后利用传统的流系统传输,在客户端播放。转码传输也能分为两种:

​ 传统的方法只通过单一的预测模型去预测用户的注视点(single view),在根据鲁棒性的要求传输一个范围稍大的2D video。

​ vues提出了(Multiview)方法,即用多个预测模型预测出多个注视点,传输多个2D video,然后在客户端依据真实的注视点选择其中一个view的内容进行播放,以容忍预测的误差。

转码传输方式的优点是轻量级的,并且传输上使用2d视频的框架就可以。缺点是预测误差会造成用户看到的和实际应该看到的画面有差异。

超分方向:

yuzu,在服务器端训练点云的超分模型,在终端对低分辨率点云进行超分再根据用户当前视口渲染成2d视频播放(先超分再渲染)需要很大的算力

Streaming:

在这里插入图片描述

​ 体积内容被发送到服务器,服务器负责可选地在分区中对其进行分段,然后在给定网络条件以及用户位置和旋转的情况下为客户端选择适当的编码。然后可以将内容以体积形式流式传输到客户端,客户端将根据视口执行渲染; 或者,可以将渲染传输到云或边缘服务器,并且视口可以作为常规2D视频传输到客户端。

代码time_start = time.time() results = list() iterations = 2001 lr = 1e-2 model = func_critic_model(input_shape=(None, train_img.shape[1]), act_func='relu') loss_func = tf.keras.losses.MeanSquaredError() alg = "gd" # alg = "gd" for kk in range(iterations): with tf.GradientTape() as tape: predict_label = model(train_img) loss_val = loss_func(predict_label, train_lbl) grads = tape.gradient(loss_val, model.trainable_variables) overall_grad = tf.concat([tf.reshape(grad, -1) for grad in grads], 0) overall_model = tf.concat([tf.reshape(weight, -1) for weight in model.weights], 0) overall_grad = overall_grad + 0.001 * overall_model ## adding a regularization term results.append(loss_val.numpy()) if alg == 'gd': overall_model -= lr * overall_grad ### gradient descent elif alg == 'gdn': ## gradient descent with nestrov's momentum overall_vv_new = overall_model - lr * overall_grad overall_model = (1 + gamma) * oerall_vv_new - gamma * overall_vv overall_vv = overall_new pass model_start = 0 for idx, weight in enumerate(model.weights): model_end = model_start + tf.size(weight) weight.assign(tf.reshape()) for grad, ww in zip(grads, model.weights): ww.assign(ww - lr * grad) if kk % 100 == 0: print(f"Iter: {kk}, loss: {loss_val:.3f}, Duration: {time.time() - time_start:.3f} sec...") input_shape = train_img.shape[1] - 1 model = tf.keras.Sequential([ tf.keras.layers.Input(shape=(input_shape,)), tf.keras.layers.Dense(30, activation="relu"), tf.keras.layers.Dense(20, activation="relu"), tf.keras.layers.Dense(1) ]) n_epochs = 20 batch_size = 100 learning_rate = 0.01 momentum = 0.9 sgd_optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum) model.compile(loss="mean_squared_error", optimizer=sgd_optimizer) history = model.fit(train_img, train_lbl, epochs=n_epochs, batch_size=batch_size, validation_data=(test_img, test_lbl)) nag_optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum, nesterov=True) model.compile(loss="mean_squared_error", optimizer=nag_optimizer) history = model.fit(train_img, train_lbl, epochs=n_epochs, batch_size=batch_size, validation_data=(test_img, test_lbl))运行后报错TypeError: Missing required positional argument,如何改正
05-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值