{"id":32715,"date":"2021-11-10T12:05:22","date_gmt":"2021-11-10T11:05:22","guid":{"rendered":"https:\/\/www.inovex.de\/?p=32715"},"modified":"2022-11-17T12:23:12","modified_gmt":"2022-11-17T11:23:12","slug":"deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/","title":{"rendered":"Deep CSG: Extraction of Geometric Objects from 3D Point Clouds Using Deep Learning"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Recent research in the fields of Computer Vision and Computer Graphics often addresses the extraction of geometric shapes from 3D point clouds. The processing of raw point clouds is of particular use, because in practice, real objects, e.g. components of a car, are captured using a 3D scanner to subsequently generate a digital 3D model. <\/span><!--more--><\/p>\n<p><span style=\"font-weight: 400;\">Designers then can edit these components in Computer-Aided Design (CAD) programs. Another use case for transferring a 3D point cloud into a 3D model is the automatic construction of 3D building plans based on sensor data. This is also applicable in the robotics domain. A robot, which is supposed to perform certain actions with one or more objects, requires information about their position and shape as well as their connectedness.\u00a0<\/span><\/p>\n<figure id=\"attachment_32762\" aria-describedby=\"caption-attachment-32762\" style=\"width: 911px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32762 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1.jpg\" alt=\"\" width=\"911\" height=\"261\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1.jpg 911w, https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1-300x86.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1-768x220.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1-400x115.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/pc2csg-1-360x103.jpg 360w\" sizes=\"auto, (max-width: 911px) 100vw, 911px\" \/><figcaption id=\"caption-attachment-32762\" class=\"wp-caption-text\">The goal is to fit geometric objects to a 3D point cloud to arrange them in a Constructive Solid Geometry (CSG) tree.<\/figcaption><\/figure>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Background\" >Background<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Related-work\" >Related work<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Concept-of-Deep-CSG\" >Concept of Deep CSG<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Loss-functions\" >Loss functions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Evaluation\" >Evaluation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Background\"><\/span>Background<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>Constructive Solid Geometry<\/h3>\n<figure id=\"attachment_32724\" aria-describedby=\"caption-attachment-32724\" style=\"width: 471px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32724 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/csg-tree-param-single3.png\" alt=\"\" width=\"471\" height=\"436\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/csg-tree-param-single3.png 471w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg-tree-param-single3-300x278.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg-tree-param-single3-400x370.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg-tree-param-single3-360x333.png 360w\" sizes=\"auto, (max-width: 471px) 100vw, 471px\" \/><figcaption id=\"caption-attachment-32724\" class=\"wp-caption-text\">Each geometric primitive in the CSG tree is associated with a shape type and a 9-dimensional parameter vector specifying its position, rotation, and size.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">One widespread modeling scheme of such 3D models is <\/span><i><span style=\"font-weight: 400;\">Constructive Solid Modeling <\/span><\/i><span style=\"font-weight: 400;\">(CSG). It yields a compact and easy-to-edit representation of geometric solids while allowing for the creation of complex appearing objects. The syntax obeys a tree topology whose inner nodes contain elementary Boolean operations and the leaves are geometric primitives. A geometric primitive is a basic object (e.g. a line, a surface or a volumetric shape) whose position, rotation and size can be described by a small set of parameters. Exemplary volumetric primitives are spheres, cylinders, and cuboids. The decomposition of complex objects into such higher-level shapes simplifies their editing and interaction. Unlike low-level shape representations, such as voxels or points, their parameterization provides structural information which is close to human perception and, therefore, is of high value for designers.\u00a0<\/span><\/p>\n<div class=\"mceTemp\"><\/div>\n<h3><\/h3>\n<h3><\/h3>\n<h3>Signed Distance Fields<\/h3>\n<p><span style=\"font-weight: 400;\">Another important concept are <\/span><i><span style=\"font-weight: 400;\">Signed Distance Fields<\/span><\/i><span style=\"font-weight: 400;\"> (SDF). A distance field is a spatial, n-dimensional field that associates a scalar value to each point it encompasses.\u00a0 This value is the closest distance of the point to a shape within its domain. In an SDF the distances are signed to indicate whether a point lies inside or outside the object\u2019s boundary. Points that are located outside receive a positive distance, those lying on the surface are zero-valued and negative distances mark the interior of a shape.<\/span><\/p>\n<p><figure id=\"attachment_32726\" aria-describedby=\"caption-attachment-32726\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32726 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-1024x403.png\" alt=\"\" width=\"640\" height=\"252\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-1024x403.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-300x118.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-768x302.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-1536x605.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-400x157.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration-360x142.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-geenration.png 1890w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-32726\" class=\"wp-caption-text\">Rendering process from a geometric object (a) to an SDF grid (c) using a discretized 3D bounding volume (b). [<em>Image Source: Miroslava Slavcheva. Signed Distance Fields for Rigid and Deformable 3DReconstruction.<\/em>]<\/figcaption><\/figure><span style=\"font-weight: 400;\">The <\/span><i><span style=\"font-weight: 400;\">Signed Distance Function<\/span><\/i><span style=\"font-weight: 400;\"> is an n-dimensional function \\(\\phi: \\Omega \\subseteq \\mathbb{R}^n \\rightarrow \\mathbb{R} \\)<\/span><span style=\"font-weight: 400;\"> which maps the minimum distance to a specific object to its input. Spheres, cuboids, and cylinders have a unique, differentiable signed distance function each, e.g.\u00a0 \\(\\phi_{sphere}(p) = d(p, c) &#8211; r \\)<\/span><span style=\"font-weight: 400;\">, where \\(d \\)<\/span><span style=\"font-weight: 400;\">\u00a0is the distance metric of the underlying metric space (<\/span><span style=\"font-weight: 400;\">here<\/span><span style=\"font-weight: 400;\">: Euclidean distance), \\(c \\)<\/span><span style=\"font-weight: 400;\"> is the sphere\u2019s center and \\(r \\)<\/span><span style=\"font-weight: 400;\"> its radius. Boolean operations also have unique signed distance functions (\\(\\cup \\)<\/span><span style=\"font-weight: 400;\">: union, \\(&#8211; \\)<\/span><span style=\"font-weight: 400;\">: difference):<\/span><\/p>\n<p>\\begin{equation} \\begin{aligned}<br \/>\n\\phi_{\\,\\cup\\,}(\\Phi_1, \\Phi_2) &amp;= min(\\Phi_1, \\Phi_2), \\\\[1ex]<br \/>\n\\phi_{\\,-\\,}(\\Phi_1, \\Phi_2) &amp;= max(\\Phi_1, \\,\\phi_{\\,\\setminus\\,}(\\Phi_2)), \\\\[1ex]<br \/>\n\\end{aligned}<br \/>\n\\end{equation}<\/p>\n<p><span style=\"font-weight: 400;\">where the complement <\/span><span style=\"font-weight: 400;\">is given by \\(\\phi_{\\,\\setminus\\,}(\\Phi) = &#8211; \\, \\Phi_1 \\) and <\/span><span style=\"font-weight: 400;\">\\(\\Phi_1\\)<\/span><span style=\"font-weight: 400;\"> and \\(\\Phi_2\\)<\/span><span style=\"font-weight: 400;\"> denote two SDF representations. In general, such simple equations allow the straightforward generation of an SDF from a CSG tree. Note, that <em>min<\/em><\/span><span style=\"font-weight: 400;\"> and <em>max<\/em><\/span><span style=\"font-weight: 400;\">\u00a0are automatically differentiable in my implementation by PyTorch\u2019s autograd and a suitable gradient shaping. <\/span><\/p>\n<h3>Surface Normals<\/h3>\n<p><span style=\"font-weight: 400;\">An important characteristic of an SDF is that its gradient approximates the normals of the acquired object as it points towards the direction of the steepest (positive or negative) slope. Surface normals point towards a direction perpendicular to an object\u2019s surface and define the orientation of the shape. They are used, for instance, in the field of Computer Graphics to apply visual effects as shading.\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0 <\/span> <span style=\"font-weight: 400;\"> \u00a0 <\/span><span style=\"font-weight: 400;\"> \u00a0<\/span><\/p>\n<figure id=\"attachment_32730\" aria-describedby=\"caption-attachment-32730\" style=\"width: 1022px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32730 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1.jpg\" alt=\"\" width=\"1022\" height=\"330\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1.jpg 1022w, https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1-300x97.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1-768x248.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1-400x129.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/geometric-representations-1-360x116.jpg 360w\" sizes=\"auto, (max-width: 1022px) 100vw, 1022px\" \/><figcaption id=\"caption-attachment-32730\" class=\"wp-caption-text\">a) Surface view of a geometric object. b) 3D point cloud of the geometric object, comprising only surface points. c) Point cloud with displayed normal vectors, one for each surface point.<\/figcaption><\/figure>\n<h2><span class=\"ez-toc-section\" id=\"Related-work\"><\/span>Related work<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">These are the main related works:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/arxiv.org\/abs\/1712.08290\"><b>CSGNet by Sharma et al.<\/b><\/a><span style=\"font-weight: 400;\">: Sharma et al. apply a supervised learning approach to convert 3D voxel grids to CSG trees. Subsequently, a variety of optimization and fine tuning techniques are applied to improve the pre-trained model. The major dr<\/span><span style=\"font-weight: 400;\">awbacks are: <strong>(1)<\/strong>\u00a0<\/span><span style=\"font-weight: 400;\">The rendering engine is not differentiable, i.e. no gradient-based methods are applicable to incorporate visual feedback into the optimization process and <strong>(2)<\/strong> I<\/span><span style=\"font-weight: 400;\">n practice, objects are captured as point clouds by 3D scanners, i.e. voxel grids simplify the problem.<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/arxiv.org\/abs\/1811.08988\"><b>SPFN by Li et al.<\/b><\/a><span style=\"font-weight: 400;\">: The goal is to fit a set of primitives to a 3D point cloud. <\/span><a href=\"https:\/\/arxiv.org\/abs\/1706.02413\"><b>PointNet++ by Qi et al.<\/b><\/a><span style=\"font-weight: 400;\"> is applied as a point cloud encoder. The framework produces good results, but the detected shapes are not expressed as CSG trees. Moreover, they are not as complex as a CSG tree could describe.<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/arxiv.org\/abs\/2006.09102\"><b>UCSG-NET by Kacper et al.<\/b><\/a><span style=\"font-weight: 400;\">: The framework generates CSG trees to approximate 3D point clouds. Primitives are predicted in the first step and subsequently concatenated by a sequence of network layers. In this work, CSG trees are generated, but a limited set of primitive types is used (only cuboids).<\/span><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Concept-of-Deep-CSG\"><\/span>Concept of Deep CSG<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">To overcome the drawbacks of the related works introduced previously, a deep learning pipeline, called Deep CSG, was developed as follows:<\/span><\/p>\n<figure id=\"attachment_32733\" aria-describedby=\"caption-attachment-32733\" style=\"width: 684px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32733 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/general_architecture_deep_csg-10.png\" alt=\"\" width=\"684\" height=\"240\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/general_architecture_deep_csg-10.png 684w, https:\/\/www.inovex.de\/wp-content\/uploads\/general_architecture_deep_csg-10-300x105.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/general_architecture_deep_csg-10-400x140.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/general_architecture_deep_csg-10-360x126.png 360w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><figcaption id=\"caption-attachment-32733\" class=\"wp-caption-text\">Deep CSG pipeline consisting of a data generator (0), a point cloud encoder (1), a CSG predictor (2), and an evaluation module (3).<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The first module in the pipeline is a data generator. It generates an arbitrary number of 3D point clouds for training paired with CSG trees for evaluation. Allowed primitives are spheres, cuboids, and cylinders. They can be concatenated by the difference and union operator.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To infer structural, geometric information from point clouds, these have to be preprocessed by a robust point cloud encoder. Point clouds are unordered sets of points and, therefore, a permutation-invariant computation of features is a central cornerstone in their processing. A commonly used point cloud encoder, which satisfies this criterion, is PointNet or its successor PointNet++. Here, the latter is used.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The encoded point clouds are transferred to the PC2CSG network, a vector-to-sequence network, which transforms them into a sequential CSG expression. It employs an RNN\u00a0 which helps to solve two kinds of problems inherent in CSG sequence prediction: First, the varying size of the trees, and second, the significance of the instruction arrangement.\u00a0<\/span><\/p>\n<figure id=\"attachment_32767\" aria-describedby=\"caption-attachment-32767\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32767 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-1024x494.jpg\" alt=\"\" width=\"640\" height=\"309\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-1024x494.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-300x145.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-768x371.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-400x193.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions-360x174.jpg 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/csg_expressions.jpg 1361w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-32767\" class=\"wp-caption-text\">A CSG tree (left) and the corresponding CSG sequence of length 5 (right).<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The figure shows a CSG tree and the corresponding CSG sequence padded to a length of 5. Each instruction \\(i \\) in the CSG sequence contains a geometric primitive and an operation. The primitive is expressed by its type \\(\\in \\{s, c, b, \\bullet \\} \\) and a 9-dimensional parameter vector specifying its position. rotation, and size. The operation is given by its type \\(\\in\u00a0 \\{+, -, \\circ \\}\\). \\(\\circ \\) is the unary identity operation, \\(\\bullet \\) is an empty primitive. Both are neutral classes which do not change the geometry. They are used to pad all CSG sequences to the same length. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">The CSG sequences are then evaluated in the evaluation module. Backpropagation is applied to optimize all pipeline components in an end-to-end manner.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Loss-functions\"><\/span>Loss functions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<figure id=\"attachment_32736\" aria-describedby=\"caption-attachment-32736\" style=\"width: 490px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32736 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/small-changes.jpg\" alt=\"\" width=\"490\" height=\"399\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/small-changes.jpg 490w, https:\/\/www.inovex.de\/wp-content\/uploads\/small-changes-300x244.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/small-changes-400x326.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/small-changes-360x293.jpg 360w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><figcaption id=\"caption-attachment-32736\" class=\"wp-caption-text\">The depicted CSG trees differ in one CSG instruction. Despite the nearly identical CSG syntax, the result is a significantly different geometry.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Main focus in this work is on measuring visual aspects. A loss that relies on visual feedback results in a more robust training than a simple comparison of CSG trees. The reason for this is that a slight change in the CSG tree can cause a major change in the rendered geometry. Thus, when applying supervised learning directly to CSG expressions, minor deviations can mislead the algorithm and, consequently, degrade performance. Another weakness of expression-based learning is that, in practice, an infinite number of paths exist to generate a shape. However, during training, each model output is matched against exactly one given target sequence. As a result, a similar geometry, which is underlying a different CSG syntax, is penalized.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To optimize the pipeline components, a variety of loss functions were implemented and investigated in detail. In the following, these loss functions are presented briefly.\u00a0<\/span><\/p>\n<h3>SDF loss<\/h3>\n<p><span style=\"font-weight: 400;\">In all experiments, the primary loss function is the SDF distance, which captures grid-based, visual discrepancies between two geometries. It is given by<\/span><\/p>\n<p>\\begin{equation}\\label{equ:sdf-loss}<br \/>\n\\begin{aligned}<br \/>\n\\mathcal{L}_{SDF} = \\frac{1}{|\\mathcal{G}|} \\; \\sum_{x \\,\\in\\, \\mathcal{G}} \\: 1 &#8211; e^{-(\\:\\phi_y(x) &#8211; \\:\\phi_{\\hat{y}}(x))^2}<br \/>\n\\end{aligned}<br \/>\n\\end{equation}<\/p>\n<p><span style=\"font-weight: 400;\">where <\/span><em><span style=\"font-weight: 400;\">y <\/span><\/em><span style=\"font-weight: 400;\">and \\(\\hat{y}\\) <\/span><span style=\"font-weight: 400;\">are the target and predicted CSG expressions, \\(\\mathcal{G}\\)<\/span><span style=\"font-weight: 400;\"> is a regular grid used to discretize the SDF distances and \\(\\phi \\)<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><span style=\"font-weight: 400;\">is the respective signed distance function. The MSE of the signed distances is scaled to <\/span><span style=\"font-weight: 400;\">]0,1] <\/span><span style=\"font-weight: 400;\">using the exponential function. MSE was preferred over MAE and Huber loss to strongly penalize geometric deviations.<\/span><\/p>\n<figure id=\"attachment_32742\" aria-describedby=\"caption-attachment-32742\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32742 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-1024x372.jpg\" alt=\"\" width=\"640\" height=\"233\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-1024x372.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-300x109.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-768x279.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-400x145.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1-360x131.jpg 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf2d-1.jpg 1054w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-32742\" class=\"wp-caption-text\">Exemplary SDF representations of two 2D objects, which were discretized on a 2D boundary volume to be compared.<\/figcaption><\/figure>\n<h3>Sequence loss<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-32769 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/seq-loss.jpg\" alt=\"\" width=\"325\" height=\"193\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/seq-loss.jpg 325w, https:\/\/www.inovex.de\/wp-content\/uploads\/seq-loss-300x178.jpg 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The sequence loss regulates the predicted sequence lengths. Since shorter expressions are preferred because, among other reasons, the probability of redundant instructions is inferior, a penalty term is computed only for those that exceed the given ground truth length.\u00a0 The neutral operations \uffee<\/span><span style=\"font-weight: 400;\">\u00a0 implicitly indicate the sequence length. Based on them, a binary classification task can be inferred, which can be solved with NLLL. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">The figure on the right shows to CSG trees that generate equal geometries. The right CSG tree includes a redundant operation, which is intended to be avoided by the sequence loss.<\/span><\/p>\n<h3>Expression loss<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-32748 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/expr-loss-1-e1636134082321.jpg\" alt=\"\" width=\"292\" height=\"139\" \/><\/p>\n<p><span style=\"font-weight: 400;\">To make the meaning of the individual classes more tangible for the algorithm, an expression-based loss for the primitive and operation labels is implemented. NLLL is also used here. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">The figure on the right illustrates a disadvantage of the expression loss: <\/span>Due to the commutative property of the union operator the CSG trees generate equal geometries. An expression-based loss does not take this into account and penalizes the different arrangement of instructions. <span style=\"font-weight: 400;\">Owing to the task-inherent shortcomings of supervised learning on labels, the loss is employed merely as a secondary criterion in combination with the SDF loss. <\/span><\/p>\n<h3>Parameter loss<\/h3>\n<p><span style=\"font-weight: 400;\">The parameter loss serves the purpose of guiding the algorithm to properly interpret the position, rotation, and size of geometric primitives. The parameters are predicted as\u00a0 regression values and Huber loss is applied. Furthermore, negative sizes and rotations are penalized:<\/span><\/p>\n<p>\\begin{equation}<br \/>\n\\begin{aligned}<br \/>\n\\mathcal{L}_{param} =&amp; \\sum_{t=1}^T \\mathcal{L}_{Huber}(\\hat{y}_{t, param},\\; y_{t, param}) \\, + \\, \\mathcal{L}_{size} + \\mathcal{L}_{rot}, \\quad \\text{with}<br \/>\n\\end{aligned}<br \/>\n\\end{equation}<\/p>\n<p>\\begin{equation*}<br \/>\n\\begin{aligned}<br \/>\n\\mathcal{L}_{size} =&amp; \\;max(-\\hat{y}_{t, size}, 0), \\\\<br \/>\n\\mathcal{L}_{rot} =&amp; \\;max(-\\hat{y}_{t, rot}, 0).<br \/>\n\\end{aligned}<br \/>\n\\end{equation*}<\/p>\n<p><span style=\"font-weight: 400;\">\\(y_{t, param}\\)<\/span><span style=\"font-weight: 400;\"> is the 9-dimensional parameter vector of the \\(t^{th}\\) primitive in the CSG sequence <\/span><em><span style=\"font-weight: 400;\">y<\/span><\/em><span style=\"font-weight: 400;\">. <\/span><span style=\"font-weight: 400;\">\\(T\\) <\/span><span style=\"font-weight: 400;\">is the user-specified maximum number of instructions in a CSG expression (<\/span><span style=\"font-weight: 400;\">here<\/span><span style=\"font-weight: 400;\">: 4).<\/span><\/p>\n<h3>Sinkhorn loss<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-32754 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sinkhorn-loss-1.jpg\" alt=\"\" width=\"361\" height=\"322\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sinkhorn-loss-1.jpg 361w, https:\/\/www.inovex.de\/wp-content\/uploads\/sinkhorn-loss-1-300x268.jpg 300w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The <\/span><a href=\"https:\/\/arxiv.org\/pdf\/1306.0895.pdf\"><b>Sinkhorn<\/b><\/a><span style=\"font-weight: 400;\"> loss measures the minimal pairwise distance of the individual geometric primitives according to their SDF representation. The differentiable Sinkhorn algorithm searches for the optimal mapping, i.e. the one with the minimum transformation cost. Thus, the constituent geometric primitives are assessed without considering their order and concatenation in the CSG tree. The required cost matrix consists of the pairwise SDF distances between target and predicted primitives. The figure on the right shows a simplified cost matrix containing pairwise SDF distances for two CSG trees. Equal primitives would have 0 costs.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">One drawback of the Sinkhorn loss is that, due to the computation of pairwise costs, it is highly computation and memory intensive. Analogous to the Expression loss, the cost is not oriented to the outcome but its constituents.<\/span><\/p>\n<h3><\/h3>\n<h3>Normals loss<\/h3>\n<p><span style=\"font-weight: 400;\">Beyond the SDF, the surface normals provide further visual resonance. Learning with this information has the potential to guide a more precise fitting of geometries since the normals define the orientation of a solid. The normal vectors are obtained by applying Finite Differences on the target and predicted CSG tree. The deviation of ground truth and output normals is measured with the cosine distance:<\/span><\/p>\n<p>\\begin{equation}\\label{equ:norm-loss}<br \/>\n\\mathcal{L}_{norm} = \\frac{1}{P\\,} \\;(1 &#8211; \\sum_{p \\, \\in \\, \\mathcal{P}} \\; cos(\\vec{n}_{p}, \\hat{\\vec{n}}_{p})),<br \/>\n\\end{equation}<\/p>\n<p><span style=\"font-weight: 400;\">where <\/span><em><span style=\"font-weight: 400;\">P<\/span><\/em><span style=\"font-weight: 400;\"> is a set of points located on the target object\u2019s surface a<\/span><span style=\"font-weight: 400;\">nd \\(\\vec{n}_{p} , \\hat{\\vec{n}}_{p} \\)<\/span><span style=\"font-weight: 400;\"> are the ground truth and predicted surface normals originating from point <em>p<\/em><\/span><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3>Null Object loss<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-32771 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/null-obj-loss.jpg\" alt=\"\" width=\"126\" height=\"108\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The null object loss prevents the model from producing empty objects. These arise when, for example, a larger object is subtracted from a smaller one as shown in the figure on the right or when zero-sized primitives are predicted. To circumvent this, a penalty is imposed if the mean of the <em>K<\/em><\/span><span style=\"font-weight: 400;\">\u00a0minimum distances in the SDF grid of an object is larger than a given threshold \\(\\epsilon \\). Additionally, each primitive in the CSG prediction is separately transformed into an SDF and assessed with the Null Object loss to penalize zero-sized primitives. The \\(\\epsilon \\)-threshold is set to \\(c &#8211; \\frac{c}{4} \\)<\/span><span style=\"font-weight: 400;\">, where \\(c \\) is the size of a grid cell in the SDF grid. It was empirically established that a relaxed threshold of \\(c &#8211; \\frac{c}{4} \\)<\/span><span style=\"font-weight: 400;\"> is more robust than a strict threshold of \\(c \\) since then zero-sized primitives are consistently penalized, while primitives with the smallest size allowed achieve zero loss. In this analysis, \\(K = 16 \\) <\/span><span style=\"font-weight: 400;\">was empirically found to be an appropriate choice.\u00a0<\/span><\/p>\n<h3>Diversity loss<\/h3>\n<p><span style=\"font-weight: 400;\">The goal of the diversity loss is to restrict the network from favoring one primitive, parameter, or operation class over the others in the output CSG trees. This is accomplished by maximizing the entropy of the available annotations. To turn this into a minimization problem, first, the entropy <\/span><em><span style=\"font-weight: 400;\">H<\/span><\/em><span style=\"font-weight: 400;\"> is projected onto the interval <\/span><span style=\"font-weight: 400;\">[0,1]<\/span><span style=\"font-weight: 400;\"> by dividing it by<\/span><span style=\"font-weight: 400;\">\u00a0\\(log(Z)\\)<\/span><span style=\"font-weight: 400;\">,\u00a0 where <\/span><em><span style=\"font-weight: 400;\">Z<\/span><\/em><span style=\"font-weight: 400;\"> is the number of events in \\(\\mathcal{Z} \\). This yields \\(H^{[0,1]} \\):\u00a0<\/span><i><\/i><\/p>\n<p>\\begin{equation}<br \/>\nH^{[0,1]}(x) = &#8211; \\frac{1}{log(Z)} \\; \\sum_{z\\: \\in\\: \\mathcal{Z}} P(z) \\; log(P(z)).<br \/>\n\\end{equation}<\/p>\n<p><span style=\"font-weight: 400;\">Finally, \\(1 &#8211; H^{[0,1]} \\) <\/span><span style=\"font-weight: 400;\">is minimized.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Evaluation\"><\/span>Evaluation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">In each experiment, the primary loss is the SDF loss. All remaining losses presented are used as secondary losses only. To determine the contribution of each secondary loss an ablation study was performed. For each experiment, the optimized loss \\(\\mathcal{L}^*\\) <\/span><span style=\"font-weight: 400;\">\u00a0is given by: \\(\\mathcal{L}^*= \\mathcal{L}_{SDF} + \\mathcal{L}_{sec} \\)<\/span><span style=\"font-weight: 400;\">, where \\(\\mathcal{L}_{sec}\\) i<\/span><span style=\"font-weight: 400;\">s the respective secondary loss. One constraint-based losses, which was tested was<\/span><span style=\"font-weight: 400;\">\u00a0the <\/span><a href=\"https:\/\/www.engraved.blog\/how-we-can-make-machine-learning-algorithms-tunable\/\"><b>Modified Differential Method of Mutlipliers<\/b><\/a>, but\u00a0<span style=\"font-weight: 400;\">it did not yield good results.<\/span><\/p>\n<h3>Evaluation Criteria<\/h3>\n<p><span style=\"font-weight: 400;\">The most informative evaluation criteria were the SDF loss, the null object loss, <\/span><span style=\"font-weight: 400;\">the entropy of CSG sequence length (the higher the better) and the self-developed shape composition score (the lower the better). To obtain the shape composition score, first, a histogram is generated for the target and predicted CSG tree counting the occurrences of spheres, cuboids, and cylinders. Subsequently, pairwise absolute differences between the histograms are calculated. The idea is that, e.g. a spherical surface can be ideally approximated by a sphere and rather insufficiently by a cuboid or a cylinder. Consequently, if the target CSG tree contains a sphere, then, the surface of the described geometry is spherical somewhere. Thus, the output is expected to include a sphere, too.\u00a0<\/span><\/p>\n<h3>Ablation Study<\/h3>\n<p><span style=\"font-weight: 400;\">During the ablation study, some models adopted an undesired behavior to gain comparatively good SDF scores in the short term. Without an appropriate penalization, some models produce almost only CSG structures consisting of singular primitives. This was true for the experiments examining Sinkhorn, null object, and normals loss. Conversely, other models like the ones with enabled expression, sequence and parameter loss, which were given a direct or indirect sequence length constraint, attempted to match the first primitive as accurately as possible to the point cloud and then artificially padded the sequence with zero-sized primitives. Additionally, the model with parameter loss performed comparatively well in terms of the SDF loss, although it assigns the same rotation and position of \\((0,0,0)\\) for each primitive. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">In general, the ablation study did not succeed in training a model that can reliably build CSG trees. Rather, the prediction of undesirable CSG structures induces a premature convergence to results which are not optimal. On the one hand, this reveals a weakness of the SDF loss which initially can be lowered rapidly by placing singular primitives in the center of the canvas. On the other hand, this shows that one secondary criterion is not sufficient to ensure the desired characteristics of a CSG structure, since the models will find shortcuts to not be penalized. However, the most promising losses are SDF, expression, parameter, and null object loss. <\/span><\/p>\n<h3>Final Run<\/h3>\n<p><span style=\"font-weight: 400;\">Based on the findings of the ablation study, the final loss was defined as follows \\(\\mathcal{L}^*= \\mathcal{L}_{SDF} + \\mathcal{L}_{expr} + \\mathcal{L}_{param} + \\mathcal{L}_{nullobj} \\)<\/span>.<\/p>\n<h3>Evaluation Criteria<\/h3>\n<p><span style=\"font-weight: 400;\">The following table shows the evaluation results of the best experiments of the ablation study, as well as the final run. The best results are in bold:\u00a0<\/span><\/p>\n<table style=\"height: 389px;\" width=\"1381\">\n<tbody>\n<tr>\n<td rowspan=\"2\"><\/td>\n<td rowspan=\"2\">\n<p style=\"text-align: center;\"><b>Entropy of <\/b><\/p>\n<p style=\"text-align: center;\"><b>seq.<\/b><b> lengths<\/b><\/p>\n<\/td>\n<td rowspan=\"2\">\n<p style=\"text-align: center;\"><b>Null object <\/b><\/p>\n<p style=\"text-align: center;\"><b>loss\u00a0<\/b><b> (%)<\/b><\/p>\n<\/td>\n<td colspan=\"3\">\n<p style=\"text-align: center;\"><b>Shape composition score<\/b><\/p>\n<\/td>\n<td rowspan=\"2\">\n<p style=\"text-align: center;\"><b>SDF loss<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: center;\"><i><span style=\"font-weight: 400;\">Cuboid<\/span><\/i><\/p>\n<\/td>\n<td style=\"text-align: center;\"><i><span style=\"font-weight: 400;\">Cylinder<\/span><\/i><\/td>\n<td>\n<p style=\"text-align: center;\"><i><span style=\"font-weight: 400;\">Sphere<\/span><\/i><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: right;\"><strong>\\(\\mathcal{L}_{SDF}\\) <\/strong>(baseline)<\/p>\n<\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.0469<\/span><\/p>\n<\/td>\n<td style=\"text-align: center;\">\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.92<\/span><\/p>\n<\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.6902<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.9144<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.7223<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8923<\/span><\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: right;\"><b><strong>\\(\\mathcal{L}_{SDF} + \\mathcal{L}_{expr}\\)<\/strong><\/b><\/p>\n<\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8390<\/span><\/p>\n<\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">17.45<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.4430<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.4780<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.4073<\/span><\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8838<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: right;\"><b><strong>\\(\\mathcal{L}_{SDF} + \\mathcal{L}_{param}\\)<\/strong><\/b><\/p>\n<\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.6452<\/span><\/p>\n<\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">12.26<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8570<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">1.0015<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.7803<\/span><\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8619<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: right;\"><b><strong>\\(\\mathcal{L}_{SDF} + \\mathcal{L}_{nullobj}\\)<\/strong><\/b><\/p>\n<\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.0399<\/span><\/p>\n<\/td>\n<td style=\"text-align: center;\"><b>0.24<\/b><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.7036<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.9166<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.7193<\/span><\/td>\n<td>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">0.8773<\/span><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p style=\"text-align: right;\"><b><strong>\\(\\mathcal{L}^*\\)<\/strong><\/b> (final)<\/p>\n<\/td>\n<td>\n<p style=\"text-align: center;\"><b>0.8615<\/b><\/p>\n<\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">1.26<\/span><\/td>\n<td style=\"text-align: center;\"><b>0.3728<\/b><\/td>\n<td style=\"text-align: center;\"><b>0.3910<\/b><\/td>\n<td style=\"text-align: center;\"><b>0.3623<\/b><\/td>\n<td>\n<p style=\"text-align: center;\"><b>0.7929<\/b><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">The dashed, green line in the following figure shows the SDF loss of the final experiment at the timestamp of evaluation. Training continued for approximately one month after evaluation and the model continued to improve steadily. This demonstrates that the training process is very slow and tedious.<\/span><\/p>\n<figure id=\"attachment_32764\" aria-describedby=\"caption-attachment-32764\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-32764 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-1024x488.jpg\" alt=\"\" width=\"640\" height=\"305\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-1024x488.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-300x143.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-768x366.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-400x191.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1-360x172.jpg 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/sdf-loss-ma-1.jpg 1170w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-32764\" class=\"wp-caption-text\">SDF loss of the final model. After the evaluation, the model continued to improve steadily.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<h4>Visual Investigation<\/h4>\n<p>In addition, a visual investigation was conducted (see figure below). The top row shows the ground truth, the second the predictions, and the bottom row shows the respective SDF losses. We can see that the predicted CSG expressions are close to the ground truth and the SDF loss of the first five samples is very low. However, the last one is very high. This illustrates the strong penalization of geometric deviations.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-32758 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1.jpg\" alt=\"\" width=\"1677\" height=\"843\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1.jpg 1677w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-300x151.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-1024x515.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-768x386.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-1536x772.jpg 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-400x201.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/final-run-1-360x181.jpg 360w\" sizes=\"auto, (max-width: 1677px) 100vw, 1677px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The final experiment discards some unwanted patterns of behavior through the combination of losses. Simultaneously activating the expression and null object loss causes the model to fit its outputs to the given sequence lengths while avoiding artificially padding them with zero-sized primitives.\u00a0 Concurrently, the parameter loss guides the algorithm to minimize the reconstruction error of primitive parameters. The visual investigation and the shape composition score show that the algorithm purposefully assigns primitive and operation types to unseen samples. All these factors provide a significant performance gain in terms of SDF loss. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Similar to the separate experiment on parameter loss, the predictions include two distinct position values, whereas the output space of the size parameters is highly diverse.\u00a0 Since the first primitive of each ground truth CSG expression is centered, the remaining primitives are far more likely to reside near the center than at the edge of the canvas. To stabilize the performance, it is conceivable that the algorithm commits to a small number of positions near the center at an early stage of training. Constantly predicting positions close to the center yields a comparatively small parameter loss and allows the model to focus on optimizing the diverse primitive sizes. In a proceeding work, the model training could be continued with an additional diversity loss dealing with regression values to diversify the value range of the position parameters.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">In a future work, the rotations could be specified <\/span><span style=\"font-weight: 400;\">in the form of Quaternions. In the research fields of Computer Vision and Computer Graphics, they are widely used to compute 3D rotations, due to their simplicity and mathematical sophistication. One example, where quaternions are applied, is the UCSG-NET framework. A further improvement could be achieved by integrating Beam Search as Sharma et. al have done with the CSGNet model. This enabled the authors to gain a significant performance increase. Finally, the underlying problem could be simplified by operating on regular data representations, such as voxel grids as proposed by the CSGNet authors, instead of unordered point clouds. As a result, PointNet++ could be substituted with a convolutional neural network which serves as a voxel encoder. However, this modification causes the application to be less practically oriented.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recent research in the fields of Computer Vision and Computer Graphics often addresses the extraction of geometric shapes from 3D point clouds. The processing of raw point clouds is of particular use, because in practice, real objects, e.g. components of a car, are captured using a 3D scanner to subsequently generate a digital 3D model.<\/p>\n","protected":false},"author":264,"featured_media":32791,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[151],"service":[76],"coauthors":[{"id":264,"display_name":"Liza Obermeier","user_nicename":"lobermeier"}],"class_list":["post-32715","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-deep-learning","service-artificial-intelligence"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH<\/title>\n<meta name=\"description\" content=\"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2021-11-10T11:05:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-17T11:23:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Liza Obermeier\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Liza Obermeier\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"18\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Liza Obermeier\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/\"},\"author\":{\"name\":\"Liza Obermeier\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/95f963789d706ef1349bddae8e1f079b\"},\"headline\":\"Deep CSG: Extraction of Geometric Objects from 3D Point Clouds Using Deep Learning\",\"datePublished\":\"2021-11-10T11:05:22+00:00\",\"dateModified\":\"2022-11-17T11:23:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/\"},\"wordCount\":3544,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/deepcsg.png\",\"keywords\":[\"Deep Learning\"],\"articleSection\":[\"Analytics\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/\",\"name\":\"Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/deepcsg.png\",\"datePublished\":\"2021-11-10T11:05:22+00:00\",\"dateModified\":\"2022-11-17T11:23:12+00:00\",\"description\":\"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/deepcsg.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/deepcsg.png\",\"width\":1920,\"height\":1080,\"caption\":\"Sphere pointcloud transitioning to 3d object\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep CSG: Extraction of Geometric Objects from 3D Point Clouds Using Deep Learning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/95f963789d706ef1349bddae8e1f079b\",\"name\":\"Liza Obermeier\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g8b7e45e3b020173e17ce42e10749687b\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g\",\"caption\":\"Liza Obermeier\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/lobermeier\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH","description":"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/","og_locale":"de_DE","og_type":"article","og_title":"Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH","og_description":"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.","og_url":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2021-11-10T11:05:22+00:00","article_modified_time":"2022-11-17T11:23:12+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png","type":"image\/png"}],"author":"Liza Obermeier","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Liza Obermeier","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten","Written by":"Liza Obermeier"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/"},"author":{"name":"Liza Obermeier","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/95f963789d706ef1349bddae8e1f079b"},"headline":"Deep CSG: Extraction of Geometric Objects from 3D Point Clouds Using Deep Learning","datePublished":"2021-11-10T11:05:22+00:00","dateModified":"2022-11-17T11:23:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/"},"wordCount":3544,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png","keywords":["Deep Learning"],"articleSection":["Analytics","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/","url":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/","name":"Extraction of Geometric Objects from 3D Point Clouds - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png","datePublished":"2021-11-10T11:05:22+00:00","dateModified":"2022-11-17T11:23:12+00:00","description":"This article is about training a deep neural network that extracts geometric objects from 3D point clouds and transforms them into a CSG tree.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/deepcsg.png","width":1920,"height":1080,"caption":"Sphere pointcloud transitioning to 3d object"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/deep-csg-extraction-of-geometric-objects-from-3d-point-clouds-using-deep-learning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Deep CSG: Extraction of Geometric Objects from 3D Point Clouds Using Deep Learning"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/95f963789d706ef1349bddae8e1f079b","name":"Liza Obermeier","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g8b7e45e3b020173e17ce42e10749687b","url":"https:\/\/secure.gravatar.com\/avatar\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/45211f70df695599c5ffe8e2554ea9c5b357e5038751a326c4e54ab90725ea61?s=96&d=retro&r=g","caption":"Liza Obermeier"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/lobermeier\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/32715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/264"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=32715"}],"version-history":[{"count":6,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/32715\/revisions"}],"predecessor-version":[{"id":33308,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/32715\/revisions\/33308"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/32791"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=32715"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=32715"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=32715"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=32715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}