diff --git a/.gitignore b/.gitignore
index 2a1f1458..8a7ecc0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,4 +22,5 @@ assets/tum/*
*.lock
*.lock
*.MOV
-assets/*
\ No newline at end of file
+assets/*
+*.jpg
\ No newline at end of file
diff --git a/scripts/experiments/gaussian_splatting/nvdiffrast_diff.ipynb b/scripts/experiments/gaussian_splatting/nvdiffrast_diff.ipynb
index d4847224..31162e15 100644
--- a/scripts/experiments/gaussian_splatting/nvdiffrast_diff.ipynb
+++ b/scripts/experiments/gaussian_splatting/nvdiffrast_diff.ipynb
@@ -93,22 +93,19 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 1,
"id": "10f8c10f",
"metadata": {},
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "torch.Size([15728, 3]) torch.Size([16762, 3]) torch.Size([16762, 3]) torch.Size([1, 3])\n",
- "tensor([[-0.4248, -0.2584, -0.3477],\n",
- " [-0.4334, -0.2500, -0.3395],\n",
- " [-0.4441, -0.2338, -0.3527],\n",
- " ...,\n",
- " [ 0.4904, -0.0145, 0.2256],\n",
- " [ 0.3056, -0.0512, 0.2582],\n",
- " [ 0.3417, -0.0483, 0.3824]], device='cuda:0') tensor([[1., 1., 1.]], device='cuda:0')\n"
+ "ename": "NameError",
+ "evalue": "name 'os' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[1;32m/home/nishadgothoskar/bayes3d/scripts/experiments/gaussian_splatting/nvdiffrast_diff.ipynb Cell 5\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m model_dir \u001b[39m=\u001b[39m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(b\u001b[39m.\u001b[39mutils\u001b[39m.\u001b[39mget_assets_dir(),\u001b[39m\"\u001b[39m\u001b[39mbop/ycbv/models\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 2\u001b[0m idx \u001b[39m=\u001b[39m \u001b[39m14\u001b[39m\n\u001b[1;32m 3\u001b[0m mesh_path \u001b[39m=\u001b[39m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(model_dir,\u001b[39m\"\u001b[39m\u001b[39mobj_\u001b[39m\u001b[39m\"\u001b[39m \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m{}\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(idx)\u001b[39m.\u001b[39mrjust(\u001b[39m6\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m0\u001b[39m\u001b[39m'\u001b[39m) \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m.ply\u001b[39m\u001b[39m\"\u001b[39m)\n",
+ "\u001b[0;31mNameError\u001b[0m: name 'os' is not defined"
]
}
],
diff --git a/scripts/experiments/gaussian_splatting/nvdiffrast_optim.ipynb b/scripts/experiments/gaussian_splatting/nvdiffrast_optim.ipynb
index d2688a52..085aab5b 100644
--- a/scripts/experiments/gaussian_splatting/nvdiffrast_optim.ipynb
+++ b/scripts/experiments/gaussian_splatting/nvdiffrast_optim.ipynb
@@ -7,37 +7,14 @@
"metadata": {},
"outputs": [
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2023-10-25 05:38:28.459571: E external/xla/xla/stream_executor/cuda/cuda_driver.cc:1587] Failed to get stream capture info: out of memory\n",
- "2023-10-25 05:38:28.461562: E external/xla/xla/pjrt/pjrt_stream_executor_client.cc:2716] Execution of replica 0 failed: INVALID_ARGUMENT: stream is uninitialized or in an error state\n"
- ]
- },
- {
- "ename": "ValueError",
- "evalue": "INVALID_ARGUMENT: stream is uninitialized or in an error state",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "\u001b[1;32m/home/nishadgothoskar/bayes3d/scripts/experiments/gaussian_splatting/nvdiffrast_optim.ipynb Cell 1\u001b[0m line \u001b[0;36m8\n\u001b[1;32m 6\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mtorch\u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mimageio\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mbayes3d\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mb\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mtqdm\u001b[39;00m \u001b[39mimport\u001b[39;00m tqdm\n\u001b[1;32m 10\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mpytorch3d\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mtransforms\u001b[39;00m\n",
- "File \u001b[0;32m~/bayes3d/bayes3d/__init__.py:16\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m \u001b[39mimport\u001b[39;00m colmap\n\u001b[1;32m 15\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m---> 16\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mgenjax\u001b[39;00m \u001b[39mimport\u001b[39;00m \u001b[39m*\u001b[39m\n\u001b[1;32m 18\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mImportError\u001b[39;00m:\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/__init__.py:20\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mGenJAX is a probabilistic programming system constructed by combining the concepts of Gen with the program transformation and hardware accelerator compilation capabilities of JAX.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 16\u001b[0m \u001b[39m# This __init__ file exports GenJAX's public API.\u001b[39;00m\n\u001b[1;32m 17\u001b[0m \u001b[39m# For the internals, see _src.\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \n\u001b[1;32m 19\u001b[0m \u001b[39m# Closed modules.\u001b[39;00m\n\u001b[0;32m---> 20\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m \u001b[39mimport\u001b[39;00m inference\n\u001b[1;32m 21\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m \u001b[39mimport\u001b[39;00m typing\n\u001b[1;32m 22\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mcore\u001b[39;00m \u001b[39mimport\u001b[39;00m interpreters\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/inference/__init__.py:19\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minference\u001b[39;00m \u001b[39mimport\u001b[39;00m mcmc\n\u001b[1;32m 18\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minference\u001b[39;00m \u001b[39mimport\u001b[39;00m smc\n\u001b[0;32m---> 19\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minference\u001b[39;00m \u001b[39mimport\u001b[39;00m testbed\n\u001b[1;32m 22\u001b[0m __all__ \u001b[39m=\u001b[39m [\n\u001b[1;32m 23\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mmcmc\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 24\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mimportance_sampling\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mtestbed\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 28\u001b[0m ]\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/inference/testbed.py:15\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39m# Copyright 2022 MIT Probabilistic Computing Project\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[39m#\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[39m# Licensed under the Apache License, Version 2.0 (the \"License\");\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[39m# See the License for the specific language governing permissions and\u001b[39;00m\n\u001b[1;32m 13\u001b[0m \u001b[39m# limitations under the License.\u001b[39;00m\n\u001b[0;32m---> 15\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39m_src\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minference\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mtestbed\u001b[39;00m \u001b[39mimport\u001b[39;00m build_inference_test_generator\n\u001b[1;32m 16\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mgenjax\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39m_src\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39minference\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mtestbed\u001b[39;00m \u001b[39mimport\u001b[39;00m default_problem_generator\n\u001b[1;32m 19\u001b[0m __all__ \u001b[39m=\u001b[39m [\n\u001b[1;32m 20\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mbuild_inference_test_generator\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 21\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mdefault_problem_generator\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m 22\u001b[0m ]\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/_src/inference/testbed.py:127\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[39mreturn\u001b[39;00m inference_test_generator\n\u001b[1;32m 126\u001b[0m default_problem_config \u001b[39m=\u001b[39m (\u001b[39m10\u001b[39m, \u001b[39m10\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m0.3\u001b[39m, \u001b[39m0.3\u001b[39m)\n\u001b[0;32m--> 127\u001b[0m default_problem_generator \u001b[39m=\u001b[39m build_inference_test_generator(\n\u001b[1;32m 128\u001b[0m \u001b[39m*\u001b[39;49mdefault_problem_config,\n\u001b[1;32m 129\u001b[0m )\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/_src/inference/testbed.py:84\u001b[0m, in \u001b[0;36mbuild_inference_test_generator\u001b[0;34m(max_length, state_space_size, transition_distance_truncation, observation_distance_truncation, transition_variance, observation_variance)\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mbuild_inference_test_generator\u001b[39m(\n\u001b[1;32m 77\u001b[0m max_length: IntArray,\n\u001b[1;32m 78\u001b[0m state_space_size: IntArray,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 82\u001b[0m observation_variance: FloatArray,\n\u001b[1;32m 83\u001b[0m ):\n\u001b[0;32m---> 84\u001b[0m config \u001b[39m=\u001b[39m discrete_hmm_config(\n\u001b[1;32m 85\u001b[0m state_space_size,\n\u001b[1;32m 86\u001b[0m transition_distance_truncation,\n\u001b[1;32m 87\u001b[0m observation_distance_truncation,\n\u001b[1;32m 88\u001b[0m transition_variance,\n\u001b[1;32m 89\u001b[0m observation_variance,\n\u001b[1;32m 90\u001b[0m )\n\u001b[1;32m 92\u001b[0m \u001b[39m@gen\u001b[39m(Unfold, max_length\u001b[39m=\u001b[39mmax_length)\n\u001b[1;32m 93\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mmarkov_chain\u001b[39m(state: IntArray, config: DiscreteHMMConfiguration):\n\u001b[1;32m 94\u001b[0m transition \u001b[39m=\u001b[39m config\u001b[39m.\u001b[39mtransition_tensor\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/genjax/_src/generative_functions/distributions/custom/discrete_hmm.py:109\u001b[0m, in \u001b[0;36mDiscreteHMMConfiguration.new\u001b[0;34m(cls, linear_grid_dim, adjacency_distance_trans, adjacency_distance_obs, sigma_trans, sigma_obs)\u001b[0m\n\u001b[1;32m 89\u001b[0m transition_tensor \u001b[39m=\u001b[39m scaled_circulant(\n\u001b[1;32m 90\u001b[0m linear_grid_dim,\n\u001b[1;32m 91\u001b[0m adjacency_distance_trans,\n\u001b[1;32m 92\u001b[0m sigma_trans \u001b[39mif\u001b[39;00m sigma_trans \u001b[39m>\u001b[39m \u001b[39m0.0\u001b[39m \u001b[39melse\u001b[39;00m \u001b[39m-\u001b[39mnp\u001b[39m.\u001b[39minf,\n\u001b[1;32m 93\u001b[0m \u001b[39m1\u001b[39m \u001b[39m/\u001b[39m sigma_trans \u001b[39mif\u001b[39;00m sigma_trans \u001b[39m>\u001b[39m \u001b[39m0.0\u001b[39m \u001b[39melse\u001b[39;00m \u001b[39m-\u001b[39mnp\u001b[39m.\u001b[39minf,\n\u001b[1;32m 94\u001b[0m )\n\u001b[1;32m 96\u001b[0m observation_tensor \u001b[39m=\u001b[39m scaled_circulant(\n\u001b[1;32m 97\u001b[0m linear_grid_dim,\n\u001b[1;32m 98\u001b[0m adjacency_distance_obs,\n\u001b[1;32m 99\u001b[0m sigma_obs \u001b[39mif\u001b[39;00m sigma_obs \u001b[39m>\u001b[39m \u001b[39m0.0\u001b[39m \u001b[39melse\u001b[39;00m \u001b[39m-\u001b[39mnp\u001b[39m.\u001b[39minf,\n\u001b[1;32m 100\u001b[0m \u001b[39m1\u001b[39m \u001b[39m/\u001b[39m sigma_obs \u001b[39mif\u001b[39;00m sigma_obs \u001b[39m>\u001b[39m \u001b[39m0.0\u001b[39m \u001b[39melse\u001b[39;00m np\u001b[39m.\u001b[39minf,\n\u001b[1;32m 101\u001b[0m )\n\u001b[1;32m 102\u001b[0m \u001b[39mreturn\u001b[39;00m DiscreteHMMConfiguration(\n\u001b[1;32m 103\u001b[0m linear_grid_dim,\n\u001b[1;32m 104\u001b[0m adjacency_distance_trans,\n\u001b[1;32m 105\u001b[0m adjacency_distance_obs,\n\u001b[1;32m 106\u001b[0m sigma_trans,\n\u001b[1;32m 107\u001b[0m sigma_obs,\n\u001b[1;32m 108\u001b[0m jnp\u001b[39m.\u001b[39marray(transition_tensor),\n\u001b[0;32m--> 109\u001b[0m jnp\u001b[39m.\u001b[39;49marray(observation_tensor),\n\u001b[1;32m 110\u001b[0m )\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/numpy/lax_numpy.py:2089\u001b[0m, in \u001b[0;36marray\u001b[0;34m(object, dtype, copy, order, ndmin)\u001b[0m\n\u001b[1;32m 2085\u001b[0m \u001b[39mreturn\u001b[39;00m array(np\u001b[39m.\u001b[39masarray(view), dtype, copy, ndmin\u001b[39m=\u001b[39mndmin)\n\u001b[1;32m 2087\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mTypeError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mUnexpected input type for array: \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mtype\u001b[39m(\u001b[39mobject\u001b[39m)\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n\u001b[0;32m-> 2089\u001b[0m out_array: Array \u001b[39m=\u001b[39m lax_internal\u001b[39m.\u001b[39;49m_convert_element_type(\n\u001b[1;32m 2090\u001b[0m out, dtype, weak_type\u001b[39m=\u001b[39;49mweak_type)\n\u001b[1;32m 2091\u001b[0m \u001b[39mif\u001b[39;00m ndmin \u001b[39m>\u001b[39m ndim(out_array):\n\u001b[1;32m 2092\u001b[0m out_array \u001b[39m=\u001b[39m lax\u001b[39m.\u001b[39mexpand_dims(out_array, \u001b[39mrange\u001b[39m(ndmin \u001b[39m-\u001b[39m ndim(out_array)))\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/lax/lax.py:555\u001b[0m, in \u001b[0;36m_convert_element_type\u001b[0;34m(operand, new_dtype, weak_type)\u001b[0m\n\u001b[1;32m 553\u001b[0m \u001b[39mreturn\u001b[39;00m type_cast(Array, operand)\n\u001b[1;32m 554\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 555\u001b[0m \u001b[39mreturn\u001b[39;00m convert_element_type_p\u001b[39m.\u001b[39;49mbind(operand, new_dtype\u001b[39m=\u001b[39;49mnew_dtype,\n\u001b[1;32m 556\u001b[0m weak_type\u001b[39m=\u001b[39;49m\u001b[39mbool\u001b[39;49m(weak_type))\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/core.py:385\u001b[0m, in \u001b[0;36mPrimitive.bind\u001b[0;34m(self, *args, **params)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mbind\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mparams):\n\u001b[1;32m 383\u001b[0m \u001b[39massert\u001b[39;00m (\u001b[39mnot\u001b[39;00m config\u001b[39m.\u001b[39menable_checks\u001b[39m.\u001b[39mvalue \u001b[39mor\u001b[39;00m\n\u001b[1;32m 384\u001b[0m \u001b[39mall\u001b[39m(\u001b[39misinstance\u001b[39m(arg, Tracer) \u001b[39mor\u001b[39;00m valid_jaxtype(arg) \u001b[39mfor\u001b[39;00m arg \u001b[39min\u001b[39;00m args)), args\n\u001b[0;32m--> 385\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mbind_with_trace(find_top_trace(args), args, params)\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/core.py:388\u001b[0m, in \u001b[0;36mPrimitive.bind_with_trace\u001b[0;34m(self, trace, args, params)\u001b[0m\n\u001b[1;32m 387\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mbind_with_trace\u001b[39m(\u001b[39mself\u001b[39m, trace, args, params):\n\u001b[0;32m--> 388\u001b[0m out \u001b[39m=\u001b[39m trace\u001b[39m.\u001b[39;49mprocess_primitive(\u001b[39mself\u001b[39;49m, \u001b[39mmap\u001b[39;49m(trace\u001b[39m.\u001b[39;49mfull_raise, args), params)\n\u001b[1;32m 389\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mmap\u001b[39m(full_lower, out) \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmultiple_results \u001b[39melse\u001b[39;00m full_lower(out)\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/core.py:868\u001b[0m, in \u001b[0;36mEvalTrace.process_primitive\u001b[0;34m(self, primitive, tracers, params)\u001b[0m\n\u001b[1;32m 867\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mprocess_primitive\u001b[39m(\u001b[39mself\u001b[39m, primitive, tracers, params):\n\u001b[0;32m--> 868\u001b[0m \u001b[39mreturn\u001b[39;00m primitive\u001b[39m.\u001b[39;49mimpl(\u001b[39m*\u001b[39;49mtracers, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mparams)\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/dispatch.py:140\u001b[0m, in \u001b[0;36mapply_primitive\u001b[0;34m(prim, *args, **params)\u001b[0m\n\u001b[1;32m 136\u001b[0m msg \u001b[39m=\u001b[39m pjit\u001b[39m.\u001b[39m_device_assignment_mismatch_error(\n\u001b[1;32m 137\u001b[0m prim\u001b[39m.\u001b[39mname, fails, args, \u001b[39m'\u001b[39m\u001b[39mjit\u001b[39m\u001b[39m'\u001b[39m, arg_names)\n\u001b[1;32m 138\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(msg) \u001b[39mfrom\u001b[39;00m \u001b[39mNone\u001b[39;00m\n\u001b[0;32m--> 140\u001b[0m \u001b[39mreturn\u001b[39;00m compiled_fun(\u001b[39m*\u001b[39;49margs)\n",
- "File \u001b[0;32m/opt/conda/envs/bayes3d/lib/python3.9/site-packages/jax/_src/dispatch.py:172\u001b[0m, in \u001b[0;36mxla_primitive_callable..\u001b[0;34m(*args, **kw)\u001b[0m\n\u001b[1;32m 170\u001b[0m call \u001b[39m=\u001b[39m compiled\u001b[39m.\u001b[39munsafe_call\n\u001b[1;32m 171\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m prim\u001b[39m.\u001b[39mmultiple_results:\n\u001b[0;32m--> 172\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mlambda\u001b[39;00m \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkw: call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkw)[\u001b[39m0\u001b[39m]\n\u001b[1;32m 173\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 174\u001b[0m \u001b[39mreturn\u001b[39;00m call\n",
- "\u001b[0;31mValueError\u001b[0m: INVALID_ARGUMENT: stream is uninitialized or in an error state"
- ]
+ "data": {
+ "text/plain": [
+ "device(type='cuda')"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
}
],
"source": [
@@ -59,7 +36,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "dae0d56a",
"metadata": {},
"outputs": [],
@@ -84,7 +61,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"id": "47ce3703-36df-4d82-bebc-751bb974c89e",
"metadata": {},
"outputs": [],
@@ -105,7 +82,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"id": "62fdf559-094d-46e5-ae8b-b75122891ec8",
"metadata": {},
"outputs": [],
@@ -173,10 +150,22 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"id": "a1fc02ca",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor([[0.0000, 0.1000, 0.2000],\n",
+ " [0.0000, 0.1000, 0.2000],\n",
+ " [0.0000, 0.1000, 0.2000],\n",
+ " [0.0000, 0.1000, 0.2000],\n",
+ " [0.0000, 0.1000, 0.2000]], device='cuda:0')\n"
+ ]
+ }
+ ],
"source": [
"def posevec_to_matrix(position, quat):\n",
" return torch.cat(\n",
@@ -203,20 +192,25 @@
},
{
"cell_type": "code",
- "execution_count": null,
- "id": "adf3aa14",
- "metadata": {},
- "outputs": [],
- "source": [
- "m.vertices"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
+ "execution_count": 10,
"id": "1d9c2c03-8f55-4625-982d-32479eebfa64",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "torch.Size([15728, 3]) torch.Size([16762, 3]) torch.Size([16762, 3]) torch.Size([1, 3])\n",
+ "tensor([[-0.4248, -0.2584, -0.3477],\n",
+ " [-0.4334, -0.2500, -0.3395],\n",
+ " [-0.4441, -0.2338, -0.3527],\n",
+ " ...,\n",
+ " [ 0.4904, -0.0145, 0.2256],\n",
+ " [ 0.3056, -0.0512, 0.2582],\n",
+ " [ 0.3417, -0.0483, 0.3824]], device='cuda:0') tensor([[1., 1., 1.]], device='cuda:0')\n"
+ ]
+ }
+ ],
"source": [
"model_dir = os.path.join(b.utils.get_assets_dir(),\"bop/ycbv/models\")\n",
"idx = 14\n",
@@ -224,7 +218,7 @@
"m = b.utils.load_mesh(mesh_path)\n",
"m = b.utils.scale_mesh(m, 1.0/100.0)\n",
"\n",
- "m = b.utils.make_cuboid_mesh(jnp.array([0.5, 0.5, 0.2]))\n",
+ "# m = b.utils.make_cuboid_mesh(jnp.array([0.5, 0.5, 0.2]))\n",
"\n",
"vtx_pos = torch.from_numpy(m.vertices.astype(np.float32)).cuda()\n",
"pos_idx = torch.from_numpy(m.faces.astype(np.int32)).cuda()\n",
@@ -237,7 +231,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"id": "acb5415b",
"metadata": {},
"outputs": [],
@@ -254,10 +248,30 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"id": "af6f93c7-f7e8-427f-8ea5-365370a9560d",
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/tmp/ipykernel_218609/2544377672.py:2: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"pos = torch.tensor([0.0, 0.0, -2.5],device=device)\n",
"quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n",
diff --git a/scripts/experiments/gaussian_splatting/splatting_messing_with_it.ipynb b/scripts/experiments/gaussian_splatting/splatting_messing_with_it.ipynb
new file mode 100644
index 00000000..e08a8cba
--- /dev/null
+++ b/scripts/experiments/gaussian_splatting/splatting_messing_with_it.ipynb
@@ -0,0 +1,740 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "device(type='cuda')"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import diff_gaussian_rasterization as dgr\n",
+ "from diff_gaussian_rasterization import GaussianRasterizationSettings, GaussianRasterizer\n",
+ "import torch\n",
+ "import os\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import math\n",
+ "from tqdm import tqdm\n",
+ "import bayes3d as b\n",
+ "import jax.numpy as jnp\n",
+ "from random import randint\n",
+ "import pytorch3d.transforms\n",
+ "import matplotlib.pyplot as plt\n",
+ "from tqdm import tqdm\n",
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
+ "device\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "You can open the visualizer by visiting the following URL:\n",
+ "http://127.0.0.1:7003/static/\n"
+ ]
+ }
+ ],
+ "source": [
+ "b.setup_visualizer()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Increasing frame buffer size to (width, height, depth) = (128, 128, 1024)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[E rasterize_gl.cpp:121] OpenGL version reported as 4.6\n"
+ ]
+ }
+ ],
+ "source": [
+ "intrinsics = b.Intrinsics(\n",
+ " height=100,\n",
+ " width=100,\n",
+ " fx=250.0, fy=250.0,\n",
+ " cx=50.0, cy=50.0,\n",
+ " near=0.01, far=2.5\n",
+ ")\n",
+ "b.setup_renderer(intrinsics)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "model_dir = os.path.join(b.utils.get_assets_dir(),\"bop/ycbv/models\")\n",
+ "mesh_path = os.path.join(model_dir,\"obj_\" + \"{}\".format(14).rjust(6, '0') + \".ply\")\n",
+ "mesh = b.utils.load_mesh(mesh_path)\n",
+ "mesh = b.utils.scale_mesh(mesh, 1.0/1000.0)\n",
+ "b.RENDERER.add_mesh(mesh)\n",
+ "vertices = torch.tensor(np.array(jnp.array(mesh.vertices)),device=device)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "torch.Size([16762, 3])"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "vertices.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/tmp/ipykernel_366687/3159514181.py:26: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " proj_matrix = torch.tensor(getProjectionMatrix(intrinsics), device=device)\n",
+ "/var/tmp/ipykernel_366687/3159514181.py:89: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " gt_quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n",
+ "/var/tmp/ipykernel_366687/3159514181.py:73: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " scales = torch.tensor( 0.005 * torch.rand((N, 3)),requires_grad=True,device=device)\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fovX = jnp.arctan(intrinsics.width / 2 / intrinsics.fx) * 2\n",
+ "fovY = jnp.arctan(intrinsics.height / 2 / intrinsics.fy) * 2\n",
+ "tan_fovx = math.tan(fovX)\n",
+ "tan_fovy = math.tan(fovY)\n",
+ "\n",
+ "\n",
+ "def getProjectionMatrix(intrinsics):\n",
+ " top = intrinsics.near / intrinsics.fy * intrinsics.height / 2.0\n",
+ " bottom = -top\n",
+ " right = intrinsics.near / intrinsics.fy * intrinsics.height / 2.0\n",
+ " left = -right\n",
+ "\n",
+ " P = torch.zeros(4, 4)\n",
+ "\n",
+ " z_sign = 1.0\n",
+ "\n",
+ " P[0, 0] = 2.0 * intrinsics.near / (right - left)\n",
+ " P[1, 1] = 2.0 * intrinsics.near / (top - bottom)\n",
+ " P[0, 2] = (right + left) / (right - left)\n",
+ " P[1, 2] = (top + bottom) / (top - bottom)\n",
+ " P[2, 2] = z_sign * (intrinsics.far + intrinsics.near) / (intrinsics.far - intrinsics.near)\n",
+ " P[2, 3] = -2.0 * (intrinsics.far * intrinsics.near) / (intrinsics.far - intrinsics.near)\n",
+ " P[3, 2] = z_sign\n",
+ " return torch.transpose(P, 0, 1)\n",
+ "\n",
+ "proj_matrix = torch.tensor(getProjectionMatrix(intrinsics), device=device)\n",
+ "\n",
+ "def posevec_to_matrix(position, quat):\n",
+ " return torch.cat(\n",
+ " (\n",
+ " torch.cat((pytorch3d.transforms.quaternion_to_matrix(quat), position.unsqueeze(1)), 1),\n",
+ " torch.tensor([[0.0, 0.0, 0.0, 1.0]],device=device),\n",
+ " ),\n",
+ " 0,\n",
+ " )\n",
+ "def apply_transform(points, transform):\n",
+ " rels_ = torch.cat(\n",
+ " (\n",
+ " points,\n",
+ " torch.ones((points.shape[0], 1), device=device),\n",
+ " ),\n",
+ " 1,\n",
+ " )\n",
+ " return torch.einsum(\"ij, aj -> ai\", transform, rels_)[...,:3]\n",
+ "\n",
+ "position = torch.tensor([0.0, 0.1, 0.2], device=device)\n",
+ "quat = torch.tensor([1.0, 0.1, 0.2, 0.3],device=device)\n",
+ "\n",
+ "camera_pose = jnp.eye(4)\n",
+ "view_matrix = torch.transpose(torch.tensor(np.array(b.inverse_pose(camera_pose))),0,1).cuda()\n",
+ "raster_settings = GaussianRasterizationSettings(\n",
+ " image_height=int(intrinsics.height),\n",
+ " image_width=int(intrinsics.width),\n",
+ " tanfovx=tan_fovx,\n",
+ " tanfovy=tan_fovy,\n",
+ " bg=torch.tensor([intrinsics.far, intrinsics.far, intrinsics.far]).cuda(),\n",
+ " scale_modifier=1.0,\n",
+ " viewmatrix=view_matrix,\n",
+ " projmatrix=view_matrix @ proj_matrix,\n",
+ " sh_degree=1,\n",
+ " campos=torch.zeros(3).cuda(),\n",
+ " prefiltered=False,\n",
+ " debug=None\n",
+ ")\n",
+ "rasterizer = GaussianRasterizer(raster_settings=raster_settings)\n",
+ "\n",
+ "\n",
+ "def render(pose, in_color):\n",
+ " means3D = apply_transform(vertices, pose)\n",
+ " N = means3D.shape[0]\n",
+ " means2D = torch.ones((N, 3),requires_grad=True, device=device)\n",
+ " opacity = torch.rand((N, 1),requires_grad=True,device=device)\n",
+ " scales = torch.tensor( 0.005 * torch.rand((N, 3)),requires_grad=True,device=device)\n",
+ " rotations = torch.rand((N, 4),requires_grad=True,device=device)\n",
+ "\n",
+ " data = rasterizer(\n",
+ " means3D = means3D,\n",
+ " means2D = means2D,\n",
+ " shs = None,\n",
+ " colors_precomp = means3D[:,2:3],\n",
+ " opacities = opacity,\n",
+ " scales = scales,\n",
+ " rotations = rotations,\n",
+ " in_color=in_color\n",
+ " )\n",
+ " return data\n",
+ "\n",
+ "gt_pos = torch.tensor([0.0, 0.0, 0.5],device=device)\n",
+ "gt_quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n",
+ "gt_pose = posevec_to_matrix(gt_pos, gt_quat)\n",
+ "gt_color, likelihood, radii = render(gt_pose, torch.zeros((1, int(intrinsics.height), int(intrinsics.width)),device=device))\n",
+ "viz_gt = b.get_depth_image(gt_color.detach().cpu().numpy()[0,...])\n",
+ "viz_gt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "gt_pose_jnp =jnp.array(gt_pose.detach().cpu().numpy())\n",
+ "img = b.RENDERER.render(gt_pose_jnp[None,...], jnp.array([0]))\n",
+ "gt_color = torch.tensor(np.array(img[:,:,2]), device=device)\n",
+ "\n",
+ "viz_gt = b.get_depth_image(gt_color.detach().cpu().numpy())\n",
+ "viz_gt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b.clear()\n",
+ "gt_color_jnp = jnp.array(gt_color.detach().cpu().numpy()[0,...])\n",
+ "b.show_cloud(\"1\", b.unproject_depth_jit(gt_color_jnp,intrinsics).reshape(-1,3))\n",
+ "b.show_cloud(\"2\", b.unproject_depth_jit(img[...,2],intrinsics).reshape(-1,3), color=b.RED)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b.show_trimesh(\"1\",mesh)\n",
+ "b.set_pose(\"1\", gt_pose_jnp)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/tmp/ipykernel_366687/1924790481.py:4: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " pos = torch.tensor(gt_pos ,device=device, requires_grad=True)\n",
+ "/var/tmp/ipykernel_366687/1924790481.py:5: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " quat = torch.tensor(gt_quat ,device=device, requires_grad=True)\n",
+ " 0%| | 0/100 [00:00, ?it/s]/var/tmp/ipykernel_366687/3159514181.py:73: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
+ " scales = torch.tensor( 0.005 * torch.rand((N, 3)),requires_grad=True,device=device)\n",
+ "0.1059095710515976: 0%| | 0/100 [00:00, ?it/s] "
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.10629859566688538: 11%|█ | 11/100 [00:00<00:00, 100.99it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.1299, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1869, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0974, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1059, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1433, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1302, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0997, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1016, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1119, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1324, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1252, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1082, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1085, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1121, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1155, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1169, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1153, device='cuda:0', grad_fn=)\n",
+ "tensor(0.1063, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.06752968579530716: 34%|███▍ | 34/100 [00:00<00:00, 98.12it/s] "
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.1044, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0989, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0953, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0896, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0914, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0861, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0757, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0806, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0735, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0737, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0737, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0665, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0686, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0637, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0639, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0652, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0643, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0666, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0738, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0675, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0628, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.05946268141269684: 54%|█████▍ | 54/100 [00:00<00:00, 92.25it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.0724, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0643, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0657, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0707, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0688, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0644, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0634, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0664, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0702, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0706, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0699, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0722, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0661, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0632, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0685, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0712, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0647, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0595, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.061479467898607254: 64%|██████▍ | 64/100 [00:00<00:00, 79.75it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.0687, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0691, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0654, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0688, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0670, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0666, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0734, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0709, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0747, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0689, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0727, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0694, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0615, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.06789098680019379: 87%|████████▋ | 87/100 [00:01<00:00, 90.66it/s] "
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.0797, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0705, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0691, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0674, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0654, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0608, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0580, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0585, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0665, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0653, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0649, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0670, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0637, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0661, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0687, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0684, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0690, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0655, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0594, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0600, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0674, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0609, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0607, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0604, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0679, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0647, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "0.06520310044288635: 100%|██████████| 100/100 [00:01<00:00, 92.31it/s] \n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.0690, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0698, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0680, device='cuda:0', grad_fn=)\n",
+ "tensor(0.0652, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# pos = torch.tensor([0.0, 0.0, 1.9],device=device, requires_grad=True)\n",
+ "# quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device, requires_grad=True)\n",
+ "\n",
+ "pos = torch.tensor(gt_pos ,device=device, requires_grad=True)\n",
+ "quat = torch.tensor(gt_quat ,device=device, requires_grad=True)\n",
+ "\n",
+ "pose = posevec_to_matrix(pos, quat)\n",
+ "optimizer = torch.optim.Adam([\n",
+ " {'params': [pos], 'lr': 0.01, \"name\": \"pos\"},\n",
+ " {'params': [quat], 'lr': 0.01, \"name\": \"quat\"},\n",
+ "], lr=0.0, eps=1e-15)\n",
+ "b.clear()\n",
+ "b.show_pose(\"1\", gt_pose.detach().cpu().numpy())\n",
+ "b.show_pose(\"2\", pose.detach().cpu().numpy())\n",
+ "\n",
+ "gt_color=gt_color.detach()\n",
+ "pbar = tqdm(range(100))\n",
+ "for _ in pbar:\n",
+ " # print(pos,quat)\n",
+ " pose = posevec_to_matrix(pos, quat)\n",
+ " rendered_image, likelihood, radii = render(pose, gt_color)\n",
+ " loss = torch.abs(gt_color - rendered_image).mean()\n",
+ " optimizer.zero_grad()\n",
+ " loss.backward()\n",
+ " print(loss)\n",
+ " optimizer.step()\n",
+ " # parameters_over_time.append((pos.detach().clone(),quat.detach().clone()))\n",
+ " # losses_over_time.append(loss.item())\n",
+ " pbar.set_description(f\"{loss.item()}\")\n",
+ "\n",
+ "b.clear()\n",
+ "b.show_pose(\"1\", gt_pose.detach().cpu().numpy())\n",
+ "b.show_pose(\"2\", pose.detach().cpu().numpy())\n",
+ "viz = b.get_depth_image(rendered_image.detach().cpu().numpy()[0,...])\n",
+ "b.hstack_images([viz, viz_gt])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b.clear()\n",
+ "b.show_cloud(\"1\", b.unproject_depth_jit(rendered_image[0,...].detach().cpu().numpy(),intrinsics).reshape(-1,3))\n",
+ "b.show_cloud(\"2\", b.unproject_depth_jit(gt_color.detach().cpu().numpy(),intrinsics).reshape(-1,3), color=b.RED)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b.clear()\n",
+ "b.show_pose(\"1\", gt_pose.detach().cpu().numpy())\n",
+ "b.show_pose(\"2\", pose.detach().cpu().numpy())\n",
+ "# b.show_pose(\"2\", b.unproject_depth_jit(img[...,2],intrinsics).reshape(-1,3), color=b.RED)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(2.0167, device='cuda:0', grad_fn=)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "