{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Object pose estimation" ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## Overview\n", "\n", "In this tutorial, we will show how to optimize the pose of an object while correctly accounting for the visibility discontinuities. We are going to optimize several latent variables that control the translation and rotation of the object.\n", "\n", "In differentiable rendering, we aim to evaluate the derivative of a pixel intensity integral with respect to a scene parameter $\\pi$ as follows:\n", "\n", "\\begin{equation}\n", "\\partial_\\pi I(\\pi) = \\partial_\\pi \\int_P f(\\textbf{x}, \\pi) ~ d\\textbf{x}\n", "\\end{equation}\n", "\n", "where $\\textbf{x}$ is a light path in the path space $P$.\n", "\n", "When the function $f(\\cdot)$ is continuous w.r.t. $\\pi$, we can move the derivative into the integral and then apply Monte Carlo integration. Under this assumption, differentiating the rendering process via automatic differentiation, as in the previous tutorials, is correct.\n", "\n", "However, if $f(\\cdot)$ has discontinuities w.r.t. $\\pi$, direct application of automatic differentiation is not correct anymore, as it omits an integral term given by the [Reynolds transport theorem](https://en.wikipedia.org/wiki/Reynolds_transport_theorem). This needs to be considered when differentiating shape-related parameters (e.g., position), as the discontinuities in the visiblity function (the silhouette of the object) are then dependent on the differentiated parameter.\n", "\n", "In the last years, several works tried to address this issue (e.g., Li et al. (2018), Zhang et al. (2020), Loubet et al. (2019), Bangaru et al. (2020), Zhang et al. (2023), ...). Mitsuba provides dedicated integrators implementing the \"*projective sampling*\"-based approach (Zhang et al. (2023)).\n", "\n", "- [direct_projective][1]: projective sampling direct illumination integrator\n", "- [prb_projective][2]: projective sampling wth Path Replay Backpropagation (PRB) integrator\n", "\n", "In this tutorial, we will optimize the position and rotation of a mesh in order to match a target rendering. To keep things simple, we will use the `direct_projective` integrator.\n", "You will learn more about this integrator in the following tutorials.\n", "\n", "\n", "
\n", "\n", "🚀 **You will learn how to:**\n", " \n", "\n", " \n", "
\n", "\n", "[1]: https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_integrators.html#direct-illumination-projective-sampling-direct-projective\n", "[2]: https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_integrators.html#projective-sampling-path-replay-backpropagation-prb-prb-projective" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "As always, let's import `drjit` and `mitsuba` and set a differentiation-aware variant." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import drjit as dr\n", "import mitsuba as mi\n", "\n", "mi.set_variant('cuda_ad_rgb')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `direct_projective` and scene construction\n", "\n", "We will rely on the `direct_projective` integrator for this tutorial to properly handle the visibility discontinuities in our differentiable simulation. In primal rendering, this integrator is identical to the `direct` integrator." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "integrator = {\n", " 'type': 'direct_projective',\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We create a simple scene with a bunny placed in front of a gray wall, illuminated by a spherical light." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from mitsuba.scalar_rgb import Transform4f as T\n", "\n", "scene = mi.load_dict({\n", " 'type': 'scene',\n", " 'integrator': integrator,\n", " 'sensor': {\n", " 'type': 'perspective',\n", " 'to_world': T.look_at(\n", " origin=(0, 0, 2),\n", " target=(0, 0, 0),\n", " up=(0, 1, 0)\n", " ),\n", " 'fov': 60,\n", " 'film': {\n", " 'type': 'hdrfilm',\n", " 'width': 64,\n", " 'height': 64,\n", " 'rfilter': { 'type': 'gaussian' },\n", " 'sample_border': True\n", " },\n", " },\n", " 'wall': {\n", " 'type': 'obj',\n", " 'filename': '../scenes/meshes/rectangle.obj',\n", " 'to_world': T.translate([0, 0, -2]).scale(2.0),\n", " 'face_normals': True,\n", " 'bsdf': {\n", " 'type': 'diffuse',\n", " 'reflectance': { 'type': 'rgb', 'value': (0.5, 0.5, 0.5) },\n", " }\n", " },\n", " 'bunny': {\n", " 'type': 'ply',\n", " 'filename': '../scenes/meshes/bunny.ply',\n", " 'to_world': T.scale(6.5),\n", " 'bsdf': {\n", " 'type': 'diffuse',\n", " 'reflectance': { 'type': 'rgb', 'value': (0.3, 0.3, 0.75) },\n", " },\n", " },\n", " 'light': {\n", " 'type': 'obj',\n", " 'filename': '../scenes/meshes/sphere.obj',\n", " 'emitter': {\n", " 'type': 'area',\n", " 'radiance': {'type': 'rgb', 'value': [1e3, 1e3, 1e3]}\n", " },\n", " 'to_world': T.translate([2.5, 2.5, 7.0]).scale(0.25)\n", " }\n", "})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reference image\n", "\n", "Next we generate the target rendering. We will later modify the bunny's position and rotation to set the initial optimization state." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Bitmap[\n", " pixel_format = rgb,\n", " component_format = uint8,\n", " size = [64, 64],\n", " srgb_gamma = 1,\n", " struct = Struct<3>[\n", " uint8 R; // @0, normalized, gamma, premultiplied alpha\n", " uint8 G; // @1, normalized, gamma, premultiplied alpha\n", " uint8 B; // @2, normalized, gamma, premultiplied alpha\n", " ],\n", " data = [ 12 KiB of image data ]\n", "]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "img_ref = mi.render(scene, seed=0, spp=1024)\n", "\n", "mi.util.convert_to_bitmap(img_ref)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optimizer and latent variables\n", "\n", "As done in previous tutorial, we access the scene parameters using the `traverse()` mechanism. We then store a copy of the initial vertex positions. Those will be used later to compute the new vertex positions at every iteration, always applying a different transformation on the same base shape. \n", "\n", "Since the vertex positions in `Mesh` are stored in a linear buffer (e.g., `x_1, y_1, z_1, x_2, y_2, z_2, ...`), we use the `dr.unravel()` routine to unflatten that array into a `Point3f` array." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "params = mi.traverse(scene)\n", "initial_vertex_positions = dr.unravel(mi.Point3f, params['bunny.vertex_positions'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While it would be possible to optimize the vertex positions of the bunny independently, in this example we are only going to optimize a translation and rotation parameter. This drastically constrains the optimization process, which helps with convergence.\n", "\n", "Therefore, we instantiate an optimizer and assign two variables to it: `angle` and `trans`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "opt = mi.ad.Adam(lr=0.025)\n", "opt['angle'] = mi.Float(0.25)\n", "opt['trans'] = mi.Point2f(0.1, -0.25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the optimizer's point of view, those variables are the same as any other variables optimized in the previous tutorials, to the exception that when calling `opt.update()`, the optimizer doesn't know how to propagate their new values to the scene parameters. This has to be done *manually*, and we encapsulate exactly that logic in the function defined below. More detailed explaination on this can be found [here][1].\n", "\n", "After clamping the optimized variables to a proper range, this function creates a transformation object combining a translation and rotation and applies it to the vertex positions stored previously. It then flattens those new vertex positions before assigning them to the scene parameters.\n", "\n", "[1]: https://mitsuba.readthedocs.io/en/latest/src/how_to_guides/use_optimizers.html#Optimizing-latent-variables" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def apply_transformation(params, opt):\n", " opt['trans'] = dr.clamp(opt['trans'], -0.5, 0.5)\n", " opt['angle'] = dr.clamp(opt['angle'], -0.5, 0.5)\n", " \n", " trafo = mi.Transform4f.translate([opt['trans'].x, opt['trans'].y, 0.0]).rotate([0, 1, 0], opt['angle'] * 100.0)\n", " \n", " params['bunny.vertex_positions'] = dr.ravel(trafo @ initial_vertex_positions)\n", " params.update()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is now time to apply our first transformation to get the bunny to its initial state before starting the optimization." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "Bitmap[\n", " pixel_format = rgb,\n", " component_format = uint8,\n", " size = [64, 64],\n", " srgb_gamma = 1,\n", " struct = Struct<3>[\n", " uint8 R; // @0, normalized, gamma, premultiplied alpha\n", " uint8 G; // @1, normalized, gamma, premultiplied alpha\n", " uint8 B; // @2, normalized, gamma, premultiplied alpha\n", " ],\n", " data = [ 12 KiB of image data ]\n", "]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apply_transformation(params, opt)\n", "\n", "img_init = mi.render(scene, seed=0, spp=1024)\n", "\n", "mi.util.convert_to_bitmap(img_init)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the following cell we define the hyper parameters controlling the optimization, such as the number of iterations and number of samples per pixels for the differentiable rendering simulation:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "iteration_count = 50\n", "spp = 16" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "nbsphinx": "hidden", "tags": [] }, "outputs": [], "source": [ "# IGNORE THIS: When running under pytest, adjust parameters to reduce computation time\n", "import os\n", "if 'PYTEST_CURRENT_TEST' in os.environ:\n", " iteration_count = 2\n", " spp = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The optimization loop below is very similar to the one used in the other tutorials, except that we need to apply the transformation to update the bunny's state and record the relation between the rendered image and the optimized parameters." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration 49: error=0.002856, angle=0.0287, trans=[-0.0071, -0.0043]]\r" ] } ], "source": [ "import time\n", "loss_hist = []\n", "for it in range(iteration_count):\n", " # Apply the mesh transformation\n", " apply_transformation(params, opt)\n", " \n", " # Perform a differentiable rendering\n", " img = mi.render(scene, params, seed=it, spp=spp)\n", "\n", " # Evaluate the objective function\n", " loss = dr.sum(dr.sqr(img - img_ref)) / len(img)\n", " \n", " # Backpropagate through the rendering process\n", " dr.backward(loss)\n", "\n", " # Optimizer: take a gradient descent step\n", " opt.step()\n", "\n", " loss_hist.append(loss)\n", " print(f\"Iteration {it:02d}: error={loss[0]:6f}, angle={opt['angle'][0]:.4f}, trans=[{opt['trans'].x[0]:.4f}, {opt['trans'].y[0]:.4f}]\", end='\\r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualizing the results\n", "\n", "Finally, let's visualize the results and plot the loss over iterations" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "nbsphinx-thumbnail": {}, "tags": [] }, "outputs": [ { "data": { "image/png": "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9aNnnyEY1zVzDalorrqnUqkB19X3iu8wlasu+Rw60NdNL9+xY8eRz3fddZe1bMuWLZHHpmhsv9z7YvuVuy4a26/cy49G+8UnakREREQxxY4aERERUUyxo0ZEREQUU4xRcwi/wl5XV2ctq6+vt8q+4+4+67tiE1zHco27u+ITfPjGCESdm2tbV4zHcPcXta1e1xX74oqridq36zV933gTvTxcdu3LFU/ke6+G41eKiooityU/bL/8sf3KYPuV22i0X3yiRkRERBRT7KgRERERxRQ7akREREQxxRg1D648Mr7TnLjGznUOHh+unDmunEjh5a7YBFc9XTEDrilaotZ15edxxbLouoXX18tcU6y48iu5YiOGui7gH2/iu/+oY2muOJuo/Y1krBHZ2H5lsP3KXWb7lRHH9outIhEREVFMsaNGREREFFPsqBERERHFFGPUhsGVZ8ZFj8NHzQvnylnkGtMfTo4cPWav19VxFlpUzptcdYk6b9e+fXL95FrfJ77EN8+Qvk6uOeR8ju2Kk3F9h+H9ufblm/tJG873TSOH7VcG26/BHZvtV/axdJkxakREREQTDDtqRERERDHFjhoRERFRTDFGzcEnR0pUThvAfx638PZ6mWsc3pUTySVqzN83tsE371B4fde+XN+JK1eQFl7uyrekl6fTaausr4vePipXlCsOxlUX1/2ihc/blT8plUpZZd+cV67vlEYO2y+2X4ex/coYi+0XW0giIiKimGJHjYiIiCim2FEjIiIiiinGqDn4xDroseqo+ecGI2rc3XduNNfyKK551oYTT5CrrGMIovbtmr/ONxeQTz4ezXc+Or2/8Pq6Xq54oeHmWwqXffJEAdmxLZr+PqPibnzuS3Jj+8X2a6B6amy/cotD+8UnakREREQxxY4aERERUUyxo0ZEREQUU4xRcwiP87vGul15iKL2DbhjH3y46qrH3aOO5RMfALjnAPSJ6XCN+bvmcfONjQkv983t5Ls86rx97wXf+Qh9cl65+OalirrvXXEx5IftF9uvgdbV2H5l72swxz4a7RefqBERERHFFDtqRERERDHFjhoRERFRTDFGzSE85uwa83fNMeaaU0zHQkRxxTZovmP+UfO2ueIkNNd1iMrfNNz8Sq7l+pp3d3cPWG+fOf5ylfX6On9PeP++8UGuWBjXdYm6f1z3ju+ckL45lGjo2H6x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1IiIiIhiijFqDuGxcT1W7Tuvl4750OP4UflbXPEkrvnN9Pa9vXZsRDrdYpX37SsKLbPj2XRetew8RPYYfmVlnVUuL7fnxispsXO4hecWzc5lpudhs+uWSNjxI4WF9jVPJnV8nb2+juuw963jRfT3mVJle1/d3TqH2warLNIfb+e6t/T36ZrPTou6f3zzELnuTd98XTRyxm/7ZR8rlbLjYpubNx753NNj72vfvh1WuajIzk2mf6+rqxussm5DomJus+PXonNOplI6X5y9vj52Mmkf226/RK2r2y+73NenvwN7DubeXvtYnZ0vq/3356tj+zWy+ESNiIiIKKbYUSMiIiKKKXbUiIiIiGKKMWoeXGPbeu47zZVbxrU8TMeLuMbZdd0KC+3y1Kn2/rZte+HI582b7dxkvb32uvX1s63ynDnLrHJd3SyrHM71kylDlft/kB3ToXM32XXROY50XIZrntJEoj/Gw5joWAfX96XjR3p7661yT4+dA66wcHOontH3mv7+feeri4oByY7/sa+hKybDVTctXBfGq+XPeGq/dIq3ujody7r7yOd163Zay/bts2NoZ85capXnzl1mlSdPnmmVdRuSrb9N0e2LzlWm48h0bjMd46aPrX+Pw+0XEH1Ne3q6I5frYycSdr65dHqOqkt/Hkmde07H4rH98sMnakREREQxxY4aERERUUxx6NOD7yvkvvvzeeXY9xGre2jBfkQ/eXL/I/gdO+yhz/r6463yzJlLrHJ4+hYg+3F99mv+9lBEeGhUD2329dmP67NfX9dTTkUPfepjFxT0p/vQ+9JDoem0PWWUHipIpYqssjF2Xbq77bQlXV39r7eXlNjT3mh6GhPX432fsr6vXUNarmEJ1+9JuOwzVQz5GU/tlyu9Q3l5/+9edXWltay62g7VmDXLbs9KS+31XVNr6WG98HCmbhP01FfZQ5c6nZCeBkr/btr76+npn5ZOtz+6nnpqP32s7LATPc2XPRTa1dWfdimZbEcUtl9++ESNiIiIKKbYUSMiIiKKKXbUiIiIiGKKMWoO4fFnPa7uO5WEHiv3eQ1Yj337vs6s129rs1+f3r7dnlalpaV//YaGZday6uppVtn9Srmosn3dstME9MdW6DgJfR56365jd3fbKTGiYjz0sfWr9DoGJPu87O9Ef73ZMWv9sX16Shw9tYzvNCmue9MnPsn3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2X7lPlYc26/41YiIiIiIALCjRkRERBRb7KgRERERxRRj1By6u7uPfG5ubraWjXTOlKjcQTpOwjeeoLCw0Cq7YgjC+/eNq3DN2+eKEYi6rq4YDVcsTDqdtsrhmA69ve95us7DVY7KBeSKs3HF0bjiNsJlV/4k13noa6qvub5Oe/fuPfK5s7PTq94Uje0X26+BsP3KXY5j+8UnakREREQxxY4aERERUUzJRBtKEBGvEw4/Nq2vr7eW6cfxw3mlOJfhvJLseuXYZ9++Qwe+x/K5B12Pkn3TAETVzXcKFt/fJZ8hEl+uqWh8pqrx3dY1zKG37+rqOvJ5z549kdu6GGOG90sXc2y//PfN9su9bq5jubD9yjga7RefqBERERHFFDtqRERERDHFjhoRERFRTDFGbZwY6TQGUdOB0MQyllJkMEZtbGL7RfkyHtovPlEjIiIiiil21IiIiIhiih01IiIiopjiFFLjxEiPu8d5HJ+OLt4LlG9svyhfxsO9wCdqRERERDHFjhoRERFRTLGjRkRERBRT7KgRERERxRQ7akREREQxxY4aERERUUyxo0ZEREQUUxNurk8iIiKisYJP1IiIiIhiih01IiIiophiR42IiIgopthRIyIiIoopdtSIiIiIYoodNSIiIqKY+v8bbWl+k7BblgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "\n", "fig, axs = plt.subplots(2, 2, figsize=(10, 10))\n", "\n", "axs[0][0].plot(loss_hist)\n", "axs[0][0].set_xlabel('iteration'); \n", "axs[0][0].set_ylabel('Loss'); \n", "axs[0][0].set_title('Parameter error plot');\n", "\n", "axs[0][1].imshow(mi.util.convert_to_bitmap(img_init))\n", "axs[0][1].axis('off')\n", "axs[0][1].set_title('Initial Image')\n", "\n", "axs[1][0].imshow(mi.util.convert_to_bitmap(mi.render(scene, spp=1024)))\n", "axs[1][0].axis('off')\n", "axs[1][0].set_title('Optimized image')\n", "\n", "axs[1][1].imshow(mi.util.convert_to_bitmap(img_ref))\n", "axs[1][1].axis('off')\n", "axs[1][1].set_title('Reference Image');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## See also\n", "\n", "- [Detailed look at Optimizer](https://mitsuba.readthedocs.io/en/latest/src/how_to_guides/use_optimizers.html)\n", "- [mitsuba.ad.Optimizer](https://mitsuba.readthedocs.io/en/latest/src/api_reference.html#mitsuba.ad.Optimizer)\n", "- [prb_projective plugin](https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_integrators.html#projective-sampling-path-replay-backpropagation-prb-prb-projective)\n", "- [direct_projective plugin](https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_integrators.html#direct-illumination-projective-sampling-direct-projective)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12" }, "vscode": { "interpreter": { "hash": "524ef5c892e16adde62d9febd56e921248026795a369fc4d8cb46b781ffa4996" } } }, "nbformat": 4, "nbformat_minor": 4 }