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": "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAVeklEQVR4nO2da4hs2VXH/2vtvc/ZVdXdd5LRCUNCBo0vRBARFccXfjC+UAQRRTEBP6kJ6AcTMOoH8YkOUUFU0CgzPjGIqPjAxweNMxIhiKJifDI6MXF0kpnb3VXn7L3XWn7Yp05XV/ftedDVp6/Wn2aoru65U+e3/ue/136cO/RL5XOx13TiqT/A/3ftCzCx9gWYWPsCTKx9ASbWvgATa1+AibUvwMTaF2Bi7QswsfYFmFj7AkysfQEm1r4AE2tfgIm1L8DE2hdgYu0LMLH2BZhY+wJMrH0BJta+ABNrX4CJtS/AxNoXYGLtCzCx9gWYWPsCTKx9ASbWvgATy0/9Aa5H73y4BUCu5ebo2/71mak/zssQ3b/PBzz2kF18k10EwM1RuPOxb/mb9974h3rZuv8KcCn3LbnmDjdH/uC1t78G900EvfPhVqWrr6vNtzT+tMqkN0k/85lf9s1/+Xs38fleqe6PQfixh0ylYxfrFwBy7eYXzlfFpK9vAnjXF79lks/8EnXbC/DYQ/bYQ1a5bxG/l+pvjt+a5Me/6ad3/0lfoW5vBNWs36R5L+7V7yb9+M66Tg25AMCWz+/8475S3cY7YHS9a+5cdH19ca9inL9RmrEGT3zbr97Y539ZunV3QEV/kfLF11uuHwfhSp+bQw6H5Bpq5mAPlRu6gJepW3QHjMbftPxLCX0AtRLsIjdHo/25WVBYgD05D3ZPfP8f3sRlvEzdlgJsZQ7W6MdfuNcIbNKP9Md/cbB/s6Bmzs0cIZJzAH7uXe+50at6CZo+gjYH263keVHjj6pNal2K4OaIwyE3Cw4LCjOESE0L58DMeUcX8co18R1wL/ovMXY27V/Dh5sjbg64WYz2p3iA0CAEOAbwE7/5xzu/qpejKe+ArfH20vZma6Td0vij9cB7xM0Bh0NuDqr9KR5Q01JoEDyYNOzyel6RJrsDXpR+fX2Rfn3HpNd0d/zNIXmaQw6HbvYqjg9QPKJmhhCr/S14C6xsyva9f/7um7nGl6JpCrDV7VxKf3M5YdRI/zLvH9bop3AWPhTnFGeILYLXQBJMWQG87f0/cUOX+mK66Qi6NPQvxg4uC59N+pJeGP+QTe8P0R+PKB5QaM/ZP5A5VWcAyNyNXfLVutE7YIv+xbZy89sr6Jv053qeddtDzYLjAxyPECLFBeKcYrS2QRu0ZQkmQSUUCRnA2z74PTd35ffWzRXgIn3ce657L/qa7tbXlT651s0+ysUHuVnw7FWVPsVDigcILcUZQsDa/iVqanMJWXw2EgC/kL/8Ri79Kt1QBL1E+lcMuQDuNeqO9CnMqJlRE4fob1uLjUUvkUus9hfxxViMhYD/6l+Dqfuim7gDrqY/vnMF/c2e5yx2xp5nTZ9nRxQPKC4ozhCjBV/Dp7SWW0ltLqFIyBIyfCYSNffr8oU3QOAK7fwOeFHv497ocX62Nf4JW6PuFn20M4RgbYPYaHQaSIJKIxIkt734bD7DZecKk5SpR+ObuAM2e56LurrT36LPzZGbfbSbPejigyN9jkeb9ClGxBaxsdZJSyVaiZLakmIvIZe2U5fIZ+eSIwHwPn7DjgFcpd3eAZuzLbyEtZ3NxN9q9s+tNFTvh7HjPKQmbtK3trHAElnCED4SivhSms58RtMR58DZkXiSApfJBZtmvXqHBdg8vnA1+s3AwWXzrK2pFjcHFBY8u0Nhdjn96Gv0l6g5lho+ue0kZA1dzZ/gUsO9JwFwzPHVcrorEFdqVwV458Mt0G1tz466erwd39xAPxifXODZq3jtfYRYp7sIzRZ9iVSi5Fhym1Psc9uXptfQwSf2ffBd4NRy71A8BMChpGPX7IjGFdpVAer68NabF1cXLnq/frtpfHLteoltQXWROR6tlznXHWcIW/RzqzmW1JYSSm770nTadtZ0FPrR/i2nyH0tgBLtCMXV2kkBqv033xnRX+r9oc1f12zkPm6tjLEzhH4zozrXrbOtGBH8Fv068OY2Ve+XthvCx/fBd9GtWk6R+kgpUvImQvRxx90/H15y4min2kkBts5IVW3af8v445mfFzF+Mz8X+qGp3q8dpwU+Tz9X+rntStuZy/CJQu9cjn7VcD93ywUvI/UtcoPizJTwRe+XP/rEG21Mr78AP/a6I+CF8duxicQF7rgM/Zp+s2V8CrOz2GlatDNqmjrXRfDWOolcWpMw0O/n/UC/6TUM4eN937gucJq7ZaQ+Uh+RWiRnxmYAlnMF7vMCbMLF+sDaVvKMP7q4MDeeZtg2/lbs1NAPHm2oHefY84zJM9BvO2s6hK6GT+tXM7dsOS14ecDLBa1alGDSqLFBCV/xV/o7n3ZzS2TXXwByLTYi6NI4uvR4ITeH1fjkwpbxEeIlsRO8RW+BpSUJ96SvoUPo2Pfed9GvZm65cMsDXh7wMiJF5Ln1wSSoOQUAvdktkp2MAeziFdxxAX2Ne+K2Zg5cuNT4Q68ZggU/hr4GKtFyK9LI5fTbU/Z9CH3ru+hWNfoXfBqpX9Bqjj6YRBU2BAEbAHzd76df+9Ibakl3cwdctsRxcfdxdH1FT665mDlD4oeGQjN0OxuxowG5VQla+/3acV70fgh94zbpLw9odYDVAl1ruTFp1ILAC7GCFRb463/yuV9564PXDueirr8AbvbRm2s4OH+YcMP1zRg4I3q4cC5zQrtt/AuxI0FTmyXIONsSn8/oN8tKfx5OZm45dj6R+gV1LUq0HFWCWixwCl+IFACwuKGF+l0U4EFsdPcX6DfV8vXU5mbggP36EJU/1+oMmyqD8TWQRKrbWzmW4iXHnNu+hDz2+3XUHb3fno/+A14e0GqBbm591BLU2oIgaDL7QqyAGhx/zXc+/e4feuTa+Wzp+gsQjl5P3Go+3nyTXANg5D6UISzIhcvR18wJYTPxh42ttm6taI6lBMltkpDrXLcu9dyLfo3+A17W8Kn0G9MoGhReyAtcIVKQGACe+WePngQgRg8fP3rtoAYyu3hE6We/4Bs0nZicnUMbocMF4oZcgAvkAoUZuVADB+wvQR88grvU+DV2xJfcdurzMNdtOri8Sf/AH1f6d9zdA1o9QMd36HSO/lC7Q+0XRQ6SHfZYdDxf8fyEZy9YeL7Qc5385+npPz7/87/5kXoJD939nGsHhd09I/auL36LSTZNw3+Gh2PiWEMnF+A8hQjnh6x37l7o64kSCVailCAliNQVnpDPhX6d6/re+672PBveXz7Axwe0vEOnR1geajfXtBCZFz3sMUt0uOT5kmcn1Bybu5vp2ZV8aLn69+P//peT33rfMJjtoga7GmrC6z9Vn/8vTcvxnRH6cFy5vmhasENoqGnAPKB3XHfS1/SHVkcaqYlfQhZfJOSz2PEZoS605avpD+FjOapE0VjQFmoz+UI+ERdQUcoKMRMFEBpuHXoBgGePnrz2GuzwKcknvvVxW96FlLO3BvoOzg/cnYNzwzDLPLje0Yh+fZZES5C83tQ9M35IGjr4XEPfuRJ8F/0qcBrp1+Q5oOWCVnewnFu/0LTQPC86zzbPmPc073i+5HZJ7bG5U+HnevtIV/571X9oefcDy//8QPrrD8jxOlCvtwY7bLbe9FNv/sW3/YZ1KwAQgXMAwA7A4HfnwDxaHkzr41Pb6GvmlJDrpq76fM74PjvfO5cb1wWXar8/d8uDOupeoB+tRNEoFgvaTDFxk9gn8glcjDtBFktqSTUrgCaQI3hCefEHZF+2dtvtfuOPfvUT3/+H1CWoDm8xA4BjYz7jvra88cDdnG2hr5kjPpe2M5/VpWp8csX73rnU+q4af+6WLacr6C+KtGLtOnyaRCFRSHC9Ua/oBEktiSax2g4xHlogHaMUiNH1BtHOpxtv+u43Pv7jf0r9+R1XJnM0oGdoIHOQYMpWs17ZLqKvmWMuW9PBZfKZOIfQO86bsdNSvxj7fawW1J3lvpUo2orNM2JGm6kZCgCXwEm5EySxVdFV0aSSVYoBcEyODED95zXqJuZ7b/72L/i5d72H89BfmyMAxjAHZTMHZa2uL0GUVYKUUNTJJeh9hk+10XSuOJcC53GBsy4yV/qR+k36Y/LMi8aCmDFLHHuK3RA+rjfuFJ2gE0tiSTWJZlU1VTBhTCExenrx1COn1zMzuKEJ94dfezx/YcZKJATUMpiymTN1qmyVuzotIRvrcICQ9SJ6csW5PCZ+NX7L/YKXkVONnUj9MNdFXydcm/TnafQ+j+HDvVAv6Eq1v6yKdCLZpJiqqdXHOwDAkT1yev9EUNXbv+TLvu/PfiOeLACwDLuv6sxY1amyqhNjVVYJWVnqMGssl6J3nOtgW/d1q/Fb6sdF5gWtFugW1s8sB5Mx90f6MXGNfp/gElyn1CtWgpXoquhKNIlklaKlWBGI1qYUAMTomYOnXndyX90BAL7n87/6u973eLOa88aKez2tX+mLz8airIPlWeAzWC6iD5waTg33NfGr8SOlA6r0u7rMObM89vsX6bcdNx18gl8pd0qdoCu6Yf/SSU5aiuUL3c/y+s4Q3ejzAT/w6W9++z/8JPeRz+96KKs5GfzOAlb4BNI6zDLrRfQt97XVaamP1I/Gj8hz9O2AvkSVKBbF2jKMuiP9kCp9o16pF5xmW53lT+mkJM3JUrIilgWyUYVPWF3b0tBNP6DxI5/01u94+gdRmu2dJ1awDH5nBalzmUjrMBtcYpJN9GPmREo18VvkFmkzdqJoFG0Lxulu7Xkq/dDBr4x74U5q+KzpS7W/FKv502V0BWLDCCzX2gdN8JDeY4+84+0feoeZg7EpAyBWACAlkup3ImHSanlHUrPeURnRR+7rYBuRWkoLdC1K3Vwc1zhbsSBn9GN/Nuqe0V8KTgtOs66KnGQ5Z39NyfpsWSzp2R3grvUA0TRPSb7+gX96rnsoa7D14WQiAcCkjoRZKvc1+t6T1KxvqfdUxrhvKUXkFnlufWNSjR9Ua+wEQVvQ5tH73Hbk18kz0O/Wnc9J0lUpJ7l0UvqBfsrWZ+sKRCEKMQKQ9KpLe7mapgBvje9+wn/JR/IDSVsAYg5APavsSBwVR1K5O5JqeU+yPkfVb6JvLTcoUUswWS/uW42dILXd5PVsi3xC6Iamc6B/mu0k60nWldTwycuSOsnJuk77bFmwNQCcynXeApM9J/wm/we/6z7rBTnsrQVQz+lX4gA8SuTkUCr3gT6Sh2yhHzMnqAU9Z/wgQ+g3ifx6uut645Vwd46+nORykstpHsOn63Swf7akSIpicGRi9MndZ18jhykf1P5yeu+T4ZNPbFbMjwUA4KkA8JBIyVPxkGp5D22RWpS6kx5Mqusr+rqvGwRtoVDQZPaCMfTrXNclo155WbASdGXt/VKjP5+WtJIhfNJAvytIgnEScL35g8n/rojPsb//Z/eaU5sVuAIHoB6V9RAP8SQOUrl7aLW8M7uIvg629WRDm8nLYHxXhtB3vXFS7pR6wWpoOiv9cpLLSc7LUnotSftOa/jU5qfav0qM+v9jBQDwaek/nm5e1cMLXIGrBQBQ0TuoNxm5O2gwDar1INsW+po5vgzoQ4Ir69jphXqlTrAq6ERPsq3bnko/LyV10nfadZayrZItk3UFqwJgWIgWu84ZQNX0BTh2zcd3H34utJmcnD8j7swYukZvQdUZgpozC4ogw1dF78tA3xf4RK6sjV+Meh1CvyvDYsNJ0pWUkyyrcp7+WfRX+mJn+XNdyw+bmr4AAJ4L7SOn3QstZ6bNGtQzs87qi4p+OL8WBEEolHqaoXInX1Azx5WKHoPxsw6hP851T7KsZKSfh65fU7JVr8uE04xVQVKI7mT+NepWFADA04v4KR/ulg2ygxCUAIANzgCAFRvoiRXV8l7Auo2eC1xvVJQ7payj8S2JntFfr/YsJXVS256us1WyLuM0WbdBH4DYTuyP21MAAH/76vjZz+RVq8WZbKxTOAUbsQ4vfCE2VMuzwhVydQTfQE+57iwqVgVZR+Nb0rJBv/Rakyelgf6yP4v+uvYAQIx2RB+3qgAA/uJ14YveL6mx4k0JygaAlQBU6KzV8iAlV8A6cOds6wMNRlmpEyStTYyuypn3V1JXGqSX3GudcG3Rr+EzRr8YXXvruanbVQAAf/SJ7ivfp6WBeNtcr2MFaV2mQ0XPBaQVvVEe0CMrkiLLmDmWZFjfH43fSW03a8vf9dbnc97fiv7r2vy6VLeuAAAO/uY4f8yBtKTnPx3p+kuMC0gNaoPls0JsdL2lkb5K3d3dMP640FZXe+qo22U7zUiCpMMpoEp/d+EzXNTt/NvTv/6nP2yvXVggC2xMAEgNANRIDPX4ptoZ9yxICrFq+bqpW9FrEulEso7LDDV2Kv1lb30ZRt3V9sC7wyOho27jHQDgV77l1V/3wx/k18wx83AEXvemapDxS6FWuY/QddxPP49eilX6pVj1/mpjsWGkPyop3S308O6v9JbeAVVf893/7u60PPNoNkaDSh+wem5H1JKa6CZ3TapZR/RSLG/SH6Za6IutCupqT/U+gGJIusO2Z0u3ugAAvupb/8kfBJ45cny2FVILMKA3E9WkJlYPksia/oheiqWkpaCiH42fZTB+krPYuYHc39QtjaCqZ4+efNzha994FObezTw5onUNTKyiH16oSVJT06ySTYrWDcVN9LnU7a3B+FmQBCs5F/o3TB+3vABi1Iv99p/cfeNnzJqZ48DExI4AaL0JdKCvYqaQoqoY6ZdipaCUwfUVfZJ7Gn/XHeelutUFePj40WePnlwJ/u793SMP+zay88wMYjIdlmZUYWr1/Fo9RFWKqaLup2+6vqKv3De7naqlXP9K50vRrS4AqjfV/u15y5IfuuNiS94Tnz9QoYpagMpdDbkMZ0lyPem83lZM6wLgbIWZkuIdnfyyfN4El3c/FADFUAqeOcZplgcizVsKDsxni6aqBgxNaS6mBlFkser3Ef3Yu47GF6Ol4A3LR6eij9tfgNedPPrBw6ccWRL8zwqnyRaNzTyCo40SoAaS6EBfbD0zW0/UgHODLYCkEyT+Rd32AowqBihWQOpwynBsjrb60uFFhS529i1w5vqkBOBuuea99Ves+6AADx8/+sHDpwAAVgSekGQ4q3zxjNTAfT2n3Uwb7HJZ/xXrPigAztVgYFouHI/1NPx081kiseHBiluIvur+KACAui72zMFT1fVrrDQ+stIr1fc3g34peMNyJ8/3XpfumwJUjS5+evFUwzXrqWEb92xrY+MIb1jeRr9f1H1WgFG3oYG5Ft2W/4vS/1vtCzCx9gWYWPsCTKx9ASbWvgATa1+AibUvwMTaF2Bi7QswsfYFmFj7AkysfQEm1r4AE2tfgIm1L8DE2hdgYv0vFNe9OSYz7ukAAAAASUVORK5CYII=", + "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)\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": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(likelihood.max())\n", + "plt.figure()\n", + "ax = plt.subplot(1, 2, 1)\n", + "plt.imshow((gt_color - rendered_image).detach().cpu().numpy()[0])\n", + "plt.colorbar()\n", + "ax = plt.subplot(1, 2, 2)\n", + "plt.imshow((likelihood).detach().cpu().numpy()[0])\n", + "plt.colorbar()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([3, 100, 100])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "color.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "T = 0\n", + "fig = plt.figure(figsize=(6,6))\n", + "ax = fig.add_subplot(2,2,1)\n", + "ax.set_title(\"Target\")\n", + "gt_image = np.moveaxis(gt_rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", + "img1 = ax.imshow(b.preprocess_for_viz(gt_image),cmap=b.cmap)\n", + "ax = fig.add_subplot(2,2,2)\n", + "parameters = parameters_over_time[T]\n", + "rendered_image = render(*parameters)\n", + "rendered_image = np.moveaxis(rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", + "img2 = ax.imshow(b.preprocess_for_viz(rendered_image),cmap=b.cmap)\n", + "title = ax.set_title(f\"Reconstruction\")\n", + "ax = fig.add_subplot(2,1,2)\n", + "line = ax.plot(jnp.arange(T), losses_over_time[:T])\n", + "# ax.set_yscale(\"log\")\n", + "ax.set_title(\"Pixelwise MSE Loss\")\n", + "# ax.set_ylim(0.01, 1000.0)\n", + "ax.set_xlabel(\"Iteration\")\n", + "ax.set_xlim(0,len(losses_over_time))\n", + "fig.tight_layout()\n", + "\n", + "buffs = []\n", + "for T in tqdm(range(0,len(losses_over_time),3)):\n", + " parameters = parameters_over_time[T]\n", + " rendered_image = render(*parameters)\n", + " rendered_image = np.moveaxis(rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", + " img2.set_array(b.preprocess_for_viz(rendered_image))\n", + " line[0].set_xdata(jnp.arange(T))\n", + " line[0].set_ydata(losses_over_time[:T])\n", + " fig.canvas.draw()\n", + " buffs.append(b.pil_image_from_matplotlib(fig))\n", + "buffs[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "b.make_gif_from_pil_images(buffs, \"optimization.gif\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "bayes3d", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/scripts/experiments/gaussian_splatting/splatting_optim copy.ipynb b/scripts/experiments/gaussian_splatting/splatting_optim copy.ipynb index 16838117..b37213c8 100644 --- a/scripts/experiments/gaussian_splatting/splatting_optim copy.ipynb +++ b/scripts/experiments/gaussian_splatting/splatting_optim copy.ipynb @@ -5,10 +5,40 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/tmp/ipykernel_1107990/2151526459.py:50: 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" + ] + }, + { + "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" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/tmp/ipykernel_1107990/2151526459.py:117: 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", + "/var/tmp/ipykernel_1107990/2151526459.py:102: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" + ] + }, { "data": { + "image/png": "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", "text/plain": [ - "device(type='cuda')" + "" ] }, "execution_count": 1, @@ -29,55 +59,11 @@ "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" - ] - }, - { - "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:7006/static/\n" - ] - } - ], - "source": [ - "b.setup_visualizer()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "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", - "vertices = torch.tensor(np.array(jnp.array(mesh.vertices) / 1000.0),device=device)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/tmp/ipykernel_391632/2926322865.py:33: 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" - ] - } - ], - "source": [ + "device\n", + "\n", "intrinsics = b.Intrinsics(\n", " height=100,\n", " width=100,\n", @@ -110,27 +96,8 @@ " P[3, 2] = z_sign\n", " return torch.transpose(P, 0, 1)\n", "\n", - "proj_matrix = torch.tensor(getProjectionMatrix(intrinsics), device=device)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "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": [ + "proj_matrix = torch.tensor(getProjectionMatrix(intrinsics), device=device)\n", + "\n", "def posevec_to_matrix(position, quat):\n", " return torch.cat(\n", " (\n", @@ -151,15 +118,8 @@ "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", "points = torch.zeros((5,3), device = device)\n", - "print(apply_transform(points, posevec_to_matrix(position, quat)))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ + "print(apply_transform(points, posevec_to_matrix(position, quat)))\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", @@ -176,35 +136,13 @@ " prefiltered=False,\n", " debug=None\n", ")\n", - "rasterizer = GaussianRasterizer(raster_settings=raster_settings)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([16763, 3])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vertices.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ + "rasterizer = GaussianRasterizer(raster_settings=raster_settings)\n", + "\n", + "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", + "vertices = torch.tensor(np.array(jnp.array(mesh.vertices) / 1000.0),device=device)\n", + "\n", "def render(pos,quat):\n", " means3D = apply_transform(vertices, posevec_to_matrix(pos, quat))\n", " N = means3D.shape[0]\n", @@ -217,95 +155,124 @@ " means3D = means3D,\n", " means2D = means2D,\n", " shs = None,\n", - " colors_precomp = means3D[:,2:3].repeat(1,3),\n", + " colors_precomp = means3D[:,2:3],\n", " opacities = opacity,\n", " scales = scales,\n", " rotations = rotations\n", " )\n", - " return data" + " return data\n", + "\n", + "pos = torch.tensor([0.0, 0.0, 0.5],device=device)\n", + "quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n", + "\n", + "color, radii = render(pos, quat)\n", + "depth_image = np.moveaxis(color.detach().cpu().numpy(),0,-1)[...,2]\n", + "\n", + "# out_weights = out_weights.detach().cpu().numpy()\n", + "# tensor_ranges = tensor_ranges.detach().cpu().numpy()\n", + "# gaussian_sorted = gaussian_sorted.detach().cpu().numpy()\n", + "\n", + "\n", + "viz_gt = b.get_depth_image(depth_image)\n", + "viz_gt" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/tmp/ipykernel_391632/667617267.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", - "/var/tmp/ipykernel_391632/2615716263.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" - ] - }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAEfklEQVR4nO3acUicdRzH8e/zPN7z3G356K3diklsy0XWHwt31CYzawY6If9J2hhGLIK2EWMVA0GhlcxaUO0fKaKRkTW2yDaco5gTYa1kK1pZo83CylrJbrJQ8/ac99zTH0/9fLzzLr/knp+jz5v74/F81C8vfr/nHk8Vx3EIzS5V9gDXU8BiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEZ5sgeY1m5dSzoKES3UnMartuxx0lPmyT/g7i9UH+ksK7/cY752ZOLnXiIK9q/csaKhbjgle7Sp5GM1BfKaD0crW+rjv/X9PZNmuAcBc8VHpa35bTF5001LMtZLIe3N7qFF9bu8TwosIrrhzo0PnKhdEnR+/FPNU5znEzL3pmSskt5L5padU9N4mER6+PbElQuqbrZ3nz6w8otnLWleMl8Nv1mte6UKKxqqB+O9737fXd41/H6TeD5x5YJjW8nxXzeXFW07u6YpIO1FSSZW1Qc94vhiV2NVR7SZDrXX9C2ov624qd+xLfeRSow6tkVEjm09WLPsvqXStoLMW4fFA6vE8U+Hau2P11ZWd4wXbtr/uEX0XtrJrlcqMfr0d23nfB1zKpnXrGecLaeWW+JDl8N7kJljW4pmtN9y4o4zWc+5dknbhn98ue7TYnJ3mfsQ+y73Fzq2VfvqYLOh+TOnNzkra+yxSGX3vdlcZnxe1U1BqWjGGzcej347eW2nzJzB55/n9nDRoFhH3gWVY2WJy7x72sjnpf6N+09ysMY6X8x80suUsq/m/g6vPHVw30K/h5fzamgsWWXFvqacKO6nVC0442cvH37i/mK/L1tyVlZsV82MN+uZ5dAMd0bnbqJZJQerf2S9qpv/8ZvUhrfOyTCzTw5W69avFM3Isbiy7T4tFBFfFakLvRD0dSfKwdoxngqYy3Msrmy7L5UYFcej59rLls79bDmSdlNqfpZQNCPbChKlnZB2Y3HzYl9foKRhPbd6T7ad6AKpWjBNSpwvDkILfJ1fGtaRASd4U2m2y1bmipvxzPiEr286S8NqmUxu+qRjljcQ4jR3TYlH73lff+OR+X5WMr9H1c20RZRt69F0MiIKVzRejP8/tiERDVtq4UN7vZd5r1Qak/soiG4PFNyqaEZ+ycadJ+9pmUz6ObDk9+DtrjVrtxV5bwho+uVJ0Qx9Uckvx8vOXtp7bH3f7xMKEd0VoQ1DEt6Jl4y1W9dOrnt77PxBcU/gSqm6Gd7Qsuz1l/dt/7D1nVhDfF78wVX+3w2PFql7jEfteIyItFCk4Mm3DlSXD9SdOTZIPu+yf00+FhG1hVVlpKLqB+vo3aeHJtT5ZiSaF1jXS/gvGkbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGwGIELEbAYgQsRsBiBCxGfwFQrITDbsjTngAAAABJRU5ErkJggg==", "text/plain": [ - "" + "torch.Size([3, 100, 100])" ] }, - "execution_count": 9, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pos = torch.tensor([0.0, 0.0, 0.5],device=device)\n", - "quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n", - "\n", - "color, radii, num_rendered, tiles_depth_sorted,gaussian_sorted,alpha_tensor= render(pos, quat)\n", - "depth_image = np.moveaxis(color.detach().cpu().numpy(),0,-1)[...,2]\n", - "b.show_cloud(\"1\", b.unproject_depth_jit(depth_image, intrinsics).reshape(-1,3))\n", - "viz_gt = b.get_depth_image(depth_image)\n", - "viz_gt" + "color.shape" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 1, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "24835\n", - "torch.Size([24835])\n", - "torch.Size([24835])\n", - "torch.Size([24835])\n" + "ename": "NameError", + "evalue": "name 'intrinsics' 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/splatting_optim copy.ipynb Cell 3\u001b[0m line \u001b[0;36m4\n\u001b[1;32m 2\u001b[0m BLOCK_Y \u001b[39m=\u001b[39m \u001b[39m16\u001b[39m\n\u001b[1;32m 3\u001b[0m BLOCK_SIZE \u001b[39m=\u001b[39m BLOCK_X\u001b[39m*\u001b[39m BLOCK_Y\n\u001b[0;32m----> 4\u001b[0m num_tiles_x \u001b[39m=\u001b[39m \u001b[39mint\u001b[39m((intrinsics\u001b[39m.\u001b[39mwidth \u001b[39m+\u001b[39m BLOCK_X \u001b[39m-\u001b[39m \u001b[39m1\u001b[39m) \u001b[39m/\u001b[39m BLOCK_X)\n\u001b[1;32m 5\u001b[0m num_tiles_y \u001b[39m=\u001b[39m \u001b[39mint\u001b[39m((intrinsics\u001b[39m.\u001b[39mheight \u001b[39m+\u001b[39m BLOCK_Y \u001b[39m-\u001b[39m \u001b[39m1\u001b[39m) \u001b[39m/\u001b[39m BLOCK_Y)\n\u001b[1;32m 6\u001b[0m num_tiles \u001b[39m=\u001b[39m num_tiles_x \u001b[39m*\u001b[39m num_tiles_y\n", + "\u001b[0;31mNameError\u001b[0m: name 'intrinsics' is not defined" ] } ], "source": [ - "print(num_rendered)\n", - "print(tiles_depth_sorted.shape)\n", - "print(gaussian_sorted.shape)\n", - "print(alpha_tensor.shape)" + "BLOCK_X = 16\n", + "BLOCK_Y = 16\n", + "BLOCK_SIZE = BLOCK_X* BLOCK_Y\n", + "num_tiles_x = int((intrinsics.width + BLOCK_X - 1) / BLOCK_X)\n", + "num_tiles_y = int((intrinsics.height + BLOCK_Y - 1) / BLOCK_Y)\n", + "num_tiles = num_tiles_x * num_tiles_y\n", + "\n", + "\n", + "# Print all relevant info.\n", + "\n", + "assert tensor_ranges.shape[0] == num_tiles * 2\n", + "num_gaussians = gaussian_sorted.shape[0]\n", + "assert out_weights.shape[0] == num_gaussians * BLOCK_X* BLOCK_Y\n", + "\n", + "img = np.zeros((intrinsics.height, intrinsics.width))\n", + "\n", + "\n", + "for tile in tqdm(range(num_tiles)):\n", + " print(f\"TILE {tile}\")\n", + " range_x, range_y = tensor_ranges[2*tile], tensor_ranges[2*tile + 1]\n", + " start_index = (BLOCK_SIZE * range_x)\n", + " print(start_index)\n", + " num_gaussians_in_this_block = range_y - range_x\n", + " print(f\"NUM GAUSSIANS IN THIS BLOCK {num_gaussians_in_this_block}\")\n", + " if num_gaussians_in_this_block == 0:\n", + " continue\n", + " for ii in range(BLOCK_X):\n", + " for jj in range(BLOCK_Y):\n", + " pixel_index_in_block = jj * BLOCK_X + ii\n", + " u,v = (start_index + pixel_index_in_block * num_gaussians_in_this_block, start_index + (pixel_index_in_block + 1) * num_gaussians_in_this_block)\n", + " print(u,v)\n", + " weights = out_weights[u:v]\n", + " maximum_weight = weights.max()\n", + " img[tile // num_tiles_y * BLOCK_Y + jj, tile % num_tiles_x * BLOCK_X + ii] = maximum_weight\n", + "plt.matshow(img)\n", + "plt.colorbar()" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "" ] }, - "execution_count": 21, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGdCAYAAAA1/PiZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAoVUlEQVR4nO3df3RUZZ7n8U8lkAoRE8IEqhKMJPwQBAJRkHRs0dmllgSdbpi2p4H2NJjj4jTqHD1RtGNLgo2zQUQWWxnpcRahZxXQGcWzLZ1tjURbDdAEEPm5QEOHX5Xww6RCIgkkz/5BU1iSECpCVT3J+3XOPVL3fuvJ9z7EWx9u3VvlMMYYAQAAWCAq3A0AAABcKYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAa3cLdwNXQ0tKio0eP6vrrr5fD4Qh3OwAA4AoYY1RXV6eUlBRFRV3ZuZROEVyOHj2q1NTUcLcBAAA64NChQ7rhhhuuqLZTBJfrr79e0vkdj4+PD3M3AADgSvh8PqWmpvpfx69EpwguF94eio+PJ7gAAGCZYC7z4OJcAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAhNx7W49o3e7qcLcBC3WKb4cGANjjaM3XenTVVknSwfn3hLcZWIczLgCAkDpV3xTuFmAxggsAALBGh4LLkiVLlJaWptjYWGVlZWnjxo1t1r722msaN26cEhMTlZiYKI/Hc0n9/fffL4fDEbDk5uZ2pDUAANCJBR1cVq9erfz8fBUVFWnz5s0aNWqUcnJyVF3d+kVWZWVlmjZtmtatW6fy8nKlpqZqwoQJOnLkSEBdbm6ujh075l9WrlzZsT0CAACdVtDBZdGiRZo5c6by8vI0bNgwLV26VHFxcVq2bFmr9W+88YYeeughZWZmaujQofq3f/s3tbS0qLS0NKDO6XTK7Xb7l8TExI7tEQAA6LSCCi5NTU2qqKiQx+O5OEBUlDwej8rLy69ojIaGBp09e1a9e/cOWF9WVqa+fftqyJAhmjVrlk6ePNnmGI2NjfL5fAELAADo/IIKLidOnFBzc7NcLlfAepfLJa/Xe0VjPPXUU0pJSQkIP7m5ufrtb3+r0tJSPf/88/r44481ceJENTc3tzpGcXGxEhIS/EtqamowuwEAACwV0s9xmT9/vlatWqWysjLFxsb610+dOtX/54yMDI0cOVIDBw5UWVmZxo8ff8k4BQUFys/P9z/2+XyEFwAAuoCgzrgkJSUpOjpaVVVVAeurqqrkdrsv+9yFCxdq/vz5+sMf/qCRI0detnbAgAFKSkrSvn37Wt3udDoVHx8fsAAAgM4vqOASExOj0aNHB1xYe+FC2+zs7Daft2DBAs2bN08lJSUaM2ZMuz/n8OHDOnnypJKTk4NpDwAAdHJB31WUn5+v1157TStWrNCuXbs0a9Ys1dfXKy8vT5I0ffp0FRQU+Ouff/55zZkzR8uWLVNaWpq8Xq+8Xq9Onz4tSTp9+rRmz56t9evX6+DBgyotLdWkSZM0aNAg5eTkXKXdBAAAnUHQ17hMmTJFx48fV2FhobxerzIzM1VSUuK/YLeyslJRURfz0Kuvvqqmpib9+Mc/DhinqKhIc+fOVXR0tLZt26YVK1aopqZGKSkpmjBhgubNmyen0/kddw8AAHQmDmOMCXcT35XP51NCQoJqa2u53gUAItz2I7X6u5c/lcSXLHZ1HXn95ruKAACANQguAADAGgQXAEBIORzh7gA2I7gAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAQUg7x9dDoOIILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgCAkHI4wt0BbEZwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAQNgYY8LdAixDcAEAhBTfDo3vguACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAEFJ85hy+C4ILAACwRoeCy5IlS5SWlqbY2FhlZWVp48aNbda+9tprGjdunBITE5WYmCiPx3NJvTFGhYWFSk5OVo8ePeTxeLR3796OtAYAADqxoIPL6tWrlZ+fr6KiIm3evFmjRo1STk6OqqurW60vKyvTtGnTtG7dOpWXlys1NVUTJkzQkSNH/DULFizQr3/9ay1dulQbNmzQddddp5ycHJ05c6bjewYAADodhwnyG66ysrJ022236ZVXXpEktbS0KDU1Vf/0T/+kX/ziF+0+v7m5WYmJiXrllVc0ffp0GWOUkpKixx9/XE888YQkqba2Vi6XS8uXL9fUqVPbHdPn8ykhIUG1tbWKj48PZncAACG265hPE1/6oyTpQPHdcvDlRV1WR16/gzrj0tTUpIqKCnk8nosDREXJ4/GovLz8isZoaGjQ2bNn1bt3b0nSgQMH5PV6A8ZMSEhQVlZWm2M2NjbK5/MFLAAAoPMLKricOHFCzc3NcrlcAetdLpe8Xu8VjfHUU08pJSXFH1QuPC+YMYuLi5WQkOBfUlNTg9kNAECE4A4jBCukdxXNnz9fq1at0rvvvqvY2NgOj1NQUKDa2lr/cujQoavYJQDgWuKdIXwX3YIpTkpKUnR0tKqqqgLWV1VVye12X/a5Cxcu1Pz58/Xhhx9q5MiR/vUXnldVVaXk5OSAMTMzM1sdy+l0yul0BtM6AADoBII64xITE6PRo0ertLTUv66lpUWlpaXKzs5u83kLFizQvHnzVFJSojFjxgRsS09Pl9vtDhjT5/Npw4YNlx0TAAB0PUGdcZGk/Px8zZgxQ2PGjNHYsWO1ePFi1dfXKy8vT5I0ffp09evXT8XFxZKk559/XoWFhXrzzTeVlpbmv26lZ8+e6tmzpxwOhx577DE999xzGjx4sNLT0zVnzhylpKRo8uTJV29PAQCA9YIOLlOmTNHx48dVWFgor9erzMxMlZSU+C+uraysVFTUxRM5r776qpqamvTjH/84YJyioiLNnTtXkvTkk0+qvr5eDz74oGpqanTHHXeopKTkO10HAwAAOp+gP8clEvE5LgBgj91en3IXn/8clz//j7sVFcXVul3VNf8cFwAAgHAiuAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAIG+s/SAwhR3ABAISUQ3zgHDqO4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAEDYGGPC3QIsQ3ABAISUwxHuDmAzggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAABhY8LdAKxDcAEAhJQj3A3AagQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAALAGwQUAAFiD4AIAAKxBcAEAhI3h66ERJIILACCkHHw9NL4DggsAALAGwQUAEFK8PYTvokPBZcmSJUpLS1NsbKyysrK0cePGNmt37Nihe++9V2lpaXI4HFq8ePElNXPnzpXD4QhYhg4d2pHWAABAJxZ0cFm9erXy8/NVVFSkzZs3a9SoUcrJyVF1dXWr9Q0NDRowYIDmz58vt9vd5rjDhw/XsWPH/Munn34abGsAAKCTCzq4LFq0SDNnzlReXp6GDRumpUuXKi4uTsuWLWu1/rbbbtMLL7ygqVOnyul0tjlut27d5Ha7/UtSUlKwrQEAgE4uqODS1NSkiooKeTyeiwNERcnj8ai8vPw7NbJ3716lpKRowIABuu+++1RZWdlmbWNjo3w+X8ACAAA6v6CCy4kTJ9Tc3CyXyxWw3uVyyev1driJrKwsLV++XCUlJXr11Vd14MABjRs3TnV1da3WFxcXKyEhwb+kpqZ2+GcDAAB7RMRdRRMnTtQ//MM/aOTIkcrJydHatWtVU1Ojt956q9X6goIC1dbW+pdDhw6FuGMAABAO3YIpTkpKUnR0tKqqqgLWV1VVXfbC22D16tVLN910k/bt29fqdqfTednrZQAAQOcU1BmXmJgYjR49WqWlpf51LS0tKi0tVXZ29lVr6vTp09q/f7+Sk5Ov2pgAAMB+QZ1xkaT8/HzNmDFDY8aM0dixY7V48WLV19crLy9PkjR9+nT169dPxcXFks5f0Ltz507/n48cOaKtW7eqZ8+eGjRokCTpiSee0A9+8AP1799fR48eVVFRkaKjozVt2rSrtZ8AAKATCDq4TJkyRcePH1dhYaG8Xq8yMzNVUlLiv2C3srJSUVEXT+QcPXpUt9xyi//xwoULtXDhQt11110qKyuTJB0+fFjTpk3TyZMn1adPH91xxx1av369+vTp8x13DwAAdCYOY+z/8GWfz6eEhATV1tYqPj4+3O0AAC5jb1Wd/tv//ESS9P+em6iYbhFxnwjCoCOv3/y2AADCxsj6fzsjxAguAICQcjjC3QFsRnABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAQEhtP+ILdwuwGMEFABBSj63eGu4WYDGCCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAICwMXw5NIJEcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwBAyJw52xzuFmA5ggsAICRWbqzU0Dkl4W4DliO4AABCouCdL8PdAjoBggsAALAGwQUAAFiD4AIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAGFjTLg7gG0ILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgjQ4FlyVLligtLU2xsbHKysrSxo0b26zdsWOH7r33XqWlpcnhcGjx4sXfeUwAANA1BR1cVq9erfz8fBUVFWnz5s0aNWqUcnJyVF1d3Wp9Q0ODBgwYoPnz58vtdl+VMQEAQNcUdHBZtGiRZs6cqby8PA0bNkxLly5VXFycli1b1mr9bbfdphdeeEFTp06V0+m8KmMCAICuKajg0tTUpIqKCnk8nosDREXJ4/GovLy8Qw1cizEBAEDn1C2Y4hMnTqi5uVkulytgvcvl0u7duzvUQEfGbGxsVGNjo/+xz+fr0M8GAISXkQl3C7CMlXcVFRcXKyEhwb+kpqaGuyUAABACQQWXpKQkRUdHq6qqKmB9VVVVmxfeXosxCwoKVFtb618OHTrUoZ8NAADsElRwiYmJ0ejRo1VaWupf19LSotLSUmVnZ3eogY6M6XQ6FR8fH7AAAIDOL6hrXCQpPz9fM2bM0JgxYzR27FgtXrxY9fX1ysvLkyRNnz5d/fr1U3FxsaTzF9/u3LnT/+cjR45o69at6tmzpwYNGnRFYwIAAEgdCC5TpkzR8ePHVVhYKK/Xq8zMTJWUlPgvrq2srFRU1MUTOUePHtUtt9zif7xw4UItXLhQd911l8rKyq5oTAAAAElyGGOsv6Tb5/MpISFBtbW1vG0EABEq7RfvX7Ju569yFBcT9L+h0Ul05PXbyruKAABA10RwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAAgb+z8CFaFGcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILACBs+HJoBIvgAgAArEFwAQAA1iC4AAAAaxBcAACANQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1CC4AAMAaBBcAAGANggsAIGyMMeFuAZYhuAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQCE3bnmlnC3AEsQXAAAYfXv6/+im575vT7bdyLcrcACBBcAQFjNWbNdLUZ6dNWWcLcCCxBcAACANQguAADAGgQXAEBE4PsWcSUILgCAsCGrIFgEFwAAYA2CCwAgInD2BVeC4AIAAKzRoeCyZMkSpaWlKTY2VllZWdq4ceNl699++20NHTpUsbGxysjI0Nq1awO233///XI4HAFLbm5uR1oDAACdWNDBZfXq1crPz1dRUZE2b96sUaNGKScnR9XV1a3Wf/7555o2bZoeeOABbdmyRZMnT9bkyZO1ffv2gLrc3FwdO3bMv6xcubJjewQAADqtoIPLokWLNHPmTOXl5WnYsGFaunSp4uLitGzZslbrX3rpJeXm5mr27Nm6+eabNW/ePN1666165ZVXAuqcTqfcbrd/SUxM7NgeAQCsZLgfGlcgqODS1NSkiooKeTyeiwNERcnj8ai8vLzV55SXlwfUS1JOTs4l9WVlZerbt6+GDBmiWbNm6eTJk8G0BgAAuoBuwRSfOHFCzc3NcrlcAetdLpd2797d6nO8Xm+r9V6v1/84NzdXP/rRj5Senq79+/fr6aef1sSJE1VeXq7o6OhLxmxsbFRjY6P/sc/nC2Y3AACApYIKLtfK1KlT/X/OyMjQyJEjNXDgQJWVlWn8+PGX1BcXF+vZZ58NZYsAgGvsq4az4W4BFgjqraKkpCRFR0erqqoqYH1VVZXcbnerz3G73UHVS9KAAQOUlJSkffv2tbq9oKBAtbW1/uXQoUPB7AYAIELVnSG84PKCCi4xMTEaPXq0SktL/etaWlpUWlqq7OzsVp+TnZ0dUC9JH3zwQZv1knT48GGdPHlSycnJrW53Op2Kj48PWAAA9qtvbA53C4hwQd9VlJ+fr9dee00rVqzQrl27NGvWLNXX1ysvL0+SNH36dBUUFPjrH330UZWUlOjFF1/U7t27NXfuXG3atEmPPPKIJOn06dOaPXu21q9fr4MHD6q0tFSTJk3SoEGDlJOTc5V2EwAAdAZBX+MyZcoUHT9+XIWFhfJ6vcrMzFRJSYn/AtzKykpFRV3MQ7fffrvefPNNPfPMM3r66ac1ePBgrVmzRiNGjJAkRUdHa9u2bVqxYoVqamqUkpKiCRMmaN68eXI6nVdpNwEANjB88D/a4TCd4MZ5n8+nhIQE1dbW8rYRAESotF+8f8m6bXMnaOTcP/gflxf8VyUn9AhlWwijjrx+811FAICw+fY/ne3/pzSuNYILAACwBsEFAABYg+ACAIgYvFOE9hBcAACANQguAADAGgQXAEDE6ASf0IFrjOACAACsQXABAEQMTrigPQQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAMKHu4gQJIILAACwBsEFABAx+BwXtIfgAgAArEFwAQAA1iC4AAAihuFqXbSD4AIAAKxBcAEAANYguAAAIgZ3FaE9BBcAQNgc+qoh3C3AMgQXAEDY/PP7uwIec8IF7SG4AADCpqm5JdwtwDIEFwAAYA2CCwAgbAxX4yJIBBcAQNgQWxAsggsAIGw44YJgEVwAAGHz7dzCW0doD8EFABA+BBUEieACAIgYxBi0h+ACAACsQXABAIQNZ1gQLIILACBicMkL2kNwAQCETaQHleaWCG+wCyK4AADCxkTwm0XbDtdoRNH/1f/69EC4W8E3EFwAABEkcoLMk/+xTV+fbda83+0Mdyv4BoILACBsIvmtIofDEe4W0AqCCwAgYkRSkCG2RCaCCwAAreCES2QiuAAAwiaSzrB8G8ElMhFcAACANQguAICwieATLnJwlUtE6hbuBgAAXZeJwPeK9h8/rXc3H5HvzNlwt4JWEFwAABHjQozx1p7RQ29UaMbtaZqU2S+kPeQu/kRnmyMvUOE83ioCAIRNWydc5r2/U5sra/Toqq0h7UcSoSXCEVwAAGHz7Y/8vxBkTp85F4ZuYAOCCwAgbL4dUL5qaJLErchoG8EFABA2R2vPBDx+5M0tkqSoCEsu55pbwt0C/orgAgCIGCdON0qSoiIrt2h40f/VoVMN4W4DIrgAACJSZCWXxnMtWvrx/nC3ARFcAAAR6JvvFBW9t10bD5wKXzN/1cLNRhGB4AIAuOaC/aC5b55vWVH+F/3kN+VXt6E2HDxR3+a2SPywvK6oQ8FlyZIlSktLU2xsrLKysrRx48bL1r/99tsaOnSoYmNjlZGRobVr1wZsN8aosLBQycnJ6tGjhzwej/bu3duR1gAAESjYsxWhujh3j7dO/1lx2B9KLheQmjnlEhGCDi6rV69Wfn6+ioqKtHnzZo0aNUo5OTmqrq5utf7zzz/XtGnT9MADD2jLli2aPHmyJk+erO3bt/trFixYoF//+tdaunSpNmzYoOuuu045OTk6c+ZMq2MCAOzyn5sPB1UfFaL3A3IWf6LH3/5CH+46/xpWXdfYZi25JTIE/auxaNEizZw5U3l5eRo2bJiWLl2quLg4LVu2rNX6l156Sbm5uZo9e7ZuvvlmzZs3T7feeqteeeUVSefPtixevFjPPPOMJk2apJEjR+q3v/2tjh49qjVr1nynnQMARIYn/2NbUPWtfcHhH3Z4dfirBjWea9aLf9ijir98FbB9+5FafbbvRIf623G0tt0a3iqKDEF9V1FTU5MqKipUUFDgXxcVFSWPx6Py8tZPr5WXlys/Pz9gXU5Ojj+UHDhwQF6vVx6Px789ISFBWVlZKi8v19SpUy8Zs7GxUY2NF1Oxz+cLZjeu2LnmFv3z2l3XZGwA6CqCvY342f+zQ+9/eeyS9Q/+e0XA45c/2qe876dJkv508JS2Hzn/WjA2vbeGp8S3Of7BE/Xa463TzckXaxZ/uFcrPj942b7e2XJEcc5odY/umpeHdoty6Jf3DAt3G8EFlxMnTqi5uVkulytgvcvl0u7du1t9jtfrbbXe6/X6t19Y11bNtxUXF+vZZ58NpvUOaTHS658dvOY/BwBwUTDH3dZqNx44dUV3IX37w+++amj/26D/9/rKK+6ts4npFmVfcIkUBQUFAWdxfD6fUlNTr/rPiXJID/+XgVd9XADoSs41G/3mkz+3uu2nWTdqX9VpbTx4Pmj87Hv9Fd+jm+obm7X8r2dA3PGxGpOWqC2VNcrol6BjtV/ri8O1ujvDrfSk6yRJzS3S0o/3y9ktSv99XPpl+zlztkX/UXFYd2e49efj9dpw4JSmZ/fX5sqvtPtYnc61GMV2j/LXDuxznfYfr9fAPtcpd4T7Ks2KfaJDdeFRO4IKLklJSYqOjlZVVVXA+qqqKrndrf9lut3uy9Zf+G9VVZWSk5MDajIzM1sd0+l0yul0BtN6h3SLjtLsnKHX/OcAQGdXcPfNQT9n7g+HB1X/i4lXfrye83fhP3OAjgkqPsXExGj06NEqLS31r2tpaVFpaamys7NbfU52dnZAvSR98MEH/vr09HS53e6AGp/Ppw0bNrQ5JgAA6JqCfqsoPz9fM2bM0JgxYzR27FgtXrxY9fX1ysvLkyRNnz5d/fr1U3FxsSTp0Ucf1V133aUXX3xR99xzj1atWqVNmzbpX//1XyVJDodDjz32mJ577jkNHjxY6enpmjNnjlJSUjR58uSrt6cAAMB6QQeXKVOm6Pjx4yosLJTX61VmZqZKSkr8F9dWVlYq6hvvg91+++1688039cwzz+jpp5/W4MGDtWbNGo0YMcJf8+STT6q+vl4PPvigampqdMcdd6ikpESxsbFXYRcBAEBn4TCd4MZ0n8+nhIQE1dbWKj6+7VvgAABA5OjI63dkXCIMAABwBQguAADAGgQXAABgDYILAACwBsEFAABYg+ACAACsQXABAADWILgAAABrEFwAAIA1gv7I/0h04cN/fT5fmDsBAABX6sLrdjAf4t8pgktdXZ0kKTU1NcydAACAYNXV1SkhIeGKajvFdxW1tLTo6NGjuv766+VwOK7q2D6fT6mpqTp06BDfg3SNMdehw1yHBvMcOsx16FzNuTbGqK6uTikpKQFf0Hw5neKMS1RUlG644YZr+jPi4+P5nyFEmOvQYa5Dg3kOHeY6dK7WXF/pmZYLuDgXAABYg+ACAACsQXBph9PpVFFRkZxOZ7hb6fSY69BhrkODeQ4d5jp0wj3XneLiXAAA0DVwxgUAAFiD4AIAAKxBcAEAANYguAAAAGsQXNqxZMkSpaWlKTY2VllZWdq4cWO4W4pYc+fOlcPhCFiGDh3q337mzBk9/PDD+pu/+Rv17NlT9957r6qqqgLGqKys1D333KO4uDj17dtXs2fP1rlz5wJqysrKdOutt8rpdGrQoEFavnx5KHYvrD755BP94Ac/UEpKihwOh9asWROw3RijwsJCJScnq0ePHvJ4PNq7d29AzalTp3TfffcpPj5evXr10gMPPKDTp08H1Gzbtk3jxo1TbGysUlNTtWDBgkt6efvttzV06FDFxsYqIyNDa9euver7G07tzfX9999/ye95bm5uQA1z3b7i4mLddtttuv7669W3b19NnjxZe/bsCagJ5TGjMx/rr2Su//Zv//aS3+uf//znATURM9cGbVq1apWJiYkxy5YtMzt27DAzZ840vXr1MlVVVeFuLSIVFRWZ4cOHm2PHjvmX48eP+7f//Oc/N6mpqaa0tNRs2rTJfO973zO33367f/u5c+fMiBEjjMfjMVu2bDFr1641SUlJpqCgwF/z5z//2cTFxZn8/Hyzc+dO8/LLL5vo6GhTUlIS0n0NtbVr15pf/vKX5p133jGSzLvvvhuwff78+SYhIcGsWbPGfPHFF+aHP/yhSU9PN19//bW/Jjc314waNcqsX7/e/PGPfzSDBg0y06ZN82+vra01LpfL3HfffWb79u1m5cqVpkePHuY3v/mNv+azzz4z0dHRZsGCBWbnzp3mmWeeMd27dzdffvnlNZ+DUGlvrmfMmGFyc3MDfs9PnToVUMNcty8nJ8e8/vrrZvv27Wbr1q3m7rvvNjfeeKM5ffq0vyZUx4zOfqy/krm+6667zMyZMwN+r2tra/3bI2muCS6XMXbsWPPwww/7Hzc3N5uUlBRTXFwcxq4iV1FRkRk1alSr22pqakz37t3N22+/7V+3a9cuI8mUl5cbY86/YERFRRmv1+uvefXVV018fLxpbGw0xhjz5JNPmuHDhweMPWXKFJOTk3OV9yZyffvFtKWlxbjdbvPCCy/419XU1Bin02lWrlxpjDFm586dRpL505/+5K/5/e9/bxwOhzly5Igxxph/+Zd/MYmJif65NsaYp556ygwZMsT/+Cc/+Ym55557AvrJysoy//iP/3hV9zFStBVcJk2a1OZzmOuOqa6uNpLMxx9/bIwJ7TGjqx3rvz3XxpwPLo8++mibz4mkueatojY0NTWpoqJCHo/Hvy4qKkoej0fl5eVh7Cyy7d27VykpKRowYIDuu+8+VVZWSpIqKip09uzZgPkcOnSobrzxRv98lpeXKyMjQy6Xy1+Tk5Mjn8+nHTt2+Gu+OcaFmq78d3LgwAF5vd6AeUlISFBWVlbA3Pbq1Utjxozx13g8HkVFRWnDhg3+mjvvvFMxMTH+mpycHO3Zs0dfffWVv4b5P386vG/fvhoyZIhmzZqlkydP+rcx1x1TW1srSerdu7ek0B0zuuKx/ttzfcEbb7yhpKQkjRgxQgUFBWpoaPBvi6S57hRfsngtnDhxQs3NzQF/SZLkcrm0e/fuMHUV2bKysrR8+XINGTJEx44d07PPPqtx48Zp+/bt8nq9iomJUa9evQKe43K55PV6JUler7fV+b6w7XI1Pp9PX3/9tXr06HGN9i5yXZib1ublm/PWt2/fgO3dunVT7969A2rS09MvGePCtsTExDbn/8IYXUFubq5+9KMfKT09Xfv379fTTz+tiRMnqry8XNHR0cx1B7S0tOixxx7T97//fY0YMUKSQnbM+Oqrr7rUsb61uZakn/70p+rfv79SUlK0bds2PfXUU9qzZ4/eeecdSZE11wQXXDUTJ070/3nkyJHKyspS//799dZbb3XJQIHOaerUqf4/Z2RkaOTIkRo4cKDKyso0fvz4MHZmr4cffljbt2/Xp59+Gu5WOr225vrBBx/0/zkjI0PJyckaP3689u/fr4EDB4a6zcviraI2JCUlKTo6+pIr2KuqquR2u8PUlV169eqlm266Sfv27ZPb7VZTU5NqamoCar45n263u9X5vrDtcjXx8fFdNhxdmJvL/a663W5VV1cHbD937pxOnTp1Vea/K/8/MWDAACUlJWnfvn2SmOtgPfLII/rd736ndevW6YYbbvCvD9Uxoysd69ua69ZkZWVJUsDvdaTMNcGlDTExMRo9erRKS0v961paWlRaWqrs7OwwdmaP06dPa//+/UpOTtbo0aPVvXv3gPncs2ePKisr/fOZnZ2tL7/8MuCg/8EHHyg+Pl7Dhg3z13xzjAs1XfnvJD09XW63O2BefD6fNmzYEDC3NTU1qqio8Nd89NFHamlp8R+gsrOz9cknn+js2bP+mg8++EBDhgxRYmKiv4b5D3T48GGdPHlSycnJkpjrK2WM0SOPPKJ3331XH3300SVvnYXqmNEVjvXtzXVrtm7dKkkBv9cRM9dXfBlvF7Rq1SrjdDrN8uXLzc6dO82DDz5oevXqFXBVNS56/PHHTVlZmTlw4ID57LPPjMfjMUlJSaa6utoYc/7WxhtvvNF89NFHZtOmTSY7O9tkZ2f7n3/hdrsJEyaYrVu3mpKSEtOnT59Wb7ebPXu22bVrl1myZEmXuB26rq7ObNmyxWzZssVIMosWLTJbtmwxf/nLX4wx52+H7tWrl3nvvffMtm3bzKRJk1q9HfqWW24xGzZsMJ9++qkZPHhwwC26NTU1xuVymZ/97Gdm+/btZtWqVSYuLu6SW3S7detmFi5caHbt2mWKioo61S26xlx+ruvq6swTTzxhysvLzYEDB8yHH35obr31VjN48GBz5swZ/xjMdftmzZplEhISTFlZWcAtuA0NDf6aUB0zOvuxvr253rdvn/nVr35lNm3aZA4cOGDee+89M2DAAHPnnXf6x4ikuSa4tOPll182N954o4mJiTFjx44169evD3dLEWvKlCkmOTnZxMTEmH79+pkpU6aYffv2+bd//fXX5qGHHjKJiYkmLi7O/P3f/705duxYwBgHDx40EydOND169DBJSUnm8ccfN2fPng2oWbduncnMzDQxMTFmwIAB5vXXXw/F7oXVunXrjKRLlhkzZhhjzt8SPWfOHONyuYzT6TTjx483e/bsCRjj5MmTZtq0aaZnz54mPj7e5OXlmbq6uoCaL774wtxxxx3G6XSafv36mfnz51/Sy1tvvWVuuukmExMTY4YPH27ef//9a7bf4XC5uW5oaDATJkwwffr0Md27dzf9+/c3M2fOvOSgy1y3r7U5lhTw/3Mojxmd+Vjf3lxXVlaaO++80/Tu3ds4nU4zaNAgM3v27IDPcTEmcuba8dedAgAAiHhc4wIAAKxBcAEAANYguAAAAGsQXAAAgDUILgAAwBoEFwAAYA2CCwAAsAbBBQAAWIPgAgAArEFwAQAA1iC4AAAAaxBcAACANf4/lObMF5/PASAAAAAASUVORK5CYII=", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -313,29 +280,27 @@ } ], "source": [ - "fig = plt.figure()\n", - "plt.plot(alpha_tensor.detach().cpu().numpy())" + "plt.matshow(depth_image)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tensor([ 69774986716, 69774986716, 69774986716, ..., 104137094613,\n", - " 104137100257, 104137100257])" + "torch.Size([98])" ] }, - "execution_count": 14, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "tiles_depth_sorted" + "tensor_ranges.shape" ] }, { @@ -343,10 +308,85 @@ "execution_count": 13, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 4849\n", + "4849 11793\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "11793 19001\n", + "19001 28809\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "0 0\n", + "hello\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/tmp/ipykernel_787001/2567456983.py:100: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" + ] + }, { "data": { "text/plain": [ - "tensor([ 2639, 11498, 11499, ..., 14579, 5808, 14576], dtype=torch.int32)" + "tensor([ 6916, 15673, 7166, 15981, 15982, 7164, 15980, 7177, 15992, 7151,\n", + " 15960, 15961, 15962, 7492, 16404, 16405, 7160, 7167, 15983, 7129,\n", + " 7188, 7296, 16124, 16125, 7494, 16407, 16408, 7162, 15978, 7502,\n", + " 16412, 7155, 15968, 7183, 15998, 7508, 16414, 16415, 7154, 15967,\n", + " 7165, 7503, 16413, 7300, 16131, 16132, 7291, 16118, 7493, 16406,\n", + " 7479, 16394, 7441, 16349, 16350, 7153, 15965, 15966, 7452, 16361,\n", + " 7152, 15963, 15964, 7125, 15928, 15929, 7170, 15988, 15989, 7146,\n", + " 15954, 15955, 7128, 15934, 15935, 15936, 7120, 15924, 15925, 7450,\n", + " 16360, 7124, 7354, 16228, 16229, 7293, 16120, 7169, 15986, 15987,\n", + " 7837, 16744, 7100, 15894, 15895, 15896, 15897, 15898],\n", + " dtype=torch.int32)" ] }, "execution_count": 13, @@ -355,239 +395,396 @@ } ], "source": [ - "gaussian_sorted" + "\n", + "color, radii, num_rendered, tiles_depth_sorted,gaussian_sorted,tensor_ranges,alpha_tensor= render(pos, quat)\n", + "depth_image = np.moveaxis(color.detach().cpu().numpy(),0,-1)[...,2]\n", + "viz_gt = b.get_depth_image(depth_image)\n", + "viz_gt\n" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "tensor(16762, dtype=torch.int32)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "gaussian_sorted.max()" + "def signedToUnsigned(n, byte_count): \n", + " return int.from_bytes(n.to_bytes(byte_count, 'little', signed=True), 'little', signed=False)" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tensor([ 69774669731, 69774669731, 69774669846, ..., 104137279267,\n", - " 104137280558, 104137280558])" + "array([4294967289], dtype=uint32)" ] }, - "execution_count": 39, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "tiles_depth_sorted" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'gaussian_sorted' 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/splatting_optim copy.ipynb Cell 13\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m gaussian_sorted\n", - "\u001b[0;31mNameError\u001b[0m: name 'gaussian_sorted' is not defined" - ] - } - ], - "source": [ - "gaussian_sorted" + "a = np.array([-7]).astype(np.int32)\n", + "a.astype(np.uint32)" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tensor([ 69774669731, 69774669731, 69774669846, ..., 104137279267,\n", - " 104137280558, 104137280558])" + "int" ] }, - "execution_count": 31, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "tiles_depth_sorted" + "type(4)" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "torch.Size([12227])" + "7789" ] }, - "execution_count": 35, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "torch.unique(tiles_depth_sorted).shape" + "signedToUnsigned(int(t[0]),4)" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "256" + "7789" ] }, - "execution_count": 36, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "16*16" + "int(t[0])" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "tensor(16762, dtype=torch.int32)" + "array([ 7789, 16670, 16671, 7798, 16681, 16682, 7262, 16079, 7257,\n", + " 16071, 16072, 7225, 16044, 16045, 7258, 16073, 16074, 7799,\n", + " 16683, 7791, 16673, 7763, 16636, 16637, 7793, 16675, 7261,\n", + " 16077, 16078, 7224, 16043, 7790, 16672, 7235, 7775, 16658,\n", + " 16659, 7248, 16062, 16063, 7249, 16064, 16065, 7766, 16643,\n", + " 7176, 7229, 7780, 16664, 7251, 7797, 7776, 16660, 7399,\n", + " 16290, 7230, 7172, 7097, 15892, 15893, 7247, 7222, 16041,\n", + " 16042, 7231, 7218, 7779, 7091, 15884, 15885, 7214, 16033,\n", + " 16034, 7244, 7163, 7223, 7217, 16036, 7072, 15851, 15852,\n", + " 7219, 16037, 7227, 16046, 7401, 16293, 16294, 7211, 16029,\n", + " 7149, 15957, 15958, 7228, 16047, 16048, 7209, 7252],\n", + " dtype=uint32)" ] }, - "execution_count": 23, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "gaussian_sorted.max()" + ".view(np.uint32)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 2, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "tensor([ 69774977559, 69774982546, 69774982546, ..., 104137019522,\n", - " 104137020161, 104137020161])" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "You can open the visualizer by visiting the following URL:\n", + "http://127.0.0.1:7010/static/\n" + ] } ], "source": [ - "tiles_depth_sorted" + "b.setup_visualizer()" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_282961/1411759165.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", - "/var/tmp/ipykernel_282961/2915196021.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" - ] - }, - { - "ename": "ValueError", - "evalue": "too many values to unpack (expected 2)", - "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/splatting_optim copy.ipynb Cell 8\u001b[0m line \u001b[0;36m4\n\u001b[1;32m 1\u001b[0m pos \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mtensor([\u001b[39m0.0\u001b[39m, \u001b[39m0.0\u001b[39m, \u001b[39m0.5\u001b[39m],device\u001b[39m=\u001b[39mdevice)\n\u001b[1;32m 2\u001b[0m quat \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mtensor(torch\u001b[39m.\u001b[39mrand(\u001b[39m4\u001b[39m,device\u001b[39m=\u001b[39mdevice) \u001b[39m-\u001b[39m \u001b[39m0.5\u001b[39m,device\u001b[39m=\u001b[39mdevice)\n\u001b[0;32m----> 4\u001b[0m gt_rendered_image \u001b[39m=\u001b[39m render(pos, quat)\u001b[39m.\u001b[39mdetach()\n\u001b[1;32m 5\u001b[0m depth_image \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mmoveaxis(gt_rendered_image\u001b[39m.\u001b[39mdetach()\u001b[39m.\u001b[39mcpu()\u001b[39m.\u001b[39mnumpy(),\u001b[39m0\u001b[39m,\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,\u001b[39m2\u001b[39m]\n\u001b[1;32m 6\u001b[0m b\u001b[39m.\u001b[39mshow_cloud(\u001b[39m\"\u001b[39m\u001b[39m1\u001b[39m\u001b[39m\"\u001b[39m, b\u001b[39m.\u001b[39munproject_depth_jit(depth_image, intrinsics)\u001b[39m.\u001b[39mreshape(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m,\u001b[39m3\u001b[39m))\n", - "\u001b[1;32m/home/nishadgothoskar/bayes3d/scripts/experiments/gaussian_splatting/splatting_optim copy.ipynb Cell 8\u001b[0m line \u001b[0;36m9\n\u001b[1;32m 6\u001b[0m scales \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mtensor( \u001b[39m0.0025\u001b[39m \u001b[39m*\u001b[39m torch\u001b[39m.\u001b[39mrand((N, \u001b[39m3\u001b[39m)),requires_grad\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m,device\u001b[39m=\u001b[39mdevice)\n\u001b[1;32m 7\u001b[0m rotations \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mrand((N, \u001b[39m4\u001b[39m),requires_grad\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m,device\u001b[39m=\u001b[39mdevice)\n\u001b[0;32m----> 9\u001b[0m gt_rendered_image, radii \u001b[39m=\u001b[39m rasterizer(\n\u001b[1;32m 10\u001b[0m means3D \u001b[39m=\u001b[39m means3D,\n\u001b[1;32m 11\u001b[0m means2D \u001b[39m=\u001b[39m means2D,\n\u001b[1;32m 12\u001b[0m shs \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m,\n\u001b[1;32m 13\u001b[0m colors_precomp \u001b[39m=\u001b[39m means3D[:,\u001b[39m2\u001b[39m:\u001b[39m3\u001b[39m]\u001b[39m.\u001b[39mrepeat(\u001b[39m1\u001b[39m,\u001b[39m3\u001b[39m),\n\u001b[1;32m 14\u001b[0m opacities \u001b[39m=\u001b[39m opacity,\n\u001b[1;32m 15\u001b[0m scales \u001b[39m=\u001b[39m scales,\n\u001b[1;32m 16\u001b[0m rotations \u001b[39m=\u001b[39m rotations\n\u001b[1;32m 17\u001b[0m )\n\u001b[1;32m 18\u001b[0m \u001b[39mreturn\u001b[39;00m gt_rendered_image\n", - "\u001b[0;31mValueError\u001b[0m: too many values to unpack (expected 2)" + "/var/tmp/ipykernel_779547/2926322865.py:33: 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" ] } ], - "source": [ - "pos = torch.tensor([0.0, 0.0, 0.5],device=device)\n", - "quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n", - "\n", - "data = render(pos, quat).detach()\n", - "depth_image = np.moveaxis(gt_rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", - "b.show_cloud(\"1\", b.unproject_depth_jit(depth_image, intrinsics).reshape(-1,3))\n", - "viz_gt = b.get_depth_image(depth_image)\n", - "viz_gt\n" - ] + "source": [] }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 5, "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_577859/758192653.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(quat + torch.rand(4,device=device)*0.1,device=device, requires_grad=True)\n", - "/var/tmp/ipykernel_577859/2915196021.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" + "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": [] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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", "text/plain": [ - "" + "torch.Size([16763, 3])" ] }, - "execution_count": 130, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], + "source": [ + "vertices.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mThe Kernel crashed while executing code in the the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details." + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tensor_ranges" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tensor_ranges" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(num_rendered)\n", + "print(tiles_depth_sorted.shape)\n", + "print(gaussian_sorted.shape)\n", + "print(alpha_tensor.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "plt.plot(alpha_tensor.detach().cpu().numpy())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tiles_depth_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gaussian_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gaussian_sorted.max()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tiles_depth_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gaussian_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tiles_depth_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "torch.unique(tiles_depth_sorted).shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "16*16" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gaussian_sorted.max()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tiles_depth_sorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pos = torch.tensor([0.0, 0.0, 0.5],device=device)\n", + "quat = torch.tensor(torch.rand(4,device=device) - 0.5,device=device)\n", + "\n", + "data = render(pos, quat).detach()\n", + "depth_image = np.moveaxis(gt_rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", + "b.show_cloud(\"1\", b.unproject_depth_jit(depth_image, intrinsics).reshape(-1,3))\n", + "viz_gt = b.get_depth_image(depth_image)\n", + "viz_gt\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "pos = torch.tensor([0.0, 0.0, 0.5],device=device, requires_grad=True)\n", "quat = torch.tensor(quat + torch.rand(4,device=device)*0.1,device=device, requires_grad=True)\n", @@ -602,30 +799,9 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/25 [00:00" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "\n", "optimizer = torch.optim.Adam([\n", @@ -661,40 +837,9 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/tmp/ipykernel_577859/2915196021.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n", - "100%|██████████| 92/92 [00:23<00:00, 3.84it/s]\n" - ] - }, - { - "data": { - "image/png": "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KpUKd955J1asWIHevXsjIyOj2vqefvppPP300zh//jy2bt2Kd955B1999RVUKlW52z707t27Xk5yP336NACgffv2LtPVajVat27tnB8TE4MZM2bgrbfewvLlyzFgwADcfvvtuOeee5zha9SoUfjoo4/wr3/9C08++SQSEhIwYsQI3HHHHTX6myJqKRiwiFqAuv7DffLkSWdA+fPPP13mlY1evP766+jWrVuFy3t7e1e67v79++PDDz/EyZMnsX37dgwYMAAymQz9+/fH9u3bERYWBofDgQEDBlRZ4/Tp03Hbbbfh+++/x4YNGzBnzhzMnz8fmzZtQvfu3Z11fv75587QdaWyEbmauvvuu7F06VI8++yz6Nq1q0vorEpoaChGjx6NkSNHolOnTvjqq6+wbNmyWr9/fXvzzTcxfvx4/PDDD/jf//6HRx55BPPnz8eOHTvQqlUreHh4YNu2bdi8eTP++9//Yv369Vi1ahUGDx6M//3vf+VO9idqqfh1g4gq5HA4MH78eOh0Ojz11FP48ssv8e233zrnx8bGAigdAUpMTKzwVdXtH8qC08aNG7F7927nzzfeeCO2b9+O7du3w8vLCz169Ki21tjYWMycORP/+9//cPDgQVitVrz55psudQYHB1dY46BBg2q1X/r374/IyEhs2bKlytGryqhUKlx33XWw2WzIycmp9fJ1UXbCfWpqqst0q9WKtLQ05/wyXbp0wTPPPINt27Zh+/btOHv2LJYuXeqcL5fLkZCQgLfeeguHDx/GSy+9hE2bNtXqcCtRc8eARUQVeuutt/Dbb7/hgw8+wAsvvIB+/frhoYcecoaCHj16IDY2Fm+88QYKCgrKLX/hwoUq1x8TE4Pw8HC8/fbbsNlsztsZDBgwACdOnMDXX3+Nvn37VjnCU1RUBLPZ7DItNjYWPj4+sFgsAICkpCTodDq8/PLLzqvlalPn1cpuJTFv3jzce++9lbY7fvy4y5WMZfLy8pCSkgI/Pz8EBQXV6r3rKjExEWq1Gu+++67LrTH+85//wGg0YujQoQAAk8lU7orHLl26QC6XO/fnxYsXy62/bASzrA0R8RAhEVXgyJEjmDNnDsaPH4/bbrsNQOnjXLp164aHH34YX331FeRyOT766CMMGTIEnTp1woQJExAeHo6zZ89i8+bN0Ol0WLt2bZXvM2DAAKxcuRJdunRxnqt1/fXXw8vLC8eOHat2hOjYsWNISEjAXXfdhY4dO0KpVOK7775DVlYWRo8eDaB0hG3JkiW49957cf3112P06NEICgpCeno6/vvf/+KGG27AwoULa7V/hg0bhmHDhlXZpuz8sSFDhmDAgAHw9/fH2bNn8emnn+LcuXNYsGBBucNpP/30k8sjdMr069cPrVu3rvL9Lly4gBdffLHc9JiYGIwdOxazZ8/Gc889h1tuuQW33347UlNTsXjxYvTq1ct5d/pNmzZh6tSpuPPOO9GuXTuUlJTg888/h0KhwMiRIwGU3m1+27ZtGDp0KKKiopCdnY3FixejVatW6N+/f5U1ErUo7r6MkYjqT9nl/7t3766y3ZW3aSgpKRG9evUSrVq1Enl5eS7t3nnnHQFArFq1yjlt//79YsSIESIgIEBoNBoRFRUl7rrrLpGcnFyujrLbNJRZtGiRACAeeughl+mJiYkCgMs6hCh/m4acnBwxZcoUERcXJ7y8vIRerxd9+vQRX331Vblt3Lx5s0hKShJ6vV5otVoRGxsrxo8fL/bs2VPlvrnyNg1VufpWCVlZWeKVV14RAwcOFKGhoUKpVAo/Pz8xePBg8fXXX7ssW9VtGq7c3qreu7JlExISnO0WLlwo4uLihEqlEgaDQTz00EPi0qVLzvknT54U999/v4iNjRVarVb4+/uL//u//xM///yzs01ycrIYNmyYCAsLE2q1WoSFhYkxY8aIY8eOVVkjUUsjE+KK8WIiIiIiumY8B4uIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDHeaPQyh8OBc+fOwcfHBzKZzN3lEBERkRsJIZCfn4+wsLA6PcicAeuyc+fOISIiwt1lEBERUSOSkZGBVq1a1Xo5BqzLfHx8AJTuSJ1O5+ZqiIiIyJ1MJhMiIiKc+aC2GLAuKzssqNPpGLCIiIgIAOp82hBPciciIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYm4LWIsWLUJ0dDS0Wi369OmDXbt2Vdl+9erViIuLg1arRZcuXfDjjz9W2vbBBx+ETCbDggULJK6aiIiIqHpuCVirVq3CjBkzMG/ePOzbtw9du3ZFUlISsrOzK2z/22+/YcyYMZg4cSL279+P4cOHY/jw4Th48GC5tt999x127NiBsLCw+t4MIiIiogq5JWC99dZbmDRpEiZMmICOHTti6dKl8PT0xMcff1xh+3feeQe33HILZs2ahQ4dOuCFF17A9ddfj4ULF7q0O3v2LKZNm4bly5dDpVI1xKYQERERldPgActqtWLv3r1ITEz8uwi5HImJiUhJSalwmZSUFJf2AJCUlOTS3uFw4N5778WsWbPQqVOnauuwWCwwmUwuLyIiIiIpNHjAysnJgd1uh8FgcJluMBiQmZlZ4TKZmZnVtn/11VehVCrxyCOP1KiO+fPnQ6/XO18RERG13BIiIiKiijWLqwj37t2Ld955B8uWLYNMJqvRMrNnz4bRaHS+MjIy6rlKIiIiaikaPGAFBgZCoVAgKyvLZXpWVhZCQkIqXCYkJKTK9tu3b0d2djYiIyOhVCqhVCpx+vRpzJw5E9HR0RWuU6PRQKfTubyIiIiIpNDgAUutVqNHjx5ITk52TnM4HEhOTkZ8fHyFy8THx7u0B4CNGzc629977734448/8PvvvztfYWFhmDVrFjZs2FB/G0NERERUAaU73nTGjBkYN24cevbsid69e2PBggUoLCzEhAkTAAD33XcfwsPDMX/+fADAo48+ioEDB+LNN9/E0KFDsXLlSuzZswcffPABACAgIAABAQEu76FSqRASEoL27ds37MYRERFRi+eWgDVq1ChcuHABc+fORWZmJrp164b169c7T2RPT0+HXP734Fq/fv2wYsUKPPPMM3jqqafQtm1bfP/99+jcubM7yiciIiKqkkwIIdxdRGNgMpmg1+thNBp5PhYREVELd625oFlcRUhERETUmDBgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSmNsC1qJFixAdHQ2tVos+ffpg165dVbZfvXo14uLioNVq0aVLF/z444/OeTabDU888QS6dOkCLy8vhIWF4b777sO5c+fqezOIiIiIynFLwFq1ahVmzJiBefPmYd++fejatSuSkpKQnZ1dYfvffvsNY8aMwcSJE7F//34MHz4cw4cPx8GDBwEARUVF2LdvH+bMmYN9+/bh22+/RWpqKm6//faG3CwiIiIiAIBMCCEa+k379OmDXr16YeHChQAAh8OBiIgITJs2DU8++WS59qNGjUJhYSHWrVvnnNa3b19069YNS5curfA9du/ejd69e+P06dOIjIystiaTyQS9Xg+j0QidTlfHLSMiIqLm4FpzQYOPYFmtVuzduxeJiYl/FyGXIzExESkpKRUuk5KS4tIeAJKSkiptDwBGoxEymQy+vr6S1E1ERERUU8qGfsOcnBzY7XYYDAaX6QaDAUePHq1wmczMzArbZ2ZmVtjebDbjiSeewJgxYypNnRaLBRaLxfmzyWSqzWYQERERVarZXUVos9lw1113QQiBJUuWVNpu/vz50Ov1zldEREQDVklERETNWYMHrMDAQCgUCmRlZblMz8rKQkhISIXLhISE1Kh9Wbg6ffo0Nm7cWOUx09mzZ8NoNDpfGRkZAIAia0ldNouIiIjIqcEDllqtRo8ePZCcnOyc5nA4kJycjPj4+AqXiY+Pd2kPABs3bnRpXxaujh8/jp9//hkBAQFV1qHRaKDT6VxeABA/fxO6zNuADnPW45Ev9+NSobWum0pEREQtVIOfgwUAM2bMwLhx49CzZ0/07t0bCxYsQGFhISZMmAAAuO+++xAeHo758+cDAB599FEMHDgQb775JoYOHYqVK1diz549+OCDDwCUhqs77rgD+/btw7p162C3253nZ/n7+0OtVte4NrtDIN9SOoq15sA57EzLxX3x0bg+0g9dI/TwVLtllxEREVET4pa0MGrUKFy4cAFz585FZmYmunXrhvXr1ztPZE9PT4dc/vfgWr9+/bBixQo888wzeOqpp9C2bVt8//336Ny5MwDg7NmzWLNmDQCgW7duLu+1efNmDBo0qMa1bZo5EHKNJy7kWzD7uz9x8kIhXt+QCgBQyGWIC/HB9ZF+uD7K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vPjii3jwwQexePFiqNVq6PV6yGQyl/e7WnJyMv7880+kpaUhIiICAPDZZ5+hU6dO2L17N3r16gWgNIgtW7YMPj4+AIB7770XycnJeOmll65txxBRo8MRLCJq8g4cOIDNmzfD29vb+YqLiwNQOmpUpkePHuWW/fnnn5GQkIDw8HD4+Pjg3nvvRW5uLoqKimr8/keOHEFERIQzXAFAx44d4evriyNHjjinRUdHO8MVAISGhiI7O7tW20pETQNHsIioySsoKMBtt92GV199tdy80NBQ5/97eXm5zDt16hRuvfVWPPTQQ3jppZfg7++PX375BRMnToTVaoWnp6ekdapUKpefZTIZHA6HpO9BRI0DAxYRNSlqtRp2u91l2vXXX49vvvkG0dHRUCpr3q3t3bsXDocDb775JuTy0gH9r776qtr3u1qHDh2QkZGBjIwM5yjW4cOHkZeXh44dO9a4HiJqPniIkIialOjoaOzcuROnTp1CTk4OHA4HpkyZgosXL2LMmDHYvXs3Tpw4gQ0bNmDChAlVhqM2bdrAZrPhvffew8mTJ/H55587T36/8v0KCgqQnJyMnJycCg8dJiYmokuXLhg7diz27duHXbt24b777sPAgQPRs2dPyfcBETV+DFhE1KQ8/vjjUCgU6NixI4KCgpCeno6wsDD8+uuvsNvtuPnmm9GlSxdMnz4dvr6+zpGpinTt2hVvvfUWXn31VXTu3BnLly/H/PnzXdr069cPDz74IEaNGoWgoKByJ8kDpYf6fvjhB/j5+eHGG29EYmIiWrdujVWrVkm+/UTUNMiEEMLdRRARERE1JxzBIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKS2P8DDM9LoAXJPNgAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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//1PdO7cWajVatG+fXvxxRdfVLodQYWPP/5YdO/eXWg0GuHn5ycGDhwoNmzYUGMNV96OoMLKlSsd6/P39xdjx44Vp0+fdmozbtw44eXlVamWqmokIfisOmoR5s+fj8ceewynT59GeHi4u8shIqImisGJmp2SkhKnK1xKS0vRvXt32Gw2HD161I2VERFRU8dznKjZGTFiBCIjI9GtWzcYjUZ88cUXOHLkCJYtW+bu0oiIqIljcKJmJykpCR999BGWLVsGm82Gjh07YsWKFRg1apS7SyMioiaOh+qIiIiIJGrW93FauHAhoqOjodVq0adPH+zcudPdJRFRM8C+hajlarbBaeXKlZgxYwbmzZuHvXv3omvXrkhKSkJOTo67SyOiJox9C1HL1mwP1fXp0we9evXCggULAJQ/mywiIgLTpk3Dk08+We2ydrsdZ8+ehY+PDx+3QdRAhBAoKChAWFhYpQe4NibX0rdUtGf/QtSw6rJ/aZYnh1ssFuzZswezZ892TJPL5UhMTERqamql9maz2em29GfOnKmzp1QTUe1kZmaiVatW7i7Dpdr2LQD7F6LGpC76l2YZnHJzc2Gz2WAwGJymGwwGx4MgL5ecnIznnnuu0vTMzEzodLp6q5OI/mYymRAREVHrR2Y0pNr2LQD7F6LGoC77l2YZnGpr9uzZmDFjhuPnih2s0+nYsRE1sOZ2+Ir9C1HjURf9S7MMToGBgVAoFMjOznaanp2djZCQkErtNRoNNBpNQ5VHRE1UbfsWgP0LUXPTeM/AvAZqtRo9evRASkqKY5rdbkdKSgri4+PdWBkRNWXsW4ioWY44AcCMGTMwbtw49OzZE71798b8+fNRVFSECRMmuLs0ImrC2LcQtWzNNjiNGjUK58+fx9y5c5GVlYVu3bph3bp1lU7qJCKqDfYtRC1bs72P07UwmUzQ6/UwGo08eZOogbSUz11L2U6ixqQuP3fN8hwnIiIiovrA4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJ1OSCU3JyMnr16gUfHx8EBwdj+PDhSEtLc2pTWlqKKVOmICAgAN7e3hg5ciSys7PdVDERNRXsX4ioJk0uOG3ZsgVTpkzB9u3bsWHDBlitVtx8880oKipytHnsscewZs0arFq1Clu2bMHZs2cxYsQIN1ZNRE0B+xciqolMCCHcXcS1OH/+PIKDg7FlyxbceOONMBqNCAoKwvLly3HHHXcAAI4cOYIOHTogNTUVffv2rXGdJpMJer0eRqMROp2uvjeBiNA4P3fsX4iah7r83DW5EacrGY1GAIC/vz8AYM+ePbBarUhMTHS0iYuLQ2RkJFJTU91SIxE1TexfiOhKSncXcC3sdjumT5+OG264AZ07dwYAZGVlQa1Ww9fX16mtwWBAVlaWy/WYzWaYzWbHzyaTqd5qJqKmgf0LEbnSpEecpkyZggMHDmDFihXXtJ7k5GTo9XrHKyIioo4qJKKmiv0LEbnSZIPT1KlTsXbtWmzatAmtWrVyTA8JCYHFYkF+fr5T++zsbISEhLhc1+zZs2E0Gh2vzMzM+iydiBo59i9EVJUmF5yEEJg6dSq+++47bNy4ETExMU7ze/ToAZVKhZSUFMe0tLQ0ZGRkID4+3uU6NRoNdDqd04uIWh72L0RUkyZ3jtOUKVOwfPly/PDDD/Dx8XGcV6DX6+Hh4QG9Xo+JEydixowZ8Pf3h06nw7Rp0xAfHy/pihciarnYvxBRTZrc7QhkMpnL6Z988gnGjx8PoPwGdTNnzsSXX34Js9mMpKQkLFq0qMqh9CvxcmGihtcYPnfsX4iap7r83DW54NQQ2LERNbyW8rlrKdtJ1JjwPk5EREREbsDgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRM3CbHE3IncfQ7st59Buyzm0+v0g3hNJ7i6L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s9GtWzeX69RoNNBoru7BjVQ3jhfKsOS/BVD8WABPBeChAGL8gFtiNNCFaDF76ElYwz2wMf5TpGv00NtLoLWXYdh6gWPP7QN2uXsLqDlg/9JyfN1jB2J9gfhwFcZNM6GorSc+6r0CqWXXIV75B8JtRgzfAuS8sh9nz5ix5IQdT/P8f0ITDE433HAD0tLSnKYdPXoUUVFRAICYmBiEhIQgJSXF0ZGZTCbs2LEDDz30UEOXSxK9ZK350n8NgCEVPyguvW4FOtxaf3VRy8L+peV4pNDu9LMPgMcAPKa6NEEJIAFolVB+ZK53w5ZHjViTC06PPfYY+vXrh5dffhl33XUXdu7ciQ8++AAffPABAEAmk2H69Ol48cUX0bZtW8TExGDOnDkICwvD8OHD3Vs8ETVq7F+IqEaiCVqzZo3o3Lmz0Gg0Ii4uTnzwwQdO8+12u5gzZ44wGAxCo9GIhIQEkZaWJnn9RqNRABBGo7GuSyeiKjSWzx37F6Lmpy4/d03uPk4NgfdZIWp4LeVz11K2k6gxqcvPXZO7czgRERGRuzA4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBI1ueBks9kwZ84cxMTEwMPDA7GxsXjhhRcghHC0EUJg7ty5CA0NhYeHBxITE3Hs2DE3Vk1ETQH7FyKqSZMLTq+++ioWL16MBQsW4PDhw3j11Vfx2muv4b333nO0ee211/Duu+9iyZIl2LFjB7y8vJCUlITS0lI3Vk5EjR37FyKqiUxc/lWqCbj11lthMBjwn//8xzFt5MiR8PDwwBdffAEhBMLCwjBz5kw8/vjjAACj0QiDwYClS5di9OjRNb6HyWSCXq+H0WiETqert20hor81hs8d+xei5qkuP3dNbsSpX79+SElJwdGjRwEA+/fvxy+//IIhQ4YAANLT05GVlYXExETHMnq9Hn369EFqaqpbaiaipoH9CxHVROnuAmrrySefhMlkQlxcHBQKBWw2G1566SWMHTsWAJCVlQUAMBgMTssZDAbHvCuZzWaYzWbHzyaTqZ6qJ6LGjP0LEdWkyY04ffXVV1i2bBmWL1+OvXv34tNPP8Ubb7yBTz/99KrXmZycDL1e73hFRETUYcVE1FSwfyGimjS54DRr1iw8+eSTGD16NLp06YJ7770Xjz32GJKTkwEAISEhAIDs7Gyn5bKzsx3zrjR79mwYjUbHKzMzs343gogaJfYvRFSTJheciouLIZc7l61QKGC32wEAMTExCAkJQUpKimO+yWTCjh07EB8f73KdGo0GOp3O6UVELQ/7FyKqSZM7x+m2227DSy+9hMjISHTq1An79u3DW2+9hfvvvx8AIJPJMH36dLz44oto27YtYmJiMGfOHISFhWH48OHuLZ6IGjX2L0RUkyYXnN577z3MmTMHDz/8MHJychAWFoYHHngAc+fOdbT597//jaKiIkyePBn5+fno378/1q1bB61W68bKiaixY/9CRDVpcvdxagi8zwpRw2spn7uWsp1EjUmLvo8TERERkbswOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRREp3F9AYCSEAACaTyc2VELUcFZ+3is9fc8X+hajh1WX/wuDkQkFBAQAgIiLCzZUQtTwFBQXQ6/XuLqPesH8hcp+66F9korl/vbsKdrsdZ8+ehRACkZGRyMzMhE6nc3dZNTKZTIiIiGC99aip1dyU6hVCoKCgAGFhYZDLm+9ZBHa7HWlpaejYsWOT+L0ATevvqEJTq5n11q+67F844uSCXC5Hq1atHEN7Op2uSfxhVGC99a+p1dxU6m3OI00V5HI5wsPDATSd30uF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mjVrqn2fAQMGYMWKFejSpYvjXKjrr78eXl5eOHr0aI0jOkePHkVCQgLuuusudOzYEUqlEt999x2ys7MxevRoAOUjYosXL8a9996L66+/HqNHj0ZQUBAyMjLw3//+FzfccAMWLFhQq/0zbNgwDBs2rNo2FednDRkyBAMGDIC/vz/OnDmDTz/9FGfPnsX8+fMrHdb66aefnB7FUqFfv35o3bp1te93/vx5vPjii5Wmx8TEYOzYsZg9ezaee+453HLLLbj99tuRlpaGRYsWoVevXo67oW/cuBFTp07FnXfeiXbt2qGsrAyff/45FAoFRo4cCaD87uZbt27F0KFDERUVhZycHCxatAitWrVC//79q62RqNly92V9RFQ3Ki5z37VrV7XtLr8dQVlZmejVq5do1aqVyM/Pd2r3zjvvCABi5cqVjmn79u0TI0aMEAEBAUKj0YioqChx1113iZSUlEp1VNyOoMLChQsFAPHQQw85TU9MTBQAnNYhROXbEeTm5oopU6aIuLg44eXlJfR6vejTp4/46quvKm3jpk2bRFJSktDr9UKr1YrY2Fgxfvx4sXv37mr3zeW3I6jOlbcEyM7OFq+88ooYOHCgCA0NFUqlUvj5+YnBgweLr7/+2mnZ6m5HcPn2VvfeVS2bkJDgaLdgwQIRFxcnVCqVMBgM4qGHHhIXL150zD9x4oS4//77RWxsrNBqtcLf31/83//9n/j5558dbVJSUsSwYcNEWFiYUKvVIiwsTIwZM0YcPXq02hqJmjOZEJeN5RIRERFRlXiOExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQStcgbYNrtdpw9exY+Pj5VPomdiIiIWgYhBAoKChAWFlbjA6xbZHA6e/YsIiIi3F0GERERNSKZmZlo1apVtW1aZHDy8fEBUL6DdDqdm6shIiIidzKZTIiIiHDkg+q0yOBUcXhOp9MxOBEREREASDp9hyeHExEREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFE9R6cFi5ciOjoaGi1WvTp0wc7d+6stv2qVasQFxcHrVaLLl264Mcff6yy7YMPPgiZTIb58+fXcdVEREREldVrcFq5ciVmzJiBefPmYe/evejatSuSkpKQk5Pjsv1vv/2GMWPGYOLEidi3bx+GDx+O4cOH48CBA5Xafvfdd9i+fTvCwsLqcxOIiIiIHOo1OL311luYNGkSJkyYgI4dO2LJkiXw9PTExx9/7LL9O++8g1tuuQWzZs1Chw4d8MILL+D666/HggULnNqdOXMG06ZNw7Jly6BSqepzE4iIiIgc6i04WSwW7NmzB4mJiX+/mVyOxMREpKamulwmNTXVqT0AJCUlObW32+249957MWvWLHTq1ElSLWazGSaTyelFREREVFv1Fpxyc3Nhs9lgMBicphsMBmRlZblcJisrq8b2r776KpRKJR555BHJtSQnJ0Ov1zteERERtdgSIiIionJN6qq6PXv24J133sHSpUshk8kkLzd79mwYjUbHKzMzsx6rJCIiouaq3oJTYGAgFAoFsrOznaZnZ2cjJCTE5TIhISHVtt+2bRtycnIQGRkJpVIJpVKJU6dOYebMmYiOjq6yFo1GA51O5/QiIiIiqq16C05qtRo9evRASkqKY5rdbkdKSgri4+NdLhMfH+/UHgA2bNjgaH/vvffijz/+wO+//+54hYWFYdasWVi/fn19bQoRERERAEBZnyufMWMGxo0bh549e6J3796YP38+ioqKMGHCBADAfffdh/DwcCQnJwMAHn30UQwcOBBvvvkmhg4dihUrVmD37t344IMPAAABAQEICAhweg+VSoWQkBC0b9++PjeFiIiIqH6D06hRo3D+/HnMnTsXWVlZ6NatG9atW+c4ATwjIwNy+d+DXv369cPy5cvxzDPP4KmnnkLbtm3x/fffo3PnzvVZJhEREZEkMiGEcHcRDc1kMkGv18NoNPJ8JyIiohauNrmgSV1VR0RERORODE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERE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evTogZSUFMc0u92OlJQUxMfHu1wmPj7eqT0AbNiwwdE+JiYGISEhTm1MJhN27NhR5ToBQKPRQKfTOb2IiIiIaqten1U3Y8YMjBs3Dj179kTv3r0xf/58FBUVYcKECQCA++67D+Hh4UhOTgYAPProoxg4cCDefPNNDB06FCtWrMDu3bvxwQcfACh//tX06dPx4osvom3btoiJicGcOXMQFhaG4cOH1+emEBEREdVvcBo1ahTOnz+PuXPnIisrC926dcO6descJ3dnZGRALv970Ktfv35Yvnw5nnnmGTz11FNo27Ytvv/+e3Tu3NnR5t///jeKioowefJk5Ofno3///li3bh20Wm2l9yciIiKqS3zILw/bERERtWiN4j5ORERERM0NgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFE9RacLly4gLFjx0Kn08HX1xcTJ05EYWFhtcuUlpZiypQpCAgIgLe3N0aOHIns7GzH/P3792PMmDGIiIiAh4cHOnTogHfeeae+NoGIiIjISb0Fp7Fjx+LgwYPYsGED1q5di61bt2Ly5MnVLvPYY49hzZo1WLVqFbZs2YKzZ89ixIgRjvl79uxBcHAwvvjiCxw8eBBPP/00Zs+ejQULFtTXZhARERE5yIQQoq5XevjwYXTs2BG7du1Cz549AQDr1q3DP/7xD5w+fRphYWGVljEajQgKCsLy5ctxxx13AACOHDmCDh06IDU1FX379nX5XlOmTMHhw4exceNGyfWZTCbo9XoYjUbodLqr2EIiIiJqLmqTC+plxCk1NRW+vr6O0AQAiYmJkMvl2LFjh8tl9uzZA6vVisTERMe0uLg4REZGIjU1tcr3MhqN8Pf3r7Yes9kMk8nk9CIiIiKqrXoJTllZWQgODnaaplQq4e/vj6ysrCqXUavV8PX1dZpuMBiqXOa3337DypUrazwEmJycDL1e73hFRERI3xgiIiKiS2oVnJ588knIZLJqX0eOHKmvWp0cOHAAw4YNw7x583DzzTdX23b27NkwGo2OV2ZmZoPUSERERM2LsjaNZ86cifHjx1fbpnXr1ggJCUFOTo7T9LKyMly4cAEhISEulwsJCYHFYkF+fr7TqFN2dnalZQ4dOoSEhARMnjwZzzzzTI11azQaaDSaGtsRERERVadWwSkoKAhBQUE1touPj0d+fj727NmDHj16AAA2btwIu92OPn36uFymR48eUKlUSElJwciRIwEAaWlpyMjIQHx8vKPdwYMHMXjwYIwbNw4vvfRSbconIiIiuib1clUdAAwZMgTZ2dlYsmQJrFYrJkyYgJ49e2L58uUAgDNnziAhIQGfffYZevfuDQB46KGH8OOPP2Lp0qXQ6XSYNm0agPJzmYDyw3ODBw9GUlISXn/9dcd7KRQKSYGuAq+qIyIiogq1yQW1GnGqjWXLlmHq1KlISEiAXC7HyJEj8e677zrmW61WpKWlobi42DHt7bffdrQ1m81ISkrCokWLHPO//vprnD9/Hl988QW++OILx/SoqCicPHmyvjaFiIiICEA9jjg1ZhxxIiIiogpuv48TERERUXPE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERSVRvwenChQsYO3YsdDodfH19MXHiRBQWFla7TGlpKaZMmYKAgAB4e3tj5MiRyM7Odtk2Ly8PrVq1gkwmQ35+fj1sAREREZGzegtOY8eOxcGDB7FhwwasXbsWW7duxeTJk6td5rHHHsOaNWuwatUqbNmyBWfPnsWIESNctp04cSKuu+66+iidiIiIyCWZEELU9UoPHz6Mjh07YteuXejZsycAYN26dfjHP/6B06dPIywsrNIyRqMRQUFBWL58Oe644w4AwJEjR9ChQwekpqaib9++jraLFy/GypUrMXfuXCQkJODixYvw9fWVXJ/JZIJer4fRaIROp7u2jSUiIqImrTa5oF5GnFJTU+Hr6+sITQCQmJgIuVyOHTt2uFxmz549sFqtSExMdEyLi4tDZGQkUlNTHdMOHTqE559/Hp999hnkcmnlm81mmEwmpxcRERFRbdVLcMrKykJwcLDTNKVSCX9/f2RlZVW5jFqtrjRyZDAYHMuYzWaMGTMGr7/+OiIjIyXXk5ycDL1e73hFRETUboOIiIiIUMvg9OSTT0Imk1X7OnLkSH3VitmzZ6NDhw645557ar2c0Wh0vDIzM+upQiIiImrOlLVpPHPmTIwfP77aNq1bt0ZISAhycnKcppeVleHChQsICQlxuVxISAgsFgvy8/OdRp2ys7Mdy2zcuBF//vknvv76awBAxelZgYGBePrpp/Hcc8+5XLdGo4FGo5GyiURERERVqlVwCgoKQlBQUI3t4uPjkZ+fjz179qBHjx4AykOP3W5Hnz59XC7To0cPqFQqpKSkYOTIkQCAtLQ0ZGRkID4+HgDwzTffoKSkxLHMrl27cP/992Pbtm2IjY2tzaYQERER1VqtgpNUHTp0wC233IJJkyZhyZIlsFqtmDp1KkaPHu24ou7MmTNISEjAZ599ht69e0Ov12PixImYMWMG/P39odPpMG3aNMTHxzuuqLsyHOXm5jrerzZX1RERERFdjXoJTgCwbNkyTJ06FQkJCZDL5Rg5ciTeffddx3yr1Yq0tDQUFxc7pr399tuOtmazGUlJSVi0aFF9lUhERERUK/VyH6fGjvdxIiIiogpuv48TERERUXPE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFESncX4A5CCACAyWRycyVERETkbhV5oCIfVKdFBqe8vDwAQEREhJsrISIiosaioKAAer2+2jYtMjj5+/sDADIyMmrcQVR3TCYTIiIikJmZCZ1O5+5yWgzud/fhvncP7nf3aMr7XQiBgoIChIWF1di2RQYnubz81C69Xt/kfrnNgU6n4353A+539+G+dw/ud/doqvtd6kAK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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "T = 0\n", "fig = plt.figure(figsize=(6,6))\n", @@ -732,7 +877,7 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/scripts/experiments/gaussian_splatting/splatting_optim.ipynb b/scripts/experiments/gaussian_splatting/splatting_optim.ipynb index a9f2aa5f..9968ebc4 100644 --- a/scripts/experiments/gaussian_splatting/splatting_optim.ipynb +++ b/scripts/experiments/gaussian_splatting/splatting_optim.ipynb @@ -5,13 +5,6 @@ "execution_count": 1, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "GenJAX not installed. Importing bayes3d without genjax dependencies.\n" - ] - }, { "data": { "text/plain": [ @@ -50,7 +43,7 @@ "output_type": "stream", "text": [ "You can open the visualizer by visiting the following URL:\n", - "http://127.0.0.1:7001/static/\n" + "http://127.0.0.1:7013/static/\n" ] } ], @@ -79,17 +72,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_577859/2926322865.py:33: 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", + "/var/tmp/ipykernel_1076122/3999498306.py:33: 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" ] } ], "source": [ "intrinsics = b.Intrinsics(\n", - " height=100,\n", - " width=100,\n", - " fx=100.0, fy=100.0,\n", - " cx=50.0, cy=50.0,\n", + " height=200,\n", + " width=200,\n", + " fx=300.0, fy=300.0,\n", + " cx=100.0, cy=100.0,\n", " near=0.01, far=2.5\n", ")\n", "fovX = jnp.arctan(intrinsics.width / 2 / intrinsics.fx) * 2\n", @@ -122,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -163,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -188,7 +181,14 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -200,7 +200,7 @@ " scales = torch.tensor( 0.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n", " rotations = torch.rand((N, 4),requires_grad=True,device=device)\n", "\n", - " gt_rendered_image, radii = rasterizer(\n", + " color, radii= rasterizer(\n", " means3D = means3D,\n", " means2D = means2D,\n", " shs = None,\n", @@ -209,32 +209,32 @@ " scales = scales,\n", " rotations = rotations\n", " )\n", - " return gt_rendered_image" + " return color" ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_577859/1411759165.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", + "/var/tmp/ipykernel_1076122/1411759165.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", - "/var/tmp/ipykernel_577859/2915196021.py:6: 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", + "/var/tmp/ipykernel_1076122/967631123.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAFWElEQVR4nO2bfYgUdRiAn525273z7tZT8yMjUDMTPCPLSIzLRFHEDMkzIskKLEspBCmpw0LlDgpCRdD8PDBQMoSjBCkqwbA6Py6vzjIR+xA/cO3M3dPdmbvZ6Y9z527d9fLutrt36H1g2J13Zod35uH9vfPb2Q24ruuiiMHo6wSUdFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMFSIMHwv5Oz0ImZaVcy2VtHwQLCv0+kxvhVycLTJlG0uFWfmc2VMI5fuaeC1YDXvFZp9nVqPCPjxP4bNi4Yw47uFJO0YrmORtKO4jgVA3dbLmE/U9XGG3cd3FfJXRSkzDy/CdWwv5jqWtzz29jR+uD+f1SF/VoqvhOwZajA/th3XsQmYQQJmiIAZ8qoDwIo0sPhqBYeiq9kY9tXpAT4SUjPAYPvsE1gXjnmxlBSApJPw4q5jcWVMI9XfNLK2yDenCPhIyKatcZqPfgSkRLQtTjySJgPah7DhT65h39R9nJ1eRGV+Xl+k3WV80dRb90/i8bdm4SatjG2Ji4c9IYZZ4FUM4A1pZuFgar7+nt0jjrHKdnot7+4gvkKqC0xmfLAMgIAR8l4DRoik3Zy1Om5ed+IRXpgygZ3n9lB7p+xTlp0d8OzJh7Ev/+qtp6QA2E0/39YxUrfGQx75jLUj1uFuKhM7hIkesjb3N9g9fiMt0T+BdBmt185jNZ3w1g2zwHt/87B186sRDFP+yxUG9dvFirisIUx0hdQ1LfVkAF4PcZNWmoyukKqWg2P6sXTBoJzkmUvECtlQbHDqoTsy4m7SInHxcFqsY3Vk7H+jp2TrLeNeOZSDTHOLWCHPPzWQZEsM17HTZuVWpCGjkXeXe9f8npPj5BKxQsZW70qT4To2dtNJHPtq2n6dVQek95MUXtW0xHOUbe6QeasBjFseJnbjwiXtKE48clsysglI4TqWt911LC4uK89hxrlBbIUkTh/w5hBOPILrWGkCbkdGZ3IAGs9NzU2yOUSskIJR5RmNGNpEmMH+3iy849IVjGCY95f8lKt0c4ZYIbXLV2TEunPhb8X6I/Xi5iAgWEh1eR13nx4FtE/mslVFtgq5lbhUrHhsBV8Nq++dE+kiYpt6VUsrD9ZeJz+4xIuVjF9A9PgOIHNeAZ33jI7baocuJpyQVx0gWMjqkEl40hYSNx5ABcwQNdfm4oxM8lzsHazLP3b6+Y7COsoYcKqMcGj3f5Z3TxE7ZAEYBaVA+wV9saiW4SsnsPx8JfP+uI5ZOPiWTT1bfOC89UwsfrfX8u8Oor9cHBnZy9DJXwB4j2qNYAklkxcTXbefkpcmE6vf6T2Q6ozSaZXM/+Q+Fv2d7I3Uu41oIRuKDT6d/S2x+hov1v6tbfpvsNpm9VaH9fb3l+rmsPCup8U/nALhQgC2lRrsWdlK9MNXgWyTvzYxwQGjOfDyZmYd/5zYl+sAOFM7i02PTmHuBdlV0RHxQgD2DjP4+OwbRGaUkbhwJG1bwAxS8kwVb+7ox7Tf2iqgMj+PqpbWvki1x/hCSGV+HuE8l0Ehl5kTCxn+ehlb5oQZ4jQzdtIxxh21//0gPsEXQv5PiL7t/T+iQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoShQoTxD4n/1EpzCHjdAAAAAElFTkSuQmCC", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAeT0lEQVR4nO2dd3gU1drAz8yZme2btpueEEgCCS2USFEwShEvoCBXkSIo5dr1inpFiUrRwIfCvVwLNhQBG9iQKtJEpBiagVRCQkgvm2yybXanfn8MrOumsPLd+bw7nN+TJ0/27Mzs7LO/vOfMe945i4miCBCI/zT4n30CCGWCxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgC8WefgDLJJgkAQA7L+TUSmMiJmF+7IsFEUfyzz0FRLFNBLQQQE2ke8whA0iibJEyUYCABzQELgy1l+D/7NGUHifU7sklChYsAAF4Ef/TjX6aCsRqxeximV2MeVmyjRasb1LmwUErsE4XHRpMet1BYyZa0YovcSCyls5iCAIClDL9MBQ2EmGgAOgprdol1LszOBeSW1OtFq4QxvcnUifHYABMTTpBOwRWBG07b3Oea1SmhrVlhbaF8tx32X98/f6qSr3IpP2hdp2J5begRCmLDYYSJNEapdclGdnwc1cbb1pfknbTlN4pWFnvZ06kBUnhT4SAlRJzyYvrY+bOa9j8WfU4DXB6h5BxTmasePAV4aACAe2jKpf4Xl2TOve/VqoJvqg6Ucgucwv/fu/0zuL7EWq6GnAjCSLG3GYsMg72nJpXODs02j7W9/So49gvXWCqyTtXE+Rfmf7uHXqWak7/vFF1HYxADvAg4EXiE38bd2SRhJMSUEHFIX83BHwZvune57dQ6gbEBADCoEnmPtBkGVQAAqDFTYSma0XPaemtW3jk84pa8Yxe4Zg/W/rCK4XoRa6UGxuvEzBSSILCkiYkvLBy65cTS5CX5TEMBa6uQ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RjZJpOgFiANeAL2j8QHjYx55bXL1rPvpkr1S7sAPX9Vw0gAWvFQ+et8rcSvuuf/cof0thS2YjVPgXE2AILF+Qyqld/JYDsstU8EkvThuuK7807RppZ+lreW4xotMXZ5U9onhKkIfpepzG6bTCzERNRm2cWMXrP4yv3FjSel5uqBBqKWvrxFVe5BYnbJcDTNM4i0TIu0LemxIM+dxqYWutIbaDKCxT0/cOMNaMOggAACIKhwvszf/WHOp1FVh4RtcwOLBPML1G6skkFidskwFE7Ri31iY3Edv7BsOEwxAA4GNceY2WC7YGxrYC00CLwIdCSgIaA7YPMDOAjuHrAIAidUF2SRhJMQIlRilA2E63KDFCQK43WKrU6i3iy1uYGUxXgQqHEAMAAB4EXgEoMgamGsAidUVUtmgFgItIVI4oCBgeEBzUli6XPHiexMEUsoLEuvqSHlUiAECA5wIeBGFpauDxELIguLuDkH8d4DEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyELSCyELCCxELKAxELIAhILIQtILIQsILEQsoDEQsgCEgshC0gshCwgsRCygMRCyAISCyEL/wtBpF3fcJk6+AAAAABJRU5ErkJggg==", "text/plain": [ - "" + "" ] }, - "execution_count": 127, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -252,34 +252,34 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_577859/758192653.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(quat + torch.rand(4,device=device)*0.1,device=device, requires_grad=True)\n", - "/var/tmp/ipykernel_577859/2915196021.py:6: 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", + "/var/tmp/ipykernel_1076122/2190980265.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(quat + torch.rand(4,device=device)*0.4,device=device, requires_grad=True)\n", + "/var/tmp/ipykernel_1076122/967631123.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n" ] }, { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ - "" + "" ] }, - "execution_count": 130, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pos = torch.tensor([0.0, 0.0, 0.5],device=device, requires_grad=True)\n", - "quat = torch.tensor(quat + torch.rand(4,device=device)*0.1,device=device, requires_grad=True)\n", + "quat = torch.tensor(quat + torch.rand(4,device=device)*0.4,device=device, requires_grad=True)\n", "rendered_image = render(pos, quat)\n", "depth_image = np.moveaxis(rendered_image.detach().cpu().numpy(),0,-1)[...,2]\n", "b.show_cloud(\"1\", b.unproject_depth_jit(depth_image, intrinsics).reshape(-1,3))\n", @@ -291,26 +291,26 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/25 [00:00" + "" ] }, - "execution_count": 141, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -318,8 +318,8 @@ "source": [ "\n", "optimizer = torch.optim.Adam([\n", - " {'params': [pos], 'lr': 0.0001, \"name\": \"pos\"},\n", - " {'params': [quat], 'lr': 0.001, \"name\": \"quat\"},\n", + " {'params': [pos], 'lr': 0.01, \"name\": \"pos\"},\n", + " {'params': [quat], 'lr': 0.1, \"name\": \"quat\"},\n", "], lr=0.0, eps=1e-15)\n", "\n", "\n", @@ -343,39 +343,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 142, + "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/var/tmp/ipykernel_577859/2915196021.py:6: 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", + "/var/tmp/ipykernel_1076122/967631123.py:6: 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.0025 * torch.rand((N, 3)),requires_grad=True,device=device)\n", - "100%|██████████| 92/92 [00:23<00:00, 3.84it/s]\n" + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9/9 [00:00<00:00, 12.75it/s]\n" ] }, { "data": { - "image/png": "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KpUKd955J1asWIHevXsjIyOj2vqefvppPP300zh//jy2bt2Kd955B1999RVUKlW52z707t27Xk5yP336NACgffv2LtPVajVat27tnB8TE4MZM2bgrbfewvLlyzFgwADcfvvtuOeee5zha9SoUfjoo4/wr3/9C08++SQSEhIwYsQI3HHHHTX6myJqKRiwiFqAuv7DffLkSWdA+fPPP13mlY1evP766+jWrVuFy3t7e1e67v79++PDDz/EyZMnsX37dgwYMAAymQz9+/fH9u3bERYWBofDgQEDBlRZ4/Tp03Hbbbfh+++/x4YNGzBnzhzMnz8fmzZtQvfu3Z11fv75587QdaWyEbmauvvuu7F06VI8++yz6Nq1q0vorEpoaChGjx6NkSNHolOnTvjqq6+wbNmyWr9/fXvzzTcxfvx4/PDDD/jf//6HRx55BPPnz8eOHTvQqlUreHh4YNu2bdi8eTP++9//Yv369Vi1ahUGDx6M//3vf+VO9idqqfh1g4gq5HA4MH78eOh0Ojz11FP48ssv8e233zrnx8bGAigdAUpMTKzwVdXtH8qC08aNG7F7927nzzfeeCO2b9+O7du3w8vLCz169Ki21tjYWMycORP/+9//cPDgQVitVrz55psudQYHB1dY46BBg2q1X/r374/IyEhs2bKlytGryqhUKlx33XWw2WzIycmp9fJ1UXbCfWpqqst0q9WKtLQ05/wyXbp0wTPPPINt27Zh+/btOHv2LJYuXeqcL5fLkZCQgLfeeguHDx/GSy+9hE2bNtXqcCtRc8eARUQVeuutt/Dbb7/hgw8+wAsvvIB+/frhoYcecoaCHj16IDY2Fm+88QYKCgrKLX/hwoUq1x8TE4Pw8HC8/fbbsNlsztsZDBgwACdOnMDXX3+Nvn37VjnCU1RUBLPZ7DItNjYWPj4+sFgsAICkpCTodDq8/PLLzqvlalPn1cpuJTFv3jzce++9lbY7fvy4y5WMZfLy8pCSkgI/Pz8EBQXV6r3rKjExEWq1Gu+++67LrTH+85//wGg0YujQoQAAk8lU7orHLl26QC6XO/fnxYsXy62/bASzrA0R8RAhEVXgyJEjmDNnDsaPH4/bbrsNQOnjXLp164aHH34YX331FeRyOT766CMMGTIEnTp1woQJExAeHo6zZ89i8+bN0Ol0WLt2bZXvM2DAAKxcuRJdunRxnqt1/fXXw8vLC8eOHat2hOjYsWNISEjAXXfdhY4dO0KpVOK7775DVlYWRo8eDaB0hG3JkiW49957cf3112P06NEICgpCeno6/vvf/+KGG27AwoULa7V/hg0bhmHDhlXZpuz8sSFDhmDAgAHw9/fH2bNn8emnn+LcuXNYsGBBucNpP/30k8sjdMr069cPrVu3rvL9Lly4gBdffLHc9JiYGIwdOxazZ8/Gc889h1tuuQW33347UlNTsXjxYvTq1ct5d/pNmzZh6tSpuPPOO9GuXTuUlJTg888/h0KhwMiRIwGU3m1+27ZtGDp0KKKiopCdnY3FixejVatW6N+/f5U1ErUo7r6MkYjqT9nl/7t3766y3ZW3aSgpKRG9evUSrVq1Enl5eS7t3nnnHQFArFq1yjlt//79YsSIESIgIEBoNBoRFRUl7rrrLpGcnFyujrLbNJRZtGiRACAeeughl+mJiYkCgMs6hCh/m4acnBwxZcoUERcXJ7y8vIRerxd9+vQRX331Vblt3Lx5s0hKShJ6vV5otVoRGxsrxo8fL/bs2VPlvrnyNg1VufpWCVlZWeKVV14RAwcOFKGhoUKpVAo/Pz8xePBg8fXXX7ssW9VtGq7c3qreu7JlExISnO0WLlwo4uLihEqlEgaDQTz00EPi0qVLzvknT54U999/v4iNjRVarVb4+/uL//u//xM///yzs01ycrIYNmyYCAsLE2q1WoSFhYkxY8aIY8eOVVkjUUsjE+KK8WIiIiIiumY8B4uIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDHeaPQyh8OBc+fOwcfHBzKZzN3lEBERkRsJIZCfn4+wsLA6PcicAeuyc+fOISIiwt1lEBERUSOSkZGBVq1a1Xo5BqzLfHx8AJTuSJ1O5+ZqiIiIyJ1MJhMiIiKc+aC2GLAuKzssqNPpGLCIiIgIAOp82hBPciciIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYm4LWIsWLUJ0dDS0Wi369OmDXbt2Vdl+9erViIuLg1arRZcuXfDjjz9W2vbBBx+ETCbDggULJK6aiIiIqHpuCVirVq3CjBkzMG/ePOzbtw9du3ZFUlISsrOzK2z/22+/YcyYMZg4cSL279+P4cOHY/jw4Th48GC5tt999x127NiBsLCw+t4MIiIiogq5JWC99dZbmDRpEiZMmICOHTti6dKl8PT0xMcff1xh+3feeQe33HILZs2ahQ4dOuCFF17A9ddfj4ULF7q0O3v2LKZNm4bly5dDpVI1xKYQERERldPgActqtWLv3r1ITEz8uwi5HImJiUhJSalwmZSUFJf2AJCUlOTS3uFw4N5778WsWbPQqVOnauuwWCwwmUwuLyIiIiIpNHjAysnJgd1uh8FgcJluMBiQmZlZ4TKZmZnVtn/11VehVCrxyCOP1KiO+fPnQ6/XO18RERG13BIiIiKiijWLqwj37t2Ld955B8uWLYNMJqvRMrNnz4bRaHS+MjIy6rlKIiIiaikaPGAFBgZCoVAgKyvLZXpWVhZCQkIqXCYkJKTK9tu3b0d2djYiIyOhVCqhVCpx+vRpzJw5E9HR0RWuU6PRQKfTubyIiIiIpNDgAUutVqNHjx5ITk52TnM4HEhOTkZ8fHyFy8THx7u0B4CNGzc629977734448/8PvvvztfYWFhmDVrFjZs2FB/G0NERERUAaU73nTGjBkYN24cevbsid69e2PBggUoLCzEhAkTAAD33XcfwsPDMX/+fADAo48+ioEDB+LNN9/E0KFDsXLlSuzZswcffPABACAgIAABAQEu76FSqRASEoL27ds37MYRERFRi+eWgDVq1ChcuHABc+fORWZmJrp164b169c7T2RPT0+HXP734Fq/fv2wYsUKPPPMM3jqqafQtm1bfP/99+jcubM7yiciIiKqkkwIIdxdRGNgMpmg1+thNBp5PhYREVELd625oFlcRUhERETUmDBgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSmNsC1qJFixAdHQ2tVos+ffpg165dVbZfvXo14uLioNVq0aVLF/z444/OeTabDU888QS6dOkCLy8vhIWF4b777sO5c+fqezOIiIiIynFLwFq1ahVmzJiBefPmYd++fejatSuSkpKQnZ1dYfvffvsNY8aMwcSJE7F//34MHz4cw4cPx8GDBwEARUVF2LdvH+bMmYN9+/bh22+/RWpqKm6//faG3CwiIiIiAIBMCCEa+k379OmDXr16YeHChQAAh8OBiIgITJs2DU8++WS59qNGjUJhYSHWrVvnnNa3b19069YNS5curfA9du/ejd69e+P06dOIjIystiaTyQS9Xg+j0QidTlfHLSMiIqLm4FpzQYOPYFmtVuzduxeJiYl/FyGXIzExESkpKRUuk5KS4tIeAJKSkiptDwBGoxEymQy+vr6S1E1ERERUU8qGfsOcnBzY7XYYDAaX6QaDAUePHq1wmczMzArbZ2ZmVtjebDbjiSeewJgxYypNnRaLBRaLxfmzyWSqzWYQERERVarZXUVos9lw1113QQiBJUuWVNpu/vz50Ov1zldEREQDVklERETNWYMHrMDAQCgUCmRlZblMz8rKQkhISIXLhISE1Kh9Wbg6ffo0Nm7cWOUx09mzZ8NoNDpfGRkZAIAia0ldNouIiIjIqcEDllqtRo8ePZCcnOyc5nA4kJycjPj4+AqXiY+Pd2kPABs3bnRpXxaujh8/jp9//hkBAQFV1qHRaKDT6VxeABA/fxO6zNuADnPW45Ev9+NSobWum0pEREQtVIOfgwUAM2bMwLhx49CzZ0/07t0bCxYsQGFhISZMmAAAuO+++xAeHo758+cDAB599FEMHDgQb775JoYOHYqVK1diz549+OCDDwCUhqs77rgD+/btw7p162C3253nZ/n7+0OtVte4NrtDIN9SOoq15sA57EzLxX3x0bg+0g9dI/TwVLtllxEREVET4pa0MGrUKFy4cAFz585FZmYmunXrhvXr1ztPZE9PT4dc/vfgWr9+/bBixQo888wzeOqpp9C2bVt8//336Ny5MwDg7NmzWLNmDQCgW7duLu+1efNmDBo0qMa1bZo5EHKNJy7kWzD7uz9x8kIhXt+QCgBQyGWIC/HB9ZF+uD7KF9dH+iHS3xMymewa9gYRERE1N265D1ZjVNH9LoqtdqzanY7dpy5hX/olnDeayy3noVLAW6tEgJcaEf6eiPL3RFSAJ/SeamiUcmiUcmhVCoTqtQjz9YBK0eyuKyAiImp2rvU+WAxYl9VkR543FmPf6TzsSy8NXIfOmmC1O2r1Pgq5DMrLL39vNW7vGoYbYgORV2yD2WYHAIT7eqBrhC+0KsU1bxcRERHVHgOWROqyI802OzKNZhRYSnChwIL03CKkXyx9FZhLYCmxw2p3oMhix9m8YlhKah7GVAoZfLQqOISA3SEgROn5YQq5DK38PBAT6IXoQC/EBnmjS7gesUFeUHJ0jIiISBLXGrB4xvY10KoUiA70qlFbh0Mgr9gGm92BEoeA3S7w51kjVu/NwOncIgR4qeGpUcLhEEjNyseFfAsuVnIF49HMfBzNzL+qFjk6huoQHegFnVYFg06LSH9P9Gntj0BvzTVvKxEREdUcR7Aua0zPIhRC4MylYhTb7JDLZJDLSg8tymUyWO0OpOcWIS2nEGk5hUjNysehs0YUWu0Vrkspl2FwXDC6R/oh3M8DcSE+aB3I0S4iIqKq8BChRBpTwKoth0MgLbcQB88akWk0w1hsw3mjGamZ+Th8vvwjgJRyGXw91Qjy0aBjqA5tgr3h71U66tXW4IMwvZZXRhIRUYvGQ4QEuVyG2CBvxAZ5l5uXmpmPnw6eR3puEU7lFiI1Mx+FVjtyCizIKbDgSAUBzFujRJtgb0QFeCJEp4XOQwVvjRJxIT64rpUvPNQ8+Z6IiKgqHMG6rCmPYNWGwyGQlW/GpUIbzuYV4+BZIzIuFiGv2IaMi6WHHksclf9JyGSAv6caob5aXNeq9F5g3SN9ERPgBYcoPQmfo19ERNTU8RChRFpKwKqOtcSBU7mFOJ5VgHN5xcg0mVFgLkFuoRV/ns1DlslS5fJlo1/tDT5oa/BGO4MP2hl8EOyjgVzO4EVERE0DA5ZEGLCqJ4TAxUIrskwWnM4txO8ZpfcE++OMsdpbUCjkMgT7aNAr2h+9Y/whhIBcLkPvaH+0DvLGpSIrvNRKHn4kIqJGgQFLIgxYdWezO2AqtkEhl+FCvgWpWfk4llWAY5n5OJadj1M5hajiqCNkMkAIwEutwLh+0fhHl1AApbee0GlVCPLR8LAjERE1KAYsiTBg1R+b3YHcAitO5RZi27ELOHzeBK1SgXyLDXtOXap29MvfS42eUX7oFe2PntF+aGfwgZeG12cQEVH9YcCSCAOWe5htdhiLbfD3UmPz0Wws3XoCZ/OKIYMMxTY78s22Cke/QvVa9Ijyw3Wt9PBQKeCjVSHczwPhvh4w6LRQ8HwvIiK6BgxYEmHAapysJQ78edaI3acuYnfaRfyekYfcSu5wX0Ypl6GdwQc3tAlAv9hA9I7x54gXERHVCgOWRBiwmg5jkQ2Hz5uw+9RFnLhQAGuJA5eKrDibV4zzeeZyt5lQyGUI89UiRKeFVqWAt0aJAW2D8H9xQfDzVEOjlPMcLyIicsGAJREGrObB7hA4byzG3tOXkHIiF7+eyEHGxeIql1HIZfBUKRDm64GB7YNwfaQfQvVaRAd6Qe+haqDKiYioMWHAkggDVvOVaTQj41IRskxmWEscOG80Y8OhTPxxxljtsuG+HugQqkOHUB+E6LXw91RDpZDDQ61AO4MPgnz4IG0iouaIAUsiDFgtj90hUGQtQZHVjkJLCQ6dM2FzajZOXChEprG42puqAkCgtxrBPloE+Wj+fnlr4K1RQiYDArzVaOXnyQdsExE1MQxYEmHAoqsZi2w4kmnCkfMmHMsqwIV8C/KKrLA5BEzFNpzKLURNPz3eGiW6RfiiwFKCS0VWRAd4IS7UBx1CdIgL9UHrQG+olQxgRESNBQOWRBiwqLYKLSVIyynEhQILLuS7vsw2O0ocAjkFFpzOLUKBpaTKdakUMvh6qpFvtkGlkCNEp0WIXotgHy0i/D0QE+gFP081dB4qxAR4Qe/Jc8OIiOrTteYCXrtOVEdeGiU6h+urbWd3CBw5b8KfZ43w9VBB76nCyQuFOJppwtHz+TiamY8CSwku5JcekjTbHMg3F+B4dkGl6wz0VkOnVcFTo4CnWgkvtQKeGiWCvDVoE+wNL40CpuISBPto0ClMD7VSDmuJA+F+HlDIZbA7BArMJQxqRET1hCNYl3EEi9xFCIEzl4phLLZBp1XBarcj02hBlsmMTJMZp3MLcTq3CMZiGy4VWWt0blhlAr3V6B7ph32nLyG30Iq4EB/0bR0AuUyGImsJLhZaIZfJEKzToH2IDwa2C0IrP88K12W2lZ67FuDNE/2JqPnhIUKJMGBRU2Ey25CeW1R6cr61BEWW0v8WWkpw3mjG8ax82OwCXhoFzuYVIzUzH0IAcpkMVnvVjyWqiEIug0Yph1oph0Yph7dGCblMhpM5hbA7BLq20iM+NhCWEjtUCjnC9FqE+3ki3NcDPtrSQXKZrHQ9gd4aqBRyCCFgswvIL0/nfciIqLFhwJIIAxY1Vw6HgFwug7XEgR0nc3HwnBHdInzRNtgHW49dwLGsfCjkMnioFPDzUsPhEMg0mbE77SL2pV+q8kHdtSWXlT5bMt9c4nwGpUYpRzuDD9oavBGm94CHWoFiqx1yuQw+GiW8NEpoVXKkXyzC6dwi+GiVCNFr0TlMjyAfDX79KweXiqwY2C4Y17XSo9BSgmNZBfjzbB68NEpcH+mHIB8NHEIg02hGtskCPy81grw1zgeNO4SARiWHwUcLuQSPWRJCwGxzQK2UV/vYJkuJHcezClBss6NrK1/nxQ5CCBRYSuChUtTqCtSyLr0stF79c0Xty+aV2B2wlDigVSlq/bgpm92BIosdOg9lvQRmIQQKrXZolHKoarA/hBCwOwTkMlmtf6eWEjvsDgEPlaJetqXYaseJCwVoE+wNrUpRbr7ZZofV7oC3Wums3WS24eAZIwx6LVoHetWpLodDoNhmh0Iug1ohR4G1BGarHf5eaigvf/ERApJ8Buqi7Mru0quw/97ujItF8FApEOHvWaPfvdlmR7bJAoVChjC9ts6/QwYsiTBgEZVXZC0pDUM2B6x2++Xzw0pgtTvQzuANlUKOn/48j7+yC+CpUcJic+BsXhHO5hXj7KViFNvsEAIQKO087VKmtXqgVsrho1GiyGqHSiFDgHdpMCu0lDhDqF0IlNgFbHYHZDIZWvl5IFSvhUohh7HYhuNZBcgylT5RQK2QI8LfAzKZDIWWEueTBOQywGYXMBbbkJ1vhs1eul+81ApEBnjhUqEVuYUW2OwCGqUcbYJL93WhpfS2ImabHR5qBTzVClhKHDDbSn83ZpsdlhIHFHIZ/DxVcAjAWGyD3SGgkMugkMkglwMKWemooaWk9GIMXw8VFHI5cgstzitjNcrS+715qBTQqhQw2+wosJQg0FuDYB8NjMU2FFntaBvsDQ+1AluPXUC+uQQ+GiV8tEoU2exQymXQaVXw0ZYGZZPZhrwiG7q28kWvaD/8ccaII5n5UMplcAiBvCIbAKCVnwf0HirIZEBekc15uNxsKw3lPholwv08EObrAaB0FLSVnwc81Qqk5RTi5IVCnMotdLYP9NYgNsgLVrsDOQUWWEsccAjAQ1W6Dz3VpUHqYqEVOfkW5F++KEWlKK1f56GCWiGHTIbLga30vzKZ7PLv0nH54hYHQvVaqJVyZBrNyDeXwGZ3wEujRKheCx+tEkIAf5w1wlriuPxUiUD4ealhK3Eg/WIR0i8W4bzRDKD0C4nOQwVvjRLn8oqdX3b8PFXw0ZaeP1mWHWQo/ZvKN9su7w9PeKgVyDeXwFRsQ77ZhnxLSYVXPivkMui0ShRYSmCzC+fvUOehgkYpB2QyFFz+3flolQjWaWGx2WEylzj/toK8NQjwLr1PoFIhg+ry39OxrAKolXK0M3gj31yCU7mF8FIrYdBpoVHKIZfJoJDLYDLb8Ht6HvItJZd/J0oUWkpQbLO71NnKzwOR/p6X/2YAvYcKXhoFLuRbcN5oRqbR7PI4NZ1WicDLn2OtSgGdVoVimx0mc+m2+HmqYSlxoMhagukJ7ZDY0eBclgFLIgxYRPVLCIELBRZkmyzQe6ig06ogIHCpyIaj501Iyy3E+TyzMzzYHaXBpsBiR7GtBKF6D7QO8kKhpQQZF4tx4Eweskxm9Ir2R4CXGpuOZsNkLv2HMVSvRddWvjCZbTiQkYdCa2knHeyjgUGnxcVCKy4WWiGTlf7DJJeVPlz86scsNRS9hwoqhQw5BVU/Z5OaDw+VwiU81ES4rwcuXA6IUikbxW3M/L3UKLbaa7W/NEo57A5Rq8/0S//sjLF9opw/8ypCImoSZDIZgn1Kbz1xJV9PNWICva55/SV2BwotdnhrlRUe3rryUFhly5/LM6PIVgJPlRJWuwO5BRYoFTJ4qpWwX3F4RSWXQ6WUwVYikHGpCBfyLbDZHfBUK9HW4I1wXw/oPFS4VGhF+sUiyGSl90KzlDiQb7Y5D8P4eaoR5KNBmF4LIYDD5024UGBBgJcaAd4a+HmqcCG/dBQAALw0CnipldCo5KUjWVY7NCo5NMrSUSatSg6tSoESu8ClIisUchn0Hioo5DI4HMI5+ua4fChIq1JALgPyim2wljhg0GnhpVE4/zEz2+wotjpQbLNDq5LDU63AhXwrsvPN8L38HM+j503IK7ZhQNtAdAjV4eylYhRZ7fBUK1DiEM4RlAJLCXy0SnioFNj+Vw4OnjWiU5gevaL9IL/8e9F7quBwCJzNK0b+5bDso1U6b1sS5KOBxeZAbqG19OkMRjPkl0fiMi4Vo8hagugAL7QO8kJMoDf8PFUocQicyyvGyQuF0KoUCPLRQKuSQ4bSUF18+VxGh0PA30uNQB8NAr00UChkyDfbYCougbHYhhJ76aiXQ/y9/0r/H1DIgSBvLTQqOc7lFcNmFwjRaaH3UEGtlMNktiHTaEahpXT0t1OYDq0DvbE/Iw+7T12ExeaAXAZE+HsiMsAT0QFe8FQrYCq2wXj5FeZbOmJXdkjZ4gxZfwcIuUwGH60KJQ4H0nOLYLU74KNVQadVOv/rrVWixCGcI2hqhRw5BRbkFZeO6CjkMhSYS2C6/HuzljggLv/t+XqoYTLbkJ1vgadKAZ2HCkqFDLYSB7LzLbhYaIXN7nAGGx+tEm2DfWApseOv7AL4aJWICfRGsc1eOsprL/2bdDgE1Eo5rmulR1SAFy7kW1BstcNbo4S/txreGiWEEMjOtyAtpxAZF4sgUPrlyHj5byvIR4NQvRYhutIRZV9PFWx2gRMXClBgKYEMQJHVjnxzCTzUcvhoVcg323Cp0AatSgFPjQJxIT7X3A9diSNYl3EEi4iIiMpcay7graOJiIiIJMaARURERCQxtwWsRYsWITo6GlqtFn369MGuXbuqbL969WrExcVBq9WiS5cu+PHHH13mCyEwd+5chIaGwsPDA4mJiTh+/Hh9bgIRERFRhdwSsFatWoUZM2Zg3rx52LdvH7p27YqkpCRkZ2dX2P63337DmDFjMHHiROzfvx/Dhw/H8OHDcfDgQWeb1157De+++y6WLl2KnTt3wsvLC0lJSTCbzQ21WUREREQA3HSSe58+fdCrVy8sXLgQAOBwOBAREYFp06bhySefLNd+1KhRKCwsxLp165zT+vbti27dumHp0qUQQiAsLAwzZ87E448/DgAwGo0wGAxYtmwZRo8eXW1NPMmdiIiIyjS5k9ytViv27t2LxMTEv4uQy5GYmIiUlJQKl0lJSXFpDwBJSUnO9mlpacjMzHRpo9fr0adPn0rXSURERFRfGvw+WDk5ObDb7TAYDC7TDQYDjh49WuEymZmZFbbPzMx0zi+bVlmbq1ksFlgsfz8012Qy1W5DiIiIiCrRYq8inD9/PvR6vfMVERHh7pKIiIiomWjwgBUYGAiFQoGsrCyX6VlZWQgJCalwmZCQkCrbl/23NuucPXs2jEaj85WRkVGn7SEiIiK6WoMHLLVajR49eiA5Odk5zeFwIDk5GfHx8RUuEx8f79IeADZu3OhsHxMTg5CQEJc2JpMJO3furHSdGo0GOp3O5UVEREQkBbc8i3DGjBkYN24cevbsid69e2PBggUoLCzEhAkTAAD33XcfwsPDMX/+fADAo48+ioEDB+LNN9/E0KFDsXLlSuzZswcffPABgNJnnE2fPh0vvvgi2rZti5iYGMyZMwdhYWEYPny4OzaRiIiIWjC3BKxRo0bhwoULmDt3LjIzM9GtWzesX7/eeZJ6eno65PK/B9f69euHFStW4JlnnsFTTz2Ftm3b4vvvv0fnzp2dbf7973+jsLAQkydPRl5eHvr374/169dDq9WWe38iIiKi+sSHPV/G+2ARERFRmSZ3HywiIiKi5o4Bi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTWoAHr4sWLGDt2LHQ6HXx9fTFx4kQUFBRUuYzZbMaUKVMQEBAAb29vjBw5EllZWc75Bw4cwJgxYxAREQEPDw906NAB77zzTn1vChEREVGlGjRgjR07FocOHcLGjRuxbt06bNu2DZMnT65ymcceewxr167F6tWrsXXrVpw7dw4jRoxwzt+7dy+Cg4PxxRdf4NChQ3j66acxe/ZsLFy4sL43h4iIiKhCMiGEaIg3OnLkCDp27Ijdu3ejZ8+eAID169fjH//4B86cOYOwsLByyxiNRgQFBWHFihW44447AABHjx5Fhw4dkJKSgr59+1b4XlOmTMGRI0ewadOmGtdnMpmg1+thNBqh0+nqsIVERETUXFxrLmiwEayUlBT4+vo6wxUAJCYmQi6XY+fOnRUus3fvXthsNiQmJjqnxcXFITIyEikpKZW+l9FohL+/f5X1WCwWmEwmlxcRERGRFBosYGVmZiI4ONhlmlKphL+/PzIzMytdRq1Ww9fX12W6wWCodJnffvsNq1atqvbQ4/z586HX652viIiImm8MERERURWuOWA9+eSTkMlkVb6OHj0qRa3VOnjwIIYNG4Z58+bh5ptvrrLt7NmzYTQana+MjIwGqZGIiIiaP+W1rmDmzJkYP358lW1at26NkJAQZGdnu0wvKSnBxYsXERISUuFyISEhsFqtyMvLcxnFysrKKrfM4cOHkZCQgMmTJ+OZZ56ptm6NRgONRlNtOyIiIqLauuaAFRQUhKCgoGrbxcfHIy8vD3v37kWPHj0AAJs2bYLD4UCfPn0qXKZHjx5QqVRITk7GyJEjAQCpqalIT09HfHy8s92hQ4cwePBgjBs3Di+99NK1bhIRERHRNWmwqwgBYMiQIcjKysLSpUths9kwYcIE9OzZEytWrAAAnD17FgkJCfjss8/Qu3dvAMBDDz2EH3/8EcuWLYNOp8O0adMAlJ5rBZQeFhw8eDCSkpLw+uuvO99LoVDUKPiV4VWEREREVOZac8E1j2DVxvLlyzF16lQkJCRALpdj5MiRePfdd53zbTYbUlNTUVRU5Jz29ttvO9taLBYkJSVh8eLFzvlff/01Lly4gC+++AJffPGFc3pUVBROnTrVINtFREREdKUGHcFqzDiCRURERGWazH2wiIiIiFoKBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJr0IB18eJFjB07FjqdDr6+vpg4cSIKCgqqXMZsNmPKlCkICAiAt7c3Ro4ciaysrArb5ubmolWrVpDJZMjLy6uHLSAiIiKqXoMGrLFjx+LQoUPYuHEj1q1bh23btmHy5MlVLvPYY49h7dq1WL16NbZu3Ypz585hxIgRFbadOHEirrvuuvoonYiIiKjGZEII0RBvdOTIEXTs2BG7d+9Gz549AQDr16/HP/7xD5w5cwZhYWHlljEajQgKCsKKFStwxx13AACOHj2KDh06ICUlBX379nW2XbJkCVatWoW5c+ciISEBly5dgq+vb43rM5lM0Ov1MBqN0Ol017axRERE1KRday5osBGslJQU+Pr6OsMVACQmJkIul2Pnzp0VLrN3717YbDYkJiY6p8XFxSEyMhIpKSnOaYcPH8bzzz+Pzz77DHJ5zTbJYrHAZDK5vIiIiIik0GABKzMzE8HBwS7TlEol/P39kZmZWekyarW63EiUwWBwLmOxWDBmzBi8/vrriIyMrHE98+fPh16vd74iIiJqt0FERERElbjmgPXkk09CJpNV+Tp69KgUtVZo9uzZ6NChA+65555aL2c0Gp2vjIyMeqqQiIiIWhrlta5g5syZGD9+fJVtWrdujZCQEGRnZ7tMLykpwcWLFxESElLhciEhIbBarcjLy3MZxcrKynIus2nTJvz555/4+uuvAQBlp5QFBgbi6aefxnPPPVfhujUaDTQaTU02kYiIiKhWrjlgBQUFISgoqNp28fHxyMvLw969e9GjRw8ApeHI4XCgT58+FS7To0cPqFQqJCcnY+TIkQCA1NRUpKenIz4+HgDwzTffoLi42LnM7t27cf/992P79u2IjY291s0jIiIiqrVrDlg11aFDB9xyyy2YNGkSli5dCpvNhqlTp2L06NHOKwjPnj2LhIQEfPbZZ+jduzf0ej0mTpyIGTNmwN/fHzqdDtOmTUN8fLzzCsKrQ1ROTo7z/WpzFSERERGRVBosYAHA8uXLMXXqVCQkJEAul2PkyJF49913nfNtNhtSU1NRVFTknPb2228721osFiQlJWHx4sUNWTYRERFRrTTYfbAaO94Hi4iIiMo0mftgEREREbUUDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKSGAMWERERkcQYsIiIiIgkxoBFREREJDEGLCIiIiKJKd1dQGMhhAAAmEwmN1dCRERE7laWB8ryQW0xYF2Wm5sLAIiIiHBzJURERNRY5OfnQ6/X13o5BqzL/P39AQDp6el12pFUNyaTCREREcjIyIBOp3N3OS0G97v7cN+7B/e7ezTl/S6EQH5+PsLCwuq0PAPWZXJ56eloer2+yf0RNAc6nY773Q24392H+949uN/do6nu92sZcOFJ7kREREQSY8AiIiIikhgD1mUajQbz5s2DRqNxdyktCve7e3C/uw/3vXtwv7tHS97vMlHX6w+JiIiIqEIcwSIiIiKSGAMWERERkcQYsIiIiIgkxoAFYNGiRYiOjoZWq0WfPn2wa9cud5fUrDz77LOQyWQur7i4OOd8s9mMKVOmICAgAN7e3hg5ciSysrLcWHHTtW3bNtx2220ICwuDTCbD999/7zJfCIG5c+ciNDQUHh4eSExMxPHjx13aXLx4EWPHjoVOp4Ovry8mTpyIgoKCBtyKpqe6/T5+/Phyn4FbbrnFpQ33e+3Nnz8fvXr1go+PD4KDgzF8+HCkpqa6tKlJ/5Keno6hQ4fC09MTwcHBmDVrFkpKShpyU5qUmuz3QYMGlfubf/DBB13aNPf93uID1qpVqzBjxgzMmzcP+/btQ9euXZGUlITs7Gx3l9asdOrUCefPn3e+fvnlF+e8xx57DGvXrsXq1auxdetWnDt3DiNGjHBjtU1XYWEhunbtikWLFlU4/7XXXsO7776LpUuXYufOnfDy8kJSUhLMZrOzzdixY3Ho0CFs3LgR69atw7Zt2zB58uSG2oQmqbr9DgC33HKLy2fgyy+/dJnP/V57W7duxZQpU7Bjxw5s3LgRNpsNN998MwoLC51tqutf7HY7hg4dCqvVit9++w2ffvopli1bhrlz57pjk5qEmux3AJg0aZLL3/xrr73mnNci9rto4Xr37i2mTJni/Nlut4uwsDAxf/58N1bVvMybN0907dq1wnl5eXlCpVKJ1atXO6cdOXJEABApKSkNVGHzBEB89913zp8dDocICQkRr7/+unNaXl6e0Gg04ssvvxRCCHH48GEBQOzevdvZ5qeffhIymUycPXu2wWpvyq7e70IIMW7cODFs2LBKl+F+l0Z2drYAILZu3SqEqFn/8uOPPwq5XC4yMzOdbZYsWSJ0Op2wWCwNuwFN1NX7XQghBg4cKB599NFKl2kJ+71Fj2BZrVbs3bsXiYmJzmlyuRyJiYlISUlxY2XNz/HjxxEWFobWrVtj7NixSE9PBwDs3bsXNpvN5XcQFxeHyMhI/g4klpaWhszMTJd9rdfr0adPH+e+TklJga+vL3r27Olsk5iYCLlcjp07dzZ4zc3Jli1bEBwcjPbt2+Ohhx5yPmAe4H6XitFoBPD3s2Vr0r+kpKSgS5cuMBgMzjZJSUkwmUw4dOhQA1bfdF2938ssX74cgYGB6Ny5M2bPno2ioiLnvJaw31v0swhzcnJgt9tdfsEAYDAYcPToUTdV1fz06dMHy5YtQ/v27XH+/Hk899xzGDBgAA4ePIjMzEyo1Wr4+vq6LGMwGJCZmemegpupsv1Z0d972bzMzEwEBwe7zFcqlfD39+fv4xrccsstGDFiBGJiYnDixAk89dRTGDJkCFJSUqBQKLjfJeBwODB9+nTccMMN6Ny5MwDUqH/JzMys8DNRNo+qVtF+B4C7774bUVFRCAsLwx9//IEnnngCqamp+PbbbwG0jP3eogMWNYwhQ4Y4//+6665Dnz59EBUVha+++goeHh5urIyoYYwePdr5/126dMF1112H2NhYbNmyBQkJCW6srPmYMmUKDh486HJ+J9W/yvb7lecPdunSBaGhoUhISMCJEycQGxvb0GW6RYs+RBgYGAiFQlHuipKsrCyEhIS4qarmz9fXF+3atcNff/2FkJAQWK1W5OXlubTh70B6Zfuzqr/3kJCQchd4lJSU4OLFi/x9SKh169YIDAzEX3/9BYD7/VpNnToV69atw+bNm9GqVSvn9Jr0LyEhIRV+JsrmUeUq2+8V6dOnDwC4/M039/3eogOWWq1Gjx49kJyc7JzmcDiQnJyM+Ph4N1bWvBUUFODEiRMIDQ1Fjx49oFKpXH4HqampSE9P5+9AYjExMQgJCXHZ1yaTCTt37nTu6/j4eOTl5WHv3r3ONps2bYLD4XB2kHTtzpw5g9zcXISGhgLgfq8rIQSmTp2K7777Dps2bUJMTIzL/Jr0L/Hx8fjzzz9dAu7GjRuh0+nQsWPHhtmQJqa6/V6R33//HQBc/uab/X5391n27rZy5Uqh0WjEsmXLxOHDh8XkyZOFr6+vy5UNdG1mzpwptmzZItLS0sSvv/4qEhMTRWBgoMjOzhZCCPHggw+KyMhIsWnTJrFnzx4RHx8v4uPj3Vx105Sfny/2798v9u/fLwCIt956S+zfv1+cPn1aCCHEK6+8Inx9fcUPP/wg/vjjDzFs2DARExMjiouLneu45ZZbRPfu3cXOnTvFL7/8Itq2bSvGjBnjrk1qEqra7/n5+eLxxx8XKSkpIi0tTfz888/i+uuvF23bthVms9m5Du732nvooYeEXq8XW7ZsEefPn3e+ioqKnG2q619KSkpE586dxc033yx+//13sX79ehEUFCRmz57tjk1qEqrb73/99Zd4/vnnxZ49e0RaWpr44YcfROvWrcWNN97oXEdL2O8tPmAJIcR7770nIiMjhVqtFr179xY7duxwd0nNyqhRo0RoaKhQq9UiPDxcjBo1Svz111/O+cXFxeLhhx8Wfn5+wtPTU/zzn/8U58+fd2PFTdfmzZsFgHKvcePGCSFKb9UwZ84cYTAYhEajEQkJCSI1NdVlHbm5uWLMmDHC29tb6HQ6MWHCBJGfn++GrWk6qtrvRUVF4uabbxZBQUFCpVKJqKgoMWnSpHJf4rjfa6+ifQ5AfPLJJ842NelfTp06JYYMGSI8PDxEYGCgmDlzprDZbA28NU1Hdfs9PT1d3HjjjcLf319oNBrRpk0bMWvWLGE0Gl3W09z3u0wIIRpuvIyIiIio+WvR52ARERER1QcGLCIiIiKJMWARERERSYwBi4iIiEhiDFhEREREEmPAIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEVAfR0dFYsGCBu8sgokaKAYuIGr3x48dj+PDhAIBBgwZh+vTpDfbey5Ytg6+vb7npu3fvxuTJkxusDiJqWpTuLoCIyB2sVivUanWdlw8KCpKwGiJqbjiCRURNxvjx47F161a88847kMlkkMlkOHXqFADg4MGDGDJkCLy9vWEwGHDvvfciJyfHueygQYMwdepUTJ8+HYGBgUhKSgIAvPXWW+jSpQu8vLwQERGBhx9+GAUFBQCALVu2YMKECTAajc73e/bZZwGUP0SYnp6OYcOGwdvbGzqdDnfddReysrKc85999ll069YNn3/+OaKjo6HX6zF69Gjk5+fX704jIrdgwCKiJuOdd95BfHw8Jk2ahPPnz+P8+fOIiIhAXl4eBg8ejO7du2PPnj1Yv349srKycNddd7ks/+mnn0KtVuPXX3/F0qVLAQByuRzvvvsuDh06hE8//RSbNm3Cv//9bwBAv379sGDBAuh0Ouf7Pf744+XqcjgcGDZsGC5evIitW7di48aNOHnyJEaNGuXS7sSJE/j++++xbt06rFu3Dlu3bsUrr7xST3uLiNyJhwiJqMnQ6/VQq9Xw9PRESEiIc/rChQvRvXt3vPzyy85pH3/8MSIiInDs2DG0a9cOANC2bVu89tprLuu88nyu6OhovPjii3jwwQexePFiqNVq6PV6yGQyl/e7WnJyMv7880+kpaUhIiICAPDZZ5+hU6dO2L17N3r16gWgNIgtW7YMPj4+AIB7770XycnJeOmll65txxBRo8MRLCJq8g4cOIDNmzfD29vb+YqLiwNQOmpUpkePHuWW/fnnn5GQkIDw8HD4+Pjg3nvvRW5uLoqKimr8/keOHEFERIQzXAFAx44d4evriyNHjjinRUdHO8MVAISGhiI7O7tW20pETQNHsIioySsoKMBtt92GV199tdy80NBQ5/97eXm5zDt16hRuvfVWPPTQQ3jppZfg7++PX375BRMnToTVaoWnp6ekdapUKpefZTIZHA6HpO9BRI0DAxYRNSlqtRp2u91l2vXXX49vvvkG0dHRUCpr3q3t3bsXDocDb775JuTy0gH9r776qtr3u1qHDh2QkZGBjIwM5yjW4cOHkZeXh44dO9a4HiJqPniIkIialOjoaOzcuROnTp1CTk4OHA4HpkyZgosXL2LMmDHYvXs3Tpw4gQ0bNmDChAlVhqM2bdrAZrPhvffew8mTJ/H55587T36/8v0KCgqQnJyMnJycCg8dJiYmokuXLhg7diz27duHXbt24b777sPAgQPRs2dPyfcBETV+DFhE1KQ8/vjjUCgU6NixI4KCgpCeno6wsDD8+uuvsNvtuPnmm9GlSxdMnz4dvr6+zpGpinTt2hVvvfUWXn31VXTu3BnLly/H/PnzXdr069cPDz74IEaNGoWgoKByJ8kDpYf6fvjhB/j5+eHGG29EYmIiWrdujVWrVkm+/UTUNMiEEMLdRRARERE1JxzBIiIiIpIYAxYRERGRxBiwiIiIiCTGgEVEREQkMQYsIiIiIokxYBERERFJjAGLiIiISGIMWEREREQSY8AiIiIikhgDFhEREZHEGLCIiIiIJMaARURERCQxBiwiIiIiiTFgEREREUmMAYuIiIhIYgxYRERERBJjwCIiIiKS2P8DDM9LoAXJPNgAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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//1PdO7cWajVatG+fXvxxRdfVLodQYWPP/5YdO/eXWg0GuHn5ycGDhwoNmzYUGMNV96OoMLKlSsd6/P39xdjx44Vp0+fdmozbtw44eXlVamWqmokIfisOmoR5s+fj8ceewynT59GeHi4u8shIqImisGJmp2SkhKnK1xKS0vRvXt32Gw2HD161I2VERFRU8dznKjZGTFiBCIjI9GtWzcYjUZ88cUXOHLkCJYtW+bu0oiIqIljcKJmJykpCR999BGWLVsGm82Gjh07YsWKFRg1apS7SyMioiaOh+qIiIiIJGrW93FauHAhoqOjodVq0adPH+zcudPdJRFRM8C+hajlarbBaeXKlZgxYwbmzZuHvXv3omvXrkhKSkJOTo67SyOiJox9C1HL1mwP1fXp0we9evXCggULAJQ/mywiIgLTpk3Dk08+We2ydrsdZ8+ehY+PDx+3QdRAhBAoKChAWFhYpQe4NibX0rdUtGf/QtSw6rJ/aZYnh1ssFuzZswezZ892TJPL5UhMTERqamql9maz2em29GfOnKmzp1QTUe1kZmaiVatW7i7Dpdr2LQD7F6LGpC76l2YZnHJzc2Gz2WAwGJymGwwGx4MgL5ecnIznnnuu0vTMzEzodLp6q5OI/mYymRAREVHrR2Y0pNr2LQD7F6LGoC77l2YZnGpr9uzZmDFjhuPnih2s0+nYsRE1sOZ2+Ir9C1HjURf9S7MMToGBgVAoFMjOznaanp2djZCQkErtNRoNNBpNQ5VHRE1UbfsWgP0LUXPTeM/AvAZqtRo9evRASkqKY5rdbkdKSgri4+PdWBkRNWXsW4ioWY44AcCMGTMwbtw49OzZE71798b8+fNRVFSECRMmuLs0ImrC2LcQtWzNNjiNGjUK58+fx9y5c5GVlYVu3bph3bp1lU7qJCKqDfYtRC1bs72P07UwmUzQ6/UwGo08eZOogbSUz11L2U6ixqQuP3fN8hwnIiIiovrA4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJ1OSCU3JyMnr16gUfHx8EBwdj+PDhSEtLc2pTWlqKKVOmICAgAN7e3hg5ciSys7PdVDERNRXsX4ioJk0uOG3ZsgVTpkzB9u3bsWHDBlitVtx8880oKipytHnsscewZs0arFq1Clu2bMHZs2cxYsQIN1ZNRE0B+xciqolMCCHcXcS1OH/+PIKDg7FlyxbceOONMBqNCAoKwvLly3HHHXcAAI4cOYIOHTogNTUVffv2rXGdJpMJer0eRqMROp2uvjeBiNA4P3fsX4iah7r83DW5EacrGY1GAIC/vz8AYM+ePbBarUhMTHS0iYuLQ2RkJFJTU91SIxE1TexfiOhKSncXcC3sdjumT5+OG264AZ07dwYAZGVlQa1Ww9fX16mtwWBAVlaWy/WYzWaYzWbHzyaTqd5qJqKmgf0LEbnSpEecpkyZggMHDmDFihXXtJ7k5GTo9XrHKyIioo4qJKKmiv0LEbnSZIPT1KlTsXbtWmzatAmtWrVyTA8JCYHFYkF+fr5T++zsbISEhLhc1+zZs2E0Gh2vzMzM+iydiBo59i9EVJUmF5yEEJg6dSq+++47bNy4ETExMU7ze/ToAZVKhZSUFMe0tLQ0ZGRkID4+3uU6NRoNdDqd04uIWh72L0RUkyZ3jtOUKVOwfPly/PDDD/Dx8XGcV6DX6+Hh4QG9Xo+JEydixowZ8Pf3h06nw7Rp0xAfHy/pihciarnYvxBRTZrc7QhkMpnL6Z988gnGjx8PoPwGdTNnzsSXX34Js9mMpKQkLFq0qMqh9CvxcmGihtcYPnfsX4iap7r83DW54NQQ2LERNbyW8rlrKdtJ1JjwPk5EREREbsDgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRM3CbHE3IncfQ7st59Buyzm0+v0g3hNJ7i6L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s9GtWzeX69RoNNBoru7BjVQ3jhfKsOS/BVD8WABPBeChAGL8gFtiNNCFaDF76ElYwz2wMf5TpGv00NtLoLWXYdh6gWPP7QN2uXsLqDlg/9JyfN1jB2J9gfhwFcZNM6GorSc+6r0CqWXXIV75B8JtRgzfAuS8sh9nz5ix5IQdT/P8f0ITDE433HAD0tLSnKYdPXoUUVFRAICYmBiEhIQgJSXF0ZGZTCbs2LEDDz30UEOXSxK9ZK350n8NgCEVPyguvW4FOtxaf3VRy8L+peV4pNDu9LMPgMcAPKa6NEEJIAFolVB+ZK53w5ZHjViTC06PPfYY+vXrh5dffhl33XUXdu7ciQ8++AAffPABAEAmk2H69Ol48cUX0bZtW8TExGDOnDkICwvD8OHD3Vs8ETVq7F+IqEaiCVqzZo3o3Lmz0Gg0Ii4uTnzwwQdO8+12u5gzZ44wGAxCo9GIhIQEkZaWJnn9RqNRABBGo7GuSyeiKjSWzx37F6Lmpy4/d03uPk4NgfdZIWp4LeVz11K2k6gxqcvPXZO7czgRERGRuzA4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBI1ueBks9kwZ84cxMTEwMPDA7GxsXjhhRcghHC0EUJg7ty5CA0NhYeHBxITE3Hs2DE3Vk1ETQH7FyKqSZMLTq+++ioWL16MBQsW4PDhw3j11Vfx2muv4b333nO0ee211/Duu+9iyZIl2LFjB7y8vJCUlITS0lI3Vk5EjR37FyKqiUxc/lWqCbj11lthMBjwn//8xzFt5MiR8PDwwBdffAEhBMLCwjBz5kw8/vjjAACj0QiDwYClS5di9OjRNb6HyWSCXq+H0WiETqert20hor81hs8d+xei5qkuP3dNbsSpX79+SElJwdGjRwEA+/fvxy+//IIhQ4YAANLT05GVlYXExETHMnq9Hn369EFqaqpbaiaipoH9CxHVROnuAmrrySefhMlkQlxcHBQKBWw2G1566SWMHTsWAJCVlQUAMBgMTssZDAbHvCuZzWaYzWbHzyaTqZ6qJ6LGjP0LEdWkyY04ffXVV1i2bBmWL1+OvXv34tNPP8Ubb7yBTz/99KrXmZycDL1e73hFRETUYcVE1FSwfyGimjS54DRr1iw8+eSTGD16NLp06YJ7770Xjz32GJKTkwEAISEhAIDs7Gyn5bKzsx3zrjR79mwYjUbHKzMzs343gogaJfYvRFSTJheciouLIZc7l61QKGC32wEAMTExCAkJQUpKimO+yWTCjh07EB8f73KdGo0GOp3O6UVELQ/7FyKqSZM7x+m2227DSy+9hMjISHTq1An79u3DW2+9hfvvvx8AIJPJMH36dLz44oto27YtYmJiMGfOHISFhWH48OHuLZ6IGjX2L0RUkyYXnN577z3MmTMHDz/8MHJychAWFoYHHngAc+fOdbT597//jaKiIkyePBn5+fno378/1q1bB61W68bKiaixY/9CRDVpcvdxagi8zwpRw2spn7uWsp1EjUmLvo8TERERkbswOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRREp3F9AYCSEAACaTyc2VELUcFZ+3is9fc8X+hajh1WX/wuDkQkFBAQAgIiLCzZUQtTwFBQXQ6/XuLqPesH8hcp+66F9korl/vbsKdrsdZ8+ehRACkZGRyMzMhE6nc3dZNTKZTIiIiGC99aip1dyU6hVCoKCgAGFhYZDLm+9ZBHa7HWlpaejYsWOT+L0ATevvqEJTq5n11q+67F844uSCXC5Hq1atHEN7Op2uSfxhVGC99a+p1dxU6m3OI00V5HI5wsPDATSd30uF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mjVrqn2fAQMGYMWKFejSpYvjXKjrr78eXl5eOHr0aI0jOkePHkVCQgLuuusudOzYEUqlEt999x2ys7MxevRoAOUjYosXL8a9996L66+/HqNHj0ZQUBAyMjLw3//+FzfccAMWLFhQq/0zbNgwDBs2rNo2FednDRkyBAMGDIC/vz/OnDmDTz/9FGfPnsX8+fMrHdb66aefnB7FUqFfv35o3bp1te93/vx5vPjii5Wmx8TEYOzYsZg9ezaee+453HLLLbj99tuRlpaGRYsWoVevXo67oW/cuBFTp07FnXfeiXbt2qGsrAyff/45FAoFRo4cCaD87uZbt27F0KFDERUVhZycHCxatAitWrVC//79q62RqNly92V9RFQ3Ki5z37VrV7XtLr8dQVlZmejVq5do1aqVyM/Pd2r3zjvvCABi5cqVjmn79u0TI0aMEAEBAUKj0YioqChx1113iZSUlEp1VNyOoMLChQsFAPHQQw85TU9MTBQAnNYhROXbEeTm5oopU6aIuLg44eXlJfR6vejTp4/46quvKm3jpk2bRFJSktDr9UKr1YrY2Fgxfvx4sXv37mr3zeW3I6jOlbcEyM7OFq+88ooYOHCgCA0NFUqlUvj5+YnBgweLr7/+2mnZ6m5HcPn2VvfeVS2bkJDgaLdgwQIRFxcnVCqVMBgM4qGHHhIXL150zD9x4oS4//77RWxsrNBqtcLf31/83//9n/j5558dbVJSUsSwYcNEWFiYUKvVIiwsTIwZM0YcPXq02hqJmjOZEJeN5RIRERFRlXiOExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQStcgbYNrtdpw9exY+Pj5VPomdiIiIWgYhBAoKChAWFlbjA6xbZHA6e/YsIiIi3F0GERERNSKZmZlo1apVtW1aZHDy8fEBUL6DdDqdm6shIiIidzKZTIiIiHDkg+q0yOBUcXhOp9MxOBEREREASDp9hyeHExEREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFE9R6cFi5ciOjoaGi1WvTp0wc7d+6stv2qVasQFxcHrVaLLl264Mcff6yy7YMPPgiZTIb58+fXcdVEREREldVrcFq5ciVmzJiBefPmYe/evejatSuSkpKQk5Pjsv1vv/2GMWPGYOLEidi3bx+GDx+O4cOH48CBA5Xafvfdd9i+fTvCwsLqcxOIiIiIHOo1OL311luYNGkSJkyYgI4dO2LJkiXw9PTExx9/7LL9O++8g1tuuQWzZs1Chw4d8MILL+D666/HggULnNqdOXMG06ZNw7Jly6BSqepzE4iIiIgc6i04WSwW7NmzB4mJiX+/mVyOxMREpKamulwmNTXVqT0AJCUlObW32+249957MWvWLHTq1ElSLWazGSaTyelFREREVFv1Fpxyc3Nhs9lgMBicphsMBmRlZblcJisrq8b2r776KpRKJR555BHJtSQnJ0Ov1zteERERtdgSIiIionJN6qq6PXv24J133sHSpUshk8kkLzd79mwYjUbHKzMzsx6rJCIiouaq3oJTYGAgFAoFsrOznaZnZ2cjJCTE5TIhISHVtt+2bRtycnIQGRkJpVIJpVKJU6dOYebMmYiOjq6yFo1GA51O5/QiIiIiqq16C05qtRo9evRASkqKY5rdbkdKSgri4+NdLhMfH+/UHgA2bNjgaH/vvffijz/+wO+//+54hYWFYdasWVi/fn19bQoRERERAEBZnyufMWMGxo0bh549e6J3796YP38+ioqKMGHCBADAfffdh/DwcCQnJwMAHn30UQwcOBBvvvkmhg4dihUrVmD37t344IMPAAABAQEICAhweg+VSoWQkBC0b9++PjeFiIiIqH6D06hRo3D+/HnMnTsXWVlZ6NatG9atW+c4ATwjIwNy+d+DXv369cPy5cvxzDPP4KmnnkLbtm3x/fffo3PnzvVZJhEREZEkMiGEcHcRDc1kMkGv18NoNPJ8JyIiohauNrmgSV1VR0RERORODE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERE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evTogZSUFMc0u92OlJQUxMfHu1wmPj7eqT0AbNiwwdE+JiYGISEhTm1MJhN27NhR5ToBQKPRQKfTOb2IiIiIaqten1U3Y8YMjBs3Dj179kTv3r0xf/58FBUVYcKECQCA++67D+Hh4UhOTgYAPProoxg4cCDefPNNDB06FCtWrMDu3bvxwQcfACh//tX06dPx4osvom3btoiJicGcOXMQFhaG4cOH1+emEBEREdVvcBo1ahTOnz+PuXPnIisrC926dcO6descJ3dnZGRALv970Ktfv35Yvnw5nnnmGTz11FNo27Ytvv/+e3Tu3NnR5t///jeKioowefJk5Ofno3///li3bh20Wm2l9yciIiKqS3zILw/bERERtWiN4j5ORERERM0NgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFE9RacLly4gLFjx0Kn08HX1xcTJ05EYWFhtcuUlpZiypQpCAgIgLe3N0aOHIns7GzH/P3792PMmDGIiIiAh4cHOnTogHfeeae+NoGIiIjISb0Fp7Fjx+LgwYPYsGED1q5di61bt2Ly5MnVLvPYY49hzZo1WLVqFbZs2YKzZ89ixIgRjvl79uxBcHAwvvjiCxw8eBBPP/00Zs+ejQULFtTXZhARERE5yIQQoq5XevjwYXTs2BG7du1Cz549AQDr1q3DP/7xD5w+fRphYWGVljEajQgKCsLy5ctxxx13AACOHDmCDh06IDU1FX379nX5XlOmTMHhw4exceNGyfWZTCbo9XoYjUbodLqr2EIiIiJqLmqTC+plxCk1NRW+vr6O0AQAiYmJkMvl2LFjh8tl9uzZA6vVisTERMe0uLg4REZGIjU1tcr3MhqN8Pf3r7Yes9kMk8nk9CIiIiKqrXoJTllZWQgODnaaplQq4e/vj6ysrCqXUavV8PX1dZpuMBiqXOa3337DypUrazwEmJycDL1e73hFRERI3xgiIiKiS2oVnJ588knIZLJqX0eOHKmvWp0cOHAAw4YNw7x583DzzTdX23b27NkwGo2OV2ZmZoPUSERERM2LsjaNZ86cifHjx1fbpnXr1ggJCUFOTo7T9LKyMly4cAEhISEulwsJCYHFYkF+fr7TqFN2dnalZQ4dOoSEhARMnjwZzzzzTI11azQaaDSaGtsRERERVadWwSkoKAhBQUE1touPj0d+fj727NmDHj16AAA2btwIu92OPn36uFymR48eUKlUSElJwciRIwEAaWlpyMjIQHx8vKPdwYMHMXjwYIwbNw4vvfRSbconIiIiuib1clUdAAwZMgTZ2dlYsmQJrFYrJkyYgJ49e2L58uUAgDNnziAhIQGfffYZevfuDQB46KGH8OOPP2Lp0qXQ6XSYNm0agPJzmYDyw3ODBw9GUlISXn/9dcd7KRQKSYGuAq+qIyIiogq1yQW1GnGqjWXLlmHq1KlISEiAXC7HyJEj8e677zrmW61WpKWlobi42DHt7bffdrQ1m81ISkrCokWLHPO//vprnD9/Hl988QW++OILx/SoqCicPHmyvjaFiIiICEA9jjg1ZhxxIiIiogpuv48TERERUXPE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERSVRvwenChQsYO3YsdDodfH19MXHiRBQWFla7TGlpKaZMmYKAgAB4e3tj5MiRyM7Odtk2Ly8PrVq1gkwmQ35+fj1sAREREZGzegtOY8eOxcGDB7FhwwasXbsWW7duxeTJk6td5rHHHsOaNWuwatUqbNmyBWfPnsWIESNctp04cSKuu+66+iidiIiIyCWZEELU9UoPHz6Mjh07YteuXejZsycAYN26dfjHP/6B06dPIywsrNIyRqMRQUFBWL58Oe644w4AwJEjR9ChQwekpqaib9++jraLFy/GypUrMXfuXCQkJODixYvw9fWVXJ/JZIJer4fRaIROp7u2jSUiIqImrTa5oF5GnFJTU+Hr6+sITQCQmJgIuVyOHTt2uFxmz549sFqtSExMdEyLi4tDZGQkUlNTHdMOHTqE559/Hp999hnkcmnlm81mmEwmpxcRERFRbdVLcMrKykJwcLDTNKVSCX9/f2RlZVW5jFqtrjRyZDAYHMuYzWaMGTMGr7/+OiIjIyXXk5ycDL1e73hFRETUboOIiIiIUMvg9OSTT0Imk1X7OnLkSH3VitmzZ6NDhw645557ar2c0Wh0vDIzM+upQiIiImrOlLVpPHPmTIwfP77aNq1bt0ZISAhycnKcppeVleHChQsICQlxuVxISAgsFgvy8/OdRp2ys7Mdy2zcuBF//vknvv76awBAxelZgYGBePrpp/Hcc8+5XLdGo4FGo5GyiURERERVqlVwCgoKQlBQUI3t4uPjkZ+fjz179qBHjx4AykOP3W5Hnz59XC7To0cPqFQqpKSkYOTIkQCAtLQ0ZGRkID4+HgDwzTffoKSkxLHMrl27cP/992Pbtm2IjY2tzaYQERER1VqtgpNUHTp0wC233IJJkyZhyZIlsFqtmDp1KkaPHu24ou7MmTNISEjAZ599ht69e0Ov12PixImYMWMG/P39odPpMG3aNMTHxzuuqLsyHOXm5jrerzZX1RERERFdjXoJTgCwbNkyTJ06FQkJCZDL5Rg5ciTeffddx3yr1Yq0tDQUFxc7pr399tuOtmazGUlJSVi0aFF9lUhERERUK/VyH6fGjvdxIiIiogpuv48TERERUXPE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFEDE5EREREEjE4EREREUnE4EREREQkEYMTERERkUQMTkREREQSMTgRERERScTgRERERCQRgxMRERGRRAxORERERBIxOBERERFJxOBEREREJBGDExEREZFESncX4A5CCACAyWRycyVERETkbhV5oCIfVKdFBqe8vDwAQEREhJsrISIiosaioKAAer2+2jYtMjj5+/sDADIyMmrcQVR3TCYTIiIikJmZCZ1O5+5yWgzud/fhvncP7nf3aMr7XQiBgoIChIWF1di2RQYnubz81C69Xt/kfrnNgU6n4353A+539+G+dw/ud/doqvtd6kAK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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAJOCAYAAABBWYj1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACh6UlEQVR4nOzdd3xUVdrA8d/cOyW9NxIg9F6liYIioIBdsYANWRdd61r31XUVZXXRtRcUO3ZFXRGxIl0FVKRI7xDSSO/T7j3vH0OGTBoDAgHyfD+fMZlbzxmck+eealFKKYQQQgghxAFpTZ0AIYQQQojjhQROQgghhBBBksBJCCGEECJIEjgJIYQQQgRJAichhBBCiCBJ4CSEEEIIESQJnIQQQgghgiSBkxBCCCFEkCRwEkIIIYQIkgROQgghxHFk4cKFWCwWFi5c2NRJaZYkcBJHjMViCep1rH35f/75Zx566CGKi4ubOilCHFNmzJgR8N21Wq2kpaVx7bXXkpmZ2dTJO6xeeuklZsyY0ezTIOqyyFp14kh57733At6/8847zJ07l3fffTdg+5lnnklycvLRTFqjnnzySe655x527NhBmzZtmjo5QhwzZsyYwcSJE5kyZQpt27bF6XSybNkyZsyYQZs2bVi7di0hISFNnczDokePHiQkJDTpg11DaTBNE7fbjd1uR9Ok/uNoszZ1AsSJ66qrrgp4v2zZMubOnVtn+6FQSuF0OgkNDf3T1xJCHJwxY8bQv39/AP7617+SkJDA448/zuzZs7nsssuaOHVHX0VFBeHh4UftfpqmnTAB6vFIQlXRpN566y2GDx9OUlISDoeDbt268fLLL9c5rk2bNpx77rl899139O/fn9DQUF555RUAdu3axfnnn094eDhJSUnccccdfPfdd/U2Ay5fvpzRo0cTHR1NWFgYp59+Oj/99JN//0MPPcQ999wDQNu2bf1NEjt37jxin4EQx7uhQ4cCsG3bNv+2jRs3cskllxAXF0dISAj9+/dn9uzZdc4tLi7mjjvuoE2bNjgcDlq2bMk111xDfn6+/5i9e/dy3XXXkZycTEhICL179+btt98OuM7OnTuxWCw8+eSTvPrqq7Rv3x6Hw8GAAQP49ddfA47Nyclh4sSJtGzZEofDQYsWLbjgggv83/M2bdqwbt06Fi1a5C8Dhg0bBuxvrly0aBE33XQTSUlJtGzZEoBrr7223lrqhx56CIvFUmf7e++9x8CBAwkLCyM2NpbTTjuN77///oBpaKiP0yeffEK/fv0IDQ0lISGBq666qk4T6rXXXktERASZmZlceOGFREREkJiYyN13341hGHXSKOqSGifRpF5++WW6d+/O+eefj9Vq5csvv+Smm27CNE1uvvnmgGM3bdrE+PHjueGGG5g0aRKdO3emoqKC4cOHk52dzd///ndSUlL44IMPWLBgQZ17zZ8/nzFjxtCvXz8mT56Mpmn+wG3JkiUMHDiQiy++mM2bN/Phhx/yzDPPkJCQAEBiYuJR+TyEOB5VBxyxsbEArFu3jlNPPZW0tDTuvfdewsPDmTlzJhdeeCGfffYZF110EQDl5eUMHTqUDRs28Je//IWTTjqJ/Px8Zs+ezZ49e0hISKCqqophw4axdetWbrnlFtq2bcsnn3zCtddeS3FxMX//+98D0vLBBx9QVlbGDTfcgMVi4b///S8XX3wx27dvx2azATB27FjWrVvHrbfeSps2bdi7dy9z585l9+7dtGnThmeffZZbb72ViIgI7r//foA63QluuukmEhMTefDBB6moqDjoz+zhhx/moYce4pRTTmHKlCnY7XaWL1/O/PnzOeuss4JKQ03VzagDBgxg6tSp5Obm8txzz/HTTz+xcuVKYmJi/McahsGoUaMYNGgQTz75JD/88ANPPfUU7du358YbbzzovDQ7Soij5Oabb1a1/5errKysc9yoUaNUu3btAralp6crQH377bcB25966ikFqFmzZvm3VVVVqS5duihALViwQCmllGmaqmPHjmrUqFHKNM2A+7dt21adeeaZ/m1PPPGEAtSOHTsONatCnJDeeustBagffvhB5eXlqYyMDPXpp5+qxMRE5XA4VEZGhlJKqREjRqiePXsqp9PpP9c0TXXKKaeojh07+rc9+OCDClD/+9//6tyr+nv67LPPKkC99957/n1ut1sNHjxYRUREqNLSUqWUUjt27FCAio+PV4WFhf5jv/jiCwWoL7/8UimlVFFRkQLUE0880Wheu3fvrk4//fQGP4MhQ4Yor9cbsG/ChAkqPT29zjmTJ08OKPu2bNmiNE1TF110kTIMo958N5aGBQsWBJRvbrdbJSUlqR49eqiqqir/cXPmzFGAevDBBwPSCKgpU6YEXLNv376qX79+de4l6pKmOtGkavZRKikpIT8/n9NPP53t27dTUlIScGzbtm0ZNWpUwLZvv/2WtLQ0zj//fP+2kJAQJk2aFHDcqlWr2LJlC1dccQUFBQXk5+eTn59PRUUFI0aMYPHixZimeQRyKMSJZ+TIkSQmJtKqVSsuueQSwsPDmT17Ni1btqSwsJD58+dz2WWXUVZW5v+uFRQUMGrUKLZs2eJvPvrss8/o3bu3vwaqpuqmra+//pqUlBTGjx/v32ez2bjtttsoLy9n0aJFAeddfvnl/pov2N+MuH37dsBX5tjtdhYuXEhRUdEhfwaTJk1C1/VDOnfWrFmYpsmDDz5Yp3N3fU16B/Lbb7+xd+9ebrrppoC+T+eccw5dunThq6++qnPO3/72t4D3Q4cO9X9GonHSVCea1E8//cTkyZNZunQplZWVAftKSkqIjo72v2/btm2d83ft2kX79u3rFDYdOnQIeL9lyxYAJkyY0GBaSkpKAgpcIUT9pk2bRqdOnSgpKeHNN99k8eLFOBwOALZu3YpSigceeIAHHnig3vP37t1LWloa27ZtY+zYsY3ea9euXXTs2LFOgNG1a1f//ppat24d8L76O10dJDkcDh5//HHuuusukpOTOfnkkzn33HO55pprSElJCfITqL88Cta2bdvQNI1u3bod8jVqqv4MOnfuXGdfly5d+PHHHwO2hYSE1Ol+EBsb+6cCyeZEAifRZLZt28aIESPo0qULTz/9NK1atcJut/P111/zzDPP1KkB+jMj6Kqv9cQTT9CnT596j4mIiDjk6wvRnAwcONA/qu7CCy9kyJAhXHHFFWzatMn/Xbv77rvr1BBXq/1gczg1VAukasy8c/vtt3Peeecxa9YsvvvuOx544AGmTp3K/Pnz6du3b1D3qa88aqi26FjrdH2oNWXCRwIn0WS+/PJLXC4Xs2fPDnhKrK9jd0PS09NZv349SqmAQmvr1q0Bx7Vv3x6AqKgoRo4c2eg1D6WqXIjmStd1pk6dyhlnnMGLL77IX/7yF8DXnHag71r79u1Zu3Zto8ekp6ezZs0aTNMMqHXauHGjf/+haN++PXfddRd33XUXW7ZsoU+fPjz11FP++ecOpRyIjY2td+Lc2rVi7du3xzRN1q9f3+CD3MGkofoz2LRpE8OHDw/Yt2nTpkP+jET9pI+TaDLVTz01nwRLSkp46623gr7GqFGjyMzMDBjm7HQ6ee211wKO69evH+3bt+fJJ5+kvLy8znXy8vL8v1fPxyIzhwsRnGHDhjFw4ECeffZZoqKiGDZsGK+88grZ2dl1jq35XRs7diyrV6/m888/r3Ncdblw9tlnk5OTw8cff+zf5/V6eeGFF4iIiOD0008/qLRWVlbidDoDtrVv357IyEhcLpd/W3h4+EGXAe3bt6ekpIQ1a9b4t2VnZ9fJ34UXXoimaUyZMqVOzXrN8jDYNPTv35+kpCSmT58ekIdvvvmGDRs2cM455xxUPkTjpMZJNJmzzjoLu93Oeeedxw033EB5eTmvvfYaSUlJ9Ra49bnhhht48cUXGT9+PH//+99p0aIF77//vr+DZPUTm6ZpvP7664wZM4bu3bszceJE0tLSyMzMZMGCBURFRfHll18CviAL4P7772fcuHHYbDbOO++8ozrBnRDHm3vuuYdLL72UGTNmMG3aNIYMGULPnj2ZNGkS7dq1Izc3l6VLl7Jnzx5Wr17tP+fTTz/l0ksv5S9/+Qv9+vWjsLCQ2bNnM336dHr37s3111/PK6+8wrXXXsuKFSto06YNn376KT/99BPPPvsskZGRB5XOzZs3M2LECC677DK6deuG1Wrl888/Jzc3l3HjxvmP69evHy+//DKPPPIIHTp0ICkpqU5tTm3jxo3j//7v/7jooou47bbbqKys5OWXX6ZTp078/vvv/uM6dOjA/fffz7///W+GDh3KxRdfjMPh4NdffyU1NZWpU6ceVBpsNhuPP/44EydO5PTTT2f8+PH+6QjatGnDHXfccVCfkTiAphzSJ5qX+qYjmD17turVq5cKCQlRbdq0UY8//rh6880360wHkJ6ers4555x6r7t9+3Z1zjnnqNDQUJWYmKjuuusu9dlnnylALVu2LODYlStXqosvvljFx8crh8Oh0tPT1WWXXabmzZsXcNy///1vlZaWpjRNk6kJhNineij+r7/+WmefYRiqffv2qn379srr9apt27apa665RqWkpCibzabS0tLUueeeqz799NOA8woKCtQtt9yi0tLSlN1uVy1btlQTJkxQ+fn5/mNyc3PVxIkTVUJCgrLb7apnz57qrbfeCrhO9XQE9U0zAKjJkycrpZTKz89XN998s+rSpYsKDw9X0dHRatCgQWrmzJkB5+Tk5KhzzjlHRUZGKsA/LUBjn4FSSn3//feqR48e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rzF69GjVt29ftXz5cvXjjz+qjh07qvHjxzdVlvway1tZWZm6++671dKlS9WOHTvUDz/8oE466STVsWNH5XQ6/dc4VvMmAkn5cuw5kcsWpaR8ORqafeCklFIvvPCCat26tbLb7WrgwIFq2bJlTZ2kg3b55ZerFi1aKLvdrtLS0tTll1+utm7d6t9fVVWlbrrpJhUbG6vCwsLURRddpLKzs5swxY1bsGCBAuq8JkyYoJTyDRt+4IEHVHJysnI4HGrEiBFq06ZNAdcoKChQ48ePVxERESoqKkpNnDhRlZWVNUFuAjWWt8rKSnXWWWepxMREZbPZVHp6upo0aVKdP7THat5EXVK+HFtO5LJFKSlfjgaLUkodvfotIYQQQojjV7Pu4ySEEEIIcTAkcBJCCCGECJIETkIIIYQQQZLASQghhBAiSBI4CSGEEEIESQInIYQQQoggSeAkhBBCCBEkCZyEEEIIIYIkgZMQQgghRJAkcBJCCCGECJIETkIIIYQQQZLASQghhBAiSBI4CSGEEEIESQInIYQQQoggSeAkhBBCCBEkCZyEEEIIIYIkgZMQQgghRJAkcBLiBHbttdfSpk2bI3b9GTNmYLFY2Llz55+6zs6dO7FYLMyYMeOwpEsIIY4UCZyEOA5VByzVr5CQEDp16sQtt9xCbm5uUyfvuLBw4UL/5/fee+/Ve8ypp56KxWKhR48eAdvdbjfPPfccffv2JSoqipiYGLp3787111/Pxo0b/cfV/neq/Vq2bFmjaRw2bFidewshmpa1qRMghDh0U6ZMoW3btjidTn788Udefvllvv76a9auXUtYWBivvfYapmk2dTIPKD09naqqKmw221G/d0hICB988AFXXXVVwPadO3fy888/ExISUuecsWPH8s033zB+/HgmTZqEx+Nh48aNzJkzh1NOOYUuXboEHF/971Rbhw4dDm9mhBBHnAROQhzHxowZQ//+/QH461//Snx8PE8//TRffPEF48ePb5JA5FBU15o1hbPPPpvZs2eTn59PQkKCf/sHH3xAcnIyHTt2pKioyL/9119/Zc6cOTz66KP885//DLjWiy++SHFxcZ171Px3EkIc36SpTogTyPDhwwHYsWMHULeP0+TJk9E0jXnz5gWcd/3112O321m9erV/2/Llyxk9ejTR0dGEhYVx+umn89NPPzV6/zvvvJP4+HiUUv5tt956KxaLheeff96/LTc3F4vFwssvvwzU38cpJyeHiRMn0rJlSxwOBy1atOCCCy6o05/qm2++YejQoYSHhxMZGck555zDunXrDvxh7XPBBRfgcDj45JNPArZ/8MEHXHbZZei6HrB927ZtgK8ZrzZd14mPjw/63ofLSy+9RPfu3XE4HKSmpnLzzTfXCeC2bNnC2LFjSUlJISQkhJYtWzJu3DhKSkr8x8ydO5chQ4YQExNDREQEnTt3rhMcCtHcSeAkxAmk+o96Q3+8//Wvf9GnTx+uu+46ysrKAPjuu+947bXXePDBB+nduzcA8+fP57TTTqO0tJTJkyfzn//8h+LiYoYPH84vv/zS4P2HDh1KYWFhQOCyZMkSNE1jyZIlAdsATjvttAavNXbsWD7//HMmTpzISy+9xG233UZZWRm7d+/2H/Puu+9yzjnnEBERweOPP84DDzzA+vXrGTJkSNAd1sPCwrjgggv48MMP/dtWr17NunXruOKKK+ocn56eDsD777+P1+sN6h4lJSXk5+cHvAoKCoI690Aeeughbr75ZlJTU3nqqacYO3Ysr7zyCmeddRYejwfw9ckaNWoUy5Yt49Zbb2XatGlcf/31bN++3R9grVu3jnPPPReXy8WUKVN46qmnOP/88w8YLAvR7CghxHHnrbfeUoD64YcfVF5ensrIyFAfffSRio+PV6GhoWrPnj1KKaUmTJig0tPTA879448/lN1uV3/9619VUVGRSktLU/3791cej0cppZRpmqpjx45q1KhRyjRN/3mVlZWqbdu26swzz6yTjh07diillNq7d68C1EsvvaSUUqq4uFhpmqYuvfRSlZyc7D/vtttuU3Fxcf7r79ixQwHqrbfeUkopVVRUpAD1xBNPNPgZlJWVqZiYGDVp0qSA7Tk5OSo6OrrO9toWLFigAPXJJ5+oOXPmKIvFonbv3q2UUuqee+5R7dq1U0opdfrpp6vu3bv7zzNNU51++ukKUMnJyWr8+PFq2rRpateuXXXuUf351PdyOByNpq++e9e2d+9eZbfb1VlnnaUMw/Bvf/HFFxWg3nzzTaWUUitXrvTntSHPPPOMAlReXt4B0yVEcyY1TkIcx0aOHEliYiKtWrVi3LhxRERE8Pnnn5OWltbgOT169ODhhx/m9ddfZ9SoUeTn5/P2229jtfq6PK5atYotW7ZwxRVXUFBQ4K8hqaioYMSIESxevLjBDueJiYl06dKFxYsXA/DTTz+h6zr33HMPubm5bNmyBfDVOA0ZMgSLxVLvdUJDQ7Hb7SxcuDCgf1FNc+fOpbi4mPHjxwfU5Oi6zqBBg1iwYEHQn+NZZ51FXFwcH330EUopPvroI8aPH1/vsRaLhe+++45HHnmE2NhYPvzwQ26++WbS09O5/PLL6+3jNG3aNObOnRvw+uabb4JOX0N++OEH3G43t99+O5q2vzifNGkSUVFRfPXVVwBER0cDvtrFysrKeq8VExMDwBdffHFcDCgQoqlI53AhjmPTpk2jU6dOWK1WkpOT6dy5c8Af0Ibcc889fPTRR/zyyy/85z//oVu3bv591cHNhAkTGjy/pKSE2NjYevcNHTqUr7/+GvAFSP3796d///7ExcWxZMkSkpOTWb16db3NYNUcDgePP/44d911F8nJyZx88smce+65XHPNNaSkpASks7pfV21RUVGNfAKBbDYbl156KR988AEDBw4kIyPjgOm7//77uf/++8nOzmbRokU899xzzJw5E5vNVmd6g4EDBx6RzuG7du0CoHPnzgHb7XY77dq18+9v27Ytd955J08//TTvv/8+Q4cO5fzzz+eqq67yB1WXX345r7/+On/961+59957GTFiBBdffDGXXHJJUP9PCdFcSOAkxHHsUP8gb9++3R94/PHHHwH7qmsbnnjiCfr06VPv+REREQ1ee8iQIbz22mts376dJUuWMHToUCwWC0OGDGHJkiWkpqZimiZDhw5tNI2333475513HrNmzeK7777jgQceYOrUqcyfP5++ffv60/nuu+/6g6maqmvQgnXFFVcwffp0HnroIXr37h0QTDamRYsWjBs3jrFjx9K9e3dmzpzJjBkzDvr+R9pTTz3FtddeyxdffMH333/PbbfdxtSpU1m2bBktW7YkNDSUxYsXs2DBAr766iu+/fZbPv74Y4YPH873339fp5O8EM2VPEYI0cyYpsm1115LVFQU//znP/nwww/53//+59/fvn17wFdjM3LkyHpfjU1zUB0QzZ07l19//dX//rTTTmPJkiUsWbKE8PBw+vXrd8C0tm/fnrvuuovvv/+etWvX4na7eeqppwLSmZSUVG8ahw0bdlCfy5AhQ2jdujULFy5stLapITabjV69euHxeMjPzz/o8w9FdUf1TZs2BWx3u93s2LHDv79az549+de//sXixYtZsmQJmZmZTJ8+3b9f0zRGjBjB008/zfr163n00UeZP3/+QTV7CnGik8BJiGbm6aef5ueff+bVV1/l3//+N6eccgo33nij/499v379aN++PU8++STl5eV1zs/Ly2v0+m3btiUtLY1nnnkGj8fjH7Y/dOhQtm3bxqeffsrJJ5/caI1MZWUlTqczYFv79u2JjIzE5XIBMGrUKKKiovjPf/7jHz12MOmsrXrKhMmTJ3P11Vc3eNyWLVsCRvZVKy4uZunSpcTGxpKYmHhQ9z5UI0eOxG638/zzzwdMAfHGG29QUlLCOeecA0BpaWmdEYA9e/ZE0zT/51lYWFjn+tU1jtXHCCGkqU6IZmXDhg088MADXHvttZx33nmAb1mQPn36cNNNNzFz5kw0TeP1119nzJgxdO/enYkTJ5KWlkZmZiYLFiwgKiqKL7/8stH7DB06lI8++oiePXv6+0KddNJJhIeHs3nz5gPW6GzevJkRI0Zw2WWX0a1bN6xWK59//jm5ubmMGzcO8NWIvfzyy1x99dWcdNJJjBs3jsTERHbv3s1XX33FqaeeyosvvnhQn88FF1zABRdc0Ogx1f2zxowZw9ChQ4mLiyMzM5O3336brKwsnn322TrNWt98803AUizVTjnlFNq1a9fo/fLy8njkkUfqbG/bti1XXnkl9913Hw8//DCjR4/m/PPPZ9OmTbz00ksMGDDAPxv6/PnzueWWW7j00kvp1KkTXq+Xd999F13XGTt2LOCb3Xzx4sWcc845pKens3fvXl566SVatmzJkCFDGk2jEM1KUw/rE0IcvOph7r/++mujx9WcjsDr9aoBAwaoli1bquLi4oDjnnvuOQWojz/+2L9t5cqV6uKLL1bx8fHK4XCo9PR0ddlll6l58+bVSUf1dATVpk2bpgB14403BmwfOXKkAgKuoVTd6Qjy8/PVzTffrLp06aLCw8NVdHS0GjRokJo5c2adPC5YsECNGjVKRUdHq5CQENW+fXt17bXXqt9++63Rz6bmdASNqT0lQG5urnrsscfU6aefrlq0aKGsVquKjY1Vw4cPV59++mnAuY1NR1Azv43du6FzR4wY4T/uxRdfVF26dFE2m00lJyerG2+8URUVFfn3b9++Xf3lL39R7du3VyEhISouLk6dccYZ6ocffvAfM2/e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ac+ePRozZow6d+6sqKgo3XXXXaqsrDTHjhw5UjNnztScOXMUERGh9PR0SdITTzyh+Ph4derUSTExMbr33ntVU1MjSXr33Xc1bdo0eTwec38PPfSQpLPfqisvL9fYsWPVuXNnORwO3XnnnaqoqDDXP/TQQxoyZIheeOEFxcXFyel0asKECfr+++99+0cD4BcEJwB+99RTTyklJUXTp0/XkSNHdOTIEcXExKiqqkq33HKLbrrpJu3atUubN29WRUWF7rzzTq/xzz//vOx2uz744AOtWbNGkhQUFKSVK1dq7969ev7557V161bdf//9kqThw4drxYoVcjgc5v7mzZt3Vl3Nzc0aO3asTpw4ocLCQm3ZskVfffWVMjMzvfqVlZVp06ZNys/PV35+vgoLC/WPf/zDR38tAP7EW3UA/M7pdMput6tjx45yuVxm+6pVq3TTTTfp73//u9n2z3/+UzExMfrf//6n66+/XpLUt29fLVu2zGubP79fKi4uTo888ojuvvtuPfPMM7Lb7XI6nbLZbF77+6WCggJ9/vnnOnDggGJiYiRJ69at04033qidO3dq6NChkk4HrLVr16pLly6SpLvuuksFBQV69NFHL+4PA6DN4YoTgDbr008/1bZt29S5c2dz6devn6TTV3nOSEhIOGvsO++8o9TUVPXs2VNdunTRXXfdpePHj6uurs7y/vft26eYmBgzNEnSgAEDFBYWpn379pltcXFxZmiSpB49eujo0aOtmiuAKwNXnAC0WTU1Nbr99tv12GOPnbWuR48e5s+dOnXyWnfw4EH9/ve/1z333KNHH31U4eHhev/995WVlaWGhgZ17NjxktYZEhLi9bvNZlNzc/Ml3QeAtoHgBKBNsNvtampq8mr7zW9+o9dee01xcXFq1876/1wVFxerublZy5cvV1DQ6Qvrr7zyygX390v9+/fXoUOHdOjQIfOq0xdffKGqqioNGDDAcj0Arh68VQegTYiLi9P27dt18OBBVVZWqrm5WdnZ2Tpx4oQmTpyonTt3qqysTP/5z380bdq084ae6667To2NjXr66af11Vdf6YUXXjBvGv/5/mpqalRQUKDKysoW38JLS0tTfHy8Jk2apN27d2vHjh2aPHmyRowYocTExEv+NwDQ9hGcALQJ8+bNU3BwsAYMGKDIyEiVl5crOjpaH3zwgZqamjRq1CjFx8drzpw5CgsLM68ktWTw4MF64okn9Nhjj2ngwIFav369cnNzvfoMHz5cd999tzIzMxUZGXnWzeXS6bfc3nzzTXXt2lU333yz0tLS1KdPH23YsOGSzx/AlcFmGIbh7yIAAACuBFxxAgAAsIjgBAAAYBHBCQAAwCKCEwAAgEUEJwAAAIsITgAAABYRnAAAACwiOAEAAFhEcAIAALCI4AQAAGARwQkAAMAighMAAIBF/w/8W0vi0i2oAAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -416,17 +398,16 @@ " line[0].set_ydata(losses_over_time[:T])\n", " fig.canvas.draw()\n", " buffs.append(b.pil_image_from_matplotlib(fig))\n", - "buffs[-1]" + "buffs[-1]\n", + "b.make_gif_from_pil_images(buffs, \"optimization.gif\")" ] }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 64, "metadata": {}, "outputs": [], - "source": [ - "b.make_gif_from_pil_images(buffs, \"optimization.gif\")" - ] + "source": [] }, { "cell_type": "code", @@ -445,7 +426,7 @@ ], "metadata": { "kernelspec": { - "display_name": "bayes3d", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -459,9 +440,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/scripts/experiments/likelihood_debug.ipynb b/scripts/experiments/likelihood_debug.ipynb index 1f2cd2ea..fe518e5f 100644 --- a/scripts/experiments/likelihood_debug.ipynb +++ b/scripts/experiments/likelihood_debug.ipynb @@ -33,7 +33,7 @@ "output_type": "stream", "text": [ "You can open the visualizer by visiting the following URL:\n", - "http://127.0.0.1:7000/static/\n" + "http://127.0.0.1:7002/static/\n" ] } ], @@ -109,7 +109,10 @@ "\n", "grid_params = [\n", " (0.3, jnp.pi, (15,15,15)), (0.2, jnp.pi, (15,15,15)), (0.1, jnp.pi, (15,15,15)),\n", - " (0.05, jnp.pi/3, (15,15,15)), (0.02, jnp.pi, (9,9,51)), (0.01, jnp.pi/5, (15,15,15)), (0.01, 0.0, (31,31,1)),(0.05, 0.0, (31,31,1))\n", + " (0.05, jnp.pi/3, (15,15,15)),\n", + " (0.02, jnp.pi, (9,9,51))\n", + " , (0.01, jnp.pi/5, (15,15,15)),\n", + " # (0.01, 0.0, (31,31,1)),(0.05, 0.0, (31,31,1))\n", "]\n", "contact_param_gridding_schedule = [\n", " b.utils.make_translation_grid_enumeration_3d(\n", @@ -123,41 +126,36 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 6, "id": "f4648f31-caf1-4792-bd83-9d652a8c5e4b", "metadata": {}, "outputs": [], "source": [ "table_pose = b.t3d.inverse_pose(\n", " b.t3d.transform_from_pos_target_up(\n", - " jnp.array([0.0, 0.8, .15]),\n", + " jnp.array([0.0, 0.6, .35]),\n", " jnp.array([0.0, 0.0, 0.0]),\n", " jnp.array([0.0, 0.0, 1.0]),\n", " )\n", ")\n", - "face_child = 3\n", - "cp_to_pose = lambda cp: table_pose@ b.scene_graph.relative_pose_from_edge(cp, face_child, b.RENDERER.model_box_dims[13])\n", - "cp_to_pose_jit = jax.jit(cp_to_pose)\n", - "cp_to_pose_parallel = jax.jit(jax.vmap(cp_to_pose, in_axes=(0,)))\n", - "\n", - "key = jax.random.PRNGKey(30)\n" + "face_child = 3" ] }, { "cell_type": "code", - "execution_count": null, - "id": "e9143f28", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 58, + "execution_count": 7, "id": "53c182df", "metadata": {}, "outputs": [], "source": [ + "_cp_to_pose = lambda cp, index: table_pose@ b.scene_graph.relative_pose_from_edge(cp, face_child, b.RENDERER.model_box_dims[index])\n", + "cps_to_pose= jax.vmap(_cp_to_pose, in_axes=(0,0,))\n", + "cps_to_pose_jit = jax.jit(cps_to_pose)\n", + "cps_to_pose_parallel = jax.vmap(cps_to_pose, in_axes=(0,None,))\n", + "cps_to_pose_parallel_jit = jax.jit(cps_to_pose_parallel)\n", + "\n", + "key = jax.random.PRNGKey(30)\n", + "\n", "def score_images(rendered, observed):\n", " return -jnp.linalg.norm(observed - rendered, axis=-1).mean()\n", "\n", @@ -189,31 +187,292 @@ }, { "cell_type": "code", - "execution_count": 60, - "id": "cecb8b0d", + "execution_count": 8, + "id": "a2921aef", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1000, 1, 4, 4)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cps_to_pose_parallel_jit(jnp.zeros((1000,1,3)), jnp.array([0])).shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "da1e5a2d", + "metadata": {}, + "outputs": [], + "source": [ + "def grid_and_max(cps, indices, number, grid, obs_img):\n", + " cps_expanded = jnp.repeat(cps[None,...], grid.shape[0], axis=0)\n", + " cps_expanded = cps_expanded.at[:,number,:].set(cps_expanded[:,number,:] + grid)\n", + " cp_poses = cps_to_pose_parallel(cps_expanded, indices)\n", + " scores = score_vmap(b.RENDERER.render_many(cp_poses, indices)[...,:3], obs_img)\n", + " best_idx = jnp.argmax(scores)\n", + " cps = cps_expanded[best_idx]\n", + " return cps, scores[best_idx]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6655d973", + "metadata": {}, + "outputs": [], + "source": [ + "def c2f(potential_cps, potential_indices, number, contact_param_gridding_schedule, obs_img):\n", + " # cps_over_inference = [potential_cps]\n", + " for cp_grid in contact_param_gridding_schedule:\n", + " potential_cps, score = grid_and_max(potential_cps, potential_indices, number, cp_grid, obs_img)\n", + " # cps_over_inference.append(potential_cps)\n", + " return potential_cps, score\n", + "c2f_jit = jax.jit(c2f)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f6b6cda1", + "metadata": {}, + "outputs": [], + "source": [ + "data_dump = []" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "080eaee9", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/50 [00:0025\u001b[0m potential_indices \u001b[39m=\u001b[39m jnp\u001b[39m.\u001b[39mconcatenate([indices, jnp\u001b[39m.\u001b[39marray([next_index])])\n\u001b[1;32m 26\u001b[0m potential_cps \u001b[39m=\u001b[39m jnp\u001b[39m.\u001b[39mconcatenate([cps, jax\u001b[39m.\u001b[39mrandom\u001b[39m.\u001b[39muniform(key, shape\u001b[39m=\u001b[39m(\u001b[39m1\u001b[39m,\u001b[39m3\u001b[39m,),minval\u001b[39m=\u001b[39mlow, maxval\u001b[39m=\u001b[39mhigh)])\n\u001b[0;32m---> 27\u001b[0m potential_cps, score \u001b[39m=\u001b[39m c2f_jit(potential_cps, potential_indices, \u001b[39mlen\u001b[39;49m(potential_indices) \u001b[39m-\u001b[39;49m \u001b[39m1\u001b[39;49m, contact_param_gridding_schedule, obs_img)\n\u001b[1;32m 28\u001b[0m \u001b[39mif\u001b[39;00m score \u001b[39m>\u001b[39m best_score:\n\u001b[1;32m 29\u001b[0m best_index \u001b[39m=\u001b[39m next_index\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "for _ in tqdm(range(50)):\n", + " key = jax.random.split(key,2)[0]\n", + " # gt_indices = \"jnp.array([13,11])\n", + " gt_indices = jax.random.choice(key, 21, shape=(3,))\n", + " # key = jnp.array([2755247810, 1586593754], dtype=np.uint32)\n", + " low, high = jnp.array([-0.25, -0.25, -jnp.pi]), jnp.array([0.25, 0.25, jnp.pi])\n", + " gt_cps = jax.random.uniform(key, shape=(gt_indices.shape[0],3),minval=low, maxval=high)\n", + " gt_poses = cps_to_pose(gt_cps, gt_indices)\n", + " obs_img = b.RENDERER.render(gt_poses, gt_indices)[...,:3]\n", + "\n", + " b.get_depth_image(obs_img[...,2])\n", + "\n", + " inference_results = []\n", + " for _ in range(2):\n", + " cps = jnp.zeros((0,3))\n", + " indices = jnp.array([], dtype=jnp.int32)\n", + "\n", + " for _ in range(3):\n", + " best_score = 0.0\n", + " best_index = -1\n", + " best_cps = None\n", + " best_indices = None\n", + " key = jax.random.split(key,2)[0]\n", + " for next_index in range(21):\n", + " potential_indices = jnp.concatenate([indices, jnp.array([next_index])])\n", + " potential_cps = jnp.concatenate([cps, jax.random.uniform(key, shape=(1,3,),minval=low, maxval=high)])\n", + " potential_cps, score = c2f_jit(potential_cps, potential_indices, len(potential_indices) - 1, contact_param_gridding_schedule, obs_img)\n", + " if score > best_score:\n", + " best_index = next_index\n", + " best_score = score\n", + " best_cps = potential_cps\n", + " best_indices = potential_indices\n", + " # print(\"GT CP: \", gt_cps)\n", + " # print(\"Inferred CP: \", potential_cps)\n", + " cps = best_cps\n", + " indices = best_indices\n", + " reconstruction = b.RENDERER.render(cps_to_pose(best_cps, best_indices), best_indices)[...,:3]\n", + " b.hstack_images([b.get_depth_image(obs_img[...,2]), *[b.get_depth_image(reconstruction[...,2])]])\n", + " print(\"GT Indices : \", gt_indices)\n", + " print(\"Inf Indices : \", indices)\n", + "\n", + " inference_results.append((cps, indices))\n", + " data_dump.append((gt_cps, gt_indices, inference_results))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "e4c3c9ba", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 24/24 [00:16<00:00, 1.42it/s]\n" + ] + } + ], + "source": [ + "images = []\n", + "for i in tqdm(range(len(data_dump))):\n", + " (gt_cps, gt_indices, inference_results) = data_dump[i]\n", + " obs_img = b.RENDERER.render(cps_to_pose(gt_cps, gt_indices), gt_indices)[...,:3]\n", + " obs_viz = b.scale_image(b.get_depth_image(obs_img[...,2]), 3.0)\n", + "\n", + " viz = []\n", + " for j in range(len(inference_results)):\n", + " best_cps, best_indices = inference_results[j]\n", + " reconstruction = b.RENDERER.render(cps_to_pose(best_cps, best_indices), best_indices)[...,:3]\n", + " viz.append(b.scale_image(b.get_depth_image(reconstruction[...,2]), 3.0))\n", + " \n", + " images.append(b.multi_panel([obs_viz, *viz], labels=[\"Observed\", \"Inference Run 1\", \"Inference Run 2\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "0a5726da", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ffmpeg version 4.3.6-0+deb11u1 Copyright (c) 2000-2023 the FFmpeg developers\n", + " built with gcc 10 (Debian 10.2.1-6)\n", + " configuration: --prefix=/usr --extra-version=0+deb11u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared\n", + " libavutil 56. 51.100 / 56. 51.100\n", + " libavcodec 58. 91.100 / 58. 91.100\n", + " libavformat 58. 45.100 / 58. 45.100\n", + " libavdevice 58. 10.100 / 58. 10.100\n", + " libavfilter 7. 85.100 / 7. 85.100\n", + " libavresample 4. 0. 0 / 4. 0. 0\n", + " libswscale 5. 7.100 / 5. 7.100\n", + " libswresample 3. 7.100 / 3. 7.100\n", + " libpostproc 55. 7.100 / 55. 7.100\n", + "Input #0, image2, from '%07d.png':\n", + " Duration: 00:00:00.96, start: 0.000000, bitrate: N/A\n", + " Stream #0:0: Video: png, rgb24(pc), 920x371, 25 fps, 25 tbr, 25 tbn, 25 tbc\n", + "Stream mapping:\n", + " Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))\n", + "Press [q] to stop, [?] for help\n", + "[libx264 @ 0x562f7a200300] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512\n", + "[libx264 @ 0x562f7a200300] profile High 4:4:4 Predictive, level 2.2, 4:4:4, 8-bit\n", + "[libx264 @ 0x562f7a200300] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=1 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00\n", + "Output #0, mp4, to 'out.mp4':\n", + " Metadata:\n", + " encoder : Lavf58.45.100\n", + " Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv444p, 920x371, q=-1--1, 0.50 fps, 16384 tbn, 0.50 tbc\n", + " Metadata:\n", + " encoder : Lavc58.91.100 libx264\n", + " Side data:\n", + " cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A\n", + "frame= 24 fps=0.0 q=-1.0 Lsize= 177kB time=00:00:42.00 bitrate= 34.4kbits/s speed= 115x \n", + "video:176kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.526017%\n", + "[libx264 @ 0x562f7a200300] frame I:1 Avg QP:14.56 size: 15734\n", + "[libx264 @ 0x562f7a200300] frame P:23 Avg QP:13.87 size: 7105\n", + "[libx264 @ 0x562f7a200300] mb I I16..4: 25.9% 58.0% 16.1%\n", + "[libx264 @ 0x562f7a200300] mb P I16..4: 7.2% 16.8% 9.3% P16..4: 0.9% 0.9% 0.5% 0.0% 0.0% skip:64.4%\n", + "[libx264 @ 0x562f7a200300] 8x8 transform intra:51.2% inter:57.0%\n", + "[libx264 @ 0x562f7a200300] coded y,u,v intra: 30.7% 25.4% 26.9% inter: 2.0% 1.7% 1.9%\n", + "[libx264 @ 0x562f7a200300] i16 v,h,dc,p: 55% 13% 2% 30%\n", + "[libx264 @ 0x562f7a200300] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 16% 48% 2% 2% 2% 3% 3% 2%\n", + "[libx264 @ 0x562f7a200300] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 26% 20% 3% 7% 3% 4% 3% 2%\n", + "[libx264 @ 0x562f7a200300] Weighted P-Frames: Y:0.0% UV:0.0%\n", + "[libx264 @ 0x562f7a200300] ref P L0: 40.6% 7.6% 28.4% 23.4%\n", + "[libx264 @ 0x562f7a200300] kb/s:29.86\n" ] }, { "data": { - "image/png": "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", "text/plain": [ - "" + "0" ] }, "execution_count": 60, @@ -222,42 +481,404 @@ } ], "source": [ - "key = jax.random.split(key,2)[0]\n", - "# key = jnp.array([2755247810, 1586593754], dtype=np.uint32)\n", - "low, high = jnp.array([-0.2, -0.2, -jnp.pi]), jnp.array([0.2, 0.2, jnp.pi])\n", - "gt_cp = jax.random.uniform(key, shape=(3,),minval=low, maxval=high)\n", - "gt_pose = cp_to_pose_jit(gt_cp)\n", - "obs_img = b.RENDERER.render(gt_pose[None,...], jnp.array([13]))[...,:3]\n", + "import subprocess\n", + "\n", + "fps = 0.5\n", + "for i in range(len(images)):\n", + " images[i].convert(\"RGB\").save(\"%07d.png\" % i)\n", + "subprocess.call([\"ffmpeg\",\"-y\",\"-r\",str(fps),\"-i\", \"%07d.png\",\"out.mp4\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "1b013647", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAC8CAYAAADl2K3eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/uUlEQVR4nO29e5xkVXnv/V1r7V1VfZsLMyMzw50RBAWDlxhFFAIKMZJRkYig8RI90SCamDdoXt/4QT36+kZz0OOFiPEWJSrE16AcL6MCHsSo0SQIoqjIRe4zw9x6uruq9l5rnT/W3rv2rq7qy0zPTPfU8/18+lO7du1bV69+1m89z7Oepbz3HkEQBEEQBhZ9oB9AEARBEIQDi4gBQRAEQRhwRAwIgiAIwoAjYkAQBEEQBhwRA4IgCIIw4IgYEARBEIQBR8SAIAiCIAw4IgYEQRAEYcARMSAIgiAIA85AiIF3vOMdKKXYunXrgX6U/Y5Sine84x0H+jEEQRCERcySFgO33347L3/5yznssMOo1+usX7+el73sZdx+++0H+tEEYcH5zGc+g1Kq+ImiiMMOO4xXvepVPPDAAwfsud7znvewceNGDj30UBGfQk8WY9u94447eMtb3sIpp5zC2NgY69at4/nPfz4/+clPDsjzHGiiA/0Ae8qXv/xlLrzwQg455BBe85rXcMwxx3DPPffwyU9+ki996Ut88Ytf5EUvetGBfkxBWHDe9a53ccwxx9BsNvnhD3/IZz7zGW6++WZ+9rOf0Wg09vvz/O3f/i1r167lSU96Eps2bdrv9xeWDoup7X7iE5/gk5/8JC9+8Yu5+OKL2blzJ1deeSVPf/rT+eY3v8lznvOc/fo8Bxy/BLnzzjv98PCwP+GEE/zmzZsrn23ZssWfcMIJfmRkxP/mN7/x3nt/2WWXecBv2bLlQDxugbXWT01N7dd7Av6yyy7br/cU9g2f/vSnPeB//OMfV/a/9a1v9YC/+uqrD8hz3X333d778L8n7U3oxWJsuz/5yU/8+Ph4Zd/WrVv9mjVr/DOf+cz9/jwHmiUZJnj/+9/P5OQkH//4x1mzZk3ls9WrV3PllVcyMTHB+973vspnW7du5SUveQnLli1j1apV/MVf/AXNZrNyzLe//W1OO+00VqxYwejoKI973ON429veVjmm1Wpx2WWX8djHPpZ6vc4RRxzBW97yFlqtVuU4pRSXXHIJ//zP/8wTnvAE6vU61113HYcccgivfvWrp/1eu3btotFo8Nd//dfzvler1eLNb34za9asYWxsjI0bN3L//ffP/UsVlizPetazAPjNb35T7DvjjDM444wzph37qle9iqOPPrp4f88996CU4u///u/5+Mc/zoYNG6jX6/zu7/4uP/7xj+d0//L1BGE+HMi2+5SnPIXR0dHKvlWrVvGsZz2LX/ziF3v2Cy1hlmSY4LrrruPoo48uGlI3z372szn66KP52te+Vtn/kpe8hKOPPpr3vve9/PCHP+RDH/oQ27dv57Of/SwQchDOPfdcnvjEJ/Kud72Ler3OnXfeyfe///3iGs45Nm7cyM0338yf/dmfceKJJ3LbbbfxgQ98gF/96ldce+21lXvecMMNXHPNNVxyySWsXr2a4447jhe96EV8+ctf5sorr6RWqxXHXnvttbRaLV760pfO+16vfe1rueqqq7jooos49dRTueGGG3j+85+/N1+zsES45557AFi5cuUeX+Pzn/884+PjvO51r0Mpxfve9z7OO+887rrrLuI4XqAnFYQqi7HtPvzww6xevXqPn2fJcqBdE/Nlx44dHvAveMELZjxu48aNHvC7du0qwgQbN26sHHPxxRd7wP/0pz/13nv/gQ98YNZwwuc+9zmvtfbf+973Kvs/9rGPecB///vfL/YBXmvtb7/99sqxmzZt8oC/7rrrKvv/8A//0B977LHzvtctt9ziAX/xxRdXjrvooovEbXsQkbtav/Od7/gtW7b4++67z3/pS1/ya9as8fV63d93333Fsaeffro//fTTp13jla98pT/qqKOK93fffbcH/KpVq/y2bduK/V/5yld6ttGZkDCB0I/F3nZzbrrpJq+U8m9/+9vnfe5SZ8mFCcbHxwEYGxub8bj88127dhX73vCGN1SOeeMb3wjA17/+dQBWrFgBwFe+8hWccz2v+y//8i+ceOKJnHDCCWzdurX4OfPMMwG48cYbK8effvrpPP7xj6/sO/PMM1m9ejVXX311sW/79u18+9vf5oILLpj3vfLnf9Ob3lS5z1/+5V/2/B2Epc1znvMc1qxZwxFHHMH555/PyMgIX/3qVzn88MP3+JoXXHBBZXSWe93uuuuuvX5eQchZzG138+bNXHTRRRxzzDG85S1v2ePnWaosuTBB3snnoqAfvUTDcccdVzlmw4YNaK0LV9UFF1zAJz7xCV772tfyN3/zN5x11lmcd955nH/++WgddNOvf/1rfvGLX0zLVcjZvHlz5f0xxxwz7Zgoinjxi1/M5z//eVqtFvV6nS9/+cskSVIRA3O917333ovWmg0bNlQ+f9zjHtfzPGFp89GPfpTjjz+enTt38qlPfYqbbrqJer2+V9c88sgjK+9z47p9+/a9uq4glFmsbXdiYoJzzz2X8fFxbr755mm5BIPAkhMDy5cvZ926ddx6660zHnfrrbdy2GGHsWzZsr7HKKUq74eGhrjpppu48cYb+drXvsY3v/lNrr76as4880y+9a1vYYzBOcfJJ5/M5Zdf3vOaRxxxxLRr9uKlL30pV155Jd/4xjd44QtfyDXXXMMJJ5zA7/zO7xTHzPdewmDwtKc9jac+9akAvPCFL+S0007joosu4pe//GVhxJRSeO+nnWut7XlNY0zP/b2uIQh7ymJsu+12m/POO49bb72VTZs2cdJJJ83pvIONJRcmADj33HO5++67ufnmm3t+/r3vfY977rmHc889t7L/17/+deX9nXfeiXOukqGqteass87i8ssv5+c//znvec97uOGGGwqX/IYNG9i2bRtnnXUWz3nOc6b9zHU0/uxnP5t169Zx9dVXs3XrVm644YaKV2A+9zrqqKNwzlUycgF++ctfzulZhKWLMYb3vve9PPjgg3zkIx8p9q9cuZIdO3ZMO/7ee+/dj08nCP1ZDG3XOccrXvEKrr/+ej7/+c9z+umnL/g9lgpLUgxceumlDA0N8brXvY5HH3208tm2bdt4/etfz/DwMJdeemnls49+9KOV9x/+8IcBeN7znlec280pp5wCUEzle8lLXsIDDzzAP/7jP047dmpqiomJiTn9Dlprzj//fK677jo+97nPkabpNDEw13vlz/+hD32ocswHP/jBOT2LsLQ544wzeNrTnsYHP/jBYqrshg0buOOOO9iyZUtx3E9/+tPKzBhBONAc6Lb7xje+kauvvporrriC8847b8Gvv5RYcmECCLH/f/qnf+JlL3sZJ5988rQKhFu3buULX/jCtBj63XffzcaNG/mDP/gDfvCDHxRT8XLX/Lve9S5uuukmnv/853PUUUexefNmrrjiCg4//HBOO+00AP7kT/6Ea665hte//vXceOONPPOZz8Rayx133ME1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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "img_panels = []\n", + "ax = fig.add_subplot(131)\n", + "i = 1\n", + "(gt_cps, gt_indices, inference_results) = data_dump[i]\n", + "obs_img = b.RENDERER.render(cps_to_pose(gt_cps, gt_indices), gt_indices)[...,:3]\n", + "img_panels.append(b.add_depth_image(ax,obs_img[...,2]))\n", + "ax.set_title(\"Observed\")\n", + "\n", + "for j in range(len(inference_results)):\n", + " ax = fig.add_subplot(1,3,j+2)\n", + " best_cps, best_indices = inference_results[j]\n", + " reconstruction = b.RENDERER.render(cps_to_pose(best_cps, best_indices), best_indices)[...,:3]\n", + " img_panels.append(b.add_depth_image(ax,reconstruction[...,2]))\n", + " ax.set_title(\"Run {}\".format(j+1))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffb834bf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14a901ef", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "f0865ad8", + "metadata": {}, + "outputs": [], + "source": [ + "i = 1\n", + "(gt_cps, gt_indices, inference_results) = data_dump[i]\n", + "obs_img = b.RENDERER.render(cps_to_pose(gt_cps, gt_indices), gt_indices)[...,:3]\n", + "img_panels[0].set_array(b.preprocess_for_viz(obs_img[...,2]))\n", + "\n", + "# for j in range(len(inference_results)):\n", + "# ax = fig.add_subplot(1,3,j+2)\n", + "# best_cps, best_indices = inference_results[j]\n", + "# reconstruction = b.RENDERER.render(cps_to_pose(best_cps, best_indices), best_indices)[...,:3]\n", + "# img_panels.append(b.add_depth_image(ax,reconstruction[...,2]))\n", + "# ax.set_title(\"Run {}\".format(j+1))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "da520dbf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAC8CAYAAADl2K3eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJR0lEQVR4nO29e5RlVX3v+51zrrnWrle/G7p5yKNVMPjA4yMKKAQwRsFWkIDgM+qJDkSTnBuMw2EOxqvXEc1VjkaGGE2MGAzEcFU0SgxwDmAk0UTFoIggICDYNP2q7qraa6055/1jPtZca69dtauprtrV9fuMUaP2XnvtR+3+9Vzf+XsyY4wBQRAEQRArFr7UH4AgCIIgiKWFxABBEARBrHBIDBAEQRDECofEAEEQBEGscEgMEARBEMQKh8QAQRAEQaxwSAwQBEEQxAqHxABBEARBrHBIDBAEQRDECmdFiIH3v//9YIxh+/btS/1RFh3GGN7//vcv9ccgCIIghphlLQbuvPNOvO51r8Phhx+OLMtw2GGH4bWvfS3uvPPOpf5oBLHgfP7znwdjLPwkSYLDDz8cb3rTm/Dwww8v2ef60Ic+hK1bt+LQQw8l8Um0Moy2e9ddd+Hd7343TjzxRExMTGDz5s0466yz8P3vf39JPs9Skyz1B9hfrrvuOlx44YVYt24d3vKWt+CYY47B/fffj8997nP48pe/jL//+7/HOeecs9QfkyAWnA984AM45phjMDMzg9tvvx2f//zncdttt+G//uu/0Ol0Fv3zvO9978OmTZvw7Gc/GzfccMOivz+xfBgm2/3sZz+Lz33uc3j1q1+Niy++GLt378aVV16JF7zgBfjWt76FM888c1E/z5JjliH33HOPGR0dNccff7zZtm1b7bHHHnvMHH/88WZsbMzce++9xhhjLrvsMgPAPPbYY0vxcQNKKTM9Pb2o7wnAXHbZZYv6nsSB4W/+5m8MAPO9732vdvxP/uRPDABzzTXXLMnnuu+++4wx9v8e2RvRxjDa7ve//30zOTlZO7Z9+3azceNGc/LJJy/651lqlmWY4KMf/Simpqbwmc98Bhs3bqw9tmHDBlx55ZXYt28fPvKRj9Qe2759O84//3ysWrUK69evxx/8wR9gZmamds63v/1tnHLKKVizZg3Gx8dx3HHH4b3vfW/tnG63i8suuwxPfvKTkWUZjjzySLz73e9Gt9utnccYwyWXXIK/+7u/wwknnIAsy3D99ddj3bp1+L3f+72ev2vPnj3odDr44z/+43m/V7fbxR/90R9h48aNmJiYwNatW/HQQw8N/qUSy5YXvehFAIB77703HDvttNNw2mmn9Zz7pje9CUcffXS4f//994Mxhr/4i7/AZz7zGWzZsgVZluF5z3sevve97w30/vHrEcR8WErbfc5znoPx8fHasfXr1+NFL3oRfvrTn+7fH7SMWZZhguuvvx5HH310MKQmL37xi3H00UfjG9/4Ru34+eefj6OPPhof/vCHcfvtt+MTn/gEdu7ciS984QsAbA7C2WefjWc+85n4wAc+gCzLcM899+A73/lOeA2tNbZu3YrbbrsNv//7v4+nPe1p+PGPf4yPf/zjuPvuu/GVr3yl9p433XQTrr32WlxyySXYsGEDnvKUp+Ccc87BddddhyuvvBJpmoZzv/KVr6Db7eI1r3nNvN/rrW99K774xS/ioosuwkknnYSbbroJZ5111hP5mollwv333w8AWLt27X6/xtVXX43JyUm87W1vA2MMH/nIR3DuuefiF7/4BaSUC/RJCaLOMNruo48+ig0bNuz351m2LLVrYr7s2rXLADCvfOUrZz1v69atBoDZs2dPCBNs3bq1ds7FF19sAJgf/ehHxhhjPv7xj88ZTrjqqqsM59zceuutteOf/vSnDQDzne98JxwDYDjn5s4776yde8MNNxgA5vrrr68df/nLX26OPfbYeb/XD3/4QwPAXHzxxbXzLrroInLbHkR4V+u//Mu/mMcee8w8+OCD5stf/rLZuHGjybLMPPjgg+HcU0891Zx66qk9r/HGN77RHHXUUeH+fffdZwCY9evXmx07doTjX/3qV1ttdDYoTED0Y9ht13PLLbcYxpj50z/903k/d7mz7MIEk5OTAICJiYlZz/OP79mzJxx7xzveUTvnne98JwDgn/7pnwAAa9asAQB89atfhda69XX/4R/+AU972tNw/PHHY/v27eHn9NNPBwDcfPPNtfNPPfVU/MZv/Ebt2Omnn44NGzbgmmuuCcd27tyJb3/727jgggvm/V7+87/rXe+qvc8f/uEftv4NxPLmzDPPxMaNG3HkkUfivPPOw9jYGL72ta/hiCOO2O/XvOCCC2q7M+91+8UvfvGEPy9BeIbZdrdt24aLLroIxxxzDN797nfv9+dZriy7MIG/yHtR0I820fCUpzylds6WLVvAOQ+uqgsuuACf/exn8da3vhXvec97cMYZZ+Dcc8/FeeedB86tbvr5z3+On/70pz25Cp5t27bV7h9zzDE95yRJgle/+tW4+uqr0e12kWUZrrvuOhRFURMDg77XAw88AM45tmzZUnv8uOOOa30esbz51Kc+hac+9anYvXs3/vqv/xq33HILsix7Qq/5pCc9qXbfL647d+58Qq9LEDHDarv79u3D2WefjcnJSdx22209uQQrgWUnBlavXo3NmzfjjjvumPW8O+64A4cffjhWrVrV9xzGWO3+yMgIbrnlFtx88834xje+gW9961u45pprcPrpp+Of//mfIYSA1hrPeMYz8LGPfaz1NY888sie12zjNa95Da688kp885vfxKte9Spce+21OP744/GsZz0rnDPf9yJWBs9//vPx3Oc+FwDwqle9Cqeccgouuugi/OxnPwuLGGMMxpie5yqlWl9TCNF6vO01CGJ/GUbbzfMc5557Lu644w7ccMMNePrTnz7Q8w42ll2YAADOPvts3HfffbjttttaH7/11ltx//334+yzz64d//nPf167f88990BrXctQ5ZzjjDPOwMc+9jH85Cc/wYc+9CHcdNNNwSW/ZcsW7NixA2eccQbOPPPMnp9Bd+MvfvGLsXnzZlxzzTXYvn07brrppppXYD7vddRRR0FrXcvIBYCf/exnA30WYvkihMCHP/xh/OpXv8Jf/uVfhuNr167Frl27es5/4IEHFvHTEUR/hsF2tdZ4wxvegBtvvBFXX301Tj311AV/j+XCshQDl156KUZGRvC2t70Njz/+eO2xHTt24O1vfztGR0dx6aWX1h771Kc+Vbv/yU9+EgDwspe9LDy3yYknnggAoZTv/PPPx8MPP4y/+qu/6jl3enoa+/btG+hv4JzjvPPOw/XXX4+rrroKZVn2iIFB38t//k984hO1cy6//PKBPguxvDnttNPw/Oc/H5dffnkold2yZQvuuusuPPbYY+G8H/3oR7XKGIJYapbadt/5znfimmuuwRVXXIFzzz13wV9/ObHswgSAjf3/7d/+LV772tfiGc94Rk8Hwu3bt+NLX/pSTwz9vvvuw9atW/E7v/M7+O53vxtK8bxr/gMf+ABuueUWnHXWWTjqqKOwbds2XHHFFTji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", + "text/plain": [ + "
" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fig" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "76e3141c", + "metadata": {}, + "outputs": [], + "source": [ + "b.make_gif_from_pil_images(images, \"likelihood_debug.gif\")" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "id": "3f5d7e8c", + "metadata": {}, + "outputs": [], + "source": [ + "cps = jnp.zeros((0,3))\n", + "indices = jnp.array([], dtype=jnp.int32)" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "id": "8e023d5c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.11 s, sys: 64.4 ms, total: 4.17 s\n", + "Wall time: 4.04 s\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 241, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 242, + "id": "6487e24c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GT Indices : [19 8 7]\n", + "Inf Indices : [ 7 8 19]\n" + ] + } + ], + "source": [ + "print(\"GT Indices : \", gt_indices)\n", + "print(\"Inf Indices : \", indices)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0f75c9c", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-11-01 19:34:29.194231: W external/tsl/tsl/framework/bfc_allocator.cc:485] Allocator (GPU_0_bfc) ran out of memory trying to allocate 5.96GiB (rounded to 6400000000)requested by op \n", + "2023-11-01 19:34:29.194393: W external/tsl/tsl/framework/bfc_allocator.cc:497] *_**************************************_****____________*******************________________________\n", + "2023-11-01 19:34:29.194713: E external/xla/xla/pjrt/pjrt_stream_executor_client.cc:2716] Execution of replica 0 failed: RESOURCE_EXHAUSTED: Out of memory while trying to allocate 6400000000 bytes.\n", + "BufferAssignment OOM Debugging.\n", + "BufferAssignment stats:\n", + " parameter allocation: 2.44MiB\n", + " constant allocation: 0B\n", + " maybe_live_out allocation: 5.96GiB\n", + " preallocated temp allocation: 0B\n", + " total allocation: 5.96GiB\n", + " total fragmentation: 0B (0.00%)\n", + "Peak buffers:\n", + "\tBuffer 1:\n", + "\t\tSize: 5.96GiB\n", + "\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n", + "\t\tXLA Label: custom-call\n", + "\t\tShape: f32[40000,100,100,4]\n", + "\t\t==========================\n", + "\n", + "\tBuffer 2:\n", + "\t\tSize: 2.44MiB\n", + "\t\tEntry Parameter Subshape: f32[40000,1,4,4]\n", + "\t\t==========================\n", + "\n", + "\tBuffer 3:\n", + "\t\tSize: 64B\n", + "\t\tEntry Parameter Subshape: f32[4,4]\n", + "\t\t==========================\n", + "\n", + "\tBuffer 4:\n", + "\t\tSize: 16B\n", + "\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n", + "\t\tXLA Label: custom-call\n", + "\t\tShape: (f32[40000,100,100,4], f32[])\n", + "\t\t==========================\n", + "\n", + "\tBuffer 5:\n", + "\t\tSize: 4B\n", + "\t\tEntry Parameter Subshape: s32[1]\n", + "\t\t==========================\n", + "\n", + "\tBuffer 6:\n", + "\t\tSize: 4B\n", + "\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n", + "\t\tXLA Label: custom-call\n", + "\t\tShape: f32[]\n", + "\t\t==========================\n", + "\n", + "\n" + ] + }, + { + "ename": "ValueError", + "evalue": "RESOURCE_EXHAUSTED: Out of memory while trying to allocate 6400000000 bytes.\nBufferAssignment OOM Debugging.\nBufferAssignment stats:\n parameter allocation: 2.44MiB\n constant allocation: 0B\n maybe_live_out allocation: 5.96GiB\n preallocated temp allocation: 0B\n total allocation: 5.96GiB\n total fragmentation: 0B (0.00%)\nPeak buffers:\n\tBuffer 1:\n\t\tSize: 5.96GiB\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: f32[40000,100,100,4]\n\t\t==========================\n\n\tBuffer 2:\n\t\tSize: 2.44MiB\n\t\tEntry Parameter Subshape: f32[40000,1,4,4]\n\t\t==========================\n\n\tBuffer 3:\n\t\tSize: 64B\n\t\tEntry Parameter Subshape: f32[4,4]\n\t\t==========================\n\n\tBuffer 4:\n\t\tSize: 16B\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: (f32[40000,100,100,4], f32[])\n\t\t==========================\n\n\tBuffer 5:\n\t\tSize: 4B\n\t\tEntry Parameter Subshape: s32[1]\n\t\t==========================\n\n\tBuffer 6:\n\t\tSize: 4B\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: f32[]\n\t\t==========================\n\n", + "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/likelihood_debug.ipynb Cell 14\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m b\u001b[39m.\u001b[39;49mRENDERER\u001b[39m.\u001b[39;49mrender_many(jnp\u001b[39m.\u001b[39;49mzeros((\u001b[39m40000\u001b[39;49m,\u001b[39m1\u001b[39;49m,\u001b[39m4\u001b[39;49m,\u001b[39m4\u001b[39;49m)), jnp\u001b[39m.\u001b[39;49marray([\u001b[39m0\u001b[39;49m]))\u001b[39m.\u001b[39mshape\n", + "File \u001b[0;32m~/bayes3d/bayes3d/renderer.py:141\u001b[0m, in \u001b[0;36mRenderer.render_many\u001b[0;34m(self, poses, indices)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrender_many\u001b[39m(\u001b[39mself\u001b[39m, poses, indices):\n\u001b[1;32m 129\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Render many scenes in parallel.\u001b[39;00m\n\u001b[1;32m 130\u001b[0m \u001b[39m \u001b[39;00m\n\u001b[1;32m 131\u001b[0m \u001b[39m Args:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[39m the final dimension is the segmentation image.\u001b[39;00m\n\u001b[1;32m 140\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 141\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrender_many_custom_intrinsics(poses, indices, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mintrinsics)\n", + "File \u001b[0;32m~/bayes3d/bayes3d/renderer.py:125\u001b[0m, in \u001b[0;36mRenderer.render_many_custom_intrinsics\u001b[0;34m(self, poses, indices, intrinsics)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mrender_many_custom_intrinsics\u001b[39m(\u001b[39mself\u001b[39m, poses, indices, intrinsics):\n\u001b[1;32m 119\u001b[0m proj_matrix \u001b[39m=\u001b[39m b\u001b[39m.\u001b[39mcamera\u001b[39m.\u001b[39m_open_gl_projection_matrix(\n\u001b[1;32m 120\u001b[0m intrinsics\u001b[39m.\u001b[39mheight, intrinsics\u001b[39m.\u001b[39mwidth, \n\u001b[1;32m 121\u001b[0m intrinsics\u001b[39m.\u001b[39mfx, intrinsics\u001b[39m.\u001b[39mfy, \n\u001b[1;32m 122\u001b[0m intrinsics\u001b[39m.\u001b[39mcx, intrinsics\u001b[39m.\u001b[39mcy, \n\u001b[1;32m 123\u001b[0m intrinsics\u001b[39m.\u001b[39mnear, intrinsics\u001b[39m.\u001b[39mfar\n\u001b[1;32m 124\u001b[0m )\n\u001b[0;32m--> 125\u001b[0m images_jnp \u001b[39m=\u001b[39m _render_custom_call(\u001b[39mself\u001b[39;49m, poses, indices, proj_matrix)[\u001b[39m0\u001b[39m]\n\u001b[1;32m 126\u001b[0m \u001b[39mreturn\u001b[39;00m _transform_image_zeros_parallel(images_jnp, intrinsics)\n", + "\u001b[0;31mValueError\u001b[0m: RESOURCE_EXHAUSTED: Out of memory while trying to allocate 6400000000 bytes.\nBufferAssignment OOM Debugging.\nBufferAssignment stats:\n parameter allocation: 2.44MiB\n constant allocation: 0B\n maybe_live_out allocation: 5.96GiB\n preallocated temp allocation: 0B\n total allocation: 5.96GiB\n total fragmentation: 0B (0.00%)\nPeak buffers:\n\tBuffer 1:\n\t\tSize: 5.96GiB\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: f32[40000,100,100,4]\n\t\t==========================\n\n\tBuffer 2:\n\t\tSize: 2.44MiB\n\t\tEntry Parameter Subshape: f32[40000,1,4,4]\n\t\t==========================\n\n\tBuffer 3:\n\t\tSize: 64B\n\t\tEntry Parameter Subshape: f32[4,4]\n\t\t==========================\n\n\tBuffer 4:\n\t\tSize: 16B\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: (f32[40000,100,100,4], f32[])\n\t\t==========================\n\n\tBuffer 5:\n\t\tSize: 4B\n\t\tEntry Parameter Subshape: s32[1]\n\t\t==========================\n\n\tBuffer 6:\n\t\tSize: 4B\n\t\tOperator: op_name=\"jit(_render_custom_call)/jit(main)/render_multiple_140344568595072\" source_file=\"/home/nishadgothoskar/bayes3d/bayes3d/renderer.py\" source_line=159\n\t\tXLA Label: custom-call\n\t\tShape: f32[]\n\t\t==========================\n\n" + ] + } + ], + "source": [ + "b.RENDERER.render_many(jnp.zeros((30000,1,4,4)), jnp.array([0])).shape" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "90089f06", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 204, + "id": "a7ad974c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GT CP: [[ 0.05495971 -0.17944771 1.054827 ]\n", + " [ 0.18264061 0.05479354 2.8038127 ]]\n", + "Inferred CP: [[ 0.18200912 0.05505969 -3.432253 ]]\n" + ] + } + ], + "source": [ + "print(\"GT CP: \", gt_cps)\n", + "print(\"Inferred CP: \", potential_cps)" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "id": "2bb746e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "49.8\n", + "GT CP: [[-0.22289193 0.12206167 2.1985157 ]\n", + " [ 0.01725131 0.15798539 -2.5857973 ]]\n", + "Inferred CP: [[0.0176649 0.15874405 3.6625495 ]]\n", + "CPU times: user 362 ms, sys: 32 ms, total: 395 ms\n", + "Wall time: 379 ms\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "indices = jnp.array([11])\n", "\n", "key = jax.random.split(key,2)[0]\n", - "cp = jax.random.uniform(key, shape=(3,),minval=low, maxval=high)\n", - "cps = [cp]\n", - "poses = [cp_to_pose_jit(cp)]\n", + "cps = jax.random.uniform(key, shape=(len(indices),3,),minval=low, maxval=high)\n", + "cps_over_inference = [cps]\n", + "poses = [cps_to_pose(cps)]\n", "for cp_grid in contact_param_gridding_schedule:\n", - " contact_param_grid = cp + cp_grid\n", - " cp_poses = cp_to_pose_parallel(contact_param_grid)\n", - " scores = score_vmap(b.RENDERER.render_many(cp_poses[:,None,...], jnp.array([13]))[...,:3], obs_img)\n", + " contact_param_grid = cps + cp_grid[:,None,...]\n", + " cp_poses = cps_to_pose_parallel(contact_param_grid)\n", + " scores = score_vmap(b.RENDERER.render_many(cp_poses, indices)[...,:3], obs_img)\n", " best_idx = jnp.argmax(scores)\n", - " print(scores[best_idx])\n", - " cp = contact_param_grid[best_idx]\n", - " cps.append(cp)\n", + " cps = contact_param_grid[best_idx]\n", + " cps_over_inference.append(cps)\n", " poses.append(cp_poses[best_idx])\n", - "images_over_time = b.RENDERER.render_many(cp_to_pose_parallel(jnp.stack(cps))[:,None,...], jnp.array([13]))[...,:3]\n", - "\n", - "b.clear()\n", - "b.show_cloud(\"1\", obs_img.reshape(-1,3))\n", - "colors = b.distinct_colors(len(images_over_time))\n", - "b.show_trimesh(f\"gt\", b.RENDERER.meshes[13], opacity=0.5, color=b.RED)\n", - "b.set_pose(f\"gt\", gt_pose)\n", - "for i in range(len(images_over_time)):\n", - " b.show_trimesh(f\"_{i}\", b.RENDERER.meshes[13], opacity=0.5, color=colors[i])\n", - " b.set_pose(f\"_{i}\", poses[i])\n", - "\n", - "print(\"GT CP: \", gt_cp)\n", - "print(\"Inferred CP: \", cp)\n", + "print(score_images(b.RENDERER.render(cps_to_pose(cps), indices)[...,:3], obs_img))\n", + "print(\"GT CP: \", gt_cps)\n", + "print(\"Inferred CP: \", cps)\n", + "images_over_time = b.RENDERER.render_many(cps_to_pose_parallel(jnp.stack(cps_over_inference))[...], indices)[...,:3]\n", "b.hstack_images([b.get_depth_image(obs_img[...,2]), *[b.get_depth_image(i[...,2]) for i in images_over_time]])" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "f55fbb68", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "6ccb570a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GT CP: [[ 0.04249835 0.07728073 -2.208417 ]\n", + " [ 0.29853767 0.05722705 0.8848913 ]]\n", + "Inferred CP: [[ 0.04272937 0.07666682 -2.1843925 ]]\n" + ] + }, + { + "ename": "ValueError", + "evalue": "zero-size array to reduction operation minimum which has no identity", + "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/likelihood_debug.ipynb Cell 11\u001b[0m line \u001b[0;36m4\n\u001b[1;32m 2\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mInferred CP: \u001b[39m\u001b[39m\"\u001b[39m, cps)\n\u001b[1;32m 3\u001b[0m images_over_time \u001b[39m=\u001b[39m b\u001b[39m.\u001b[39mRENDERER\u001b[39m.\u001b[39mrender_many(cps_to_pose_parallel(jnp\u001b[39m.\u001b[39mstack(cps_over_inference))[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m], indices)[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,:\u001b[39m3\u001b[39m]\n\u001b[0;32m----> 4\u001b[0m b\u001b[39m.\u001b[39mhstack_images([b\u001b[39m.\u001b[39mget_depth_image(obs_img[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,\u001b[39m2\u001b[39m]), \u001b[39m*\u001b[39m[b\u001b[39m.\u001b[39mget_depth_image(i[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,\u001b[39m2\u001b[39m]) \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m images_over_time]])\n", + "\u001b[1;32m/home/nishadgothoskar/bayes3d/scripts/experiments/likelihood_debug.ipynb Cell 11\u001b[0m line \u001b[0;36m4\n\u001b[1;32m 2\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mInferred CP: \u001b[39m\u001b[39m\"\u001b[39m, cps)\n\u001b[1;32m 3\u001b[0m images_over_time \u001b[39m=\u001b[39m b\u001b[39m.\u001b[39mRENDERER\u001b[39m.\u001b[39mrender_many(cps_to_pose_parallel(jnp\u001b[39m.\u001b[39mstack(cps_over_inference))[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m], indices)[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,:\u001b[39m3\u001b[39m]\n\u001b[0;32m----> 4\u001b[0m b\u001b[39m.\u001b[39mhstack_images([b\u001b[39m.\u001b[39mget_depth_image(obs_img[\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m\u001b[39m.\u001b[39m,\u001b[39m2\u001b[39m]), \u001b[39m*\u001b[39m[b\u001b[39m.\u001b[39;49mget_depth_image(i[\u001b[39m.\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m.\u001b[39;49m,\u001b[39m2\u001b[39;49m]) \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m images_over_time]])\n", + "File \u001b[0;32m~/bayes3d/bayes3d/viz/viz.py:65\u001b[0m, in \u001b[0;36mget_depth_image\u001b[0;34m(image, max)\u001b[0m\n\u001b[1;32m 63\u001b[0m mask \u001b[39m=\u001b[39m depth \u001b[39m<\u001b[39m maxim\n\u001b[1;32m 64\u001b[0m depth[np\u001b[39m.\u001b[39mlogical_not(mask)] \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mnan\n\u001b[0;32m---> 65\u001b[0m vmin \u001b[39m=\u001b[39m depth[mask]\u001b[39m.\u001b[39;49mmin()\n\u001b[1;32m 66\u001b[0m vmax \u001b[39m=\u001b[39m depth[mask]\u001b[39m.\u001b[39mmax()\n\u001b[1;32m 67\u001b[0m depth \u001b[39m=\u001b[39m (depth \u001b[39m-\u001b[39m vmin) \u001b[39m/\u001b[39m (vmax \u001b[39m-\u001b[39m vmin)\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/numpy/core/_methods.py:45\u001b[0m, in \u001b[0;36m_amin\u001b[0;34m(a, axis, out, keepdims, initial, where)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_amin\u001b[39m(a, axis\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m, out\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m, keepdims\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m,\n\u001b[1;32m 44\u001b[0m initial\u001b[39m=\u001b[39m_NoValue, where\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m):\n\u001b[0;32m---> 45\u001b[0m \u001b[39mreturn\u001b[39;00m umr_minimum(a, axis, \u001b[39mNone\u001b[39;49;00m, out, keepdims, initial, where)\n", + "\u001b[0;31mValueError\u001b[0m: zero-size array to reduction operation minimum which has no identity" + ] + } + ], + "source": [ + "all_all_paths = []\n", + "for _ in range(3):\n", + " all_paths = []\n", + " for obj_id in tqdm(range(len(b.RENDERER.meshes)-1)):\n", + " path = []\n", + " trace_ = add_object_jit(trace, key, obj_id, 0, 2,3)\n", + " number = b.get_contact_params(trace_).shape[0] - 1\n", + " path.append(trace_)\n", + " for c2f_iter in range(len(contact_param_gridding_schedule)):\n", + " trace_ = c2f_contact_update_jit(trace_, key, number,\n", + " contact_param_gridding_schedule[c2f_iter], V_GRID, O_GRID)\n", + " path.append(trace_)\n", + " # for c2f_iter in range(len(contact_param_gridding_schedule)):\n", + " # trace_ = c2f_contact_update_jit(trace_, key, number,\n", + " # contact_param_gridding_schedule[c2f_iter], VARIANCE_GRID, OUTLIER_GRID)\n", + " all_paths.append(\n", + " path\n", + " )\n", + " all_all_paths.append(all_paths)\n", + " \n", + " scores = jnp.array([t[-1].get_score() for t in all_paths])\n", + " print(scores)\n", + " normalized_scores = b.utils.normalize_log_scores(scores)\n", + " trace = all_paths[jnp.argmax(scores)][-1]\n", + " b.viz_trace_meshcat(trace)" + ] + }, { "cell_type": "code", "execution_count": 63,