From dd9bc6a06406464aca31530d0d7d668b333d5994 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Thu, 18 Nov 2021 18:34:13 +0100 Subject: [PATCH 01/46] Fix(MaterialUtility): recover references, add created_in_func, add remove_emissive --- blenderproc/python/types/MaterialUtility.py | 43 ++++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/blenderproc/python/types/MaterialUtility.py b/blenderproc/python/types/MaterialUtility.py index fc3f846a9..de71d8b48 100644 --- a/blenderproc/python/types/MaterialUtility.py +++ b/blenderproc/python/types/MaterialUtility.py @@ -22,6 +22,8 @@ def update_blender_ref(self, name): :param name: The name of the instance which will be used to update its blender reference. """ self.blender_obj = bpy.data.materials[name] + self.nodes = bpy.data.materials[name].node_tree.nodes + self.links = bpy.data.materials[name].node_tree.links def get_users(self) -> int: """ Returns the number of users of the material. @@ -37,31 +39,45 @@ def duplicate(self) -> "Material": """ return Material(self.blender_obj.copy()) - def get_the_one_node_with_type(self, node_type: str) -> bpy.types.Node: + def get_the_one_node_with_type(self, node_type: str, created_in_func: str = "") -> bpy.types.Node: """ Returns the one node which is of the given node_type This function will only work if there is only one of the nodes of this type. :param node_type: The node type to look for. + :param created_in_func: only return node belonging to function defined by custom property 'created_in_func' :return: The node. """ - return Utility.get_the_one_node_with_type(self.nodes, node_type) + return Utility.get_the_one_node_with_type(self.nodes, node_type, created_in_func) - def get_nodes_with_type(self, node_type: str) -> List[bpy.types.Node]: + def get_nodes_with_type(self, node_type: str, created_in_func: str = "") -> List[bpy.types.Node]: """ Returns all nodes which are of the given node_type :param node_type: The note type to look for. + :param created_in_func: only return nodes belonging to function defined by custom property 'created_in_func' :return: The list of nodes with the given type. """ - return Utility.get_nodes_with_type(self.nodes, node_type) + return Utility.get_nodes_with_type(self.nodes, node_type, created_in_func) + + def get_nodes_created_in_func(self, created_in_func: str) -> List[bpy.types.Node]: + """ Returns all nodes which are of the given node_type + + :param created_in_func: return nodes created in that function + :return: The list of nodes with the given type. + """ + return Utility.get_nodes_created_in_func(self.nodes, created_in_func) - def new_node(self, node_type: str) -> bpy.types.Node: + def new_node(self, node_type: str, created_in_func: str = "") -> bpy.types.Node: """ Creates a new node in the material's node tree. :param node_type: The desired type of the new node. + :param created_in_func: Set custom property :return: The new node. """ - return self.nodes.new(node_type) + new_node = self.nodes.new(node_type) + if created_in_func: + new_node["created_in_func"] = created_in_func + return new_node def remove_node(self, node: bpy.types.Node): """ Removes the node from the material's node tree. @@ -132,7 +148,12 @@ def map_vertex_color(self, layer_name: str = 'Col', active_shading: bool = True) else: raise Exception("Material '{}' has no node connected to the output, " "which has as a 'Base Color' input.".format(self.blender_obj.name)) - + def remove_emissive(self): + """ Remove emissive part of the material. + """ + for node in self.get_nodes_created_in_func(self.make_emissive.__name__): + self.remove_node(node) + def make_emissive(self, emission_strength: float, replace: bool = False, keep_using_base_color: bool = True, emission_color: List[float] = None, non_emissive_color_socket: bpy.types.NodeSocket = None): """ Makes the material emit light. @@ -143,10 +164,12 @@ def make_emissive(self, emission_strength: float, replace: bool = False, keep_us :param emission_color: The color of the light to emit. Is ignored if keep_using_base_color is set to True. :param non_emissive_color_socket: An output socket that defines how the material should look like. By default that is the output of the principled shader node. Has no effect if replace is set to True. """ + self.remove_emissive() + output_node = self.get_the_one_node_with_type("OutputMaterial") if not replace: - mix_node = self.new_node('ShaderNodeMixShader') + mix_node = self.new_node('ShaderNodeMixShader', self.make_emissive.__name__) if non_emissive_color_socket is None: principled_bsdf = self.get_the_one_node_with_type("BsdfPrincipled") non_emissive_color_socket = principled_bsdf.outputs['BSDF'] @@ -156,13 +179,13 @@ def make_emissive(self, emission_strength: float, replace: bool = False, keep_us # The light path node returns 1, if the material is hit by a ray coming from the camera, else it # returns 0. In this way the mix shader will use the principled shader for rendering the color of # the emitting surface itself, while using the emission shader for lighting the scene. - light_path_node = self.new_node('ShaderNodeLightPath') + light_path_node = self.new_node('ShaderNodeLightPath', self.make_emissive.__name__) self.link(light_path_node.outputs['Is Camera Ray'], mix_node.inputs['Fac']) output_socket = mix_node.inputs[1] else: output_socket = output_node.inputs['Surface'] - emission_node = self.new_node('ShaderNodeEmission') + emission_node = self.new_node('ShaderNodeEmission', self.make_emissive.__name__) if keep_using_base_color: principled_bsdf = self.get_the_one_node_with_type("BsdfPrincipled") From 25525b4586b41b735b7041c83dd8563189e74fb5 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Thu, 18 Nov 2021 18:37:06 +0100 Subject: [PATCH 02/46] Feat(Utility): get_nodes_created_in_func --- blenderproc/python/utility/Utility.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/blenderproc/python/utility/Utility.py b/blenderproc/python/utility/Utility.py index 6edd23c99..2a4765c39 100644 --- a/blenderproc/python/utility/Utility.py +++ b/blenderproc/python/utility/Utility.py @@ -259,18 +259,22 @@ def get_node_connected_to_the_output_and_unlink_it(material: bpy.types.Material) return node_connected_to_the_output, material_output @staticmethod - def get_nodes_with_type(nodes: List[bpy.types.Node], node_type: str) -> List[bpy.types.Node]: + def get_nodes_with_type(nodes: List[bpy.types.Node], node_type: str, created_in_func: str = "") -> List[bpy.types.Node]: """ Returns all nodes which are of the given node_type :param nodes: list of nodes of the current material :param node_type: node types + :param created_in_func: only return nodes belonging to function defined by custom property 'created_in_func' :return: list of nodes, which belong to the type """ - return [node for node in nodes if node_type in node.bl_idname] + nodes_with_type = [node for node in nodes if node_type in node.bl_idname] + if created_in_func: + nodes_with_type = Utility.get_nodes_created_in_func(nodes_with_type, created_in_func) + return nodes_with_type @staticmethod - def get_the_one_node_with_type(nodes: List[bpy.types.Node], node_type: str) -> bpy.types.Node: + def get_the_one_node_with_type(nodes: List[bpy.types.Node], node_type: str, created_in_func: str = "") -> bpy.types.Node: """ Returns the one nodes which is of the given node_type @@ -278,14 +282,25 @@ def get_the_one_node_with_type(nodes: List[bpy.types.Node], node_type: str) -> b :param nodes: list of nodes of the current material :param node_type: node types + :param created_in_func: only return node belonging to function defined by custom property 'created_in_func' :return: node of the node type """ - node = Utility.get_nodes_with_type(nodes, node_type) + node = Utility.get_nodes_with_type(nodes, node_type, created_in_func) if node and len(node) == 1: return node[0] else: raise Exception("There is not only one node of this type: {}, there are: {}".format(node_type, len(node))) + @staticmethod + def get_nodes_created_in_func(nodes: List[bpy.types.Node], created_in_func: str) -> List[bpy.types.Node]: + """ Returns all nodes which are created in the given function + + :param nodes: list of nodes of the current material + :param created_in_func: return nodes created in that function + :return: The list of nodes with the given type. + """ + return [node for node in nodes if "created_in_func" in node and node["created_in_func"] == created_in_func] + @staticmethod def read_suncg_lights_windows_materials() -> Tuple[Dict[str, Tuple[List[str], List[str]]], List[str]]: """ From 1db4c6b1a0b25de2787ce9c385bb9471fc925898 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Thu, 18 Nov 2021 18:37:59 +0100 Subject: [PATCH 03/46] Feat(BopWriterUtility): more informative errors --- blenderproc/python/writer/BopWriterUtility.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blenderproc/python/writer/BopWriterUtility.py b/blenderproc/python/writer/BopWriterUtility.py index 18fff3c34..8ba535900 100644 --- a/blenderproc/python/writer/BopWriterUtility.py +++ b/blenderproc/python/writer/BopWriterUtility.py @@ -202,6 +202,8 @@ def _get_frame_gt(dataset_objects: List[bpy.types.Mesh], unit_scaling: float, ig cam_R_m2c = cam_H_m2c.to_quaternion().to_matrix() cam_t_m2c = cam_H_m2c.to_translation() + assert "category_id" in obj, "{} object has no custom property 'category_id'".format(obj.get_name()) + # ignore examples that fell through the plane if not np.linalg.norm(list(cam_t_m2c)) > ignore_dist_thres: cam_t_m2c = list(cam_t_m2c * unit_scaling) From 7867db437fe1caacb57971714d29cc2418300dbe Mon Sep 17 00:00:00 2001 From: Klaus Strobl Date: Fri, 19 Nov 2021 11:18:30 +0100 Subject: [PATCH 04/46] doc(examples/*README*): Add lens_distortion in READMEs --- examples/README.md | 3 ++- examples/advanced/README.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/README.md b/examples/README.md index 8f9149780..0db9dacec 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,6 +1,6 @@ # Examples overview -We structure our examples into three different group, we encourage everyone to start with the [basic examples](basics/README.md). +We structure our examples into three different groups. We encourage everyone to start with the [basic examples](basics/README.md). Each folder contains an example, some of those require external datasets and/or resources. Each example provides a valid configuration file(s) that can be used for getting some sort of output, a description, and, optionally, some resources. @@ -33,6 +33,7 @@ These examples introduce usage of advanced BlenderProc modules and/or of their c * [diffuse_color_image](advanced/diffuse_color_image/README.md): How to render a scene without any lighting or shading. * [dust](advanced/dust/README.md): How to add dust on top objects, to make them look more real. * [entity_displacement_modifier](advanced/entity_displacement_modifier/README.md): Using displacement modifiers with different textures. +* [camera lens distortion generation and validation](advanced/lens_distortion/README.md): Add lens distortion from camera calibration to all output images. * [material_randomizer](advanced/material_randomizer/README.md): Randomization of materials of selected objects. * [motion_blur_rolling_shutter](advanced/motion_blur_rolling_shutter/README.md): Generating motion blur and a rolling shutter effects. * [object_pose_sampling](advanced/object_pose_sampling/README.md): Complex use of a 6D pose sampler. diff --git a/examples/advanced/README.md b/examples/advanced/README.md index e79a0d9fb..2c0549881 100644 --- a/examples/advanced/README.md +++ b/examples/advanced/README.md @@ -1,5 +1,5 @@ # Advanced Examples -These examples introduce usage of advanced BlenderProc modules and/or of their combinations. +These examples introduce the usage of advanced BlenderProc modules and/or their combinations. * [auto_shading](auto_shading/README.md): How to change the shading mode of an object. * [camera_depth_of_field](camera_depth_of_field/README.md): Setting an object as the camera depth of field focus point. @@ -7,6 +7,7 @@ These examples introduce usage of advanced BlenderProc modules and/or of their c * [diffuse_color_image](diffuse_color_image/README.md): How to render a scene without any lighting or shading. * [dust](dust/README.md): How to add dust on top objects, to make them look more real. * [entity_displacement_modifier](entity_displacement_modifier/README.md): Using displacement modifiers with different textures. +* [lens_distortion](lens_distortion/README.md): Add lens distortion from camera calibration to all output images. * [material_randomizer](material_randomizer/README.md): Randomization of materials of selected objects. * [motion_blur_rolling_shutter](motion_blur_rolling_shutter/README.md): Generating motion blur and a rolling shutter effects. * [object_pose_sampling](object_pose_sampling/README.md): Complex use of a 6D pose sampler. From 4614e7da08aefa0570222c99ff3ac8bcc5290663 Mon Sep 17 00:00:00 2001 From: "Strobl, Klaus" Date: Fri, 19 Nov 2021 13:18:21 +0100 Subject: [PATCH 05/46] fix(examples/README): Folder name --- examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index 0db9dacec..c0c95bfe1 100644 --- a/examples/README.md +++ b/examples/README.md @@ -33,7 +33,7 @@ These examples introduce usage of advanced BlenderProc modules and/or of their c * [diffuse_color_image](advanced/diffuse_color_image/README.md): How to render a scene without any lighting or shading. * [dust](advanced/dust/README.md): How to add dust on top objects, to make them look more real. * [entity_displacement_modifier](advanced/entity_displacement_modifier/README.md): Using displacement modifiers with different textures. -* [camera lens distortion generation and validation](advanced/lens_distortion/README.md): Add lens distortion from camera calibration to all output images. +* [lens_distortion](advanced/lens_distortion/README.md): Add lens distortion from camera calibration to all output images. * [material_randomizer](advanced/material_randomizer/README.md): Randomization of materials of selected objects. * [motion_blur_rolling_shutter](advanced/motion_blur_rolling_shutter/README.md): Generating motion blur and a rolling shutter effects. * [object_pose_sampling](advanced/object_pose_sampling/README.md): Complex use of a 6D pose sampler. From e8529af2ee55a6caea142478b24a2cb50a25ac5b Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Mon, 22 Nov 2021 10:39:28 +0100 Subject: [PATCH 06/46] Chore(MaterialUtility): Improve documentation --- blenderproc/python/types/MaterialUtility.py | 9 +++++---- blenderproc/python/utility/Utility.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/blenderproc/python/types/MaterialUtility.py b/blenderproc/python/types/MaterialUtility.py index de71d8b48..72f4cbe10 100644 --- a/blenderproc/python/types/MaterialUtility.py +++ b/blenderproc/python/types/MaterialUtility.py @@ -45,7 +45,7 @@ def get_the_one_node_with_type(self, node_type: str, created_in_func: str = "") This function will only work if there is only one of the nodes of this type. :param node_type: The node type to look for. - :param created_in_func: only return node belonging to function defined by custom property 'created_in_func' + :param created_in_func: only return node created by the specified function :return: The node. """ return Utility.get_the_one_node_with_type(self.nodes, node_type, created_in_func) @@ -54,7 +54,7 @@ def get_nodes_with_type(self, node_type: str, created_in_func: str = "") -> List """ Returns all nodes which are of the given node_type :param node_type: The note type to look for. - :param created_in_func: only return nodes belonging to function defined by custom property 'created_in_func' + :param created_in_func: only return nodes created by the specified function :return: The list of nodes with the given type. """ return Utility.get_nodes_with_type(self.nodes, node_type, created_in_func) @@ -62,7 +62,7 @@ def get_nodes_with_type(self, node_type: str, created_in_func: str = "") -> List def get_nodes_created_in_func(self, created_in_func: str) -> List[bpy.types.Node]: """ Returns all nodes which are of the given node_type - :param created_in_func: return nodes created in that function + :param created_in_func: return all nodes created in the given function :return: The list of nodes with the given type. """ return Utility.get_nodes_created_in_func(self.nodes, created_in_func) @@ -71,7 +71,8 @@ def new_node(self, node_type: str, created_in_func: str = "") -> bpy.types.Node: """ Creates a new node in the material's node tree. :param node_type: The desired type of the new node. - :param created_in_func: Set custom property + :param created_in_func: Save the function name in which this node was created as a custom property. + Allows to later retrieve and delete specific nodes again. :return: The new node. """ new_node = self.nodes.new(node_type) diff --git a/blenderproc/python/utility/Utility.py b/blenderproc/python/utility/Utility.py index 2a4765c39..718607e00 100644 --- a/blenderproc/python/utility/Utility.py +++ b/blenderproc/python/utility/Utility.py @@ -265,7 +265,7 @@ def get_nodes_with_type(nodes: List[bpy.types.Node], node_type: str, created_in_ :param nodes: list of nodes of the current material :param node_type: node types - :param created_in_func: only return nodes belonging to function defined by custom property 'created_in_func' + :param created_in_func: only return nodes created by the specified function :return: list of nodes, which belong to the type """ nodes_with_type = [node for node in nodes if node_type in node.bl_idname] @@ -282,7 +282,7 @@ def get_the_one_node_with_type(nodes: List[bpy.types.Node], node_type: str, crea :param nodes: list of nodes of the current material :param node_type: node types - :param created_in_func: only return node belonging to function defined by custom property 'created_in_func' + :param created_in_func: only return node created by the specified function :return: node of the node type """ node = Utility.get_nodes_with_type(nodes, node_type, created_in_func) From 55a4474bf4b45a9f049597013d83a421e543f149 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Tue, 23 Nov 2021 17:42:59 +0100 Subject: [PATCH 07/46] Feat(bop_challenge): hb script --- .../datasets/bop_challenge/main_hb_random.py | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 examples/datasets/bop_challenge/main_hb_random.py diff --git a/examples/datasets/bop_challenge/main_hb_random.py b/examples/datasets/bop_challenge/main_hb_random.py new file mode 100644 index 000000000..401a7a2ca --- /dev/null +++ b/examples/datasets/bop_challenge/main_hb_random.py @@ -0,0 +1,153 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np +import random + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") +parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") +parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") +parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', nargs='?', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), + sys_paths = args.bop_toolkit_path, + mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), + model_type = 'cad', + sys_paths = args.bop_toolkit_path, + mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), + sys_paths = args.bop_toolkit_path, + mm2m = True) +tyol_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tyol'), + sys_paths = args.bop_toolkit_path, + mm2m = True) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs + ycbv_dist_bop_objs + tyol_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(200) + +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.3, -0.3, 0.0], [-0.2, -0.2, 0.0]) + max = np.random.uniform([0.2, 0.2, 0.4], [0.3, 0.3, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(tyol_dist_bop_objs, size=2, replace=False)) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 1.0)) + mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + obj.hide(False) + + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89, uniform_volume = True) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 20, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.44, + radius_max = 1.42, + elevation_min = 5, + elevation_max = 89, + uniform_volume = True) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + dataset = args.bop_dataset_name, + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) From a70eec1fabb5abb0c7f133de8af3f8d5bccdc5fb Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Fri, 26 Nov 2021 15:40:57 +0100 Subject: [PATCH 08/46] fix(pip): Removes cache of installed packages after running "pip uninstall" --- blenderproc/python/utility/SetupUtility.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blenderproc/python/utility/SetupUtility.py b/blenderproc/python/utility/SetupUtility.py index 2e9625fe8..3f16ac841 100644 --- a/blenderproc/python/utility/SetupUtility.py +++ b/blenderproc/python/utility/SetupUtility.py @@ -234,6 +234,9 @@ def uninstall_pip_packages(package_names: List[str], blender_path: str, major_ve # Run pip uninstall subprocess.Popen([python_bin, "-m", "pip", "uninstall"] + package_names, env=dict(os.environ, PYTHONPATH=packages_path)).wait() + # Clear installed packages cache + SetupUtility.clean_installed_packages_cache(blender_path, major_version) + @staticmethod def _ensure_pip(python_bin: str, packages_path: str, pre_python_package_path: str, force_update: bool = False): """ Make sure pip is installed and read in the already installed packages From 18a6feb564a4845f7947d3d58e7ba0e0c82de305 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 26 Nov 2021 17:47:50 +0100 Subject: [PATCH 09/46] Feat(BopLader): New API load_bop_objs, load_bop_scene, load_bop_intrinsics --- blenderproc/api/loader/__init__.py | 2 +- blenderproc/python/loader/BopLoader.py | 282 ++++++++++-------- .../python/modules/loader/BopLoaderModule.py | 44 ++- blenderproc/python/utility/Utility.py | 2 +- 4 files changed, 190 insertions(+), 140 deletions(-) diff --git a/blenderproc/api/loader/__init__.py b/blenderproc/api/loader/__init__.py index 2a0e21b62..9034e5847 100644 --- a/blenderproc/api/loader/__init__.py +++ b/blenderproc/api/loader/__init__.py @@ -1,6 +1,6 @@ from blenderproc.python.loader.AMASSLoader import load_AMASS from blenderproc.python.loader.BlendLoader import load_blend -from blenderproc.python.loader.BopLoader import load_bop +from blenderproc.python.loader.BopLoader import load_bop_objs, load_bop_scene, load_bop_intrinsics from blenderproc.python.loader.CCMaterialLoader import load_ccmaterials from blenderproc.python.loader.Front3DLoader import load_front3d from blenderproc.python.loader.HavenMaterialLoader import load_haven_mat diff --git a/blenderproc/python/loader/BopLoader.py b/blenderproc/python/loader/BopLoader.py index fe5be072a..0104a2c58 100644 --- a/blenderproc/python/loader/BopLoader.py +++ b/blenderproc/python/loader/BopLoader.py @@ -7,6 +7,7 @@ import numpy as np from mathutils import Matrix, Vector +from blenderproc.python.utility.SetupUtility import SetupUtility import blenderproc.python.camera.CameraUtility as CameraUtility from blenderproc.python.types.MeshObjectUtility import MeshObject from blenderproc.python.utility.Utility import Utility @@ -14,167 +15,202 @@ from blenderproc.python.types.MaterialUtility import Material -def load_bop(bop_dataset_path: str, sys_paths: Union[List[str], str], temp_dir: str = None, model_type: str = "", cam_type: str = "", split: str = "test", scene_id: int = -1, obj_ids: list = [], sample_objects: bool = False, num_of_objs_to_sample: int = None, obj_instances_limit: int = -1, move_origin_to_x_y_plane: bool = False, source_frame: list = ["X", "-Y", "-Z"], mm2m: bool = False) -> List[MeshObject]: - """ Loads the 3D models of any BOP dataset and allows replicating BOP scenes - - - Interfaces with the bob_toolkit, allows loading of train, val and test splits - - Relative camera poses are loaded/computed with respect to a reference model - - Sets real camera intrinsics +def load_bop_objs(bop_dataset_path: str, model_type: str = "", obj_ids: list = [], sample_objects: bool = False, num_of_objs_to_sample: int = None, + obj_instances_limit: int = -1, mm2m: bool = False, move_origin_to_x_y_plane: bool = False, temp_dir: str = None, ) -> List[MeshObject]: + """ Loads all or a subset of 3D models of any BOP dataset :param bop_dataset_path: Full path to a specific bop dataset e.g. /home/user/bop/tless. - :param sys_paths: System paths to append. Can be a string or a list of strings. - :param temp_dir: A temp directory which is used for writing the temporary .ply file. - :param model_type: Optionally, specify type of BOP model. Available: [reconst, cad or eval]. - :param cam_type: Camera type. If not defined, dataset-specific default camera type is used. - :param split: Optionally, test or val split depending on BOP dataset. - :param scene_id: Optionally, specify BOP dataset scene to synthetically replicate. Default: -1 (no scene is replicated, - only BOP Objects are loaded). - :param obj_ids: List of object ids to load. Default: [] (all objects from the given BOP dataset if scene_id is not - specified). + :param model_type: Optionally, specify type of BOP model. Available: [reconst, cad or eval]. + :param obj_ids: List of object ids to load. Default: [] (load all objects from the given BOP dataset) :param sample_objects: Toggles object sampling from the specified dataset. :param num_of_objs_to_sample: Amount of objects to sample from the specified dataset. If this amount is bigger than the dataset actually contains, then all objects will be loaded. :param obj_instances_limit: Limits the amount of object copies when sampling. Default: -1 (no limit). + :param mm2m: Specify whether to convert poses and models to meters. :param move_origin_to_x_y_plane: Move center of the object to the lower side of the object, this will not work when used in combination with pose estimation tasks! This is designed for the use-case where BOP objects are used as filler objects in the background. - :param source_frame: Can be used if the given positions and rotations are specified in frames different from the blender - frame. Has to be a list of three strings. Example: ['X', '-Z', 'Y']: Point (1,2,3) will be transformed - to (1, -3, 2). Available: ['X', 'Y', 'Z', '-X', '-Y', '-Z']. - :param mm2m: Specify whether to convert poses and models to meters. + :param temp_dir: A temp directory which is used for writing the temporary .ply file. :return: The list of loaded mesh objects. """ - # Make sure sys_paths is a list - if not isinstance(sys_paths, list): - sys_paths = [sys_paths] - - for sys_path in sys_paths: - if 'bop_toolkit' in sys_path: - sys.path.append(sys_path) + bop_path, bop_dataset_name = BopLoader._setup_bop_toolkit(bop_dataset_path) + + from bop_toolkit_lib import dataset_params + model_p = dataset_params.get_model_params(bop_path, bop_dataset_name, model_type=model_type if model_type else None) + + # temp_dir, scale, bop_dataset_name, has_external_texture, model_p = setup_bop(bop_dataset_path, temp_dir, model_type, mm2m) if temp_dir is None: temp_dir = Utility.get_temporary_directory() - + scale = 0.001 if mm2m else 1 - bop_dataset_name = os.path.basename(bop_dataset_path) has_external_texture = bop_dataset_name in ["ycbv", "ruapc"] - if obj_ids or sample_objects: - allow_duplication = True + allow_duplication = obj_ids or sample_objects + + obj_ids = obj_ids if obj_ids else model_p['obj_ids'] + + loaded_objects = [] + # if sampling is enabled + if sample_objects: + loaded_ids = {} + loaded_amount = 0 + if obj_instances_limit != -1 and len(obj_ids) * obj_instances_limit < num_of_objs_to_sample: + raise RuntimeError("{}'s {} split contains {} objects, {} object where requested to sample with " + "an instances limit of {}. Raise the limit amount or decrease the requested " + "amount of objects.".format(bop_dataset_path, split, len(obj_ids), + num_of_objs_to_sample, + obj_instances_limit)) + while loaded_amount != num_of_objs_to_sample: + random_id = choice(obj_ids) + if random_id not in loaded_ids.keys(): + loaded_ids.update({random_id: 0}) + # if there is no limit or if there is one, but it is not reached for this particular object + if obj_instances_limit == -1 or loaded_ids[random_id] < obj_instances_limit: + cur_obj = BopLoader._load_mesh(random_id, model_p, bop_dataset_name, has_external_texture, temp_dir, allow_duplication, scale) + loaded_ids[random_id] += 1 + loaded_amount += 1 + loaded_objects.append(cur_obj) + else: + print("ID {} was loaded {} times with limit of {}. Total loaded amount {} while {} are " + "being requested".format(random_id, loaded_ids[random_id], obj_instances_limit, + loaded_amount, num_of_objs_to_sample)) else: - allow_duplication = False - - datasets_path = os.path.dirname(bop_dataset_path) - dataset = os.path.basename(bop_dataset_path) - - print("bob: {}, dataset_path: {}".format(bop_dataset_path, datasets_path)) - print("dataset: {}".format(dataset)) + for obj_id in obj_ids: + cur_obj = BopLoader._load_mesh(obj_id, model_p, bop_dataset_name, has_external_texture, temp_dir, allow_duplication, scale) + loaded_objects.append(cur_obj) + # move the origin of the object to the world origin and on top of the X-Y plane + # makes it easier to place them later on, this does not change the `.location` + # This is only useful if the BOP objects are not used in a pose estimation scenario. + if move_origin_to_x_y_plane: + for obj in loaded_objects: + obj.move_origin_to_bottom_mean_point() + + return loaded_objects + +def load_bop_scene(bop_dataset_path: str, scene_id: int, model_type: str = "", cam_type: str = "", split: str = "test", source_frame: list = ["X", "-Y", "-Z"], mm2m: bool = False, temp_dir: str = None) -> List[MeshObject]: + """ Replicate a BOP scene from the given dataset: load scene objects, object poses, camera intrinsics and extrinsics - try: - from bop_toolkit_lib import dataset_params, inout - except ImportError as error: - print('ERROR: Please download the bop_toolkit package and add it to sys_paths in config!') - print('https://github.com/thodan/bop_toolkit') - raise error + - Interfaces with the bob_toolkit, allows loading of train, val and test splits + - Relative camera poses are loaded/computed with respect to a reference model + - Sets real camera intrinsics - model_p = dataset_params.get_model_params(datasets_path, dataset, model_type=model_type if model_type else None) - cam_p = dataset_params.get_camera_params(datasets_path, dataset, cam_type=cam_type if cam_type else None) + :param bop_dataset_path: Full path to a specific bop dataset e.g. /home/user/bop/tless. + :param scene_id: Specify BOP dataset scene to synthetically replicate. Default: -1 (no scene is replicated, + only BOP Objects are loaded). + :param model_type: Optionally, specify type of BOP model. Available: [reconst, cad or eval]. + :param cam_type: Camera type. If not defined, dataset-specific default camera type is used. + :param split: Optionally, test or val split depending on BOP dataset. + :param source_frame: Can be used if the given positions and rotations are specified in frames different from the blender + frame. Has to be a list of three strings. Example: ['X', '-Z', 'Y']: Point (1,2,3) will be transformed + to (1, -3, 2). Available: ['X', 'Y', 'Z', '-X', '-Y', '-Z']. + :param mm2m: Specify whether to convert poses and models to meters. + :param temp_dir: A temp directory which is used for writing the temporary .ply file. + :return: The list of loaded mesh objects. + """ + bop_path, bop_dataset_name = BopLoader._setup_bop_toolkit(bop_dataset_path) + + from bop_toolkit_lib import dataset_params, inout + model_p = dataset_params.get_model_params(bop_path, bop_dataset_name, model_type=model_type if model_type else None) try: - split_p = dataset_params.get_split_params(datasets_path, dataset, split=split) + split_p = dataset_params.get_split_params(bop_path, bop_dataset_name, split=split, split_type=cam_type if cam_type else None) except ValueError: - raise Exception("Wrong path or {} split does not exist in {}.".format(split, dataset)) + raise Exception("Wrong path or {} split does not exist in {}.".format(split, bop_dataset_name)) + sc_gt = inout.load_scene_gt(split_p['scene_gt_tpath'].format(**{'scene_id': scene_id})) + sc_camera = inout.load_json(split_p['scene_camera_tpath'].format(**{'scene_id': scene_id})) + + if temp_dir is None: + temp_dir = Utility.get_temporary_directory() + + scale = 0.001 if mm2m else 1 + has_external_texture = bop_dataset_name in ["ycbv", "ruapc"] + + for i, (cam_id, insts) in enumerate(sc_gt.items()): + cam_K, cam_H_m2c_ref = BopLoader._get_ref_cam_extrinsics_intrinsics(sc_camera, cam_id, insts, scale) - bpy.context.scene.render.resolution_x = cam_p['im_size'][0] - bpy.context.scene.render.resolution_y = cam_p['im_size'][1] + if i == 0: + # define world = first camera + cam_H_m2w_ref = cam_H_m2c_ref.copy() - loaded_objects = [] + cur_objs = [] + # load scene objects and set their poses + for inst in insts: + cur_objs.append(BopLoader._load_mesh(inst['obj_id'], model_p, bop_dataset_name, has_external_texture, temp_dir, False, scale)) + BopLoader.set_object_pose(cur_objs[-1], inst, scale) - # only load all/selected objects here, use other modules for setting poses - # e.g. camera.CameraSampler / object.ObjectPoseSampler - if scene_id == -1: + cam_H_c2w = BopLoader._compute_camera_to_world_trafo(cam_H_m2w_ref, cam_H_m2c_ref, source_frame) + # set camera intrinsics + CameraUtility.set_intrinsics_from_K_matrix(cam_K, split_p['im_size'][0], split_p['im_size'][1]) - # TLESS exception because images are cropped - if bop_dataset_name in ['tless']: - cam_p['K'][0, 2] = split_p['im_size'][0] / 2 - cam_p['K'][1, 2] = split_p['im_size'][1] / 2 + # set camera extrinsics as next frame + frame_id = CameraUtility.add_camera_pose(cam_H_c2w) - # set camera intrinsics - CameraUtility.set_intrinsics_from_K_matrix(cam_p['K'], split_p['im_size'][0], split_p['im_size'][1]) - - obj_ids = obj_ids if obj_ids else model_p['obj_ids'] - # if sampling is enabled - if sample_objects: - loaded_ids = {} - loaded_amount = 0 - if obj_instances_limit != -1 and len(obj_ids) * obj_instances_limit < num_of_objs_to_sample: - raise RuntimeError("{}'s {} split contains {} objects, {} object where requested to sample with " - "an instances limit of {}. Raise the limit amount or decrease the requested " - "amount of objects.".format(bop_dataset_path, split, len(obj_ids), - num_of_objs_to_sample, - obj_instances_limit)) - while loaded_amount != num_of_objs_to_sample: - random_id = choice(obj_ids) - if random_id not in loaded_ids.keys(): - loaded_ids.update({random_id: 0}) - # if there is no limit or if there is one, but it is not reached for this particular object - if obj_instances_limit == -1 or loaded_ids[random_id] < obj_instances_limit: - cur_obj = BopLoader._load_mesh(random_id, model_p, bop_dataset_name, has_external_texture, temp_dir, allow_duplication, scale) - loaded_ids[random_id] += 1 - loaded_amount += 1 - loaded_objects.append(cur_obj) - else: - print("ID {} was loaded {} times with limit of {}. Total loaded amount {} while {} are " - "being requested".format(random_id, loaded_ids[random_id], obj_instances_limit, - loaded_amount, num_of_objs_to_sample)) - else: - for obj_id in obj_ids: - cur_obj = BopLoader._load_mesh(obj_id, model_p, bop_dataset_name, has_external_texture, temp_dir, allow_duplication, scale) - loaded_objects.append(cur_obj) + # Add key frame for camera shift, as it changes from frame to frame in the tless replication + cam = bpy.context.scene.camera.data + cam.keyframe_insert(data_path='shift_x', frame=frame_id) + cam.keyframe_insert(data_path='shift_y', frame=frame_id) - # replicate scene: load scene objects, object poses, camera intrinsics and camera poses - else: - sc_gt = inout.load_scene_gt(split_p['scene_gt_tpath'].format(**{'scene_id': scene_id})) - sc_camera = inout.load_json(split_p['scene_camera_tpath'].format(**{'scene_id': scene_id})) - for i, (cam_id, insts) in enumerate(sc_gt.items()): - cam_K, cam_H_m2c_ref = BopLoader._get_ref_cam_extrinsics_intrinsics(sc_camera, cam_id, insts, scale) + # Copy object poses to key frame (to be sure) + for cur_obj in cur_objs: + BopLoader._insert_key_frames(cur_obj, frame_id) - if i == 0: - # define world = first camera - cam_H_m2w_ref = cam_H_m2c_ref.copy() + return cur_objs - cur_objs = [] - # load scene objects and set their poses - for inst in insts: - cur_objs.append(BopLoader._load_mesh(inst['obj_id'], model_p, bop_dataset_name, has_external_texture, temp_dir, allow_duplication, scale)) - BopLoader.set_object_pose(cur_objs[-1], inst, scale) +def load_bop_intrinsics(bop_dataset_path: str, split: str = "test", cam_type: str = "") -> tuple[np.ndarray, int, int]: + """ + Load and set the camera matrix and image resolution of a specified BOP dataset - cam_H_c2w = BopLoader._compute_camera_to_world_trafo(cam_H_m2w_ref, cam_H_m2c_ref, source_frame) - # set camera intrinsics - CameraUtility.set_intrinsics_from_K_matrix(cam_K, split_p['im_size'][0], split_p['im_size'][1]) + :param bop_dataset_path: Full path to a specific bop dataset e.g. /home/user/bop/tless. + :param split: Optionally, train, test or val split depending on BOP dataset, defaults to "test" + :param cam_type: Camera type. If not defined, dataset-specific default camera type is used. + :returns: camera matrix K, W, H + """ + + bop_path, bop_dataset_name = BopLoader._setup_bop_toolkit(bop_dataset_path) + + from bop_toolkit_lib import dataset_params + cam_p = dataset_params.get_camera_params(bop_path, bop_dataset_name, cam_type=cam_type if cam_type else None) + + try: + split_p = dataset_params.get_split_params(bop_path, bop_dataset_name, split=split, split_type=cam_type if cam_type else None) + except ValueError: + raise Exception("Wrong path or {} split does not exist in {}.".format(split, bop_dataset_name)) + + # TLESS exception because images are cropped + if bop_dataset_name in ['tless']: + cam_p['K'][0, 2] = split_p['im_size'][0] / 2 + cam_p['K'][1, 2] = split_p['im_size'][1] / 2 + + # set camera intrinsics + CameraUtility.set_intrinsics_from_K_matrix(cam_p['K'], split_p['im_size'][0], split_p['im_size'][1]) + + return cam_p['K'], split_p['im_size'][0], split_p['im_size'][1] - # set camera extrinsics as next frame - frame_id = CameraUtility.add_camera_pose(cam_H_c2w) +class BopLoader: - # Add key frame for camera shift, as it changes from frame to frame in the tless replication - cam = bpy.context.scene.camera.data - cam.keyframe_insert(data_path='shift_x', frame=frame_id) - cam.keyframe_insert(data_path='shift_y', frame=frame_id) + @staticmethod + def _setup_bop_toolkit(bop_dataset_path: str) -> tuple[str, str]: + """ + Install the bop_toolkit from Github and set an environment variable pointing to the BOP datasets - # Copy object poses to key frame (to be sure) - for cur_obj in cur_objs: - BopLoader._insert_key_frames(cur_obj, frame_id) + :param cam_H_m2c_ref: (4x4) Homog trafo from object to camera coords. + :return (bop_path, bop_dataset_name): Path to BOP datasets and BOP dataset name + """ - # move the origin of the object to the world origin and on top of the X-Y plane - # makes it easier to place them later on, this does not change the `.location` - # This is only useful if the BOP objects are not used in a pose estimation scenario. - if move_origin_to_x_y_plane: - for obj in loaded_objects: - obj.move_origin_to_bottom_mean_point() + bop_dataset_name = os.path.basename(bop_dataset_path) + bop_path = os.path.dirname(bop_dataset_path) - return loaded_objects + print("bob: {}, dataset_path: {}".format(bop_dataset_path, bop_path)) + print("dataset: {}".format(bop_dataset_name)) + if not os.path.exists(bop_path): + raise ValueError("It seems the BOP dataset does not exist under the given path {}".format(bop_dataset_path)) -class BopLoader: + # Install bop_toolkit_lib + SetupUtility.setup_pip(["git+https://github.com/thodan/bop_toolkit"]) + os.environ["BOP_PATH"] = bop_path + + return bop_path, bop_dataset_name @staticmethod def _compute_camera_to_world_trafo(cam_H_m2w_ref: np.array, cam_H_m2c_ref: np.array, source_frame: list) -> np.ndarray: diff --git a/blenderproc/python/modules/loader/BopLoaderModule.py b/blenderproc/python/modules/loader/BopLoaderModule.py index 576f67370..8db9b2d87 100644 --- a/blenderproc/python/modules/loader/BopLoaderModule.py +++ b/blenderproc/python/modules/loader/BopLoaderModule.py @@ -1,5 +1,5 @@ from blenderproc.python.modules.loader.LoaderInterface import LoaderInterface -from blenderproc.python.loader.BopLoader import load_bop +from blenderproc.python.loader.BopLoader import load_bop_objs, load_bop_scene, load_bop_intrinsics class BopLoaderModule(LoaderInterface): @@ -80,21 +80,35 @@ def run(self): num_of_objs_to_sample = None obj_instances_limit = -1 - loaded_objects = load_bop( + scene_id = self.config.get_int("scene_id", -1) + + if scene_id == -1: + loaded_objects = load_bop_objs( + bop_dataset_path=self.config.get_string("bop_dataset_path"), + model_type=self.config.get_string("model_type", ""), + obj_ids=self.config.get_list("obj_ids", []), + sample_objects=sample_objects, + num_of_objs_to_sample=num_of_objs_to_sample, + obj_instances_limit=obj_instances_limit, + move_origin_to_x_y_plane=self.config.get_bool("move_origin_to_x_y_plane", False), + mm2m=self.config.get_bool("mm2m", False), + temp_dir=self._temp_dir + ) + load_bop_intrinsics( bop_dataset_path=self.config.get_string("bop_dataset_path"), - temp_dir=self._temp_dir, - sys_paths=self.config.get_list("sys_paths"), - model_type=self.config.get_string("model_type", ""), - cam_type=self.config.get_string("cam_type", ""), split=self.config.get_string("split", "test"), - scene_id=self.config.get_int("scene_id", -1), - obj_ids=self.config.get_list("obj_ids", []), - sample_objects=sample_objects, - num_of_objs_to_sample=num_of_objs_to_sample, - obj_instances_limit=obj_instances_limit, - move_origin_to_x_y_plane=self.config.get_bool("move_origin_to_x_y_plane", False), - source_frame=self.config.get_list("source_frame", ["X", "-Y", "-Z"]), - mm2m=self.config.get_bool("mm2m", False) - ) + cam_type=self.config.get_string("cam_type", "") + ) + else: + loaded_objects = load_bop_scene( + bop_dataset_path=self.config.get_string("bop_dataset_path"), + scene_id=self.config.get_int("scene_id", -1), + model_type=self.config.get_string("model_type", ""), + cam_type=self.config.get_string("cam_type", ""), + split=self.config.get_string("split", "test"), + source_frame=self.config.get_list("source_frame", ["X", "-Y", "-Z"]), + mm2m=self.config.get_bool("mm2m", False), + temp_dir=self._temp_dir + ) self._set_properties(loaded_objects) \ No newline at end of file diff --git a/blenderproc/python/utility/Utility.py b/blenderproc/python/utility/Utility.py index 718607e00..4adbcefef 100644 --- a/blenderproc/python/utility/Utility.py +++ b/blenderproc/python/utility/Utility.py @@ -296,7 +296,7 @@ def get_nodes_created_in_func(nodes: List[bpy.types.Node], created_in_func: str) """ Returns all nodes which are created in the given function :param nodes: list of nodes of the current material - :param created_in_func: return nodes created in that function + :param created_in_func: return all nodes created in the given function :return: The list of nodes with the given type. """ return [node for node in nodes if "created_in_func" in node and node["created_in_func"] == created_in_func] From 923ef2f10a6fb5f906d87f7c79038b05c7128d6a Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 26 Nov 2021 17:49:24 +0100 Subject: [PATCH 10/46] Feat(BOP): Automatic bop_toolkit installation, remove path --- .../bop_object_on_surface_sampling/README.md | 21 ++++++++----------- .../bop_object_on_surface_sampling/main.py | 13 ++++++------ .../bop_object_physics_positioning/README.md | 15 ++++++------- .../bop_object_physics_positioning/main.py | 13 ++++++------ .../bop_object_pose_sampling/README.md | 15 ++++++------- .../datasets/bop_object_pose_sampling/main.py | 7 ++++--- .../datasets/bop_scene_replication/README.md | 10 ++++----- .../datasets/bop_scene_replication/main.py | 4 +--- 8 files changed, 44 insertions(+), 54 deletions(-) diff --git a/examples/datasets/bop_object_on_surface_sampling/README.md b/examples/datasets/bop_object_on_surface_sampling/README.md index 8bedf2f43..7f947f40e 100644 --- a/examples/datasets/bop_object_on_surface_sampling/README.md +++ b/examples/datasets/bop_object_on_surface_sampling/README.md @@ -18,7 +18,6 @@ blenderproc download cc_textures blenderproc run examples/datasets/bop_object_on_surface_sampling/main.py - resources/cctextures examples/datasets/bop_object_on_surface_sampling/output ``` @@ -26,7 +25,6 @@ blenderproc run examples/datasets/bop_object_on_surface_sampling/main.py * `examples/datasets/bop_object_on_surface_sampling/main.py`: path to the python file with pipeline configuration. * ``: path to a folder containing BOP datasets. * ``: name of BOP dataset for which ground truth should be saved, e.g. lm -* ``: path to a bop_toolkit folder. * `resources/cctextures`: path to CCTextures folder * `examples/datasets/bop_object_on_surface_sampling/output`: path to an output folder. @@ -35,9 +33,9 @@ To aggregate data and labels over multiple scenes, simply run the script multipl ## Steps -* Load T-LESS BOP models: `bproc.loader.load_bop()`. -* Load LM BOP models: `bproc.loader.load_bop`. -* Load `` (YCB-V) BOP models: `bproc.loader.load_bop`. +* Load T-LESS BOP models: `bproc.loader.load_bop_objs()`. +* Load LM BOP models: `bproc.loader.load_bop_objs`. +* Load `` (YCB-V) BOP models: `bproc.loader.load_bop_objs`. * Sample colors for T-LESS models: `mat.set_principled_shader_value()`. * Sample roughness and specular values for all objects: `mat.set_principled_shader_value()`. * Construct planes: `bproc.object.create_primiative()`. @@ -57,32 +55,31 @@ To aggregate data and labels over multiple scenes, simply run the script multipl ```python # load distractor bop objects -distractor_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), +distractor_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) ``` ```python -distractor_bop_objs += bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), - sys_paths = args.bop_toolkit_path, +distractor_bop_objs += bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) ``` ```python # load a random sample of bop objects into the scene -sampled_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +sampled_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, sample_objects = True, num_of_objs_to_sample = 10) + +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) ``` * Here we are sampling BOP objects from 3 different datasets. * We load 3 random objects from LM and T-LESS datasets, and 10 objects from the dataset given by `args.bop_dataset_name` (e.g. ycbv in this case). -* Note that each loader loads the camera intrinsics and resolutions of each dataset, thus each subsequent `bproc.loader.load_bop` overwrites these intrinsics. In this example, `args.bop_dataset_name`(ycbv) dataset intrinsics are used when rendering. If required, they can be overwritten by setting `resolution_x, resolution_y, cam_K` in `bproc.camera.set_intrinsics_from_K_matrix()`. +* In this example, `args.bop_dataset_name`(ycbv) dataset intrinsics are used when rendering by `bproc.loader.load_bop_intrinsics()` ### Material Manipulator diff --git a/examples/datasets/bop_object_on_surface_sampling/main.py b/examples/datasets/bop_object_on_surface_sampling/main.py index 9270a7e1b..d97324823 100644 --- a/examples/datasets/bop_object_on_surface_sampling/main.py +++ b/examples/datasets/bop_object_on_surface_sampling/main.py @@ -6,7 +6,6 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") parser.add_argument('output_dir', nargs='?', default="examples/bop_object_on_surface_sampling/output", help="Path to where the final files will be saved ") args = parser.parse_args() @@ -14,25 +13,25 @@ bproc.init() # load a random sample of bop objects into the scene -sampled_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +sampled_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, sample_objects = True, num_of_objs_to_sample = 10) # load distractor bop objects -distractor_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), +distractor_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) -distractor_bop_objs += bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), - sys_paths = args.bop_toolkit_path, +distractor_bop_objs += bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) + # set shading and physics properties and randomize PBR materials for j, obj in enumerate(sampled_bop_objs + distractor_bop_objs): obj.set_shading_mode('auto') diff --git a/examples/datasets/bop_object_physics_positioning/README.md b/examples/datasets/bop_object_physics_positioning/README.md index 99e189c27..5107462bc 100644 --- a/examples/datasets/bop_object_physics_positioning/README.md +++ b/examples/datasets/bop_object_physics_positioning/README.md @@ -18,7 +18,6 @@ blenderproc download cc_textures blenderproc run examples/datasets/bop_object_physics_positioning/main.py - resources/cctextures examples/datasets/bop_object_physics_positioning/output ``` @@ -26,7 +25,6 @@ blenderproc run examples/datasets/bop_object_physics_positioning/main.py * `examples/datasets/bop_object_physics_positioning/main.py`: path to the python file with pipeline configuration. * ``: path to a folder containing BOP datasets * ``: name of BOP dataset for which ground truth should be saved, e.g. ycbv -* ``: path to the bop_toolkit folder * `resources/cctextures`: path to CCTextures folder * `examples/datasets/bop_object_physics_positioning/output`: path to an output folder @@ -35,9 +33,9 @@ To aggregate data and labels over multiple scenes, simply run the script multipl ## Steps -* Load T-LESS BOP models: `bproc.loader.load_bop()`. -* Load LM BOP models: `bproc.loader.load_bop`. -* Load `` (YCB-V) BOP models: `bproc.loader.load_bop`. +* Load T-LESS BOP models: `bproc.loader.load_bop_objs()`. +* Load LM BOP models: `bproc.loader.load_bop_objs`. +* Load `` (YCB-V) BOP models: `bproc.loader.load_bop_objs`. * Sample colors for T-LESS models: `mat.set_principled_shader_value()`. * Sample roughness and specular values for all objects: `mat.set_principled_shader_value()`. * Construct planes: `bproc.object.create_primiative()`. @@ -61,14 +59,12 @@ To aggregate data and labels over multiple scenes, simply run the script multipl # load distractor bop objects distractor_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) ``` ```python distractor_bop_objs += bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) @@ -76,16 +72,17 @@ distractor_bop_objs += bproc.loader.load_bop(bop_dataset_path = os.path.join(arg ```python # load a random sample of bop objects into the scene sampled_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 10) + +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) ``` * Here we are sampling BOP objects from 3 different datasets. * We load 3 random objects from LM and T-LESS datasets, and 10 objects from the dataset given by `""` (e.g. ycbv in this case). * `"obj.set_shading_mode('auto')"` sets the shading for these corresponding objects to auto smoothing. This looks more realistic for meshes that have both sharp edges and curved surfaces like in YCB-V. -* Note that each loader loads the camera intrinsics and resolutions of each dataset, thus each subsequent `BopLoader` overwrites these intrinsics. In this example, `""`(ycbv) dataset intrinsics are used when rendering. If required, they can be overwritten by setting `resolution_x, resolution_y, cam_K` in the camera sampler or global config. +* In this example, `args.bop_dataset_name`(ycbv) dataset intrinsics are used when rendering by `bproc.loader.load_bop_intrinsics()` ### Material Manipulator diff --git a/examples/datasets/bop_object_physics_positioning/main.py b/examples/datasets/bop_object_physics_positioning/main.py index 877641f86..61331d621 100644 --- a/examples/datasets/bop_object_physics_positioning/main.py +++ b/examples/datasets/bop_object_physics_positioning/main.py @@ -6,7 +6,6 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") parser.add_argument('output_dir', nargs='?', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") args = parser.parse_args() @@ -14,26 +13,26 @@ bproc.init() # load a random sample of bop objects into the scene -sampled_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +sampled_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, sample_objects = True, num_of_objs_to_sample = 10) # load distractor bop objects -distractor_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), +distractor_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', - sys_paths = args.bop_toolkit_path, mm2m = True, sample_objects = True, num_of_objs_to_sample = 3) -distractor_bop_objs += bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), - sys_paths = args.bop_toolkit_path, +distractor_bop_objs += bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), mm2m = True, sample_objects = True, num_of_objs_to_sample = 3, obj_instances_limit = 1) +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) + # set shading and physics properties and randomize PBR materials for j, obj in enumerate(sampled_bop_objs + distractor_bop_objs): obj.enable_rigidbody(True, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) diff --git a/examples/datasets/bop_object_pose_sampling/README.md b/examples/datasets/bop_object_pose_sampling/README.md index 160c4604e..be9e688dd 100644 --- a/examples/datasets/bop_object_pose_sampling/README.md +++ b/examples/datasets/bop_object_pose_sampling/README.md @@ -6,19 +6,18 @@ This example shows how to load BOP objects and alternatingly sample light poses, ## Usage -First make sure that you have downloaded a [BOP dataset](https://bop.felk.cvut.cz/datasets/) in the original folder structure. Also please clone the [BOP toolkit](https://github.com/thodan/bop_toolkit). +First make sure that you have downloaded a [BOP dataset](https://bop.felk.cvut.cz/datasets/) in the original folder structure. In [examples/datasets/bop_object_pose_sampling/main.py](main.py) set the `blender_install_path` where Blender is or should be installed. Execute in the BlenderProc main directory: ``` -blenderproc run examples/datasets/bop_object_pose_sampling/main.py examples/datasets/bop_object_pose_sampling/output +blenderproc run examples/datasets/bop_object_pose_sampling/main.py examples/datasets/bop_object_pose_sampling/output ``` * `examples/datasets/bop_object_pose_sampling/main.py`: path to the python file with pipeline configuration. * ``: path to a folder containing BOP datasets. * ``: name of BOP dataset, e.g. lm -* ` `: path to the BOP toolkit containing dataset parameters, etc. * `examples/datasets/bop_object_pose_sampling/output`: path to the output directory. ## Visualization @@ -35,7 +34,7 @@ blenderproc vis coco /path/to/output_dir ## Steps -* Loads object models and camera intrinsics from specified BOP dataset: `bproc.loader.load_bop()`. +* Loads object models and camera intrinsics from specified BOP dataset: `bproc.loader.load_bop_objs()`, `bproc.loader.load_bop_intrinsics()`. * Creates a point light sampled inside a shell * Loops over five times: * Sample Object Poses inside a cube with collision checks @@ -48,14 +47,16 @@ blenderproc vis coco /path/to/output_dir ### BopLoader -If `scene_id` is not specified (default = -1), `loader.BopLoader` simply loads all or the specified `obj_ids` from the BOP dataset given by `bop_dataset_path`. +`bproc.loader.load_bop_objs()` simply loads all or the specified `obj_ids` from the BOP dataset given by `bop_dataset_path`. +`bproc.loader.load_bop_intrinsics()` sets the intrinsics of the BOP dataset. ```python -bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, split = 'val', # careful, some BOP datasets only have test sets obj_ids = [1, 1, 3]) + +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) ``` ### CameraObjectSampler diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index fe57d62c7..1ab2f27f0 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -6,19 +6,20 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") parser.add_argument('output_dir', nargs='?', default="examples/bop_object_pose_sampling/output", help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() # load specified bop objects into the scene -bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, split = 'val', # careful, some BOP datasets only have test sets obj_ids = [1, 1, 3]) +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) + # set shading for j, obj in enumerate(bop_objs): obj.set_shading_mode('auto') diff --git a/examples/datasets/bop_scene_replication/README.md b/examples/datasets/bop_scene_replication/README.md index cfaa1ca16..c72e0f069 100644 --- a/examples/datasets/bop_scene_replication/README.md +++ b/examples/datasets/bop_scene_replication/README.md @@ -6,19 +6,18 @@ This example shows how to synthetically recreate BOP scenes. ## Usage -First make sure that you have downloaded a [BOP dataset](https://bop.felk.cvut.cz/datasets/) in the original folder structure. Also please clone the [BOP toolkit](https://github.com/thodan/bop_toolkit). +First make sure that you have downloaded a [BOP dataset](https://bop.felk.cvut.cz/datasets/) in the original folder structure. In [examples/datasets/bop_scene_replication/main.py](main.py) set the `blender_install_path` where Blender is or should be installed. Execute in the BlenderProc main directory: ``` -blenderproc run examples/datasets/bop_scene_replication/main.py examples/datasets/bop_scene_replication/output +blenderproc run examples/datasets/bop_scene_replication/main.py examples/datasets/bop_scene_replication/output ``` * `examples/datasets/bop_scene_replication/main.py`: path to the python file with pipeline configuration. * ``: path to a folder containing BOP datasets. * ``: name of BOP dataset, e.g. tless -* ` `: path to the BOP toolkit containing dataset parameters, etc. * `examples/datasets/bop_scene_replication/output`: path to the output directory. ## Visualization @@ -31,7 +30,7 @@ blenderproc vis hdf5 example/bop_scene_replication/0.hdf5 ## Steps -* Loads BOP scene with object models, object poses, camera poses and camera intrinsics: `bproc.loader.load_bop()`. +* Loads BOP scene with object models, object poses, camera poses and camera intrinsics: `bproc.loader.load_bop_scene()`. * Creates a point light sampled inside a shell. * Renders rgb: `bproc.renderer()`. * Renders instance segmentation masks: `bproc.renderer()`. @@ -42,8 +41,7 @@ blenderproc vis hdf5 example/bop_scene_replication/0.hdf5 ### BopLoader ```python -bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +bop_objs = bproc.loader.load_bop_scene(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, scene_id = 1, split = 'test') # careful, some BOP datasets only have labeled 'val' sets diff --git a/examples/datasets/bop_scene_replication/main.py b/examples/datasets/bop_scene_replication/main.py index 267d6cf9a..24c67a416 100644 --- a/examples/datasets/bop_scene_replication/main.py +++ b/examples/datasets/bop_scene_replication/main.py @@ -5,15 +5,13 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") parser.add_argument('output_dir', nargs='?', default="examples/bop_scene_replication/output", help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() # load specified bop objects into the scene -bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), - sys_paths = args.bop_toolkit_path, +bop_objs = bproc.loader.load_bop_scene(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, scene_id = 1, split = 'test') # careful, some BOP datasets only have labeled 'val' sets From cc5899819c7cbd819e18ff7c271e7ec70fc7b149 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 26 Nov 2021 17:51:07 +0100 Subject: [PATCH 11/46] Feat(BopChallenge): BlenderProc2 python scripts for all BOP datasets --- README_BlenderProc4BOP.md | 5 + docs/tutorials/loader.md | 4 +- examples/datasets/bop_challenge/README.md | 84 ++++++++-- .../datasets/bop_challenge/main_hb_random.py | 58 +++---- .../bop_challenge/main_icbin_random.py | 145 +++++++++++++++++ .../bop_challenge/main_itodd_random.py | 148 +++++++++++++++++ .../datasets/bop_challenge/main_lm_upright.py | 149 +++++++++++++++++ .../bop_challenge/main_tless_random.py | 151 ++++++++++++++++++ .../bop_challenge/main_tudl_random.py | 147 +++++++++++++++++ .../bop_challenge/main_ycbv_random.py | 147 +++++++++++++++++ 10 files changed, 993 insertions(+), 45 deletions(-) create mode 100644 examples/datasets/bop_challenge/main_icbin_random.py create mode 100644 examples/datasets/bop_challenge/main_itodd_random.py create mode 100644 examples/datasets/bop_challenge/main_lm_upright.py create mode 100644 examples/datasets/bop_challenge/main_tless_random.py create mode 100644 examples/datasets/bop_challenge/main_tudl_random.py create mode 100644 examples/datasets/bop_challenge/main_ycbv_random.py diff --git a/README_BlenderProc4BOP.md b/README_BlenderProc4BOP.md index 4ae3385e6..e2fa59a5c 100644 --- a/README_BlenderProc4BOP.md +++ b/README_BlenderProc4BOP.md @@ -39,9 +39,14 @@ The cameras are positioned to cover the distribution of the ground-truth object * [bop_object_pose_sampling](datasets/examples/datasets/bop_object_pose_sampling): Loads BOP objects and samples the camera, light poses and object poses in a free space. +## Results + +Results of the BOP Challenge 2020 and the superiority of training training with BlenderProc images over ordinary OpenGL images is shown in our paper `BOP Challenge 2020 on 6D Object Localization` [5]. + ## References [1] Hodaň, Michel et al.: [BOP: Benchmark for 6D Object Pose Estimation](http://cmp.felk.cvut.cz/~hodanto2/data/hodan2018bop.pdf), ECCV 2018. [2] Hodaň et al.: [Photorealistic Image Synthesis for Object Instance Detection](https://arxiv.org/abs/1902.03334), ICIP 2019. [3] Denninger, Sundermeyer et al.: [BlenderProc](https://arxiv.org/pdf/1911.01911.pdf), arXiv 2019. [4] Pitteri, Ramamonjisoa et al.: [On Object Symmetries and 6D Pose Estimation from Images](https://arxiv.org/abs/1908.07640), CVPR 2020. +[5] Hodan, Sundermeyer et al.: [BOP Challenge 2020 on 6D Object Localization](https://arxiv.org/pdf/2009.07378.pdf), ECCVW2020 \ No newline at end of file diff --git a/docs/tutorials/loader.md b/docs/tutorials/loader.md index 764bdbecf..8c18c2946 100644 --- a/docs/tutorials/loader.md +++ b/docs/tutorials/loader.md @@ -28,7 +28,9 @@ objs = bproc.loader.load_obj("mymesh.obj") ### Dataset-specific loaders: * `bproc.loader.load_AMASS`: Loads objects from the AMASS Dataset. -* `bproc.loader.load_bop`: Loads the 3D models of any BOP dataset and allows replicating BOP scenes. +* `bproc.loader.load_bop_objs`: Loads the 3D models of any BOP dataset and allows replicating BOP scenes. +* `bproc.loader.load_bop_scene`: Loads any real BOP scenes using 3D models. +* `bproc.loader.load_bop_intrinsics`: Loads intrinsics of specified BOP dataset. * `bproc.loader.load_front3d`: Loads 3D-Front scenes. * `bproc.loader.load_ikea`: Loads objects from the IKEA dataset. * `bproc.loader.load_pix3d`: Loads Pix3D objects. diff --git a/examples/datasets/bop_challenge/README.md b/examples/datasets/bop_challenge/README.md index 55b192d06..cc047bb4c 100644 --- a/examples/datasets/bop_challenge/README.md +++ b/examples/datasets/bop_challenge/README.md @@ -6,13 +6,80 @@ Front readme image

-Here you find the official BlenderProc configs that we used to generate the [provided synthetic data](https://bop.felk.cvut.cz/datasets/) for the BOP Challenge 2020 (7 core datasets). The output datasets are saved in [BOP Format](https://github.com/thodan/bop_toolkit/blob/master/docs/bop_datasets_format.md) in chunks of 1000 images. +Here you find the official BlenderProc implementations that we used to generate the [provided synthetic data](https://bop.felk.cvut.cz/datasets/) for the BOP Challenge (7 core datasets). The output datasets are saved in [BOP Format](https://github.com/thodan/bop_toolkit/blob/master/docs/bop_datasets_format.md) in chunks of 1000 images. -The prerendered datasets with 50K images each are available [here](https://bop.felk.cvut.cz/datasets/), where they are called "PBR-BlenderProc4BOP training images". We ran every config file 2000 times with 25 random cameras per scene. +The prerendered datasets with 50K images each are available [here](https://bop.felk.cvut.cz/datasets/), where they are called "PBR-BlenderProc4BOP training images". -For LineMOD, the objects are placed upright on a plane based on the [bop_object_on_surface_sampling](../bop_object_on_surface_sampling/README.md) example. All other datasets are created by dropping objects using physics based on the [bop_object_physics_positioning](../bop_object_physics_positioning/README.md) example. Make sure to read through them if you want to understand and adapt the configs. +For LineMOD, the objects are placed upright on a plane based on the [bop_object_on_surface_sampling](../bop_object_on_surface_sampling/README.md) example. All other datasets are created by dropping objects using physics based on the [bop_object_physics_positioning](../bop_object_physics_positioning/README.md) example. -## Usage +## Instructions to generate the data + +Here, we explain the usage with the new python format introduced in BlenderProc2, for the original config files, check [below](#original-config-file-usage). + +Download the necessary [BOP datasets](https://bop.felk.cvut.cz/datasets/). + +Execute in the BlenderProc main directory: + +``` +blenderproc download cc_textures +``` + +The following command creates 50K training images in BOP format for the given dataset +``` +blenderpoc run examples/datasets/bop_challenge/main__.py + + resources/cctextures + examples/datasets/bop_challenge/output +``` + +* `examples/datasets/bop_challenge/main__.py`: path to the python file. +* ``: path to a folder containing BOP datasets. +* `resources/cctextures`: path to CCTextures folder +* `examples/datasets/bop_challenge/output`: path to an output folder where the bop_data will be saved + +Tip: If you have access to multiple GPUs, you can speedup the process by dividing the 2000 iterations of the outer loop in a multiple of 40 iterations. Then run the script multiple times with different output folders. At the end, rename and merge the scenes in a joint folder. For example, if you have 10 GPUs, set the outer iterations to 200 and run the script 10 times with different output folders. + +### Complete the BlenderProc4BOP datasets + +To save some time and not copy functionality we use the bop_toolkit to generate the [masks]( +https://github.com/thodan/bop_toolkit/blob/master/scripts/calc_gt_masks.py), [scene_gt_info](https://github.com/thodan/bop_toolkit/blob/master/scripts/calc_gt_info.py) and [scene_gt_coco](https://github.com/thodan/bop_toolkit/blob/master/scripts/calc_gt_coco.py) + +To install the `bop_toolkit` run + +```bash +git clone https://github.com/thodan/bop_toolkit +cd bop_toolkit +pip install -r requirements.txt -e . +``` + +Then at the top of the scripts mentioned above set the following parameters (keep other parameters unchanged): +```python +p = { + # See dataset_params.py for options. + 'dataset': '', + + # Dataset split. Options: 'train', 'val', 'test'. + 'dataset_split': 'train', + + # Dataset split type. None = default. See dataset_params.py for options. + 'dataset_split_type': 'pbr', + + # Folder containing the BOP datasets. + 'datasets_path': '', +} +``` + +To complete your BOP datasets, finally run: + +```bash +python scripts/calc_gt_masks.py +python scripts/calc_gt_info.py +python scripts/calc_gt_coco.py +``` + +## Original Config file usage + +Instead of running the python script once, we ran every config file 2000 times with 25 random cameras per scene. This has the disadvantage that objects need to be loaded at each run. Download the necessary [BOP datasets](https://bop.felk.cvut.cz/datasets/) and the [bop-toolkit](https://github.com/thodan/bop_toolkit). @@ -38,11 +105,4 @@ blenderpoc run examples/datasets/bop_challenge/ * `resources/cctextures`: path to CCTextures folder * `examples/datasets/bop_challenge/output`: path to an output folder where the bop_data will be saved -This creates 25 images of a single scene. To create a whole dataset, simply run the command multiple times. - -### Note - -To save some time and not copy functionality we use the bop_toolkit to generate the [masks]( -https://github.com/thodan/bop_toolkit/blob/master/scripts/calc_gt_masks.py) and also the [scene_gt_info](https://github.com/thodan/bop_toolkit/blob/master/scripts/calc_gt_info.py). There, you will also find a Bop2coco annotations converter. - -Don't forget to set the paths to your generated BOP dataset in bop_toolkit_lib/config.py. +This creates 25 images of a single scene. To create a whole dataset, simply run the command multiple times. \ No newline at end of file diff --git a/examples/datasets/bop_challenge/main_hb_random.py b/examples/datasets/bop_challenge/main_hb_random.py index 401a7a2ca..2661c453c 100644 --- a/examples/datasets/bop_challenge/main_hb_random.py +++ b/examples/datasets/bop_challenge/main_hb_random.py @@ -2,34 +2,25 @@ import argparse import os import numpy as np -import random parser = argparse.ArgumentParser() -parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") -parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('bop_toolkit_path', nargs='?', help="Path to bop toolkit") -parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', nargs='?', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() # load bop objects into the scene -target_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), - sys_paths = args.bop_toolkit_path, - mm2m = True) +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), mm2m = True) # load distractor bop objects -tless_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), - model_type = 'cad', - sys_paths = args.bop_toolkit_path, - mm2m = True) -ycbv_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), - sys_paths = args.bop_toolkit_path, - mm2m = True) -tyol_dist_bop_objs = bproc.loader.load_bop(bop_dataset_path = os.path.join(args.bop_parent_path, 'tyol'), - sys_paths = args.bop_toolkit_path, - mm2m = True) +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) +tyol_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tyol'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb')) # set shading and hide objects for obj in (target_bop_objs + tless_dist_bop_objs + ycbv_dist_bop_objs + tyol_dist_bop_objs): @@ -54,6 +45,7 @@ light_point = bproc.types.Light() light_point.set_energy(200) +# load cc_textures cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) # Define a function that samples 6-DoF poses @@ -63,17 +55,19 @@ def sample_pose_func(obj: bproc.types.MeshObject): obj.set_location(np.random.uniform(min, max)) obj.set_rotation_euler(bproc.sampler.uniformSO3()) -# activate depth rendering and set amount of samples for color rendering +# activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) bproc.renderer.set_samples(50) for i in range(2000): + # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20, replace=False)) sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=2, replace=False)) sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=2, replace=False)) sampled_distractor_bop_objs += list(np.random.choice(tyol_dist_bop_objs, size=2, replace=False)) + # Randomize materials and set physics for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): mat = obj.get_materials()[0] if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: @@ -83,14 +77,14 @@ def sample_pose_func(obj: bproc.types.MeshObject): mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) obj.hide(False) - + + # Sample two light sources light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) light_plane.replace_materials(light_plane_material) - light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, - elevation_min = 5, elevation_max = 89, uniform_volume = True) + elevation_min = 5, elevation_max = 89) light_point.set_location(location) # sample CC Texture and assign to room planes @@ -121,10 +115,9 @@ def sample_pose_func(obj: bproc.types.MeshObject): radius_min = 0.44, radius_max = 1.42, elevation_min = 5, - elevation_max = 89, - uniform_volume = True) + elevation_max = 89) # Determine point of interest in scene as the object closest to the mean of a subset of objects - poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15)) + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15, replace=False)) # Compute rotation based on vector going from location towards poi rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) # Add homog cam pose based on location an rotation @@ -141,12 +134,13 @@ def sample_pose_func(obj: bproc.types.MeshObject): # Write data in bop format bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), - dataset = args.bop_dataset_name, - depth_scale = 0.1, - depths = data["depth"], - colors = data["colors"], - color_file_format = "JPEG", - ignore_dist_thres = 10) + target_objects = sampled_target_bop_objs, + dataset = 'hb', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): obj.disable_rigidbody() diff --git a/examples/datasets/bop_challenge/main_icbin_random.py b/examples/datasets/bop_challenge/main_icbin_random.py new file mode 100644 index 000000000..729319a7a --- /dev/null +++ b/examples/datasets/bop_challenge/main_icbin_random.py @@ -0,0 +1,145 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'icbin'), mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) +hb_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'icbin')) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs + ycbv_dist_bop_objs + hb_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(200) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + obj.set_location(np.random.uniform([-0.2, -0.2, 0.0], [0.2, 0.2, 0.6])) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(hb_dist_bop_objs, size=2, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 1.0)) + mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 20, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.45, + radius_max = 1.08, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15, replace=False)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'icbin', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) diff --git a/examples/datasets/bop_challenge/main_itodd_random.py b/examples/datasets/bop_challenge/main_itodd_random.py new file mode 100644 index 000000000..ba866217c --- /dev/null +++ b/examples/datasets/bop_challenge/main_itodd_random.py @@ -0,0 +1,148 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'itodd'), mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'itodd')) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(20) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.3, -0.3, 0.0], [-0.2, -0.2, 0.0]) + max = np.random.uniform([0.2, 0.2, 0.4], [0.3, 0.3, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=25, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=5, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.7) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 0.5)) + if obj.get_cp("bop_dataset_name") == 'itodd': + mat.set_principled_shader_value("Specular", np.random.uniform(0.3, 1.0)) + mat.set_principled_shader_value("Metallic", np.random.uniform(0, 1.0)) + if obj.get_cp("bop_dataset_name") == 'tless': + mat.set_principled_shader_value("Metallic", np.random.uniform(0, 0.5)) + + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99, collision_margin=0.0005) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(0.1,0.5), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 0.5, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 50, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.64, + radius_max = 0.78, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15, replace=False)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'itodd', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) diff --git a/examples/datasets/bop_challenge/main_lm_upright.py b/examples/datasets/bop_challenge/main_lm_upright.py new file mode 100644 index 000000000..daf85c238 --- /dev/null +++ b/examples/datasets/bop_challenge/main_lm_upright.py @@ -0,0 +1,149 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm'), mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) +tyol_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tyol'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'lm')) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs + ycbv_dist_bop_objs + tyol_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(200) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.3, -0.3, 0.0], [-0.2, -0.2, 0.0]) + max = np.random.uniform([0.2, 0.2, 0.4], [0.3, 0.3, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=15, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=3, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=3, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(tyol_dist_bop_objs, size=3, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 1.0)) + mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Define a function that samples the initial pose of a given object above the ground + def sample_initial_pose(obj: bproc.types.MeshObject): + obj.set_location(bproc.sampler.upper_region(objects_to_sample_on=room_planes[0:1], + min_height=1, max_height=4, face_sample_range=[0.4, 0.6])) + obj.set_rotation_euler(np.random.uniform([0, 0, 0], [0, 0, np.pi * 2])) + + # Sample objects on the given surface + placed_objects = bproc.object.sample_poses_on_surface(objects_to_sample=sampled_target_bop_objs + sampled_distractor_bop_objs, + surface=room_planes[0], + sample_pose_func=sample_initial_pose, + min_distance=0.01, + max_distance=0.2) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.35, + radius_max = 1.5, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=10, replace=False)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-0.7854, 0.7854)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'lm', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.hide(True) \ No newline at end of file diff --git a/examples/datasets/bop_challenge/main_tless_random.py b/examples/datasets/bop_challenge/main_tless_random.py new file mode 100644 index 000000000..020d4fa23 --- /dev/null +++ b/examples/datasets/bop_challenge/main_tless_random.py @@ -0,0 +1,151 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) + +# load distractor bop objects +itodd_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'itodd'), mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) +hb_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless')) + +# set shading and hide objects +for obj in (target_bop_objs + itodd_dist_bop_objs + ycbv_dist_bop_objs + hb_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(100) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.3, -0.3, 0.0], [-0.2, -0.2, 0.0]) + max = np.random.uniform([0.2, 0.2, 0.4], [0.3, 0.3, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20)) + sampled_distractor_bop_objs = list(np.random.choice(itodd_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(hb_dist_bop_objs, size=2, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 0.5)) + if obj.get_cp("bop_dataset_name") == 'itodd': + mat.set_principled_shader_value("Metallic", np.random.uniform(0.5, 1.0)) + if obj.get_cp("bop_dataset_name") == 'tless': + mat.set_principled_shader_value("Specular", np.random.uniform(0.3, 1.0)) + mat.set_principled_shader_value("Metallic", np.random.uniform(0, 0.5)) + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 20, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.65, + radius_max = 0.94, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15, replace=False)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'tless', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) diff --git a/examples/datasets/bop_challenge/main_tudl_random.py b/examples/datasets/bop_challenge/main_tudl_random.py new file mode 100644 index 000000000..73dd9baf9 --- /dev/null +++ b/examples/datasets/bop_challenge/main_tudl_random.py @@ -0,0 +1,147 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tudl'), mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) +ycbv_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) +hb_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'tudl')) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs + ycbv_dist_bop_objs + hb_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(200) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.6, -0.6, 0.0], [-0.4, -0.4, 0.0]) + max = np.random.uniform([0.4, 0.4, 0.4], [0.6, 0.6, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=3, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=7, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(ycbv_dist_bop_objs, size=7, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(hb_dist_bop_objs, size=7, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 1.0)) + mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 20, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.85, + radius_max = 2.02, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=3)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'tudl', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) diff --git a/examples/datasets/bop_challenge/main_ycbv_random.py b/examples/datasets/bop_challenge/main_ycbv_random.py new file mode 100644 index 000000000..b215117cb --- /dev/null +++ b/examples/datasets/bop_challenge/main_ycbv_random.py @@ -0,0 +1,147 @@ +import blenderproc as bproc +import argparse +import os +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") +parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") +parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +args = parser.parse_args() + +bproc.init() + +# load bop objects into the scene +target_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv'), mm2m = True) + +# load distractor bop objects +tless_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tless'), model_type = 'cad', mm2m = True) +hb_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'hb'), mm2m = True) +tyol_dist_bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, 'tyol'), mm2m = True) + +# load BOP datset intrinsics +bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, 'ycbv')) + +# set shading and hide objects +for obj in (target_bop_objs + tless_dist_bop_objs + hb_dist_bop_objs + tyol_dist_bop_objs): + obj.set_shading_mode('auto') + obj.hide(True) + +# create room +room_planes = [bproc.object.create_primitive('PLANE', scale=[2, 2, 1]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, -2, 2], rotation=[-1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[0, 2, 2], rotation=[1.570796, 0, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[2, 0, 2], rotation=[0, -1.570796, 0]), + bproc.object.create_primitive('PLANE', scale=[2, 2, 1], location=[-2, 0, 2], rotation=[0, 1.570796, 0])] +for plane in room_planes: + plane.enable_rigidbody(False, collision_shape='BOX', mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + +# sample light color and strenght from ceiling +light_plane = bproc.object.create_primitive('PLANE', scale=[3, 3, 1], location=[0, 0, 10]) +light_plane.set_name('light_plane') +light_plane_material = bproc.material.create('light_material') + +# sample point light on shell +light_point = bproc.types.Light() +light_point.set_energy(200) + +# load cc_textures +cc_textures = bproc.loader.load_ccmaterials(args.cc_textures_path) + +# Define a function that samples 6-DoF poses +def sample_pose_func(obj: bproc.types.MeshObject): + min = np.random.uniform([-0.3, -0.3, 0.0], [-0.2, -0.2, 0.0]) + max = np.random.uniform([0.2, 0.2, 0.4], [0.3, 0.3, 0.6]) + obj.set_location(np.random.uniform(min, max)) + obj.set_rotation_euler(bproc.sampler.uniformSO3()) + +# activate depth rendering without antialiasing and set amount of samples for color rendering +bproc.renderer.enable_depth_output(activate_antialiasing=False) +bproc.renderer.set_samples(50) + +for i in range(2000): + + # Sample bop objects for a scene + sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=21, replace=False)) + sampled_distractor_bop_objs = list(np.random.choice(tless_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(hb_dist_bop_objs, size=2, replace=False)) + sampled_distractor_bop_objs += list(np.random.choice(tyol_dist_bop_objs, size=2, replace=False)) + + # Randomize materials and set physics + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + mat = obj.get_materials()[0] + if obj.get_cp("bop_dataset_name") in ['itodd', 'tless']: + grey_col = np.random.uniform(0.1, 0.9) + mat.set_principled_shader_value("Base Color", [grey_col, grey_col, grey_col, 1]) + mat.set_principled_shader_value("Roughness", np.random.uniform(0, 1.0)) + mat.set_principled_shader_value("Specular", np.random.uniform(0, 1.0)) + obj.enable_rigidbody(True, mass=1.0, friction = 100.0, linear_damping = 0.99, angular_damping = 0.99) + obj.hide(False) + + # Sample two light sources + light_plane_material.make_emissive(emission_strength=np.random.uniform(3,6), + emission_color=np.random.uniform([0.5, 0.5, 0.5, 1.0], [1.0, 1.0, 1.0, 1.0])) + light_plane.replace_materials(light_plane_material) + light_point.set_color(np.random.uniform([0.5,0.5,0.5],[1,1,1])) + location = bproc.sampler.shell(center = [0, 0, 0], radius_min = 1, radius_max = 1.5, + elevation_min = 5, elevation_max = 89) + light_point.set_location(location) + + # sample CC Texture and assign to room planes + random_cc_texture = np.random.choice(cc_textures) + for plane in room_planes: + plane.replace_materials(random_cc_texture) + + + # Sample object poses and check collisions + bproc.object.sample_poses(objects_to_sample = sampled_target_bop_objs + sampled_distractor_bop_objs, + sample_pose_func = sample_pose_func, + max_tries = 1000) + + # Physics Positioning + bproc.object.simulate_physics_and_fix_final_poses(min_simulation_time=3, + max_simulation_time=10, + check_object_interval=1, + substeps_per_frame = 20, + solver_iters=25) + + # BVH tree used for camera obstacle checks + bop_bvh_tree = bproc.object.create_bvh_tree_multi_objects(sampled_target_bop_objs + sampled_distractor_bop_objs) + + cam_poses = 0 + while cam_poses < 25: + # Sample location + location = bproc.sampler.shell(center = [0, 0, 0], + radius_min = 0.61, + radius_max = 1.24, + elevation_min = 5, + elevation_max = 89) + # Determine point of interest in scene as the object closest to the mean of a subset of objects + poi = bproc.object.compute_poi(np.random.choice(sampled_target_bop_objs, size=15, replace=False)) + # Compute rotation based on vector going from location towards poi + rotation_matrix = bproc.camera.rotation_from_forward_vec(poi - location, inplane_rot=np.random.uniform(-3.14159, 3.14159)) + # Add homog cam pose based on location an rotation + cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) + + # Check that obstacles are at least 0.3 meter away from the camera and make sure the view interesting enough + if bproc.camera.perform_obstacle_in_view_check(cam2world_matrix, {"min": 0.3}, bop_bvh_tree): + # Persist camera pose + bproc.camera.add_camera_pose(cam2world_matrix, frame=cam_poses) + cam_poses += 1 + + # render the whole pipeline + data = bproc.renderer.render() + + # Write data in bop format + bproc.writer.write_bop(os.path.join(args.output_dir, 'bop_data'), + target_objects = sampled_target_bop_objs, + dataset = 'ycbv', + depth_scale = 0.1, + depths = data["depth"], + colors = data["colors"], + color_file_format = "JPEG", + ignore_dist_thres = 10) + + for obj in (sampled_target_bop_objs + sampled_distractor_bop_objs): + obj.disable_rigidbody() + obj.hide(True) From b6060832291f41552e9272f52d6473b16fe78be7 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 26 Nov 2021 17:51:59 +0100 Subject: [PATCH 12/46] Feat(BopWriter): Allow setting target objects for write_bop --- .../python/modules/writer/BopWriter.py | 14 +++++++----- blenderproc/python/writer/BopWriterUtility.py | 22 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/blenderproc/python/modules/writer/BopWriter.py b/blenderproc/python/modules/writer/BopWriter.py index 15e88da8d..74cb986d6 100644 --- a/blenderproc/python/modules/writer/BopWriter.py +++ b/blenderproc/python/modules/writer/BopWriter.py @@ -1,5 +1,6 @@ from blenderproc.python.modules.writer.WriterInterface import WriterInterface from blenderproc.python.writer.BopWriterUtility import write_bop +from blenderproc.python.type.MeshObjectUtility import MeshObject import os @@ -68,10 +69,11 @@ def run(self): if self._avoid_output: print("Avoid output is on, no output produced!") else: + MeshObject.get_all_mesh_objects() write_bop(output_dir = os.path.join(self._determine_output_dir(False), 'bop_data'), - dataset = self._dataset, - append_to_existing_output = self._append_to_existing_output, - depth_scale = self._depth_scale, - save_world2cam = self._save_world2cam, - ignore_dist_thres = self._ignore_dist_thres, - m2mm = self._mm2m) \ No newline at end of file + dataset = self._dataset, + append_to_existing_output = self._append_to_existing_output, + depth_scale = self._depth_scale, + save_world2cam = self._save_world2cam, + ignore_dist_thres = self._ignore_dist_thres, + m2mm = self._mm2m) \ No newline at end of file diff --git a/blenderproc/python/writer/BopWriterUtility.py b/blenderproc/python/writer/BopWriterUtility.py index 8ba535900..811d6eec0 100644 --- a/blenderproc/python/writer/BopWriterUtility.py +++ b/blenderproc/python/writer/BopWriterUtility.py @@ -1,3 +1,4 @@ +from blenderproc.python.types.MeshObjectUtility import MeshObject import json import os import glob @@ -15,13 +16,14 @@ from blenderproc.python.writer.WriterUtility import WriterUtility -def write_bop(output_dir: str, depths: Optional[List[np.ndarray]] = None, colors: Optional[List[np.ndarray]] = None, - color_file_format: str = "PNG", dataset: str = "", append_to_existing_output: bool = True, - depth_scale: float = 1.0, jpg_quality: int = 95, save_world2cam: bool = True, +def write_bop(output_dir: str, target_objects: Optional[List[MeshObject]] = None, depths: Optional[List[np.ndarray]] = None, + colors: Optional[List[np.ndarray]] = None, color_file_format: str = "PNG", dataset: str = "", + append_to_existing_output: bool = True, depth_scale: float = 1.0, jpg_quality: int = 95, save_world2cam: bool = True, ignore_dist_thres: float = 100., m2mm: bool = True, frames_per_chunk: int = 1000): """Write the BOP data :param output_dir: Path to the output directory. + :param target_objects: Objects for which to save ground truth poses in BOP format. Default: Save all objects or from specified dataset :param depths: List of depth images in m to save :param colors: List of color images to save :param color_file_format: File type to save color images. Available: "PNG", "JPEG" @@ -53,17 +55,17 @@ def write_bop(output_dir: str, depths: Optional[List[np.ndarray]] = None, colors elif not append_to_existing_output: raise Exception("The output folder already exists: {}.".format(dataset_dir)) - all_mesh_objects = get_all_blender_mesh_objects() - - # Select objects from the specified dataset. - if dataset: + # Select target objects or objects from the specified dataset or all objects + if target_objects is not None: + dataset_objects = [t_obj.blender_obj for t_obj in target_objects] + elif dataset: dataset_objects = [] - for obj in all_mesh_objects: - if "bop_dataset_name" in obj: + for obj in get_all_blender_mesh_objects(): + if "bop_dataset_name" in obj and not obj.hide_render: if obj["bop_dataset_name"] == dataset: dataset_objects.append(obj) else: - dataset_objects = all_mesh_objects + dataset_objects = get_all_blender_mesh_objects() # Check if there is any object from the specified dataset. if not dataset_objects: From 46db849f956ae4d7382554e1d8f0392805dadb86 Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Sat, 27 Nov 2021 16:07:47 +0100 Subject: [PATCH 13/46] Fix(camera_object_pose): fct arguments --- blenderproc/python/modules/writer/BopWriter.py | 2 -- examples/basics/camera_object_pose/README.md | 2 +- examples/basics/camera_object_pose/main.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/blenderproc/python/modules/writer/BopWriter.py b/blenderproc/python/modules/writer/BopWriter.py index 74cb986d6..8fde2591f 100644 --- a/blenderproc/python/modules/writer/BopWriter.py +++ b/blenderproc/python/modules/writer/BopWriter.py @@ -1,6 +1,5 @@ from blenderproc.python.modules.writer.WriterInterface import WriterInterface from blenderproc.python.writer.BopWriterUtility import write_bop -from blenderproc.python.type.MeshObjectUtility import MeshObject import os @@ -69,7 +68,6 @@ def run(self): if self._avoid_output: print("Avoid output is on, no output produced!") else: - MeshObject.get_all_mesh_objects() write_bop(output_dir = os.path.join(self._determine_output_dir(False), 'bop_data'), dataset = self._dataset, append_to_existing_output = self._append_to_existing_output, diff --git a/examples/basics/camera_object_pose/README.md b/examples/basics/camera_object_pose/README.md index 88b338c18..1dad01cb8 100644 --- a/examples/basics/camera_object_pose/README.md +++ b/examples/basics/camera_object_pose/README.md @@ -80,7 +80,7 @@ bproc.camera.add_camera_pose(cam2world) data = bproc.renderer.render() # Write object poses, color and depth in bop format -bproc.writer.write_bop(args.output_dir, data["depth"], data["colors"], m2mm=True, append_to_existing_output=True) +bproc.writer.write_bop(args.output_dir, [obj], data["depth"], data["colors"], m2mm=True, append_to_existing_output=True) ``` * Saves all pose and camera information that is provided in BOP datasets. diff --git a/examples/basics/camera_object_pose/main.py b/examples/basics/camera_object_pose/main.py index 3faf6d65b..f99ba1496 100644 --- a/examples/basics/camera_object_pose/main.py +++ b/examples/basics/camera_object_pose/main.py @@ -60,4 +60,4 @@ data = bproc.renderer.render() # Write object poses, color and depth in bop format -bproc.writer.write_bop(args.output_dir, data["depth"], data["colors"], m2mm=True, append_to_existing_output=True) +bproc.writer.write_bop(args.output_dir, [obj], data["depth"], data["colors"], m2mm=True, append_to_existing_output=True) From 1d0e1ecc3ff059924e1655539f6bb766f75d62d0 Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Fri, 3 Dec 2021 11:21:36 +0100 Subject: [PATCH 14/46] Fix(load_objs_b remove split arg --- examples/datasets/bop_object_pose_sampling/README.md | 1 - examples/datasets/bop_object_pose_sampling/main.py | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/datasets/bop_object_pose_sampling/README.md b/examples/datasets/bop_object_pose_sampling/README.md index be9e688dd..3c607f085 100644 --- a/examples/datasets/bop_object_pose_sampling/README.md +++ b/examples/datasets/bop_object_pose_sampling/README.md @@ -53,7 +53,6 @@ blenderproc vis coco /path/to/output_dir ```python bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, - split = 'val', # careful, some BOP datasets only have test sets obj_ids = [1, 1, 3]) bproc.loader.load_bop_intrinsics(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name)) diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index 1ab2f27f0..762bbfa76 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -14,7 +14,6 @@ # load specified bop objects into the scene bop_objs = bproc.loader.load_bop_objs(bop_dataset_path = os.path.join(args.bop_parent_path, args.bop_dataset_name), mm2m = True, - split = 'val', # careful, some BOP datasets only have test sets obj_ids = [1, 1, 3]) # load BOP datset intrinsics From 3eadcd3b67801703029446da39ddb95307092937 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:15:19 +0100 Subject: [PATCH 15/46] feat(blender_3.0.0): add blender 3.0.0 deactivate auto tile size, as this is not used anymore -> change iteration over devices to new API --- blenderproc/python/renderer/RendererUtility.py | 3 ++- blenderproc/python/utility/Initializer.py | 5 ++--- blenderproc/python/utility/InstallUtility.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index 51c4be883..b9cdc4677 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -100,7 +100,8 @@ def toggle_auto_tile_size(enable: bool): :param enable: True, if it should be enabled. """ - bpy.context.scene.ats_settings.is_enabled = enable + #bpy.context.scene.ats_settings.is_enabled = enable + pass def set_tile_size(tile_x: int, tile_y: int): diff --git a/blenderproc/python/utility/Initializer.py b/blenderproc/python/utility/Initializer.py index 39c4961de..bf11d4948 100644 --- a/blenderproc/python/utility/Initializer.py +++ b/blenderproc/python/utility/Initializer.py @@ -56,9 +56,8 @@ def init(horizon_color: list = [0.05, 0.05, 0.05], compute_device: str = "GPU", if found: break # make sure that all visible GPUs are used - for group in prefs.get_devices(): - for d in group: - d.use = True + for device in prefs.devices: + device.use = True # Set the Experimental features on/off if use_experimental_features: diff --git a/blenderproc/python/utility/InstallUtility.py b/blenderproc/python/utility/InstallUtility.py index 58f1f1bc3..1009ce5a7 100644 --- a/blenderproc/python/utility/InstallUtility.py +++ b/blenderproc/python/utility/InstallUtility.py @@ -80,7 +80,7 @@ def make_sure_blender_is_installed(custom_blender_path: str, blender_install_pat # Determine configured version # right new only support blender-2.93 - major_version = "2.93" + major_version = "3.0" minor_version = "0" blender_version = "blender-{}.{}".format(major_version, minor_version) if platform == "linux" or platform == "linux2": From 9510b640900f085a078ce13f6ff0a6d5bd5b6bfa Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:16:44 +0100 Subject: [PATCH 16/46] chore(set_samples): rename set_samples to set_max_amount_of_samples --- blenderproc/api/renderer/__init__.py | 2 +- blenderproc/python/modules/renderer/RendererInterface.py | 2 +- blenderproc/python/renderer/FlowRendererUtility.py | 2 +- blenderproc/python/renderer/NOCSRendererUtility.py | 2 +- blenderproc/python/renderer/RendererUtility.py | 4 ++-- blenderproc/python/renderer/SegMapRendererUtility.py | 2 +- blenderproc/python/utility/Initializer.py | 2 +- docs/tutorials/renderer.md | 2 +- examples/advanced/camera_depth_of_field/main.py | 2 +- examples/advanced/coco_annotations/main.py | 2 +- examples/advanced/diffuse_color_image/main.py | 2 +- examples/advanced/dust/main.py | 2 +- examples/advanced/entity_displacement_modifier/main.py | 2 +- examples/advanced/lens_distortion/main.py | 2 +- examples/advanced/lens_distortion/main_callab.py | 2 +- examples/advanced/material_randomizer/main.py | 2 +- .../advanced/motion_blur_rolling_shutter/main_motion_blur.py | 2 +- .../motion_blur_rolling_shutter/main_rolling_shutter.py | 2 +- examples/advanced/object_pose_sampling/main.py | 2 +- examples/advanced/on_surface_object_sampling/main.py | 2 +- examples/advanced/random_room_constructor/main.py | 2 +- examples/basics/basic/README.md | 2 +- examples/basics/basic/main.py | 2 +- examples/basics/camera_object_pose/main.py | 2 +- examples/basics/camera_sampling/main.py | 2 +- examples/basics/entity_manipulation/main.py | 2 +- examples/basics/material_manipulation/main.py | 2 +- examples/datasets/amass_human_poses/main.py | 2 +- examples/datasets/blenderkit/main.py | 2 +- examples/datasets/bop_object_on_surface_sampling/README.md | 2 +- examples/datasets/bop_object_on_surface_sampling/main.py | 2 +- examples/datasets/bop_object_physics_positioning/README.md | 2 +- examples/datasets/bop_object_physics_positioning/main.py | 2 +- examples/datasets/bop_object_pose_sampling/main.py | 2 +- examples/datasets/bop_scene_replication/main.py | 2 +- examples/datasets/front_3d/main.py | 2 +- examples/datasets/front_3d_with_improved_mat/main.py | 2 +- examples/datasets/haven/main.py | 2 +- examples/datasets/ikea/main.py | 2 +- examples/datasets/pix3d/main.py | 2 +- examples/datasets/scenenet/main.py | 2 +- examples/datasets/scenenet_with_cctextures/main.py | 2 +- examples/datasets/shapenet/README.md | 3 ++- examples/datasets/shapenet/main.py | 2 +- examples/datasets/shapenet_with_scenenet/main.py | 2 +- examples/datasets/shapenet_with_suncg/main.py | 2 +- examples/datasets/suncg_with_improved_mat/main.py | 2 +- 47 files changed, 49 insertions(+), 48 deletions(-) diff --git a/blenderproc/api/renderer/__init__.py b/blenderproc/api/renderer/__init__.py index df732700f..86e7ee739 100644 --- a/blenderproc/api/renderer/__init__.py +++ b/blenderproc/api/renderer/__init__.py @@ -1,7 +1,7 @@ from blenderproc.python.renderer.RendererUtility import set_denoiser, set_light_bounces, toggle_auto_tile_size, \ set_tile_size, set_cpu_threads, toggle_stereo, set_simplify_subdivision_render, set_adaptive_sampling, \ - set_samples, enable_distance_output, enable_depth_output, enable_normals_output, enable_diffuse_color_output,\ + set_max_amount_of_samples, enable_distance_output, enable_depth_output, enable_normals_output, enable_diffuse_color_output,\ map_file_format_to_file_ending, render, set_output_format, enable_motion_blur, set_world_background from blenderproc.python.renderer.SegMapRendererUtility import render_segmap from blenderproc.python.renderer.FlowRendererUtility import render_optical_flow diff --git a/blenderproc/python/modules/renderer/RendererInterface.py b/blenderproc/python/modules/renderer/RendererInterface.py index 93d7161d4..9e2a990a6 100644 --- a/blenderproc/python/modules/renderer/RendererInterface.py +++ b/blenderproc/python/modules/renderer/RendererInterface.py @@ -137,7 +137,7 @@ def _configure_renderer(self, default_samples: int = 256, use_denoiser: bool = F :param default_denoiser: Either "Intel" or "Blender", "Intel" performs much better in most cases """ RendererUtility._render_init() - RendererUtility.set_samples(self.config.get_int("samples", default_samples)) + RendererUtility.set_max_amount_of_samples(self.config.get_int("samples", default_samples)) if self.config.has_param("use_adaptive_sampling"): RendererUtility.set_adaptive_sampling(self.config.get_float("use_adaptive_sampling")) diff --git a/blenderproc/python/renderer/FlowRendererUtility.py b/blenderproc/python/renderer/FlowRendererUtility.py index b3e087f8e..b8c5fec99 100644 --- a/blenderproc/python/renderer/FlowRendererUtility.py +++ b/blenderproc/python/renderer/FlowRendererUtility.py @@ -42,7 +42,7 @@ def render_optical_flow(output_dir: str = None, temp_dir: str = None, get_forwar with Utility.UndoAfterExecution(): RendererUtility._render_init() - RendererUtility.set_samples(1) + RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_adaptive_sampling(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) diff --git a/blenderproc/python/renderer/NOCSRendererUtility.py b/blenderproc/python/renderer/NOCSRendererUtility.py index b61602826..a4bdd8bdf 100644 --- a/blenderproc/python/renderer/NOCSRendererUtility.py +++ b/blenderproc/python/renderer/NOCSRendererUtility.py @@ -44,7 +44,7 @@ def render_nocs(output_dir: Optional[str] = None, file_prefix: str = "nocs_", ou # Set all fast rendering parameters with only one ray per pixel RendererUtility._render_init() - RendererUtility.set_samples(1) + RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_adaptive_sampling(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index b9cdc4677..1450590cb 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -166,7 +166,7 @@ def set_adaptive_sampling(adaptive_threshold: float): bpy.context.scene.cycles.use_adaptive_sampling = False -def set_samples(samples: int): +def set_max_amount_of_samples(samples: int): """ Sets the number of samples to render for each pixel. :param samples: The number of samples per pixel @@ -617,4 +617,4 @@ def set_world_background(color: List[float], strength: float = 1): links.remove(nodes.get("Background").inputs['Color'].links[0]) nodes.get("Background").inputs['Strength'].default_value = strength - nodes.get("Background").inputs['Color'].default_value = color + [1] \ No newline at end of file + nodes.get("Background").inputs['Color'].default_value = color + [1] diff --git a/blenderproc/python/renderer/SegMapRendererUtility.py b/blenderproc/python/renderer/SegMapRendererUtility.py index c99168f40..4474689e5 100644 --- a/blenderproc/python/renderer/SegMapRendererUtility.py +++ b/blenderproc/python/renderer/SegMapRendererUtility.py @@ -47,7 +47,7 @@ def render_segmap(output_dir: Optional[str] = None, temp_dir: Optional[str] = No with Utility.UndoAfterExecution(): RendererUtility._render_init() - RendererUtility.set_samples(1) + RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_adaptive_sampling(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) diff --git a/blenderproc/python/utility/Initializer.py b/blenderproc/python/utility/Initializer.py index bf11d4948..449f1113c 100644 --- a/blenderproc/python/utility/Initializer.py +++ b/blenderproc/python/utility/Initializer.py @@ -116,7 +116,7 @@ def set_default_parameters(): # Init renderer RendererUtility._render_init() - RendererUtility.set_samples(DefaultConfig.samples) + RendererUtility.set_max_amount_of_samples(DefaultConfig.samples) addon_utils.enable("render_auto_tile_size") RendererUtility.toggle_auto_tile_size(True) diff --git a/docs/tutorials/renderer.md b/docs/tutorials/renderer.md index 38a1fe26c..1e6a04d3d 100644 --- a/docs/tutorials/renderer.md +++ b/docs/tutorials/renderer.md @@ -43,7 +43,7 @@ In [depth images](https://en.wikipedia.org/wiki/Depth_map), each pixel contains As blender uses a raytracer, the number of rays influences the required amount of computation and the noise in the rendered image. The more rays are computed, the longer the rendering takes, but the more accurate and less noisy the resulting image is. -The number of rays can be controlled by using `bproc.renderer.set_samples(num_samples)`. +The number of rays can be controlled by using `bproc.renderer.set_max_amount_of_samples(num_samples)`. Hereby, `num_samples` sets the number of rays that are traced per pixel. For more information about how blenders renderer works visit the [blender docu](https://docs.blender.org/manual/en/latest/render/cycles/render_settings/sampling.html). diff --git a/examples/advanced/camera_depth_of_field/main.py b/examples/advanced/camera_depth_of_field/main.py index c8bbc3e96..1677b1c10 100644 --- a/examples/advanced/camera_depth_of_field/main.py +++ b/examples/advanced/camera_depth_of_field/main.py @@ -42,7 +42,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/coco_annotations/main.py b/examples/advanced/coco_annotations/main.py index 6ffc42948..b596695b6 100644 --- a/examples/advanced/coco_annotations/main.py +++ b/examples/advanced/coco_annotations/main.py @@ -38,7 +38,7 @@ bproc.renderer.enable_normals_output() # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/diffuse_color_image/main.py b/examples/advanced/diffuse_color_image/main.py index f73a8597c..e482d2c64 100644 --- a/examples/advanced/diffuse_color_image/main.py +++ b/examples/advanced/diffuse_color_image/main.py @@ -36,7 +36,7 @@ # Also enable the diffuse color image, which describes the base color of the textures bproc.renderer.enable_diffuse_color_output() # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/dust/main.py b/examples/advanced/dust/main.py index 668524d08..dbf6521f3 100644 --- a/examples/advanced/dust/main.py +++ b/examples/advanced/dust/main.py @@ -40,7 +40,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/entity_displacement_modifier/main.py b/examples/advanced/entity_displacement_modifier/main.py index d2daf60e5..694ddd6cd 100644 --- a/examples/advanced/entity_displacement_modifier/main.py +++ b/examples/advanced/entity_displacement_modifier/main.py @@ -44,7 +44,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/lens_distortion/main.py b/examples/advanced/lens_distortion/main.py index a8d75b772..1c9840bb1 100644 --- a/examples/advanced/lens_distortion/main.py +++ b/examples/advanced/lens_distortion/main.py @@ -48,7 +48,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_distance_output(activate_antialiasing=True) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/lens_distortion/main_callab.py b/examples/advanced/lens_distortion/main_callab.py index 8d2597a2d..c9a5ee26a 100644 --- a/examples/advanced/lens_distortion/main_callab.py +++ b/examples/advanced/lens_distortion/main_callab.py @@ -46,7 +46,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_distance_output(activate_antialiasing=True) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(20) +bproc.renderer.set_max_amount_of_samples(20) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/material_randomizer/main.py b/examples/advanced/material_randomizer/main.py index cd025ef9d..08362bce0 100644 --- a/examples/advanced/material_randomizer/main.py +++ b/examples/advanced/material_randomizer/main.py @@ -39,7 +39,7 @@ obj.set_material(i, random.choice(materials)) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py b/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py index 157f3a3a3..473eb7f15 100644 --- a/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py +++ b/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py @@ -38,7 +38,7 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py b/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py index c83af8c13..cc6c4ef71 100644 --- a/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py +++ b/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py @@ -42,7 +42,7 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/object_pose_sampling/main.py b/examples/advanced/object_pose_sampling/main.py index f90c26b01..a3f9eacbd 100644 --- a/examples/advanced/object_pose_sampling/main.py +++ b/examples/advanced/object_pose_sampling/main.py @@ -45,7 +45,7 @@ def sample_pose(obj: bproc.types.MeshObject): # activate normal rendering bproc.renderer.enable_normals_output() # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/on_surface_object_sampling/main.py b/examples/advanced/on_surface_object_sampling/main.py index 2ada66873..7246519a5 100644 --- a/examples/advanced/on_surface_object_sampling/main.py +++ b/examples/advanced/on_surface_object_sampling/main.py @@ -58,7 +58,7 @@ def sample_pose(obj: bproc.types.MeshObject): bproc.camera.add_camera_pose(matrix_world) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/random_room_constructor/main.py b/examples/advanced/random_room_constructor/main.py index 600f52454..6a891e802 100644 --- a/examples/advanced/random_room_constructor/main.py +++ b/examples/advanced/random_room_constructor/main.py @@ -47,7 +47,7 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) bproc.renderer.set_light_bounces(max_bounces=200, diffuse_bounces=200, glossy_bounces=200, transmission_bounces=200, transparent_max_bounces=200) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/basic/README.md b/examples/basics/basic/README.md index 1c420e138..ab414f10e 100644 --- a/examples/basics/basic/README.md +++ b/examples/basics/basic/README.md @@ -111,7 +111,7 @@ location_x location_y location_z rotation_euler_x rotation_euler_y rotation_eul bproc.renderer.enable_depth_output(activate_antialiasing=False) bproc.renderer.enable_normals_output() # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/basic/main.py b/examples/basics/basic/main.py index 8851f2115..5d9b63d45 100644 --- a/examples/basics/basic/main.py +++ b/examples/basics/basic/main.py @@ -33,7 +33,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/camera_object_pose/main.py b/examples/basics/camera_object_pose/main.py index 3faf6d65b..fd68b4897 100644 --- a/examples/basics/camera_object_pose/main.py +++ b/examples/basics/camera_object_pose/main.py @@ -54,7 +54,7 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(100) +bproc.renderer.set_max_amount_of_samples(100) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/camera_sampling/main.py b/examples/basics/camera_sampling/main.py index a516cfb62..74d60ed41 100644 --- a/examples/basics/camera_sampling/main.py +++ b/examples/basics/camera_sampling/main.py @@ -34,7 +34,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/entity_manipulation/main.py b/examples/basics/entity_manipulation/main.py index 45999359f..5403bdda1 100644 --- a/examples/basics/entity_manipulation/main.py +++ b/examples/basics/entity_manipulation/main.py @@ -35,7 +35,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/material_manipulation/main.py b/examples/basics/material_manipulation/main.py index 3deee82e1..146a788a0 100644 --- a/examples/basics/material_manipulation/main.py +++ b/examples/basics/material_manipulation/main.py @@ -46,7 +46,7 @@ mat.set_principled_shader_value("Base Color", image) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/amass_human_poses/main.py b/examples/datasets/amass_human_poses/main.py index 5e43315b1..afcb791bd 100644 --- a/examples/datasets/amass_human_poses/main.py +++ b/examples/datasets/amass_human_poses/main.py @@ -40,7 +40,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/blenderkit/main.py b/examples/datasets/blenderkit/main.py index 7e4f0ea6c..8ded78333 100644 --- a/examples/datasets/blenderkit/main.py +++ b/examples/datasets/blenderkit/main.py @@ -34,7 +34,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_on_surface_sampling/README.md b/examples/datasets/bop_object_on_surface_sampling/README.md index 8bedf2f43..1358a0009 100644 --- a/examples/datasets/bop_object_on_surface_sampling/README.md +++ b/examples/datasets/bop_object_on_surface_sampling/README.md @@ -218,7 +218,7 @@ while poses < 10: ```python bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) ``` * Renders RGB using 50 `"samples"` and also outputs depth images. diff --git a/examples/datasets/bop_object_on_surface_sampling/main.py b/examples/datasets/bop_object_on_surface_sampling/main.py index 9270a7e1b..6a5b05888 100644 --- a/examples/datasets/bop_object_on_surface_sampling/main.py +++ b/examples/datasets/bop_object_on_surface_sampling/main.py @@ -113,7 +113,7 @@ def sample_initial_pose(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_physics_positioning/README.md b/examples/datasets/bop_object_physics_positioning/README.md index 99e189c27..9dcd5e41f 100644 --- a/examples/datasets/bop_object_physics_positioning/README.md +++ b/examples/datasets/bop_object_physics_positioning/README.md @@ -235,7 +235,7 @@ while poses < 10: ```python bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) ``` * Renders RGB using 50 `"samples"` and also outputs depth images. diff --git a/examples/datasets/bop_object_physics_positioning/main.py b/examples/datasets/bop_object_physics_positioning/main.py index 877641f86..ef5727765 100644 --- a/examples/datasets/bop_object_physics_positioning/main.py +++ b/examples/datasets/bop_object_physics_positioning/main.py @@ -123,7 +123,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index fe57d62c7..29ba278bd 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -37,7 +37,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # Render five different scenes for _ in range(5): diff --git a/examples/datasets/bop_scene_replication/main.py b/examples/datasets/bop_scene_replication/main.py index 267d6cf9a..2aecfa2b5 100644 --- a/examples/datasets/bop_scene_replication/main.py +++ b/examples/datasets/bop_scene_replication/main.py @@ -29,7 +29,7 @@ # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) +bproc.renderer.set_max_amount_of_samples(50) # render the cameras of the current scene data = bproc.renderer.render() diff --git a/examples/datasets/front_3d/main.py b/examples/datasets/front_3d/main.py index c5641755e..2d21e2675 100644 --- a/examples/datasets/front_3d/main.py +++ b/examples/datasets/front_3d/main.py @@ -70,7 +70,7 @@ def check_name(name): # Also render normals bproc.renderer.enable_normals_output() # set the sample amount to 350 -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/front_3d_with_improved_mat/main.py b/examples/datasets/front_3d_with_improved_mat/main.py index 10787a137..99bbb81c5 100644 --- a/examples/datasets/front_3d_with_improved_mat/main.py +++ b/examples/datasets/front_3d_with_improved_mat/main.py @@ -101,7 +101,7 @@ def check_name(name): # Also render normals bproc.renderer.enable_normals_output() # set the sample amount to 350 -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/haven/main.py b/examples/datasets/haven/main.py index ad6a06416..64d90940d 100644 --- a/examples/datasets/haven/main.py +++ b/examples/datasets/haven/main.py @@ -38,7 +38,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/ikea/main.py b/examples/datasets/ikea/main.py index a05ba46b0..df2bc835d 100644 --- a/examples/datasets/ikea/main.py +++ b/examples/datasets/ikea/main.py @@ -33,7 +33,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/pix3d/main.py b/examples/datasets/pix3d/main.py index 23117611d..4d48d5752 100644 --- a/examples/datasets/pix3d/main.py +++ b/examples/datasets/pix3d/main.py @@ -33,7 +33,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/scenenet/main.py b/examples/datasets/scenenet/main.py index 9df87a2d6..d6dc7a878 100644 --- a/examples/datasets/scenenet/main.py +++ b/examples/datasets/scenenet/main.py @@ -77,7 +77,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/scenenet_with_cctextures/main.py b/examples/datasets/scenenet_with_cctextures/main.py index 3ef4866a6..4c7a8e523 100644 --- a/examples/datasets/scenenet_with_cctextures/main.py +++ b/examples/datasets/scenenet_with_cctextures/main.py @@ -94,7 +94,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet/README.md b/examples/datasets/shapenet/README.md index f26375845..1c612efa0 100644 --- a/examples/datasets/shapenet/README.md +++ b/examples/datasets/shapenet/README.md @@ -77,12 +77,13 @@ Each cameras rotation is such that it looks directly at the object and the camer ## RGB Renderer + ```python # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet/main.py b/examples/datasets/shapenet/main.py index 91f36f61d..f0d809fab 100644 --- a/examples/datasets/shapenet/main.py +++ b/examples/datasets/shapenet/main.py @@ -31,7 +31,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet_with_scenenet/main.py b/examples/datasets/shapenet_with_scenenet/main.py index c51cb4021..5fa44a33b 100644 --- a/examples/datasets/shapenet_with_scenenet/main.py +++ b/examples/datasets/shapenet_with_scenenet/main.py @@ -87,7 +87,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(150) +bproc.renderer.set_max_amount_of_samples(150) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet_with_suncg/main.py b/examples/datasets/shapenet_with_suncg/main.py index d521b2c75..2ef01cc6a 100644 --- a/examples/datasets/shapenet_with_suncg/main.py +++ b/examples/datasets/shapenet_with_suncg/main.py @@ -54,7 +54,7 @@ bproc.camera.add_camera_pose(cam2world_matrix) # set the number of samples to render for each object -bproc.renderer.set_samples(150) +bproc.renderer.set_max_amount_of_samples(150) # activate normal and depth rendering bproc.renderer.enable_normals_output() diff --git a/examples/datasets/suncg_with_improved_mat/main.py b/examples/datasets/suncg_with_improved_mat/main.py index d7428cc0a..aa32f8bda 100644 --- a/examples/datasets/suncg_with_improved_mat/main.py +++ b/examples/datasets/suncg_with_improved_mat/main.py @@ -69,7 +69,7 @@ bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) # set the amount of samples, which should be used for the color rendering -bproc.renderer.set_samples(350) +bproc.renderer.set_max_amount_of_samples(350) bproc.material.add_alpha_channel_to_textures(blurry_edges=True) From 8f34699dabadc6d0390c0da655214ca5f8e82320 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:26:14 +0100 Subject: [PATCH 17/46] chore(set_noise_threshold): rename set_adaptive_sampling fct. to better reflect its use-case. --- blenderproc/api/renderer/__init__.py | 2 +- blenderproc/python/modules/renderer/RendererInterface.py | 2 +- blenderproc/python/renderer/FlowRendererUtility.py | 2 +- blenderproc/python/renderer/NOCSRendererUtility.py | 2 +- blenderproc/python/renderer/RendererUtility.py | 9 ++++----- blenderproc/python/renderer/SegMapRendererUtility.py | 2 +- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/blenderproc/api/renderer/__init__.py b/blenderproc/api/renderer/__init__.py index 86e7ee739..061e42314 100644 --- a/blenderproc/api/renderer/__init__.py +++ b/blenderproc/api/renderer/__init__.py @@ -1,6 +1,6 @@ from blenderproc.python.renderer.RendererUtility import set_denoiser, set_light_bounces, toggle_auto_tile_size, \ - set_tile_size, set_cpu_threads, toggle_stereo, set_simplify_subdivision_render, set_adaptive_sampling, \ + set_tile_size, set_cpu_threads, toggle_stereo, set_simplify_subdivision_render, set_noise_threshold, \ set_max_amount_of_samples, enable_distance_output, enable_depth_output, enable_normals_output, enable_diffuse_color_output,\ map_file_format_to_file_ending, render, set_output_format, enable_motion_blur, set_world_background from blenderproc.python.renderer.SegMapRendererUtility import render_segmap diff --git a/blenderproc/python/modules/renderer/RendererInterface.py b/blenderproc/python/modules/renderer/RendererInterface.py index 9e2a990a6..0d9428c47 100644 --- a/blenderproc/python/modules/renderer/RendererInterface.py +++ b/blenderproc/python/modules/renderer/RendererInterface.py @@ -140,7 +140,7 @@ def _configure_renderer(self, default_samples: int = 256, use_denoiser: bool = F RendererUtility.set_max_amount_of_samples(self.config.get_int("samples", default_samples)) if self.config.has_param("use_adaptive_sampling"): - RendererUtility.set_adaptive_sampling(self.config.get_float("use_adaptive_sampling")) + RendererUtility.set_noise_threshold(self.config.get_float("use_adaptive_sampling")) if self.config.get_bool("auto_tile_size", True): RendererUtility.toggle_auto_tile_size(True) diff --git a/blenderproc/python/renderer/FlowRendererUtility.py b/blenderproc/python/renderer/FlowRendererUtility.py index b8c5fec99..1791d0ca8 100644 --- a/blenderproc/python/renderer/FlowRendererUtility.py +++ b/blenderproc/python/renderer/FlowRendererUtility.py @@ -43,7 +43,7 @@ def render_optical_flow(output_dir: str = None, temp_dir: str = None, get_forwar with Utility.UndoAfterExecution(): RendererUtility._render_init() RendererUtility.set_max_amount_of_samples(1) - RendererUtility.set_adaptive_sampling(0) + RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) diff --git a/blenderproc/python/renderer/NOCSRendererUtility.py b/blenderproc/python/renderer/NOCSRendererUtility.py index a4bdd8bdf..5e8d532b9 100644 --- a/blenderproc/python/renderer/NOCSRendererUtility.py +++ b/blenderproc/python/renderer/NOCSRendererUtility.py @@ -45,7 +45,7 @@ def render_nocs(output_dir: Optional[str] = None, file_prefix: str = "nocs_", ou # Set all fast rendering parameters with only one ray per pixel RendererUtility._render_init() RendererUtility.set_max_amount_of_samples(1) - RendererUtility.set_adaptive_sampling(0) + RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) bpy.context.scene.cycles.filter_width = 0.0 diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index 1450590cb..2b84a12eb 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -152,16 +152,15 @@ def set_simplify_subdivision_render(simplify_subdivision_render: int): bpy.context.scene.render.use_simplify = False -def set_adaptive_sampling(adaptive_threshold: float): - """ Configures adaptive sampling. - +def set_noise_threshold(noise_threshold: float): + """ Configures the adaptive sampling, the noise threshold is typically between 0.1 and 0.001. Adaptive sampling automatically decreases the number of samples per pixel based on estimated level of noise. :param adaptive_threshold: Noise level to stop sampling at. If 0 is given, adaptive sampling is disabled. """ - if adaptive_threshold > 0: + if noise_threshold > 0: bpy.context.scene.cycles.use_adaptive_sampling = True - bpy.context.scene.cycles.adaptive_threshold = adaptive_threshold + bpy.context.scene.cycles.adaptive_threshold = noise_threshold else: bpy.context.scene.cycles.use_adaptive_sampling = False diff --git a/blenderproc/python/renderer/SegMapRendererUtility.py b/blenderproc/python/renderer/SegMapRendererUtility.py index 4474689e5..9fc16b3ce 100644 --- a/blenderproc/python/renderer/SegMapRendererUtility.py +++ b/blenderproc/python/renderer/SegMapRendererUtility.py @@ -48,7 +48,7 @@ def render_segmap(output_dir: Optional[str] = None, temp_dir: Optional[str] = No with Utility.UndoAfterExecution(): RendererUtility._render_init() RendererUtility.set_max_amount_of_samples(1) - RendererUtility.set_adaptive_sampling(0) + RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) RendererUtility.set_light_bounces(1, 0, 0, 1, 0, 8, 0) From 66dd14ab4608ea27d32c2deccdaae6e9b7cf5a90 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:26:32 +0100 Subject: [PATCH 18/46] doc(set_noise_threshold): improve documentation --- blenderproc/python/renderer/RendererUtility.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index 2b84a12eb..9e322f053 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -156,7 +156,13 @@ def set_noise_threshold(noise_threshold: float): """ Configures the adaptive sampling, the noise threshold is typically between 0.1 and 0.001. Adaptive sampling automatically decreases the number of samples per pixel based on estimated level of noise. - :param adaptive_threshold: Noise level to stop sampling at. If 0 is given, adaptive sampling is disabled. + We do not recommend setting the noise threshold value to zero and therefore turning off the adaptive sampling. + + For more information see the official documentation: + https://docs.blender.org/manual/en/latest/render/cycles/render_settings/sampling.html#adaptive-sampling + + :param noise_threshold: Noise level to stop sampling at. If 0 is given, adaptive sampling is disabled and only the + max amount of samples is used. """ if noise_threshold > 0: bpy.context.scene.cycles.use_adaptive_sampling = True @@ -166,12 +172,15 @@ def set_noise_threshold(noise_threshold: float): def set_max_amount_of_samples(samples: int): - """ Sets the number of samples to render for each pixel. + """ Sets the maximum number of samples to render for each pixel. + This maximum amount is usually not reached if the noise threshold is low enough. + If the noise threshold was set to 0, then only the maximum number of samples is used (We do not recommend this). - :param samples: The number of samples per pixel + :param samples: The maximum number of samples per pixel """ bpy.context.scene.cycles.samples = samples + def enable_distance_output(activate_antialiasing: bool, output_dir: Optional[str] = None, file_prefix: str = "distance_", output_key: str = "distance", antialiasing_distance_max: float = None, convert_to_depth: bool = False): From 5a0ff1360266f3ee4da33f96abfef5dfacb1c239 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:35:11 +0100 Subject: [PATCH 19/46] feat(auto_tile): remove the auto tile addon as it is not longer needed with Cycles X, all functions to it are also removed --- blenderproc/README.md | 8 +++---- blenderproc/api/renderer/__init__.py | 4 ++-- .../modules/renderer/RendererInterface.py | 17 -------------- .../python/renderer/RendererUtility.py | 22 ------------------- blenderproc/python/utility/DefaultConfig.py | 5 +++-- blenderproc/python/utility/Initializer.py | 3 +-- 6 files changed, 10 insertions(+), 49 deletions(-) diff --git a/blenderproc/README.md b/blenderproc/README.md index b6ca7f16f..bc1f42bf0 100644 --- a/blenderproc/README.md +++ b/blenderproc/README.md @@ -67,14 +67,14 @@ Config file: "config": { "global": { "output_dir": "/tmp/", - "auto_tile_size": False + "max_bounces": False } } }, { "module": "renderer.NewRenderer", "config": { - "auto_tile_size": True, + "max_bounces": True, "cycles": { "samples": 255 } @@ -96,13 +96,13 @@ self.get_float("pixel_aspect_x") self.get_string("output_dir", "output/") # -> /tmp/ this value is drawn from the GlobalStorage -self.get_bool("auto_tile_size") +self.get_bool("max_bounces") # -> True self.config.get_int("resolution_x", 512) # -> 512 -self.config.get_int("tile_x") +self.config.get_int("example_value") # -> throws an error ``` diff --git a/blenderproc/api/renderer/__init__.py b/blenderproc/api/renderer/__init__.py index 061e42314..9840cb919 100644 --- a/blenderproc/api/renderer/__init__.py +++ b/blenderproc/api/renderer/__init__.py @@ -1,6 +1,6 @@ -from blenderproc.python.renderer.RendererUtility import set_denoiser, set_light_bounces, toggle_auto_tile_size, \ - set_tile_size, set_cpu_threads, toggle_stereo, set_simplify_subdivision_render, set_noise_threshold, \ +from blenderproc.python.renderer.RendererUtility import set_denoiser, set_light_bounces, \ + set_cpu_threads, toggle_stereo, set_simplify_subdivision_render, set_noise_threshold, \ set_max_amount_of_samples, enable_distance_output, enable_depth_output, enable_normals_output, enable_diffuse_color_output,\ map_file_format_to_file_ending, render, set_output_format, enable_motion_blur, set_world_background from blenderproc.python.renderer.SegMapRendererUtility import render_segmap diff --git a/blenderproc/python/modules/renderer/RendererInterface.py b/blenderproc/python/modules/renderer/RendererInterface.py index 0d9428c47..283b3f9f1 100644 --- a/blenderproc/python/modules/renderer/RendererInterface.py +++ b/blenderproc/python/modules/renderer/RendererInterface.py @@ -33,16 +33,6 @@ class RendererInterface(Module): This means pixel is sampled until the noise level is smaller than specified or the maximum amount of samples were reached. Do not use this with Non-RGB-Renders! Only used if specified" in config. Default: 0.0 - float - * - auto_tile_size - - If true, then the number of render tiles is set automatically using the render_auto_tile_size addon. - Default: True. - - bool - * - tile_x - - The number of separate render tiles to use along the x-axis. Ignored if auto_tile_size is set to true. - - int - * - tile_y - - The number of separate render tiles to use along the y-axis. Ignored if auto_tile_size is set to true. - - int * - simplify_subdivision_render - Global maximum subdivision level during rendering. Speeds up rendering. Default: 3 - int @@ -125,7 +115,6 @@ class RendererInterface(Module): def __init__(self, config: Config): Module.__init__(self, config) - addon_utils.enable("render_auto_tile_size") def _configure_renderer(self, default_samples: int = 256, use_denoiser: bool = False, default_denoiser: str = "Intel"): @@ -142,12 +131,6 @@ def _configure_renderer(self, default_samples: int = 256, use_denoiser: bool = F if self.config.has_param("use_adaptive_sampling"): RendererUtility.set_noise_threshold(self.config.get_float("use_adaptive_sampling")) - if self.config.get_bool("auto_tile_size", True): - RendererUtility.toggle_auto_tile_size(True) - else: - RendererUtility.toggle_auto_tile_size(False) - RendererUtility.set_tile_size(self.config.get_int("tile_x"), self.config.get_int("tile_y")) - # Set number of cpu cores used for rendering (1 thread is always used for coordination => 1 # cpu thread means GPU-only rendering) RendererUtility.set_cpu_threads(self.config.get_int("cpu_threads", 0)) diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index 9e322f053..cf04d0169 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -95,28 +95,6 @@ def set_light_bounces(diffuse_bounces: Optional[int] = None, glossy_bounces: Opt bpy.context.scene.cycles.volume_bounces = volume_bounces -def toggle_auto_tile_size(enable: bool): - """ Enables/Disables the automatic tile size detection via the render_auto_tile_size addon. - - :param enable: True, if it should be enabled. - """ - #bpy.context.scene.ats_settings.is_enabled = enable - pass - - -def set_tile_size(tile_x: int, tile_y: int): - """ Sets the rendering tile size. - - This will automatically disable the automatic tile size detection. - - :param tile_x: The horizontal tile size in pixels. - :param tile_y: The vertical tile size in pixels. - """ - toggle_auto_tile_size(False) - bpy.context.scene.render.tile_x = tile_x - bpy.context.scene.render.tile_y = tile_y - - def set_cpu_threads(num_threads: int): """ Sets the number of CPU cores to use simultaneously while rendering. diff --git a/blenderproc/python/utility/DefaultConfig.py b/blenderproc/python/utility/DefaultConfig.py index f9e5514bc..d9fb1a0ea 100644 --- a/blenderproc/python/utility/DefaultConfig.py +++ b/blenderproc/python/utility/DefaultConfig.py @@ -22,7 +22,8 @@ class DefaultConfig: color_depth = 8 enable_transparency = False jpg_quality = 95 - samples = 100 + samples = 1024 + sampling_noise_threshold = 0.01 cpu_threads = 1 denoiser = "INTEL" simplify_subdivision_render = 3 @@ -37,4 +38,4 @@ class DefaultConfig: # Setup default_pip_packages = ["wheel", "pyyaml==5.1.2", "imageio==2.9.0", "gitpython==3.1.18", "scikit-image==0.18.3", "pypng==0.0.20", "scipy==1.7.1", - "matplotlib==3.4.3", "pytz==2021.1", "h5py==3.4.0", "Pillow==8.3.2", "opencv-contrib-python==4.5.3.56", "scikit-learn==0.24.2"] \ No newline at end of file + "matplotlib==3.4.3", "pytz==2021.1", "h5py==3.4.0", "Pillow==8.3.2", "opencv-contrib-python==4.5.3.56", "scikit-learn==0.24.2"] diff --git a/blenderproc/python/utility/Initializer.py b/blenderproc/python/utility/Initializer.py index 449f1113c..7238dbd10 100644 --- a/blenderproc/python/utility/Initializer.py +++ b/blenderproc/python/utility/Initializer.py @@ -117,8 +117,7 @@ def set_default_parameters(): # Init renderer RendererUtility._render_init() RendererUtility.set_max_amount_of_samples(DefaultConfig.samples) - addon_utils.enable("render_auto_tile_size") - RendererUtility.toggle_auto_tile_size(True) + RendererUtility.set_noise_threshold(DefaultConfig.sampling_noise_threshold) # Set number of cpu cores used for rendering (1 thread is always used for coordination => 1 # cpu thread means GPU-only rendering) From 79df0c97a6ea1ca0e2626f6fad2693829652fdef Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:45:10 +0100 Subject: [PATCH 20/46] doc(set_max_amount_of_samples): improve tutorial introduction to this fct. --- blenderproc/python/renderer/FlowRendererUtility.py | 1 + blenderproc/python/renderer/NOCSRendererUtility.py | 1 + blenderproc/python/renderer/SegMapRendererUtility.py | 1 + docs/tutorials/renderer.md | 12 +++++++----- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/blenderproc/python/renderer/FlowRendererUtility.py b/blenderproc/python/renderer/FlowRendererUtility.py index 1791d0ca8..de77284f0 100644 --- a/blenderproc/python/renderer/FlowRendererUtility.py +++ b/blenderproc/python/renderer/FlowRendererUtility.py @@ -42,6 +42,7 @@ def render_optical_flow(output_dir: str = None, temp_dir: str = None, get_forwar with Utility.UndoAfterExecution(): RendererUtility._render_init() + # the amount of samples must be one and there can not be any noise threshold RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) diff --git a/blenderproc/python/renderer/NOCSRendererUtility.py b/blenderproc/python/renderer/NOCSRendererUtility.py index 5e8d532b9..9931b969c 100644 --- a/blenderproc/python/renderer/NOCSRendererUtility.py +++ b/blenderproc/python/renderer/NOCSRendererUtility.py @@ -44,6 +44,7 @@ def render_nocs(output_dir: Optional[str] = None, file_prefix: str = "nocs_", ou # Set all fast rendering parameters with only one ray per pixel RendererUtility._render_init() + # the amount of samples must be one and there can not be any noise threshold RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) diff --git a/blenderproc/python/renderer/SegMapRendererUtility.py b/blenderproc/python/renderer/SegMapRendererUtility.py index 9fc16b3ce..d184c0f8e 100644 --- a/blenderproc/python/renderer/SegMapRendererUtility.py +++ b/blenderproc/python/renderer/SegMapRendererUtility.py @@ -47,6 +47,7 @@ def render_segmap(output_dir: Optional[str] = None, temp_dir: Optional[str] = No with Utility.UndoAfterExecution(): RendererUtility._render_init() + # the amount of samples must be one and there can not be any noise threshold RendererUtility.set_max_amount_of_samples(1) RendererUtility.set_noise_threshold(0) RendererUtility.set_denoiser(None) diff --git a/docs/tutorials/renderer.md b/docs/tutorials/renderer.md index 1e6a04d3d..7236af784 100644 --- a/docs/tutorials/renderer.md +++ b/docs/tutorials/renderer.md @@ -43,16 +43,18 @@ In [depth images](https://en.wikipedia.org/wiki/Depth_map), each pixel contains As blender uses a raytracer, the number of rays influences the required amount of computation and the noise in the rendered image. The more rays are computed, the longer the rendering takes, but the more accurate and less noisy the resulting image is. -The number of rays can be controlled by using `bproc.renderer.set_max_amount_of_samples(num_samples)`. -Hereby, `num_samples` sets the number of rays that are traced per pixel. +The noise level can be controlled by using `brpoc.renderer.set_noise_threshold(noise_threshold)`. +This means that for each pixel only so many rays are used to get below this noise threshold. +Hereby, `noise_threshold` is a float value above `0` and below `0.1`. +A higher value means more noise per pixel, a lower value results in less noise but longer computation time. +You can influence the maximum amount of samples per pixel with the `bproc.rendererset_max_amount_of_samples(max_amount_of_samples)` fct. For more information about how blenders renderer works visit the [blender docu](https://docs.blender.org/manual/en/latest/render/cycles/render_settings/sampling.html). -The required amount of samples is unfortunately quite high to achieve a smooth result and therefore rendering can take quite long. -To reduce the number of required samples, blender offers Denoiser to reduce the noise in the resulting image. +The required noise level is unfortunately quite low to achieve a smooth result and therefore rendering can take quite long. +To reduce the number of required samples per pixel, blender offers Denoiser to reduce the noise in the resulting image. Set them via `bproc.renderer.set_denoiser`: * `bproc.renderer.set_denoiser("INTEL")`: Activates Intels [Open Image Denoiser](https://www.openimagedenoise.org/) -* `bproc.renderer.set_denoiser("BLENDER")`: Uses blenders built-in denoiser. * `bproc.renderer.set_denoiser(None)`: Deactivates any denoiser. Per default "INTEL" is used. From 4e5ed38f1eddb40aec4ab4479b892bb4f3b86b07 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:45:37 +0100 Subject: [PATCH 21/46] fix(RenderUtility): remove the BLENDER denoiser as it is no longer available in blender 3.0.0 --- blenderproc/python/renderer/RendererUtility.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/blenderproc/python/renderer/RendererUtility.py b/blenderproc/python/renderer/RendererUtility.py index cf04d0169..c69b182eb 100644 --- a/blenderproc/python/renderer/RendererUtility.py +++ b/blenderproc/python/renderer/RendererUtility.py @@ -19,7 +19,7 @@ def set_denoiser(denoiser: Optional[str]): Automatically disables all previously activated denoiser. - :param denoiser: The name of the denoiser which should be enabled. Options are "INTEL", "OPTIX", "BLENDER" and None. \ + :param denoiser: The name of the denoiser which should be enabled. Options are "INTEL", "OPTIX" and None. \ If None is given, then no denoiser will be active. """ # Make sure there is no denoiser active @@ -54,10 +54,6 @@ def set_denoiser(denoiser: Optional[str]): links.new(render_layer_node.outputs['DiffCol'], denoise_node.inputs['Albedo']) links.new(render_layer_node.outputs['Normal'], denoise_node.inputs['Normal']) - elif denoiser.upper() == "BLENDER": - bpy.context.scene.cycles.use_denoising = True - bpy.context.view_layer.cycles.use_denoising = True - bpy.context.scene.cycles.denoiser = "NLM" else: raise Exception("No such denoiser: " + denoiser) From d69155acaeae827f048825a30a77754e808b0902 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:51:29 +0100 Subject: [PATCH 22/46] chore(set_max_amount_of_samples): remove from all examples except the basic one, as the default value should work in all examples --- examples/advanced/camera_depth_of_field/main.py | 2 -- examples/advanced/coco_annotations/main.py | 3 --- examples/advanced/diffuse_color_image/main.py | 2 -- examples/advanced/dust/main.py | 2 -- examples/advanced/entity_displacement_modifier/main.py | 2 -- examples/advanced/lens_distortion/main.py | 2 -- examples/advanced/lens_distortion/main_callab.py | 2 -- examples/advanced/material_randomizer/main.py | 3 --- .../advanced/motion_blur_rolling_shutter/main_motion_blur.py | 2 -- .../motion_blur_rolling_shutter/main_rolling_shutter.py | 2 -- examples/advanced/object_pose_sampling/main.py | 2 -- examples/advanced/on_surface_object_sampling/main.py | 3 --- examples/advanced/random_room_constructor/main.py | 2 -- examples/basics/basic/README.md | 2 -- examples/basics/basic/main.py | 2 -- examples/basics/camera_object_pose/main.py | 2 -- examples/basics/camera_sampling/main.py | 2 -- examples/basics/entity_manipulation/main.py | 2 -- examples/basics/material_manipulation/main.py | 3 --- examples/datasets/amass_human_poses/main.py | 2 -- examples/datasets/blenderkit/main.py | 2 -- examples/datasets/bop_object_on_surface_sampling/README.md | 3 +-- examples/datasets/bop_object_on_surface_sampling/main.py | 1 - examples/datasets/bop_object_physics_positioning/README.md | 3 +-- examples/datasets/bop_object_physics_positioning/main.py | 1 - examples/datasets/bop_object_pose_sampling/main.py | 1 - examples/datasets/bop_scene_replication/main.py | 1 - examples/datasets/front_3d/main.py | 2 -- examples/datasets/front_3d_with_improved_mat/main.py | 2 -- examples/datasets/haven/main.py | 2 -- examples/datasets/ikea/main.py | 2 -- examples/datasets/pix3d/main.py | 2 -- examples/datasets/scenenet/main.py | 2 -- examples/datasets/scenenet_with_cctextures/main.py | 2 -- examples/datasets/shapenet/README.md | 2 -- examples/datasets/shapenet/main.py | 2 -- examples/datasets/shapenet_with_scenenet/main.py | 2 -- examples/datasets/shapenet_with_suncg/main.py | 3 --- examples/datasets/suncg_with_improved_mat/main.py | 2 -- 39 files changed, 2 insertions(+), 79 deletions(-) diff --git a/examples/advanced/camera_depth_of_field/main.py b/examples/advanced/camera_depth_of_field/main.py index 1677b1c10..9954d8f4b 100644 --- a/examples/advanced/camera_depth_of_field/main.py +++ b/examples/advanced/camera_depth_of_field/main.py @@ -41,8 +41,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/coco_annotations/main.py b/examples/advanced/coco_annotations/main.py index b596695b6..054eb8ca2 100644 --- a/examples/advanced/coco_annotations/main.py +++ b/examples/advanced/coco_annotations/main.py @@ -37,9 +37,6 @@ # activate normal rendering bproc.renderer.enable_normals_output() -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(50) - # render the whole pipeline data = bproc.renderer.render() seg_data = bproc.renderer.render_segmap(map_by=["instance", "class", "name"]) diff --git a/examples/advanced/diffuse_color_image/main.py b/examples/advanced/diffuse_color_image/main.py index e482d2c64..567bd1895 100644 --- a/examples/advanced/diffuse_color_image/main.py +++ b/examples/advanced/diffuse_color_image/main.py @@ -35,8 +35,6 @@ bproc.renderer.enable_depth_output(activate_antialiasing=False) # Also enable the diffuse color image, which describes the base color of the textures bproc.renderer.enable_diffuse_color_output() -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/dust/main.py b/examples/advanced/dust/main.py index dbf6521f3..c703522e3 100644 --- a/examples/advanced/dust/main.py +++ b/examples/advanced/dust/main.py @@ -39,8 +39,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/entity_displacement_modifier/main.py b/examples/advanced/entity_displacement_modifier/main.py index 694ddd6cd..59bdfb7bb 100644 --- a/examples/advanced/entity_displacement_modifier/main.py +++ b/examples/advanced/entity_displacement_modifier/main.py @@ -43,8 +43,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/lens_distortion/main.py b/examples/advanced/lens_distortion/main.py index 1c9840bb1..0d512fa63 100644 --- a/examples/advanced/lens_distortion/main.py +++ b/examples/advanced/lens_distortion/main.py @@ -47,8 +47,6 @@ # activate normal and distance rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_distance_output(activate_antialiasing=True) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/lens_distortion/main_callab.py b/examples/advanced/lens_distortion/main_callab.py index c9a5ee26a..ad9369e9a 100644 --- a/examples/advanced/lens_distortion/main_callab.py +++ b/examples/advanced/lens_distortion/main_callab.py @@ -45,8 +45,6 @@ # activate normal and distance rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_distance_output(activate_antialiasing=True) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(20) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/material_randomizer/main.py b/examples/advanced/material_randomizer/main.py index 08362bce0..2a700327e 100644 --- a/examples/advanced/material_randomizer/main.py +++ b/examples/advanced/material_randomizer/main.py @@ -38,9 +38,6 @@ # Replace the material with a random one obj.set_material(i, random.choice(materials)) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) - # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py b/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py index 473eb7f15..9688b53b7 100644 --- a/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py +++ b/examples/advanced/motion_blur_rolling_shutter/main_motion_blur.py @@ -37,8 +37,6 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py b/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py index cc6c4ef71..a7c4232ef 100644 --- a/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py +++ b/examples/advanced/motion_blur_rolling_shutter/main_rolling_shutter.py @@ -41,8 +41,6 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/object_pose_sampling/main.py b/examples/advanced/object_pose_sampling/main.py index a3f9eacbd..61ce6ecf5 100644 --- a/examples/advanced/object_pose_sampling/main.py +++ b/examples/advanced/object_pose_sampling/main.py @@ -44,8 +44,6 @@ def sample_pose(obj: bproc.types.MeshObject): # activate normal rendering bproc.renderer.enable_normals_output() -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/on_surface_object_sampling/main.py b/examples/advanced/on_surface_object_sampling/main.py index 7246519a5..3390ca2db 100644 --- a/examples/advanced/on_surface_object_sampling/main.py +++ b/examples/advanced/on_surface_object_sampling/main.py @@ -57,9 +57,6 @@ def sample_pose(obj: bproc.types.MeshObject): matrix_world = bproc.math.build_transformation_mat(position, euler_rotation) bproc.camera.add_camera_pose(matrix_world) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) - # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/advanced/random_room_constructor/main.py b/examples/advanced/random_room_constructor/main.py index 6a891e802..3889a1b18 100644 --- a/examples/advanced/random_room_constructor/main.py +++ b/examples/advanced/random_room_constructor/main.py @@ -46,8 +46,6 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) bproc.renderer.set_light_bounces(max_bounces=200, diffuse_bounces=200, glossy_bounces=200, transmission_bounces=200, transparent_max_bounces=200) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/basic/README.md b/examples/basics/basic/README.md index ab414f10e..4207a17c3 100644 --- a/examples/basics/basic/README.md +++ b/examples/basics/basic/README.md @@ -110,8 +110,6 @@ location_x location_y location_z rotation_euler_x rotation_euler_y rotation_eul # activate normal and depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) bproc.renderer.enable_normals_output() -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/basic/main.py b/examples/basics/basic/main.py index 5d9b63d45..b4b8ad78e 100644 --- a/examples/basics/basic/main.py +++ b/examples/basics/basic/main.py @@ -32,8 +32,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/camera_object_pose/main.py b/examples/basics/camera_object_pose/main.py index fd68b4897..2ecb5ba05 100644 --- a/examples/basics/camera_object_pose/main.py +++ b/examples/basics/camera_object_pose/main.py @@ -53,8 +53,6 @@ # activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(100) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/camera_sampling/main.py b/examples/basics/camera_sampling/main.py index 74d60ed41..b7af11558 100644 --- a/examples/basics/camera_sampling/main.py +++ b/examples/basics/camera_sampling/main.py @@ -33,8 +33,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/entity_manipulation/main.py b/examples/basics/entity_manipulation/main.py index 5403bdda1..4e5450c66 100644 --- a/examples/basics/entity_manipulation/main.py +++ b/examples/basics/entity_manipulation/main.py @@ -34,8 +34,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/basics/material_manipulation/main.py b/examples/basics/material_manipulation/main.py index 146a788a0..1c95483a7 100644 --- a/examples/basics/material_manipulation/main.py +++ b/examples/basics/material_manipulation/main.py @@ -45,9 +45,6 @@ # Set it as base color of the current material mat.set_principled_shader_value("Base Color", image) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) - # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/amass_human_poses/main.py b/examples/datasets/amass_human_poses/main.py index afcb791bd..2fcd7a215 100644 --- a/examples/datasets/amass_human_poses/main.py +++ b/examples/datasets/amass_human_poses/main.py @@ -39,8 +39,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/blenderkit/main.py b/examples/datasets/blenderkit/main.py index 8ded78333..4a0fa1776 100644 --- a/examples/datasets/blenderkit/main.py +++ b/examples/datasets/blenderkit/main.py @@ -33,8 +33,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_on_surface_sampling/README.md b/examples/datasets/bop_object_on_surface_sampling/README.md index 1358a0009..1a7eedcd0 100644 --- a/examples/datasets/bop_object_on_surface_sampling/README.md +++ b/examples/datasets/bop_object_on_surface_sampling/README.md @@ -218,9 +218,8 @@ while poses < 10: ```python bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) ``` -* Renders RGB using 50 `"samples"` and also outputs depth images. +* Renders an RGB image and also outputs a depth images. ### Bop Writer diff --git a/examples/datasets/bop_object_on_surface_sampling/main.py b/examples/datasets/bop_object_on_surface_sampling/main.py index 6a5b05888..969fc3214 100644 --- a/examples/datasets/bop_object_on_surface_sampling/main.py +++ b/examples/datasets/bop_object_on_surface_sampling/main.py @@ -113,7 +113,6 @@ def sample_initial_pose(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_physics_positioning/README.md b/examples/datasets/bop_object_physics_positioning/README.md index 9dcd5e41f..42a5333a4 100644 --- a/examples/datasets/bop_object_physics_positioning/README.md +++ b/examples/datasets/bop_object_physics_positioning/README.md @@ -235,9 +235,8 @@ while poses < 10: ```python bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) ``` -* Renders RGB using 50 `"samples"` and also outputs depth images. +* Renders an RGB image and also outputs a depth images. ### Bop Writer diff --git a/examples/datasets/bop_object_physics_positioning/main.py b/examples/datasets/bop_object_physics_positioning/main.py index ef5727765..2ba7f11ee 100644 --- a/examples/datasets/bop_object_physics_positioning/main.py +++ b/examples/datasets/bop_object_physics_positioning/main.py @@ -123,7 +123,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index 29ba278bd..d9a78cea5 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -37,7 +37,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) # Render five different scenes for _ in range(5): diff --git a/examples/datasets/bop_scene_replication/main.py b/examples/datasets/bop_scene_replication/main.py index 2aecfa2b5..2d2970e79 100644 --- a/examples/datasets/bop_scene_replication/main.py +++ b/examples/datasets/bop_scene_replication/main.py @@ -29,7 +29,6 @@ # activate depth rendering and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_max_amount_of_samples(50) # render the cameras of the current scene data = bproc.renderer.render() diff --git a/examples/datasets/front_3d/main.py b/examples/datasets/front_3d/main.py index 2d21e2675..99bb66049 100644 --- a/examples/datasets/front_3d/main.py +++ b/examples/datasets/front_3d/main.py @@ -69,8 +69,6 @@ def check_name(name): # Also render normals bproc.renderer.enable_normals_output() -# set the sample amount to 350 -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/front_3d_with_improved_mat/main.py b/examples/datasets/front_3d_with_improved_mat/main.py index 99bbb81c5..87116d58c 100644 --- a/examples/datasets/front_3d_with_improved_mat/main.py +++ b/examples/datasets/front_3d_with_improved_mat/main.py @@ -100,8 +100,6 @@ def check_name(name): # Also render normals bproc.renderer.enable_normals_output() -# set the sample amount to 350 -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/haven/main.py b/examples/datasets/haven/main.py index 64d90940d..738317c2b 100644 --- a/examples/datasets/haven/main.py +++ b/examples/datasets/haven/main.py @@ -37,8 +37,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/ikea/main.py b/examples/datasets/ikea/main.py index df2bc835d..e4f709b73 100644 --- a/examples/datasets/ikea/main.py +++ b/examples/datasets/ikea/main.py @@ -32,8 +32,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/pix3d/main.py b/examples/datasets/pix3d/main.py index 4d48d5752..e96836b44 100644 --- a/examples/datasets/pix3d/main.py +++ b/examples/datasets/pix3d/main.py @@ -32,8 +32,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/scenenet/main.py b/examples/datasets/scenenet/main.py index d6dc7a878..8e03efc01 100644 --- a/examples/datasets/scenenet/main.py +++ b/examples/datasets/scenenet/main.py @@ -76,8 +76,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/scenenet_with_cctextures/main.py b/examples/datasets/scenenet_with_cctextures/main.py index 4c7a8e523..59969ef5b 100644 --- a/examples/datasets/scenenet_with_cctextures/main.py +++ b/examples/datasets/scenenet_with_cctextures/main.py @@ -93,8 +93,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet/README.md b/examples/datasets/shapenet/README.md index 1c612efa0..8caf6e275 100644 --- a/examples/datasets/shapenet/README.md +++ b/examples/datasets/shapenet/README.md @@ -82,8 +82,6 @@ Each cameras rotation is such that it looks directly at the object and the camer # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet/main.py b/examples/datasets/shapenet/main.py index f0d809fab..bd6f11f28 100644 --- a/examples/datasets/shapenet/main.py +++ b/examples/datasets/shapenet/main.py @@ -30,8 +30,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet_with_scenenet/main.py b/examples/datasets/shapenet_with_scenenet/main.py index 5fa44a33b..05e56132e 100644 --- a/examples/datasets/shapenet_with_scenenet/main.py +++ b/examples/datasets/shapenet_with_scenenet/main.py @@ -86,8 +86,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(150) # render the whole pipeline data = bproc.renderer.render() diff --git a/examples/datasets/shapenet_with_suncg/main.py b/examples/datasets/shapenet_with_suncg/main.py index 2ef01cc6a..f108a50e7 100644 --- a/examples/datasets/shapenet_with_suncg/main.py +++ b/examples/datasets/shapenet_with_suncg/main.py @@ -53,9 +53,6 @@ cam2world_matrix = bproc.math.build_transformation_mat(location, rotation_matrix) bproc.camera.add_camera_pose(cam2world_matrix) -# set the number of samples to render for each object -bproc.renderer.set_max_amount_of_samples(150) - # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) diff --git a/examples/datasets/suncg_with_improved_mat/main.py b/examples/datasets/suncg_with_improved_mat/main.py index aa32f8bda..bb84fe66d 100644 --- a/examples/datasets/suncg_with_improved_mat/main.py +++ b/examples/datasets/suncg_with_improved_mat/main.py @@ -68,8 +68,6 @@ # activate normal and depth rendering bproc.renderer.enable_normals_output() bproc.renderer.enable_depth_output(activate_antialiasing=False) -# set the amount of samples, which should be used for the color rendering -bproc.renderer.set_max_amount_of_samples(350) bproc.material.add_alpha_channel_to_textures(blurry_edges=True) From 300675d4c5e6a8d0fce63da9908f4c8fa7000d1b Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 15:54:38 +0100 Subject: [PATCH 23/46] chore(.gitignore): add resources/AMASS to git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2734e09e9..6f359ae99 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ blender .vscode/ output/ debug/ +resources/AMASS resources/cctextures* resources/scenenet/*zip resources/scenenet/SceneNetData From 0ed0142905e43200cc1ef3214fdfdbea777982e6 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 16:03:18 +0100 Subject: [PATCH 24/46] chore(set_max_amount_of_samples): clean up all uses of word samples --- blenderproc/README.md | 4 ++-- blenderproc/python/modules/renderer/FlowRenderer.py | 2 +- blenderproc/python/modules/renderer/RendererInterface.py | 6 +++--- blenderproc/python/modules/renderer/SegMapRenderer.py | 2 +- examples/basics/basic/README.md | 8 +++++--- examples/datasets/bop_object_on_surface_sampling/main.py | 2 +- examples/datasets/bop_object_physics_positioning/main.py | 2 +- examples/datasets/bop_object_pose_sampling/main.py | 2 +- examples/datasets/bop_scene_replication/main.py | 2 +- 9 files changed, 16 insertions(+), 14 deletions(-) diff --git a/blenderproc/README.md b/blenderproc/README.md index bc1f42bf0..5b1ea3320 100644 --- a/blenderproc/README.md +++ b/blenderproc/README.md @@ -76,7 +76,7 @@ Config file: "config": { "max_bounces": True, "cycles": { - "samples": 255 + "value": 255 } } } @@ -87,7 +87,7 @@ Config file: Inside the `renderer.NewRenderer` module: ```python -self.get_int("cycles/samples", 42) +self.get_int("cycles/value", 42) # -> 255 self.get_float("pixel_aspect_x") diff --git a/blenderproc/python/modules/renderer/FlowRenderer.py b/blenderproc/python/modules/renderer/FlowRenderer.py index 38f88d07f..d4548ccbe 100644 --- a/blenderproc/python/modules/renderer/FlowRenderer.py +++ b/blenderproc/python/modules/renderer/FlowRenderer.py @@ -46,7 +46,7 @@ def __init__(self, config): def run(self): with Utility.UndoAfterExecution(): - self._configure_renderer(default_samples=1) + self._configure_renderer(max_amount_of_samples=1) if not self._avoid_output: render_optical_flow( diff --git a/blenderproc/python/modules/renderer/RendererInterface.py b/blenderproc/python/modules/renderer/RendererInterface.py index 283b3f9f1..aac7c7803 100644 --- a/blenderproc/python/modules/renderer/RendererInterface.py +++ b/blenderproc/python/modules/renderer/RendererInterface.py @@ -116,17 +116,17 @@ class RendererInterface(Module): def __init__(self, config: Config): Module.__init__(self, config) - def _configure_renderer(self, default_samples: int = 256, use_denoiser: bool = False, + def _configure_renderer(self, max_amount_of_samples: int = 1024, use_denoiser: bool = False, default_denoiser: str = "Intel"): """ Sets many different render parameters which can be adjusted via the config. - :param default_samples: Default number of samples to render for each pixel + :param max_amount_of_samples: Default maximum number of samples to render for each pixel :param use_denoiser: If true, a denoiser is used, only use this on color information :param default_denoiser: Either "Intel" or "Blender", "Intel" performs much better in most cases """ RendererUtility._render_init() - RendererUtility.set_max_amount_of_samples(self.config.get_int("samples", default_samples)) + RendererUtility.set_max_amount_of_samples(self.config.get_int("samples", max_amount_of_samples)) if self.config.has_param("use_adaptive_sampling"): RendererUtility.set_noise_threshold(self.config.get_float("use_adaptive_sampling")) diff --git a/blenderproc/python/modules/renderer/SegMapRenderer.py b/blenderproc/python/modules/renderer/SegMapRenderer.py index 2ece43315..e93ec3969 100644 --- a/blenderproc/python/modules/renderer/SegMapRenderer.py +++ b/blenderproc/python/modules/renderer/SegMapRenderer.py @@ -123,7 +123,7 @@ def run(self): default_values = self.config.get_raw_dict("default_values", {}) with Utility.UndoAfterExecution(): - self._configure_renderer(default_samples=1) + self._configure_renderer(max_amount_of_samples=1) if not self._avoid_output: render_segmap( diff --git a/examples/basics/basic/README.md b/examples/basics/basic/README.md index 4207a17c3..090108e4f 100644 --- a/examples/basics/basic/README.md +++ b/examples/basics/basic/README.md @@ -110,14 +110,16 @@ location_x location_y location_z rotation_euler_x rotation_euler_y rotation_eul # activate normal and depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) bproc.renderer.enable_normals_output() +bproc.renderer.set_noise_threshold(0.01) # this is the default value # render the whole pipeline data = bproc.renderer.render() ``` -First we enable that `blenderproc` also generates the `normals` and the `depth` for each color image, and then we set the amount of samples used for generating the color image. -A higher sample amount will reduce the noise in the image, but increase the rendering time. -The correct value depends on the complexity of your scene and the GPU budget you can spare. +First we enable that `blenderproc` also generates the `normals` and the `distance` for each color image. +Furthermore, we set the desired noise threshold in our image. +A lower noise threshold will reduce the noise in the image, but increase the rendering time. +The default value is `0.01`, this should work for most applications. => Creates the files `rgb_0000.png` and `rgb_0001.png` in the temp folder. diff --git a/examples/datasets/bop_object_on_surface_sampling/main.py b/examples/datasets/bop_object_on_surface_sampling/main.py index 969fc3214..c0a04ab99 100644 --- a/examples/datasets/bop_object_on_surface_sampling/main.py +++ b/examples/datasets/bop_object_on_surface_sampling/main.py @@ -111,7 +111,7 @@ def sample_initial_pose(obj: bproc.types.MeshObject): bproc.camera.add_camera_pose(cam2world_matrix) poses += 1 -# activate depth rendering and set amount of samples for color rendering +# activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # render the whole pipeline diff --git a/examples/datasets/bop_object_physics_positioning/main.py b/examples/datasets/bop_object_physics_positioning/main.py index 2ba7f11ee..bd01a7f4a 100644 --- a/examples/datasets/bop_object_physics_positioning/main.py +++ b/examples/datasets/bop_object_physics_positioning/main.py @@ -121,7 +121,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): bproc.camera.add_camera_pose(cam2world_matrix) poses += 1 -# activate depth rendering and set amount of samples for color rendering +# activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # render the whole pipeline diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index d9a78cea5..1cc33e306 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -35,7 +35,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): obj.set_location(np.random.uniform([-0.2, -0.2, -0.2],[0.2, 0.2, 0.2])) obj.set_rotation_euler(bproc.sampler.uniformSO3()) -# activate depth rendering and set amount of samples for color rendering +# activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # Render five different scenes diff --git a/examples/datasets/bop_scene_replication/main.py b/examples/datasets/bop_scene_replication/main.py index 2d2970e79..1c36f8ce2 100644 --- a/examples/datasets/bop_scene_replication/main.py +++ b/examples/datasets/bop_scene_replication/main.py @@ -27,7 +27,7 @@ light_point.set_energy(1000) light_point.set_location([0, 0, -0.8]) -# activate depth rendering and set amount of samples for color rendering +# activate depth rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) # render the cameras of the current scene From 1236038ec258be53efc0230fe0d1b4cb2b96f60c Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Mon, 6 Dec 2021 17:40:45 +0100 Subject: [PATCH 25/46] fix(lens_distortion): change jpg image to png image --- .../advanced/lens_distortion/main_callab.py | 35 ++++++++++-------- images/lens_img1_real.jpg | Bin 103520 -> 0 bytes images/lens_img1_real.png | Bin 0 -> 361645 bytes 3 files changed, 20 insertions(+), 15 deletions(-) delete mode 100644 images/lens_img1_real.jpg create mode 100644 images/lens_img1_real.png diff --git a/examples/advanced/lens_distortion/main_callab.py b/examples/advanced/lens_distortion/main_callab.py index ad9369e9a..cfe0fe594 100644 --- a/examples/advanced/lens_distortion/main_callab.py +++ b/examples/advanced/lens_distortion/main_callab.py @@ -5,7 +5,7 @@ import numpy as np from mathutils import Matrix -import os # path +import os # path from skimage.feature import match_template from PIL import Image @@ -13,7 +13,8 @@ parser = argparse.ArgumentParser() parser.add_argument('scene', help="Path to the scene.obj file, should be examples/resources/scene.obj") parser.add_argument('config_file', help="Path to the camera calibration config file.") -parser.add_argument('output_dir', help="Path to where the final files, will be saved, could be examples/basics/basic/output") +parser.add_argument('output_dir', + help="Path to where the final files, will be saved, could be examples/basics/basic/output") args = parser.parse_args() bproc.init() @@ -21,12 +22,12 @@ # load the objects into the scene basename = os.path.basename(args.scene) filename, file_extension = os.path.splitext(basename) -if file_extension=='.blend': +if file_extension == '.blend': objs = bproc.loader.load_blend(args.scene) obj = bproc.filter.one_by_attr(objs, "name", filename) obj.set_location([0, 0, 0]) obj.set_rotation_euler([0, 0, 0]) -elif file_extension=='.obj': +elif file_extension == '.obj': objs = bproc.loader.load_obj(args.scene) objs[0].set_location([0, 0, 0]) objs[0].set_rotation_euler([0, 0, 0]) @@ -40,7 +41,8 @@ light.set_energy(30) # setup the lens distortion and adapt intrinsics so that it can be later used in the PostProcessing -orig_res_x, orig_res_y, mapping_coords = bproc.camera.set_camera_parameters_from_config_file(args.config_file, read_the_extrinsics=True) +orig_res_x, orig_res_y, mapping_coords = bproc.camera.set_camera_parameters_from_config_file(args.config_file, + read_the_extrinsics=True) # activate normal and distance rendering bproc.renderer.enable_normals_output() @@ -61,22 +63,25 @@ # test: compare generated image with real image if "img1" in os.path.basename(args.config_file): - real_path = "./images/lens_img1_real.jpg" - norm_corr_limit = 0.660 # low since the real background is large and different + real_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "images", "lens_img1_real.png") + norm_corr_limit = 0.660 # low since the real background is large and different elif "img2" in os.path.basename(args.config_file): - real_path = "./images/lens_img2_real.png" - norm_corr_limit = 0.890 # less background + real_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "images", "lens_img2_real.png") + norm_corr_limit = 0.890 # less background else: raise Exception("Reference real image not found.") img_gene = np.asarray(Image.fromarray(data['colors'][0]).convert('L')) img_real = np.asarray(Image.open(real_path).convert('RGB').convert('L')) assert img_gene.shape == img_real.shape -result = match_template(img_gene, img_real[3:-3,3:-3], pad_input=False) -if result.argmax()==24: # center of the (7,7) correlation window +result = match_template(img_gene, img_real[3:-3, 3:-3], pad_input=False) +if result.argmax() == 24: # center of the (7,7) correlation window print(f"The generated image is not biased w.r.t. the reference real image.") - if result.max()>norm_corr_limit: - print(f"The norm. correlation index between generated and real images is {np.round(result.max(),3)}, which is fine.") + if result.max() > norm_corr_limit: + print(f"The norm. correlation index between generated and real images is {np.round(result.max(), 3)}, " + f"which is fine.") else: - raise Exception("The norm. correlation index between generated and real image is too low. The images do not match. Choose other object or config file.") + raise Exception("The norm. correlation index between generated and real image is too low. The images do " + "not match. Choose other object or config file.") else: - raise Exception("The generated calibration pattern image and the reference real image do not match. Choose other object or config file.") + raise Exception("The generated calibration pattern image and the reference real image do not match. Choose other " + f"object or config file: {result.argmax()}.") diff --git a/images/lens_img1_real.jpg b/images/lens_img1_real.jpg deleted file mode 100644 index 4b868e9c54fea16dfceadb8b3fa70a44f9cb40f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103520 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�z4WB}Tebz$mmOx`snF892&m3`#$~T` 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
}FeZ`UxFs-}5W zkRhk5S516_EkL6naA&hmIGU!`VX>AHM!7Y<4&H(wg~0gIwPc?D#kxp6AAvc^=iPD-@+V%2uGZ z7M^tWbgV0_C*#tHg2tRF6`>{Y(jvyjU@Y9>zEk%L&Kk05$1tsF(p zX&80OP1F42tgX1V^>R27{j57lY9&h zX|FqMqheA10{^_04Jgc=y+bS&;fkGMA&^lSS#DC!M!(-&EVL*R5_~(ibrg4PTZ=tH z>DO=7w4+|+WtL{~@}LX4{rzeyXUy(9X6iv9?_>R>$*CJp*_=h3f0BB+xtV#E%Kp{S zs1{qFoafEAB5S)3>NvbI4z}|Bx6_H4D5ObasM5J;+afh6X^7K^)9#Awbfdje{~1TNyx$lGwh2YQUxS~$Eq^mij=nXz)zxN!`H;ZoP5)7-^)qh6v-)<9V9E^ zb+Q;}YdbQ^)XvUIbfIkJM17tkgI#K2^2CfPga?+;9<(|6d#NIq-hKQgx{~ z8K{KS`U?uxoFVp%R*uGIDzvi(y2g0Xz;Zw?lzGiX*0ATH_BU8@MfFF66vPA);OUO~ znYV>=iXRpkWcD7ZHF$W#9|V{;c(;co(V{^pAvD|yP*o4)TrT9hO;cTy-)$F;^)fmR zsD7pUCT%w#Imj;_QvjOuq~!55CYCpSnZ>yNzJvB}y?9F!@9 zzp#=@^#0%_MUMxEM|-@*S&DfcQyJeBin4JrA^wzi)3JMPlN@j)WfX%0H10+=zX}WA zEX@zKEWYphlUc5_Vo34wEBvzUY4P-?H05C+jX8^s%**(6D$XuA*m9gUJhQFjXJU14 zK-n8h8>rhSBQppi;S?QepB5WUJ8i4t`Y<@}>U$ZA3gI9?s-QHl+0^<~(YN54TiVZ3 zW$zmxN#YfZy>R1L;<8)$N@*k(oCf^=$Z0{&dp2B3i2^JSrmmR&Zj%w#{o-EhQS|8i z+DXf7KjPYPBvtnEm%@Cs@x74MkIn9HYo>Uj3vY2daJ+NE$g(;tzMcKyJK^Op`E&UD zsQ%`sQQ3<>L|lSJlo8L3JNfwaOY27q>k~_}8KtKjn`HykMg!d3+=9HWWOq6b9t`R9StjJJs?1}Oz3DNLsQ!ANPCa5@n2|v2~vN)-bu5J zxey*d0EHEu1G;NSs1EHb9qs{=&QihMS$D<#sY5(XgqTxB(@YIQj{+U@Esk`4+aG47 z7FW{FZsRL~feAcqxH3SQRhKwd{TJAM+9sf4aWTLPlD4%ZsTi!&h0384XjdCRaO0GD z!*w_m?L)(?Z$vM7NQj*m1ma)dUS;yq(+AUT<>XdwJWD{7{rV032oA2_8q;AF?qUCE zsTO!F@U*yzK!1H+zo@8!uQ^th&N(%i7@^I*fty`GWST<14T%lvDPqW|N)kqD|1S#w zFo6-JyzO4KL}=*-lrh(GIRZ}^#`7$pq%r{Yl|*0htkD2$pLu@w@$9ppE#H#V!T4fL z*(8T>nv%OCOZJsb_nK}Z#Da)1l$CElOsUBLhLr;Y_Uqx&u~+M0`h(n#lwW~l^M_5D zS28A*&TZP+Vv(P89^9Sbj{strg)u{Iq)CS}o4(`&((Y#cN}l>(57yg<=*(v>ohIJK zyA8P%VW=oQ>0Otlz;wsc{Oc{PTjC>XkNbq^&8GO{X7(87$UWn^vh|DHs?cY2fd@ca zj{0f$X=L*|UE+<8Z1^*EHcl_D&g0BiiEo&pq&^f)iJ5b6rg^z8Qh@f``2|P!{rPha zk*DuVz*L(&f6-}zS}dRi9`J3+$uW^#1_bGGr7&;)sC@u!3xwaOsI9cYk(N(4`8f$U zI2u}rio?z8`}@avlLmXTNZQ?KL0&y}mK!Z!d}3jCyYLfp^i z8Ze*e^L4(ADO+SyE7d<|nC9 zX%%Egnh3zjHQy=(vzC><0NfFUhi$U}DWsMm{4*`a;_1*Q9ou#dZR%Bjw!ww`_jg@u zIW+(^aGd& zy7choRI#Wc(@yt65+8d`cKyD zO2%<*@*_Pb6D$++tUNV-j>6MX%@+KHO))=O@=XVDbgTSvuJVT_xUT-Y6pgEm7+PaPxwfLjuvYM28|rG zk%LY&LMA0cwu-i&Bzt(iB9<{6BE>DundBg`!7)FTA&;_P|AL!f`TZavJ-0iUqMvmr z!@bgGgq@NUj{hv0Ik+I$!N5`0hQ0M}YxQeZMi|<}!~|Nofg`E>i!>OS`yYtNqbl?8RNj8eFy{Me*iLI+Z8rj^<^tj4+FF} zUkwDRP9Fe^g#4=93mIc#SsBN}34hQruxL2CFMlaLQc*^K>UsXA)U-aY#oxAlWpLO* zN6A(DmiGmsjIKO8xv{ZvWf9o4>?W~np7(K9Xc0(o62-BQvL?HNUJ}jj$ZLTSFr`X; z^eERL*X#74tJa{0feCTGC*SMVW^|k8$BF}i)D)QZh<2isEcu{402=>&@})&pEL>um z7rq^1+R?Nx6b_2SVM6u%{BA7#PjH}B|D>$;SYMaw=B7Me7qG=Hx50O7o#9K~-MgK( zyG!E8M)B94c5ZK{?8%}8t_xG#z8D}8c2f_0;8qKEx8f$gGMTcFkRG$Lb}K%$ym8o) zl6(lFtt)}HlJUG?w8Tf8!>eHh-`Lt6iNvvEH#+yvqqfZ zCPhN)2H&uc{oVX}P&`pF^r^Z!f5lGn&zp@J{vWCWc7UMqLaBY{P0A&PGwBmWE}D~$ z)(RNpI(u>kml9fNkqxgH?8n@o_Q_)6q2~pOF6Bl@l#W-rBQVts(^sn@OF4Oj1X-5U zBNCt*s_5a1m|S6fWB!v=I89a4%Sr?5P7{D_pvi<(?hx)w(B7as`_&oEoaUvudIEHkkuMkRa=R zi-1k@3=bFZ=9 zaGF{qbnNf9Zw7Yj*G3~Mx$$Z3iKNVW02b1or0T;#=V_4X+6|Z7sjhHMoS+xn)Unfj zcl^I}ph2~>PpJ+^`7)W<(M@7svRdc9IC4T99dzhdH^l$jFB`Q|HV*Z@LLbYxLe}{QGHzfu*7tUOc?2=}zM8 zY;!2DNJR!Z_7K8~S^z}>JLNlpFw_l~KUIbnk$?yj6|BGx*f19LtpXZ6YO$QMec-Mn zLNK%a6xlN+3~7H*$BAAj9;HL4A(56$c17B(pN*| z*@T+fn%K*~DMM70wLoE{;h!QO9{;m^9lQ>DhJzH`+Kn~2OQdP2y`H2>aOdw zjXfc({k-Jpr@+-=GKsEnH)>_<%O2%$}Ps*28^UrF0`zvdkK z84sgvLjDm6Y~!PEjf4sAvR@CDS@1qN5$_s$D^{aa35JFxx?HzrFCH&7qXZMp6g1S& zzS!%64939MZkCQ;f;07HDUiFAJkr>-%Wa;ocXME0SOv1%jT#ifl>_uvGR({Pq7Vj} zL=lja)y_ly(m65_Cbi2WL*b=_wHxR5@^UG# z_jz}Yv#-C%NHK-N6pzA$wZSyuGzMBZ?^p658bBxuOiTD-|8O#8lV?~#QZn&fkK%aX z3ll8`uE8&BNV6uj6{jGmRKY@$OGyfeC2;8@9sR%>hwP0Qt9)MhoC%xBxLK|r8286- zwup&JmOTW5Fi=@FpK<9_!wv@q0s#Z**?_ZXl(F<l2?vz1???ZP;S!29iflE8<97P*BwVjWXv6 ztd0mO=takkBdvH=Z3<@$->VU55ZwB?Bu4Sk9Jq3;B}Y-Q6iz$hWdubB%Y0osK~!+9 zxFo93a&rAl@of674t(8`ND?8%QbH*UoDz(g66MVn4r|m8CU0nEtURCea6m4*HR(VUnPjpZFs)B9^{fD5FrpQ@Ro>3U;w)U<7=q3kb_H>TKog3 zW^}n6Vu@Z$d7V9-47_44iHV7?r5(TYZ3$B=>$2T|DJm+<6%ftfXlN*F$b2V~Jm(_Z z(DMxF{L-S+h9=Eunq{1>?K;77RtN@>>ANF?Oz6kaq2k1qgV!dGv?R*Xfm+>%PYbpb2#USA*CBEa^a$IA$~Lb_r2aQ}ed9{Sd(3Cc0MNHePx}M>o*h`tLv3 z&1lDgUy!Sa3P*SWm~es6)NjAkAJ2q8j1FtK@zmEuplg%z^dAt?%MuvfK$nrR2qwMb z!Rf1iyf6(qeuP7H2??Nao2$(SFzlp<8MTKQ;kDcGm4OJwPMI%XZJ;M@|86H9s$D5+ z8$PI`jMc=9yq@x}Psmi;Ei(J5(d~c}CQ*eyXjqI2A|pxuZEz-|cidW=XSFMxG?*)z zln#lUj}SPz5!`KTz+*!MFh-`U z))X=W%2rk<=a%Muf4D1@nEs2E>F=-jwwBNyqY+YNfLQU!5p@^@AFd)QPK#%_aY}da zQ8DDF6?RB06fN0ri?-aJqT0PhGn(Eh4;!dKae{|0f)lFSO1qm2RF0VquHqQ9Ov{OJ z(+#_HM=Ny=mX%J=eth%8i1S?;@YoifPh5!vKRY%oZY$RXM*Bw zG39A{<BD~NmLWZRo0QBO!EzGPcTIH6g4O{$B}#mpsUj-G?ZDBb z)Ji>$Wv6P@{d(lYp-GVfSOHu)j*jVWP1WT(=&W!}N zE5R*jb{F{xM5g@U8x=nXgdH)t<)bQCP(%a%{RLcVfq>73l+#Upc9_A;=9g!#ZB1TY zUf{8#sUt_D(%LhW$?}L%S0w*Z&|kdnW8t+c%IdmTQoK=ISrwX(a9u}9LR37XT98x12sJlJgqQNv|mLgrfV%Q`?giRX(D3(#YjJ>=4NU-N}^)anh>L+HR?KIT18gR{=o2P zTtsOnaUb9Er!}M2%;c`{Yxxuu=iN9NJLABPT)Ab!rkC3(h%}Q^miaNbM@gzwsY$6q zxQO~mOY$QB(8CJ?)Tjg6#{|=11D|7Py*jZ|Sd?mG(Q6cDWXXnTCEu~oYSvx-x&4;F zI7niNL;K8tkJf5UOes~r2j}}BPHU_fUQth(%hT!_{Cqkee(Jx5%w4-WnFxBkuwE#i znNPBP#hg zK|~rfFRMv>^2_hapI`l8jbJg2DZ&G_s3 zjxVjAii2G!DJ;(mQZ^`2<=TLgeRB}9`6Hxl;g+EwuFf_!t*Qe!!Nb>dH5pi0O;Gmk znYMD;>yT0T_d|A&s0fGXsW6Y=&`b@)f85O6wOh*kcjTecY*~|o{rxb-)5jCYl>_#U2ueIcKY? zn177UYH8~pUIE9c*0qO~HP7t+W!j?Fbvmhzhs$GXp!$>>IaMQwVR*R2it4`}j_7#2 zI|Q=1Ha4YI;Pz%L7Po~{_8$VSIDNcQY%+QNW_7;t!2ntL@=|M8X{D>%Aya#(s|*?Y z*3naT^q1jT{KRq*miCJC4T3~)+ukjEMIhcN`e$WYftoC*8eg7!=S;blLmaG{+{=BgZ7)s>H&L<3!8t@j442Rg9)?#=Zk3EQ z9~EHF?^s+^yJ7a`?s@6*!66HybXaN}#;YpbicN$(Xbj>SzK$xp%G%s^8kTelz~s)r zQGu<$4MPS04X?S{8@ZyKMrgFD8`o^+9+uyi)q)T_rhDo;jz~ajE?}2xPGW)c;%nx! z6dTr%L`dzNtN3!;5=H^&<&4CP`0IiUMTxgWY}$(386=-)3_@bG(kS>?Ls52MkRtUFZQtqc1b79`L$TCtmN|~nnUR0OLzyPY| zLn9@06HTdtt_v7@7~h<~uFvbZtnWU~4SK4sUltDgXuUwMzGY=VE{gLk5w&On6S^I3 zC^L5d&dYd!R|N#%?aHLa3b8BfAW#f#4H8ZouEI2jf@pzw-z=tRl#sDE=?6x47b{Mq znG1J>bB9+|N-XGH7<`gA@o@Xf%dQi8gH1d%<1~vg`U#~Y#O?Dm{9A#pus?1^I?oji zvJ&MlnbFJ`)MiD!=GA{*Mif8oyOJ+9-!&l3>7FHx$rkS9CaI?&=1zCTQAMDXhhE z_2-ArSM{X7(@%(@N@N`Fw044QAfGUTF9o8pC2?>OWc))tIV4@dn&85U$Nr#y)DfS+ zl<-lESA#AMCU@uI_B+7 zleMC?M9)5x5zH89U8$&v-~R5@oqw<)ZG6Yx!}gSkJ262uD1q#pZol8#|BdGAIV_M? zcR1wQ=5A~3?)nuqY1gCGp2~p~DpN~S#HC#cDcG-rmI!1)(?Sj@rk7?Av!jSA&3LXm zW-STyl2#-qC>g3#Q6;1j$G3AK3sYoK@s;?(f``gi@uxwe&tDePK_bVkR$I1u!Ww>> zN%V~N9T&$uWYM-L?_^O68!V%R8v+dc2sAc69fqr;1TQGEg|x44idaciMN2}pkPGkF z1a}E7)^3o;>=PKJRiUT(2$2an3-tJKv#NMTtil{q4z^Cnn{b-Qj-(i zI|x&J6@iVFa~<{*qoWL6h-MkulJYAnj%L+|8_m9VTsbn5PmY(_EZ8cX2?pO8rTv%r zD^?j2r=g|XlG{?-`&BEd(sZCmb1$?W5gdH*K}x#cA_?{Qr7FPlr#a>bh|L7sSF&CvGqpECN=*tmAMG+UeW)p;|()lscmfqe<4z0j!kS!vLBpmdn#EwFd z1shWW>8e-nKk%tKHRqY)(2Rze1L$qbDm}cf1fXrGUCCYs=ZNUp#lvXU@t5^Dl-lAW zU~I0ZOz^@==$|jS9@E;xu8ka)rir55W-yq_rCTV&5TsL=$l&vKwNzKA_ zX9CVOk=eV;avE z-Ecx!9&hs>e%1$Uzvfe7(9yQ|D@e){Lkd~-+qh14_M7$!^5R|4$#SkF6l{ebT8N7T z{BvR1ge;bf#zG;9L$`!qk;1i@8$2te6tIVqpEQ zq2?3;PkxFjux~U>H=JRkrkZF_=S+_cFKhd}BYH&@8B=&K@Az^esJ02OcM>8h zarvvgvEZc=%j|7~{JS5IAP%E+%LD-`N`&Zb57Bzv!p-RsN6BU!#qTDPy5XLSK@?Zl z2fpJwoD69OJ`ISv`?@uKk-B>|xk(x?yQ=<&>MQgQ_wU_VUDnILYEnhmTjoYQy`|vr`9AL4E(`xASQH z3-Tn@vknyUIf4_TvD%_E2_2=|tx^?&wx@UO#&k3|T+z?Hb4QY`Dcr|fPyJsXL?y?u z3vwiEIkmyecVJB;2!ZTa)U(aTAEg z;k02eiDd~1C6XWt*v2#!@l1pMMQ{X;RM}~~082bL)RJgQsq@I9$-aOxn;QApcjbCD zJ2^whtmom$7Iwp}Ki<4L*X_%Uf7x^1@-$j5_V6J7_q5|8_w@eAG{E6k6iZgQ@Ygq2 zI;8A#*V}P@nTM4+@J@zvX$=ie&q}gjN3y#Vse)I|YYtg>Hj`c(mtK_Q$%#-pO9Z(?1X{!| zNnqfTrkxz=br`qsTXgnbtNVl=b2O)NIh(aG`16~An_rUO^glyOLh3qvJ~&kNF^x3} zE64LFyc}8ml8fA#g5Z|2QYVJ*j^ZRxo2VMIrQ?vOqu^oX8aQsOyDmB$7)r53q&l+O zK@bDFqIRTdL-J~C-#afaZyD)XSS>+PwHrqfDM=r(f6|hSy2DC+%@Yxn#pW>^TCxJ+ z>@sM_n!AlrkYV*_pEPB9U~V)g6g_S(uc$1BmWOm5t#M9-c<6%e1Dao#G7RZe`JVmg zsT-e~gK<||*w}X(e3+v$J~Rx@ifd~59h~`$WPNgQw}(dqOt_>B({6{L0yf&1sRx@x zl9G@=9mYm7IW`VOt9_>ZT&hcZn#58xJqlJ1UGn&!HDbhYC@3h4&0w$FrqxQL|GDdw zyZO11gM^|haNc7#JyRrte*T7r%k6GZ>hLu?(mC+VFyHr2_S@_@a>oBMaKAhK0VqKC znt%F|Gk^!*S@`c1{O48{0awgb7;6fcZ(nU+`{2FQD5Qd(y9HC^n#!2tOV4V|6ct%2 zP0^`V0c$90&tMVG6@*k2fMgV$IKRM1j%IaD0{`9}asWf3{HIY{m2kUnUjNGi%)C(5 z#WN3oIf%WAFkN4a$$48XLF4>*Wf}B6z{2fw zzAZfXl;6+{PhxBTaX4$@}uhw&=_Z%Q0Qj*4JTq6gsu#^UVb3`fv> zXBwsc&VMxd@$6q1!Ue}7!!_6j6DOV|3{y^FxHiqss>xslZtuC)1wUM^`Z4N0zUs&p zq=(EA(biwNexQk{bF#MC1|FoHbAEYi1Y<6Zi$<-1wS=-ioe0ibQ>wsvC2~Eg4?$Ly6Y@ny!3-7ZtfVvU2aJ{5NIv2xH@Ezu{YVravpyTeZ`4yeoKFY$qt&t> zM9L~yqyAADNrRB)06rztBK{ycN{NL^5w}7Fzvg$Dt5dbQ`RrUInh%{?`A%KiO;*u4!wd9VYd{|cu^_81|; z-bO@cRPWg?O;MdNLE=;s+Se|ql`MmoZ8UVCxp%VOtwrBn-; z4a49Yij308<0SrK)jLmX^;WM3MFKQh2u)HV3K`4slmeN?kndt1+og9xajtP*Y!D zlkGfMcq=MrslGyY&cqJ*V~Hd<+HXhw;*h|b^vYB|pAhX{se z{Q87NMEv3?z;BgYz9|PwMk4h0(JO8%%BB}@-*T?RRaNQnt9m--g*dQlvhES$7VVLF zUU8<9gehp?77bXDwS%CftQBKyXwx%;^*?g}KejpbXFBe}Y{e)+sfDRBZ{O9uAz3Zy z9@rNLIw_v|swu5m^i)NbXZU5m(+LtG3Ll)hJTk-FZ5MH(q*zwwP%2g{sME6u=`%Q) zP;kLT(Zhj+?_sRcPFXgnS$BPU)C*@@2LYH2ucdKUY3TU>{(Cp2Wd4dHE631Qi--`R zJ|Jbr;~B+wcVRJ!2VeTurQm{N(!ok|w(vwv?K$sfB-+O90pFsb)5LdqpXIM zHH8Pj{jSHlk%LMc9bgAn$-Zx45WPlXYyjne5?zALJ3?SBk@c8^4M}Tc;P(n~CDcS4ZP)`*dHa?E|-y~2k@AlYrzFddA z(5e3DY?9CqrG==kn2KCbG5MG0$2eY-{o3l5keMt}ROBAV;T@Gvy&wv5@H47dWiP>3 z@o!$@w5=3QKcc(9ih|K>{-U(t-4eUga!VoTgW|(C^2m^(O>`b|X43bn6JHfN8+Z4&4TLdS zN(YLxIq9h-Q6K_8$_+F?s{DshCapmNS4HNYE@n2Is#sT~rm|B}GWw}+Yx+1x?b5f1>e@SFId@l+Ksx6xYp$=TG>P^8))%LL{r7|M*C z($S)(;~`Odp-HeI^&)qTO0j*Z=7gW1TEDteqj%JcAk&xFoSWg_pzUsP4=TO|(c#9? zDia;K+rwEDgrBU4eG7pcQlM2=94E?GH>KOy{`k{%@bU9UECW+F2GvTo(teTvf>3Nb z_1BE03}s9hTqIeVFQpu`W2D}9w-W z&qff&FI$w{u21BXL;sjfL9tMDDm#52DpFpVJdQgW^IH*tTKrrlISW&VQMAow^f(I& zFm{Z|Q-(d69GI{N<~CZW(Tipz_zX>++(IiNg^yj#+Fk#7OlISUKAVJSG4`iOxgjU@_7*PX znw?gD2x1jw36w0huU9Ebpl2X^BR7@>M1s6P!AVL>-}s%DD_Gx3v27TQjWjse9A5dI zgNz(rPw2xO+%;ajvE1UMdzl{h$#-=sg6a{YL=Z|zNx9D~z^{vW`#M8H18wR3+ubiw zUL3O1MD|%b9`R1O!W$rEKJSNZG<|pzuNk2#X zaqAHv7cZ}0yw9~U%Dh@#@&buU=WTIE%#sE#rA@y6oSxRS;0;$1M=1R4?}>y+i?n%p zwy%`T_*~GazbOS-&`>e7Q<%4}bZzFU$y)GZ@R=}i^E86Ke(=B883W!+PQJ2WN>^qE zXCKeauko*TAgjBtC-7il^w-a&Woun=dVw(RQ})`^Jb-ViL_4#Mp#(Bb$|E_PK3 zT+3x46i*Hd?auu{sGz9FYv-qHa_0_><9QZ*4gSl(y1z8T`2YzZ8%PuUXCy>~+;wrV z%E-t8Nhm$`^r4}l!{lia`l-FYa-cFuMMmBHVYP0(P=8pIMXW`YIy0x+q){X-5@W0Y zr6X}`o{Vr5~0h*XkGrPH(|wh^Td4u{t(B% zYWB`y5v4+Z0Ns#2&migThtl^pK+K+nPoE7ng$s(`uQEm?C%3MtiWy$O4lH*^!~;CjV9 z)LAJ=XMtnI1gxcV?Vbq~*$D9NpgP{GwKcKbpkF@E7h};aiiZ1x2mJRNQ%0VPa0hJ{ z7Z+!#Ow?F1Qd(XD4UAg<)A<+{8J-+lOZD|n8-kv9UzuYqpAYGgp~QjBFpBj%%98&c zSj*NnW&N%oyvQq0U~>^y#&O}t%v!b+i&Q6)#fP$$riessqAzP`wi6av4ijq|H=i;- zMp5LA(Ef8i03}B;qF?-FN24>SN#h5J;0*~Tb8&+}Ztt@f79d44TqpbKtzNE8LqM3zKz+<59&Jgx1~|4{K28Nh^EEn1}usHbUe0Txw$IHN%d*GP1|epRmB@GpIoa{?@!#LHsh_GnrH8mOwDu}DJGEv_Cl{+F zy`fBxVDG~*PMkU>cXt}7K1=8@OO?Yk@2b5#*^nAx%rgW@=;ogj@XEu zqoH>O9#>hZy>|GvbVUclzFc4J1ny7q^8M!9yKgd2pBkv2_U5~;o1bn>g9O88c;DMB znHwtZ`xBIEFR2!o@p3{4)Mc=HwVCoz^W0TgQUfb6Y5r!4x!|6CvrneWz5x?SNP}?= z(HkVkf};xGVQ_{|mVGt)7Jn#J8y?&PNJSe4(fS7zU6y>1B7}-6id_?CWNSR~aBJP0A`z^0OI}XOmU_UK;T|FR`&J6MLXS zQSW5dSSM_Tdk33^vJ4azffPzCxOhkFV#X~ZG8l+?B?!)Ed6iaQRN^|_lIVJRTUL`f zOwBrMNBMwg3Zf%f&B!b@6?Y(#TJD))`h=sCM(388D1Xgbxiu8q8St9EQ$$D8p`3r4 zNQ+CA0!Iu^2Wz*A^PsKIR?o}K5LI1KyxV))H?_&f;vv8CEQsuCYb}09X-BkKb_(ht z8Pj~DwJfJb-~HVeHgIrBi1J!@M54zcw!h)M zg83ab62p8ftG2Vhaer zAp-SI+fMfWI*hPx)gpzGZx%su-+$H}q9!TO%KRi9#Uuiid;*%vf?l{8Jw(okg4EA{ zU@VD}if4Ia3^eK*3@2`04SEW$%!^<_O#I{`TA8LKrDvlBnEJ>rHCnIiS`IteI7`T9 zg(*U%sWN>5m4Q(UaOX>Os}~@%fzk5=Ghlb)Y_MS|3h8G^s9eKQFwWix9%V=|D6Oz3=iIK>M$z5St^hE<#9_Sr#|nqqgk z_%98kTs#Xe)k%@us9+2zwJ6l@>W)t$@M@eKKH@OzAgS(6M~8W(gUizx9rIP@HRTJD zsuD&??bwp{I@t1iL@LiCNYL~pcwU*zrddhgk2DxV-i>EwXx|aSSQLjN`=f!zjdpsq zH4epO_Gde&mU3;lQg)w@n73Db=le~TKz^)Tx?k)<9>;E9lNUSgI}sH**MSww<%<1c z6I0)O34bk3rcN|{8EV{GX7(&3%zM|j_bWMMVwGdTe`hBXj`jI4kNuc;LAC9fyWriU zY-Mj-GW9#}?yHE*hc0i&IU;qC6&)Ie>xHdrdg9Ao^@kCaX#vlP8&2C>eCd-2O{)Q* zc2Kv3{virHBvZL!7a-Edm6Wf1NMFcTK3u$Gd`TWf*#q-`C>D|hfj>07ciUGoml-V$ zCdImbMuEQ#1K`Ls1C}1Ne%ms9zj{X*K6ydf0Gl^*F_Vz9a%II5qRiwUt4D)Mk)tlYu^TL|U=Zo{UHO zg=!*zEXjZB6YuaoT{xb4#3kf{vgl}CnKj&RO+0PB%J;zv71FnG!$eEYV9Yk zq)3g~jbkS!MaGkvSt4is1b~&ao6qCn@*huQig}aKzc6194-YS|yYEjIW7}@_;P_a% zRZ9NDIj5{rL}eA{Ns$U+Y!7(h@Ou>q)Vh9klQi#N0rsiHo1D;_9z4BazQj zvr$zl&$O(W!@3ccABGJN1)q~(xCsyS_DY(%kta8|Oc&)Y|5CP-fv-6?8=`VS(1;Qh zQP9+<>b4r$^S#0(Ig4iK?fMo~m;jqs-YpGyZ5C2`%~edD6f<@o z+`AGi6Rs`zNAf~s>IO{O3la4Oku0u6)|qB+^=OT)fqHP5SBJE&q&&VF?|mcZO(zkQ zRb>fJ1jnGuH6S9Mv#u#!VC|M}-3D}0I(^T-@cno!g^ChSDw+N^XE%GSrmD=BY&|fc z%_cGLbf{~VO60>mSOl1C@CkL}dis*}7&INjB&u=*`O+;BHbO*-Mxr(xwJ@kBQBjv zBQ1?cclT1#t$>7dH@x%vAIG~NVRvTsnft!3^BmnXcgwa^W;IP>2cP?Qy#NAGap~8z zF`DTV)+ke3Z7u}oB`bc%dggA$zNukh3i9Jtu|OILOI4Af8M#u(1#opvwAfQ5#N+mB zHeAv-39qcx18G~EPB3<-j%cced`Kda^_g=d+uQ!89#<1S?C_Nogl_4<36T09st?Rr z2uy@1I3O7(BEoHI6QBB07`p3anS%0k)?K0ZaLM}**w@1f@=90ISMR0e!E;m`;9u1b zfqzz|k|6-8l2#Tykafo5=kZeL!7bC^nyz$2B-jdlB8#~|*RAUaP+#KD0sb3;QVPp) z1Znh8$^v>@@JFN;7>BIS)7;yURPu3RmI4@!I~c5svXBM*j~8>0uoKeB<1V_i0iDHb zN}xh~yOjXsZV#fEzZr3m$b0zx@8kB;)8T)!O1}CvIdjLRPH+aStDfe(oLlW*TNutB z^Y`ZoKOvwk??=$6sr+jGJl6GCHWYmQL>uq|5VI$g6{m!7+{Bg3QZ4Hw#!SssqcmjW z$tvwhLQLH5)@>zkr+^{i%j1RILTD-fzZ}J;7#M`g^rL4HA6{whD-Z&i!J`f8Lbf?{ z1a1Z6fm-;-WQ9?-Vd>Dlh5%1d+k>i%s^vMBu2&Fbz0bFRCKVW}v5#Rr%&c;}`Lut0 zlGjl8ubQfYXlaaiz%bO)|I<&i#XhdJ;`PWt*QLgP-VQ%_-}gwJUT!xhT>e`4-s0Bg z7nYN41sUW)V&|%5{bp;Tbp})RvG1}}MB>eXw5BX%Ab37%wxfTX1PH-*EGrU=hLdub zdZ|A#D3YS=WuW>z>@77j$>Y!mpaBwCvvH@1E>l!bFQjpaXoeojg3zs2)85`3v~7Gs zreUs8t*K8F`MgE@;)CN_2L{IwDR2y;E3yhAoF3LqcHW+=y&Lr?J%6cY9McAdf@fO6 z`)N@>>?vepBl>tOENpb?FtgpCXQb|CR=7J%B27LrkLTPF1CuGd7x?5OHvgT;Ox>w? zUx*$`NZri%f32psX1>MF#{7LrpxvzK6P9n!m)~iFZu4_4KYG;$@EfifO8~v4GG};q zh3yN1hS7GmX`SEG{Z*UGdOkTb@${%&f>}fa%+~hcubXHIDDsCGM{$VEi~!d>4n5Vk zTp^7V#)maEBDhoCk`JfZeJD0kN)$;#p$rLrjAR84*D#-u4Mk)Dqp-%-)M*r>u4)aT^6^KpSR?vc12xcOa?g^_+ z$pH5yzG(=PPWjM%L@RzT0t*3*zzEZ^uJt^JUpv9L&NL$)Vt$o^6j>SHt<*nHXWr2h zwyVHKGU(&^roqy=c`!+Zcnzx}P?&cvmFOm+9D+5TCy)O%yZQPDA*JcRTOXL|T_=>2 zX2zL{pnHF#m~#yqE8d#7XlS?AX)^Nh6Zzf&KhkY)lb-64m8*}>?V@!8|7T#3JqwUH zf^}4RK}d(K)iXbroZ=G_w2q~wbkQ1!7)lgHWMz@5iUgcja&j7+Q!Y;5nm-?Wd+wL= z+m2E??hImfl~Yh>983obvtsK`G-iEZAp_yCzDqhM1hj}J0XH+;?WeuLz+EY3mqj#; z8T$UB-&hufmaJ9U#+++QK5%woebejs8+B^uU_) z5VfoJ?-G%TyZ=QAyy^6rB#FA&`cOA|c%UBKt)@85FzA&ju{G;arPKTUBsaBDu z__i?fF0TuKZ?*l;LPu_(A(kwS0v%o2Jn*_@GGK?Fp(iiQoB63RL*n_?y6gF%%ZwpV zdo5v6AZ8p&DDnlYF%z&maqu6_Ri0`t`b9*;0IYA|cUcR_g`%|DeP0YA$cPM#Omsl} z)B$~=dZRh`{5Q~Wij}E^zrr*_X&&P*zWm)2I4R0yYPnNlA8mi^KH*zyl3hJXQt{;_ zEP}XglDC|Al5)W{QM7H8YouEekG0sV1*C_>_hS_go~;JmsXHb@kj3t#c)M4%eU`R<{FyATu)L zY&ND%*+IGjIyLW1V-lGk8YX-3S1r1&%hO5!zR@G3KxMl0qWYp6*~wfGQt8=gh%E~G z#l)@f|5*UOg-xw)D(9W>;2aM=Ge2;qJ}VAedKA5pMmR~IfJ>vP*R$7t20V4wZaoX$ z#=KBD$Yv-wVy~f_WAM807oJhXezpdds!-QghwOCN&mC67HT3V!t5=TI8RwDYbgfAV z8RN5IWe%B6<1qBfa{9#ipVFxCI=%)XIe}@4%3UEBWXdNez3RcrKju>cgNEu=saN|; zKbClsrMIVE-*)4~MhyVR)YTD&?bpOQ|Z%x{QH0|yWw@a(=Mu2;u7r;#QYSXAt z*tk&(o9TQbDbaFv$`JfATG2g=hTA@sOsZkxy@JL;L*;b;$EFU4*DQGNPr~C~0%zJQ z^SkqnfHUrwf6H?W)c5M~p%8&tm6)hV%?a?C>?o19yS(rf7O_48BPz2g5_nOv9T8q> zqmUpY%wBAVkISp5znOm^oHg#%#)v%zsWaq&@$e8*gc%SJp(7U9zUlgcxBF}JR@eU6 zjHmAor>_wIR`&35*}%xeVIMgDqo(NNP*wC1?ijE7A_w~Z9Tmk zKYvnXcK@UsQTjIFhSAFONxzP`fPKsNQtP)>ipUp7tJf3@o%{)~YE#PWj0Z`=X}6XD zz;h1Fs?Y(1CT~?h6!86aGspBzxnoc8>#&=0@d~X3!Sa1CM}{URCIbF~`@qGK8*_6K zR2vs1X?fh9455>_*AMPhyPHD2`sy9egh-T(Kw71G#BU{d80kZ(7Mat1iP2!kFE3O{$w9sEj7}DL%s&koba2AL%LIF7;K-!J)Q zLyl#r@76rf=m3{4{BQ=40atLLByzxwp-b5QSc-}&HmNA{ z?;7MJMQ7=eWnwsLyUd=>Ud#=TWIpmmJ2Zf-|W|VeiL@ z!sxXvD6Uw6q6;Q662H!A!HkS@C(6eeI6xjV;LmlDc+~#NO8rr~$~;7ht>xgM&rCqC zG?^XcibFvzPx`eT^s~}iY6A|2f%OhWqQ%`BTU*=p7&#_#)iru6lvq()Isxg|{}ytF z_SNnFX1l9XMXA@H_=jYse%j)(-_*b>*8V8Lhqr<&8d7i(YFb{5z?Hu2#P7bCKVxxz z=Rjh)(|NK2En^c+V~SkGgOX+GSMCjadAGtA09uFc6`KDh&p1;y^9~vh(4o6gh5Yo6 zd(~Kdu-tg{*8M};t7>9G>ZiYYO3~CesOj!eRO4{t&XR8W)NE5)UDc5mVM129E9bH? z9ObIKP?C$3h>Y4=hcn*`0fO>V!6aQ(Is*tD8Dkvg#Czlmn0mLnddJ;`O#(PFugeXT17+uo>-@cycT z$W6*0x4SH{lLw8nfU;nB^ zmPOY=y|2dVPb`aaUAX~vhLmz`POT|hx<}sYctZnLwT6{eDa(z{)$4}!oO%J9XUwD; z*ffeCGDTwN-8lh*+zL?iJo}qweyq8G@IyK7ucgH0Q`z*FzGQzW^t~!Re&Prv@|RsP zODiQdN~F{R3Tco&+;WEIG+unbJ}-myZdpA-U%-E?h-h5YMR*NbH$tTC++xC&*=SFJ ztn@To&qO)w@qUEPM69ZP3M)tByQSH)8AxFgBYvjKV{!kzol16F6qMKZuddn9r+!!q z(E-w%3t6TfRMe#)y_^ua?quTWbwx>uFBD=!@4I2tx%x)Cj^cGi%Y*&<>N8!15PVo7ppDR9ZvD)QH9`p0V?Qi#g_!N zwbyLr7S)cWH;@I-=YB9DJqoT73dkC}gNPrUwe?_HwRqjXPe*>ZJL@NKYp@oNLnRo^ zrXnWeYEyp#xvPQA+wlk3p5v2%^OcA!0?)K)LqI*&gNAZvVOB<#y4$rvS3g;dn3Dx&0vuIOl;gTEeIW9qas~`nj(U=U-C&2JW*#2iy*?Faveb7DQQBXq9&P&w`pL`RJ zp|?O6nar>BvU8BV;;heRrJxT{NF3&pPqFNnG>y0d2vHa``%1i4OoE)c^x7$vC{A#M zm7b`8bsneo zRh_6r5r4jP*y!GoiwTozg8BVy0AyM`xHT%{5R93GAe@uHbjQsOE7xur4}oJd zv?C*?i@s*kO9Z!2(b9Gun4XM^K2$DD$);GTMq8j-%~ayz1-Sh|y_vd-WHV|VCy}`* z>B~Opd`wo7X!Y_KI%l*(OC-peU&vontixuiP*}!oG!)>o`St;X>~BJrZpXxgTCdxU zjY>yHk{Gl%sj1yySz1i*bC$XcE= zp>i9>yo5OP99i>jqK2Fx-Wxe|M2-B*tSeTAogf}GY$x^pP*J`}9+K>fhYSz`OPdcW z4lxl&0c&2IsRC-3j+4i9W;t-L09o>4+EolF`m0w;&_)N+iGg$0pRXF?q{rWd7Lk?S zGkFh&U~y&I-(B~mQK~Ch@yF}iB13pi?Gs_8nfyH7AK$(>d-Doz;^_7+fACW13$PFk zKGkkRfNnFbK|Pfg=2eMVB=? zj48yyE-@w&G+j#cK2NB`vct47=EI(zYH=Q2i^}rdc6l*c(m@C|0Hv%DWyBo*$wruN zuLzl;vKlRBE*w5g5$eZW;0{Ez=8;1x8yPPt?~g??5QsMPz8qp}nm9wH)S zBq3!yjm^?88N))v6D;>yfShb8mctfX29=1uf~W2+Mt4yGY&#E|8Om}j9%S+ZLtQ~b z%}9}uH*ppPn)q4YOcn-raV?N`$;70$J&T?#oj-;rwm%emJzW1kRy&EHwU}<=5IqrPM8hRJ{`^ zaDq3kGAM5~;Uex~mITs`zRxaQ!21Lbb}_9RO>1^X$Ns-i@!{#|>6(|D7a(rLkIF>B z3eBS{qFeL2sCjM*z8Y;ZXO-j1=btDOEbovJ}9 zOFpMAOEH4YYdr7GaJtvMNu1g`)2>%K__#Khze$NhL{OOM_S<5el)plz!pcKQ*pW+` z_ZxW?AujOq{lhUxE2j%^(U8zkO$roM(~c4`&(_g<1qOIuG((B;q_xMwS$pjtIqc%qZor`ROEA zQ+gFLMYFE<@OU@&sq7LWPub8-6|QE-GWV#>NG31X-+xgf+qci!Vd<7E< z9W0_aos2xOr{sVtA7Z)up_1Z);4$3UU4o7(DuNBye zNe^AeaFJ-XXd5wK@&Qf-hm~UJ#J180@5#~no#$vhJxJYIV;e?NAzPv|g~WGNX)1WW z7eQ5g4PunDv9Mygl+8sK;aYX%v@$7Tw{j@4vLdyJKfc>=5-R4Ol|)3bsz%j~LMqQ) zv=L*Ad{nXRPt7Egv(QwpHkS7oGoJ&V?b_WuiqyZWU)hkXI@#}(XR6;2Sl_rP;XCHsHWJ#H@P3oH&)D{cO<(O(2gGf|#LkrRgC`S) zfwiM}(U6+vny5cE8}cO|^s1dae%Bqs%`(hIC1_{R^574Dn0v!8wC-vvRp-0R4$6mt zbkOSoGt3sfE-@XluoGSP&Luo_Q@*WeK&5320NGiIAB&xIRxdbSs;J=O8SsArNIl-| zThzY8RN=yEy0AH+Du;3^YYQ)q+3mRMo%-6~MbEW@^)dRvJ^DzXXicQUb77i|@R?o< za^lmEh{E!e=>8$={q&(_#rm0n3l2WRxkJOUtB#_5axi5OnV6`ktN8rwl`b_W89_m8 zE};_gS6!Awf44`$m2_3s7TT|4e-p=2CBt|q-T{ok;vx%$NM(F<9b#!5ePX>C7<6*F zVgyG}WZeZBZPD|6TXhVt&|C~SGEX&B^d`JOnN=fN4w2B>N-ru@CP4q4t3E5^{)5r1juA&qy8XYAR3 z)637fcb(b%$bO2uJlJG*V!XR1ou|9O^aCY6oqmb9;z_C-510Orzw}Q+9F%J(k?}{g zUtPGgpA8yL+Tm1Lfszuf+Dx{y*A|4WP}o{Zkj^V_r@Y<$qM3ZPOEm=qbv_+td?h0+ zC?mdxVN26nAT!^QgZWXb$2)y-Ju?2h?24r?5h$&@T}Y5k$>x#1Hv?#kRXu3h9j;9_3lNMY4_m5P~;I5(WA*C zlM(4ag!BW6*zE%y*xJ8Q6GE5o)a4q00H?+frbSum zk_zu*m3ts&g4ve4 ze2`-2xDKt!{HeRHniM2y@jLl63K$hyl99yhO{YH#RQ$U?gcrI=&!S^n_ODRHDV<;l zv1XEwV}n0ik`<6T7ubIPKKA##XQ}MsQE?*;pB$f)WEwlOBqQ0Q<3u$YYJk3q9tHZgWvFkM2fcHR^c+S%K}D@sZu2lN%GYjhl{)sIUyrwZXn4fF*O4 z5PZB_ZQ2s%(8q(a0}2Zx(i7C@0pI`U8vG>n(kn{d@8i;BUu#wqd~F+i9Z2i*GBTo4 zEB5Q(18xttlY|G;GS`Yr*J$kQO7ObKb&6>Se7ya#qoE@yF z{w(HT)ufa47A*&hMLhCh1PvK!eZ@7z&+~buP_(PJ(fzQkfbrOjMbuvXyPut0Vc~@m zYa|nbE{dV+D9Sp>Sazd}7Rnkd#g~0_jHLUo`UV^_+%f1gLb1>H7!ri(J1%>hI7qb- zAv`j@5$aSI+V36Vp~F%N5byFRq{I+Q)E|>+zhT;kB+dng})3^H|eAVRhoan=JK3 zFWqt-9}HIhpfdlGG~d+yH@_lKar32*H1DPS{V12G2ZlOF7MuPTto4H@9D5QukLooE zD?UdTi+>x(Jxunb)S(vEuYcr2CdrpMI?zkHZ>GmifqkxVMh}G}7D z^#`p3R=mQY5g;n9KL&hIGnz`G%E@q8`h!_yt|*m>C;|T7o>N^EJ+?g5;HOAMat0!P z900*G7?T@e+_m)e39&KgKVa75D0y3BCLt-=c{f!B_QN0<50=556u*f5wgG8~tCf6L z%60DdNUbFSETQFztl5n8*&X`25J|sDT|Cj=-wsL9=zX&1<^RL==ljV6kOT=ji!r~X z9x$Hj+t~zKfrN5lM>15f|UhMQOOU9<$%hK7}U$ez+*vi834a9 zJ6}gXoPW9`u5eyUzfC>*hmpX*l?sA`U^ZGe*m|a)Nn6%gw7`f}p}v372ZvM^T^TF` z(dfT%g7Q@)(eU$h4{u&!Vns>(b0@{BNzvhiPba&4p&aHx<2n-5=Z1%T&;E)PH?P*C zOZr&J??TcpL3xfOu%+vKQSFQSg|(P zs6E<$qOFsI0utk1)>Gd~ubuG|5M!rG=< z0FR%cch150=9sdWh+UWRcO7A$RV@&M=%&gDtfoTZrE`meXtCn|9yeZCIPk1fmc*!N z!%gC*{QR~CIHByGo=z2$cOs_gj;6nM_ww=r4k>^~9l0T);EnH*RjpHINh$$h@Pjco zly&`sTOIT(7;IN>_6@uVkmIyC-*T2V#-zGyQputt%?oHm9|4xeO`w_rjP)GargOYi z*=1tS0Cd;$T=2D{;DFaKoCy54T8s7W-T5))jpW19aX zss~Ab^b+CAXqZbu1j(<0R7B*29Z-_VXreofHnJONw^x_bl-gy}Px{-?5Lu{xqBZozc4JHS;2QQ~Q4}iZfILqWu=F}`hhC|WwHhryn z8s>@QIEqEi>(X15xQbsFD|5jSvB4M64l|B4ClM8RW{HeEB#GBvKt1MrW>~Z`O{6$B zC$lt_su17ICZCxF(fHW=H!W)F04-T@Q87HJnb{w;Ti|oDYge8q?Z?zY{c%kEauPm4 z9@*GXbV>+oAW2W%%qw0_QY}L`IGCZV9Zfpd+vjDuCU%8IcGH(6ldtMCg$ikVyE+Icelm zglno#FP19CKYbNgR`Zq);;H+w@iC|ZdXD{0FfMq=l!Q&}s;cp{36D_xdqfz;^>>4- z*H>H9e`BvYf=*`1S!Q}s7?z>9Lm9>-*IhrKl#A7-Y15vHO_z=2o3|B8;(TAEFNDtP z?}lRJ`3TG6LUEdpxQL*W)s`(&J#6un z9Y+s53Mv{J$-C_o%|JJ8XH3`Oz~AV=6b(4i0gK+ce?{`+^4P7sSpeiuYQulWzw_oy zi3Sy6=+C{o$k|ux*ru+FoGF1V@z{=Wu_O&*;f~AUyRt9gvSsAZKzW)P4+n*&b^MOXg`g?;Q z2H(15-SgOX0KfV;`f|>`-npGk9Lov@yL$xAk7o@5TIVh@$_dd7j91wYB(ta2b(4<+ zq%Y@K=C{38wN#T+$4LL51?c_xi}TX018M>wY*HKYV8uuf^H8DG{mr?Cfl< z?FQsi&@vwSa;0i<-oo`M@q$i8){d$oRhQN}#wKusJMGo8$2oB&W+{v1sUw3Leqv^O z8Kl$fK(-`*+mcLIHQ6mzCt7tvVGc1vV@BPI{7R4yl8PhBs@r0}Sz`V!X%(*=O**$@ z6rMa+*=x+!N`M23fqM4mkrSQS{j;!BK=~-U2VA95-3Pcfq#Jfg_;NlR&xy5U&-6mp6i1A+&rR*zeu!g>)%o>Lx!&LlsSR&xjWaN4F z6hl^RLU9>^N#gWy_~GVe7&f}L+eA5iWOj1qr^YkB&EKa}pH~U1Ci|%E;hJ;c-Q8WD zu%>7j{b@ayK5 z&1T7Ouu1$ipu zJiCnj0K; zhCnRiiDyvwS|mCy%ME|6W#5g|P+a@q``dPZaobx8tq<%Ut2|hv)HunZHJ0y|w7!U* zDjGBWy@mVR71Bv7EbwgF7(J}Bz+tlX{kWLwgg~6DtATxYaDyD!#<4@V&c- zDoDCmfO1o8(!2LOlNG04Gh>De`P&>smzS4+CIc=RcHDu-Jdm2< zE~S3$dy*kQ3hjK_vHedjOvWJEl%G0ag;=6cncuP2_Pn4`AFON&sHHj0S znwC}yNTvOEW^-X-ez!zI5q;TE6L_=`bhJ=Hb?YS_yVhe5)dG^w{{ib=xD3MHV}7a} zcBGSc%G?3m0zd)^i4QUFa{5W3@y0Sxkkbv|f`-{7 zNhE1bKGX$;qdw}w537BhKs;g!4c5uo%WkXML8yj%7vV^Hk_&iY3~6Z6VQ`hFqO zZYw;RRsa2B(v8Q)rpNHPyQb&k6HQIc0@xR)$`8zt;%1+)XMBAye?DF== z{`qsEQ*k*FViGT3XeP4e5(OnEb7=`<-Gw8LbPO9Gswd+?l;}yPted5~|)v{p95g#Fk0B>sfw9e-v?p%`4l&70>BpSIYl*-OzCzm5-?XoFPwoR_wPviVEjC30>N zv`2q4heD0L#+bjgt_j4k5g`jVB6S;YoLx`8jMfBPRhVz_;<`!2xc=PhR~~z7t^O3k&?uO7dzHH4plg4%9h&TI*tZPMSu|fpw}3x zD~kMjU!p3r2FRq7P6pX4y{*#W3oTdsA|G&6nTYF3|!yvLzJ*# z8%o7QyE52)gS9z~Wt1s!lpztO&FBpaC@5~#hr@M(T)ro7{!K%E&Gs}0*OvHogb4*M_U&Fz-&bVBdy`jlAh<9DE@OI(AgH)JIdPOy5s5P8 zxA)~oIx#EyYhMr=-`jR$R&wnnY>Y~DRDA}%k63Y{OiMLnMXIVyXm26D#MO1K>=~08 ziQV}_o@{cRSFyjRD2X6f%&+ikS<|_)N?@6gk!F_LwiT6Hl$8@e%p1wnGM@w_41w;#!j!LcE4%gKS zgK^ztufd6+EDcs%!j)fm-^=t@nIzzD(O&4x31^6t1)+yO@1340z8ju6Z%NMdf2ue% zZnLV!G(ES&kOxDhw)Gb^uAtF} z7-CDyN78@Khu6f38gIB`tzI?9DW88>Z+x$+ioyKmjYb+NIa2F1ZvKH7#J$*?^%HAJ z^2c_F8<#IxJ*EQpP_z^04$YiEp;smVrv9P~((6#TM3vI4gGWe?FK#bHpg+7_rjBy$YgRPqSVovfod~)1|cjMShZ@-stK<6pHsd8upG2{RsHgLbT+SCem@1DeVVM9q{$%SkEY6_O%KgbI9Gl#K(&t5BYG0*MQ$9Wyoj-V^Lg=C>UTv` ziKu{R@+x#%ea^3HFpVuC2V^VVzHCDG)k~lwgsyi-sY9KoJhM zY??om~===8wfUG4DN4=0qs!$QTGJGV5|5 zb&ivZrJK`i1D0NQFu2U;NI@WU=XS?OSh+YDKA99pY+L{AtLBs?Ab21CX5)4Vi{Hr? zC%nfG(Z$r@?L%NX-)OR4_{t+uYP{~&D+twsT%7% zu!S^q$DS#a5QC^mGdsoLY%)t>w}U&$6_((;!5$ zo?gAt3of*Z7JIu^_rmg)=GOI#E+2>w#w&J2t2@v15YJDC!}xj8iI^-zQQ08;6=L@o zfD-=qitcjmjW7{U^IteA*E7#BBfqOje=?ulmBYzKqnSdPE*;bDsgwK;oi0vAkWpYO zkt((Tf{cw#b)_@N7$Jx`&^|bj1Vx;G8pN2343Q7iOiV%4#Rf*;ow7xygz^xM#x;kA z*5LcoGTRR+2>i&1!p$aJh+nXy?H2?mB_9sM(>lpzkuyP!Q&~ej#879va&CMDjkoMIG+zOh$zq8X?*M)#*K21{th1{UM1 zIcoQK$sU7L$tZ`8@I@$3v>NU%@ljvv)Si_#F83a9zc2q6M=87-&#H?ct(w0^e7j>c z$8)oVjbM**-WshttI#4h!ti(W=8~-h#eiNZD^9O==N+}DYe=Fhu10oe#j1$GaA%xt2frDI2RYOH!3;#gvds46cizYT$VwWr5##{q$_n=Say=T!XV zP%DvuH2q<0rk@1k{)vaV*1n7U#!w#9B zGu@QoqPBV*tfaVb9gUsz_I;!=wql~V9q=}&Ly*+M0vi*m-9+;~Tg=0B*EJ5;YeE!j z@rwg7a~Qun-3Nx7ff_tH+3se|794!#`r&~A%*3B|rNRv-rA;*#gVVpbyMWsBAsc2F z0a#e|Q^uqL=|YXUl$4Z~=uin_2pEHvMb>Wf&!6-AX~7#Ye!8I$>kM2?Pe#Af--yCz z$SZ6|eYrOCw`0?LZrcmf=w}XXM2$T=`W?~Zcg{gb?f_m6GAJW}LN7K|U z2*aGFCcJ1hN60zbn^_=drUlcZalOuoR05dC`%-s>v`@@0w-Or{$8C7W!55!uY9`T; z_Hc3aZTPnrxJr*TDoqRXYiCKpovBJ6gxR(GT)dKzVu2Pn$k54Z>s^Ks3uR;} zRFv3iXOZZKzPTajrKWCJX}1yB(#`lxX zmpbPefw-ak$fu!>-LZJiqvNFgm!UVBuNyi7ayf;k$FyaA#1HLj{;W86*{iDMyvDAZ z@#YxS*B%&35E&h3o*4chY(Hmhq=iIAOyE`QHVU1a`3oAnTP@t2RS<8}j{(u~64Eh{ zvrz0oYQyFAAA1!0`N@~fLfsgvEh!Qv{fCY|iFDd!U~F9X@&x?-vy~b3!_!m94w1J~DULMq~r#}z3tu~AVaD+E4|BgLZ@38ekYO96Q{s}<=h z-uPafldU9%$ln6gX@K55oy4VZX{2xkWqu#qAgR$_KLja+0`Y4qKDj>5c&v8SiN91o zmqv(>(e9+q%FY3q9>v1rVcb4A4Cy|dwBosRPyksT*K=J8`ukSs)i`m-A-@>D41Zdz z=%@xl>pCM*t(i5*AA|Fd%X;1+?iRA)I!AMEz2K89< z>YY^bjIziIa~v^VmR8AbPAm2MZPg{_b;1oADC`fKAkq}~ytAYt}$mTsw{XTyaShp7$L=7Xw$4alU=-}dz zvqB%YI{S4O1C+L%SGcU?Fg&EU=f1ho+edmsx_&@Pcme04({BeLbn!WLaYThg59KTEl?bKA?23^-P+Kg;39n z36Y4y(;+_v#4WdT=1+ilP;+-}Pyl6TN|*Ba`?tq$ZPn~$A%5fq^a4N~bC~{n&|V#} zBdgzoBS&5YQ;=A^pnxe7V`%R>q27~P=smMTYumUyGEY@caGs~^_yw(;e6*rn>?{gq zt#OXj{hHSEwZGKqv+erh4yEvi_VZEpjpzHO`6m!eq>+`G?mbjiHSc-vGRC1@A2Ytt zh{2){L`)* zsf(daDg)mZ%G_mIn}PV14i)3`^K0s4CFUYr~6&xlP#`TBF~%bjGGr6!()~O#(R4ox-%R+X*H#B zgA=1*O%y0}(DKBT5O6yERsg=ghe!QdZ74B>f;l(B#^MR8N6k?_%uh#w5aMU*dN9xV zQrdB)4{@O#8fFrakPwtT`$KGyF&Qy_iM61Hm@e`j!S45?gO&b3_WeK)Uj=;O*6s?M zB&pF^!CkvLL<_QD9#UFJ={6A&8a1ol^d(UX9RV)bE6x;vfN)DSenPE{IGF0+-{P@OdJX^VGAyN{Y=eH1R(q&9dDj*aX_#BUM>|pG|60OPKajP(zOQHu!omyzBW_+CrdK=qt{aRB@t> zziOHl7coHI=Vj;a#jC{x%`Iob2VtR??4k2z{N+H{Jn#x~a}tO8jwK9AAZxdL3Jl>o zj+|Ytl0+zA`w^v=V^F~EwIcO2OC}r!hwG(ikY(QPO&4xuF_+oA)}OQN&=o?%roTm~ za$L^7SlVZR;_>lmdq1SVvb@zRFy`W(XIDJ7niUf=@Fplnbgd+jlAFQ?u-3oSArYuM z`Fm)dXj^MBrR8xL8+Y?f9akDI52J58-A*PB=%Qou3ha#XRLcWO61vS^A)r9Zw2X+FH2j_u zztO=k^~VAkc+^;nb&a5T7O`P=77?#&M=(Qtwg#)3I-i`i#P8}euAWYp`yOtN+n?Rw7N_n`D@>9@zo;64wI{Oky`r_AZ*50yPDZ~LNw|9aHbx#lL$myqeSvvMm0rnWlV<;;w)m4G3DwF7_}Gz`%IPEQ z4Gl0(5HQI^#5j7T;tchiMuvxC6bJRb%01P3n##Yccg)PLyI24Uun%(zvD5k)N!HCI z)s_}E1bs~Xb9V})1<{ie$Y3bGH;Qe;!pV9tps=@XkQAOS{QHahib;$jHYz>q7GMuZ z`J77kJW{xyesy`$5GbDgJ}32L`*L`DkHgN$Bdh`AWh3L~Q^F3oSr6a1%h~X~{aqiH z^RO-$X!dR=8^EyMasMy5@&-If>n?&3kECdW^q3-bzx8r6^G&5pK!X8YVZinvs1X3$ zJayklTnyR@XKBC~+Gf?&^JkU%|D6AxsHnlo>TE`bm2Ow2@^T<4$&2`VxCR7pfctpr zo!LvkVTbaH%A)*9utW+5U%v05B&7@DpY|>y2mbVwoXDX^T7;TBWx4V4PgYC42~2gz z4RZ)VDF1}`DT+L_tSG?k0!QJ~%3y!A7C-SEj}?eO(9xQRmypE>$yc+$524x}Vh<0V z;iatiJ2(iB%I^)l;r9vn_z4Ym$g_=vA&s~Q>KNmE1Ok;A#`A@y2Ps#DNVhq!%_dpuOfu4|8#Ww_k(t`EmSbe($sL6hE1e zCwaV+eQe&lEt^?82;aT`lXKYau=sy8on>28Z5M`zp#}tGC zhwcXHZYiZvx*KVvrBfQ-{d{pIWrH)mkBe#;G>dQbDmAM)hOjS2y< z->b$BOST2aJCwEpHL$gsA) zUeCQS`OTeDL@;|apJyoOs-(_knL!_HC~oDbH_ln_xP8JHx`>2de(bu7R<7-AvcF0) zVi8(FV32-DIh#w3YNLbc0F>dm&(UM`Joz$5`xYQeYx?F&+_TF@BwMIiBs7FfRB`2_ z^O)t#W~A0iZ4p%Ek;Emua3)l^dWhsOabCHV&Fl9Dytimj8vkhQz&BrsB73{LyFJ^h zZ8a)`O*b4ZBmkW|*76vN9sjVE{4_#J=#u?3bM2wHWc3sd37A1`jz&L+8A1XwZzv2N zQfQu>$2$D*fOs2aWn34POkKGoSF~oMs^OKRyYt#sK>gj`P@`p)^hd;M}#hK_L znbHtHhOj0*-!k;~3tg!Sec9a8Hmp?s2Oh@Op|ByH)BGNbngfPV%L8?U;RdPsLS5(FZ;Wn7!@{!C8Z-rlO+ za3mNd>%xAH9=yLF{dn~_+1;4LnbyQ!itB$v7cZ&FimH$SJ*ds%@BCD8-*$4Jgbp8h z#1#c`5~2dvyLs*cIV>@J)xm(@@A6bIp`4s)+gYkYYM`uN!0O{IA{fQ>yDnwCvwH9K zsJ6E?;|~Jp_|H6P^9oUJWC>89b!=<(CcT};o93>5b^_`mxV&(e;5I;-;gV16wmH4Q zCYhZ zMLLhOd+Xn_#zp*%!fO3oM?8j4G_w*UD!hTV|AiEmx+IY?REv}asWRlw8%DPRu|4W>dUIIE~P-;}U1?s4Xs8Vj_v^H5*G>erPp7Drp z!fZuMHH9AVCgaPHji>#=X2OITkIH6ydV1>6E={^fRRfJ@yg7BynTrdd&szRCDE5sX zg?^`YYmAG%o{B648O|>xV7*qO#mXnjLI==8 zrH9y?V)ll3+ix}^se%)%Rp!{Rj0tJC9C3s$#)bCFbqtu%!;Zc)qTgP2{{np6YeE77 zUs_C=GGsJDvcg!z)$NzR|Kp^1tVxX|0;SoI?A!}kGP3ur-M6pZudLmg0%=Un-i%9g z6qfRzBjWc0L&5z4M<-d$a9*q*n(RXfW~ugFPF@?SPl?F zhAEASL_clIN7dyvMivnV8dqY2V%9;(YNBd&N$6^fbg!o(icNXfeYa3g^(Gob7s)J>@ov;-$g`W``ZvwsW7G;Hw%;XPJU4slr`(NKBy z{Ru@vHW2k0$jRw~NXIbhH;8&mEkl?QmLWkPcPj1P+XgM*nL2>Qf17x#0ZE10rc z4%_%xWFQysHP-TF1^V-!7diKtzgNFIZkCnU0g`}w`R9d~W(gf9CpoKr+sT?huO5&* z5WHdP6(0Jk5nHS@-ss=!!1$O8U$&4jmJ6UuRbSNQJL4Q*?eKMJ|3lBLNd8_gATkwV9KXF>y69NG(jOEnR~7 zM>p_nOtt@wFtj{Tly5p`iQgwSIAQl`T`pfVo5Rxd@l4WQ&Nk=7YFIBmU@J8KeCQov zz`hV7X*Kej-@}dlD|V`>LnVm0`Y9L}s}_U3s8F20@eZoAr2Vr6>j+F@MK=N?F0q}S1MzF;RYQl`qE;E{9msS|a`$>EE$ zUM+wi20VRE0Ixd`kT$IR{=A;@dc2xFLhnA>-n+ndiQn#e#c-z(@|@%}CUgA_3;9Nq9M+IOwT$k( z`xk>_YX2kdSi4K+BJxwrKq+z_t0-YUFyifRHRp7^XKpt0xplU%4!iwTI z#}lFDas;bqXt76*u!@}W0OFBZD|HzRTh87C_o2*aX{=Sja4A}}U>Hpxb6U9vDVU^k z-WrUroI(B-;@ll=+30aRI<~KmEaEcq*Kzt8k<)q^8)L-tjZ#+@~rI6hoNjM?03dy8e3#1?){1OAGB&%0oZSmedo>jN~;@^Au%{D zbO63J?Q5)AJA~uAX6j_9Mg{vmn~vKoHo+8SK9qE^TvXNAr&rJC&rH_2S#f@|Q!qKq zaG-10=ms9O)zJ*4*BcZ1-cXS3@@a2@A(7M6O0K3S{Ez_CiYIb-HF~Uf$mkkgw$Nlk zZ7$D#LvT6A5CAW9Q-w7f*C%m}0)|Ex?t{YO6&x|0+l zf_R5imfJ3+KJ%?>g8|}&;}~g$ z2)XV1>Ja(geVA&Jw{H-u0c zbVJ- zh?jyIK6R*)njUp39cLiJ(;Pc8wX$hw7AI1Rlsud$^0R`px`=ED2Tfo`oNQ0Q0ZL}E zqef9FSoqa1t41dV6{d|mN?}I6>O>j03mU_^Pd&Iq@^2^=c16z>zkT1ftkZ3IU7pna z`FnwoGl{hw#fQ{%Y-_0BGy_CqH?LRv)$0N?!-tXsD0qXS$WbgL6%clY;84?Py@`1Y}6mXa8tje>{9jiWctYIB|PS zc9&UEOZH+C=FYso3>ihqKV2@MpW)II6W{LZ zY8~x^CI+(9c!??ngQQsBm;FQWw}5t4JuNW^Cl{)R){=ltPQy4yZ6F9lV4o>vDa<4b z31gt@e8<$A6RujDw-p`{gviD0;d#`b?KM_@|M@uG(JT0xEZGUf`^vu0$EC1bW}@i@ z=h-v@IRSMI{vqT8&!pBeI}f~}{LUyfhp=KQehJCfdUm8Ip_}F zTG3Inqb-BS7fS!#QBO5RcAP+Sspuoy9#g^2Jktd+V zI@ZV$AerCXwob4wc*`i}Lp%8o%xq+M+%)2znN?mUIty&1HUCRAqD7Fv%nE=9zKuJ$i)m(ZeGs- zhZ@z(0Icz;7xY30`YzpERVyZd9yZcuDEs@APyuA0?4FKmGa33bHN=FbLrh(m)=PNR zWy)TfqR#(%1L? zOsM}Xw)Mj2DfF3%raVD%CA2Hi<_}+Mu(|Z7)*RYIB*wIu=+^R#6xhP}W|LkiW2wYW z*2SB5oi^pXMT>P*+U=ziUP-fN?H@k<R0P zs$j~%hQHIrnzPjh{u3qfzzCxhNeQtxb5CEKFdF4TI$laNorOKHTR~((5I+jc$_`?D z#ZD{p@&h+nyT*mg4#OJzrK#|c6g(m~O)TjP*>LN6^9Okg!1?h3Nhp{J9R2~Nfv|%9 zsc-}p@@(etERWr3_KgykSurk6F7_|njh|$ca5=ca{r(F#gU-%Rq)95E)B2ppLv+C# z!Ai~VCV3J*`GHjN8G-8~2^Pr&M;D(|)XFVuO+z)pr#3j%IQu@LEDn~=wRCX1l;+*6 z%SX~CRuTv_{w!`K2!JOKle@UaEIGxczl(Z+9`@EndZl{|HC`>$v=(|7HxU|Y%L9A8 z_j;LOh2^ATl;Fm!FkBKPvFT7T84O`$yfiuSuVQA9pyqWQzYs+&Xmr>00kGjR3pCXq z4>(Z|P!YoAtJl5bs?CfvQ$(T$o5oUfx*ll@FBXb`5dOH-==e#xYLqBwjlyl8Sis1P z683D?8z9&nBX*x7PcDBluH#~p;*S;V);(YX!WFfFRpL$AD5V#x;h>R?fh@I zd)?@-rRI)LqA>BQSe^bcJvz5wnIaSG~nVGmedNX8mI(Pvq6wjV*U2KP>t7B4PWfcDy)K4IRe3^~G;^W`z`5-| zJUo<{=K!03!WgR5jgyLlmbT-2E>gYLQ25AXB_ayJ_%_kayRn6`K1pSi!&qr{qDMtd z#>mX{yjFc)E`Vg8Xc)DFs6OMnuY<$7q~-jV4R}kJyv<@$RZv`(522p5Q4mL=%24g! zeoC@um4#v#0{BZ4stvA73qxj$o{=A0xS}aNj#(epz(b6vX(~Ps zpKIo=JIP4}54G*ye`vIA)lQBl}r>8Hhrg;*!TVCRZV!GOjz7tlXMvsv3r76!Quh z*aoC-`n(lfA^^URK;6SZDlT-UnJO@yF;`^%3*F~NQTD9tY~nejtAD(eR?MJU{_jMH zNyACkD6T?ztnN-Kbv;tn!Yw18JZ%J35m!uZH`bR!1BNPV?B}_+XA7Ed17X++1eyw9 zXnsxU4<3B_Toh2BOz_ABdtp?6tt4cgk31_j>dU4qM1%K1qNz8u0`nGiw|g^pOF>_q zQdkL$Hr=4j?mSFOol-Ady$0(?;C7u)ymn8*XqMkhRl-LoH!>nKmT%|D{IVJ}=dLh& zrMyvgsDs+Ut1&Wynctu6gl$i6fHkgCNZxO*QJI_bqj&q;s@2`IDp`vnl8@Xg>()O= zOFE)%5GJqP#B&`&<^RSJ_t*Jp*P99IxFXv60c?LO4KdW(K7Ru8MtZrbsTm_p`*R)ud54 z*j(b&s(|BIT|v>T)J{ef6*EBe)C4%{#=OSt+>spSNGSiDoHT{6$X`c%mlP52xSmf5 zEQqoa!sb1d>iClQ&4gt%*eS83^fzo0F^V6>i#|-&5;N;(!k`y%PUMIJ1cbm2#{Wry z&7t>ko-8XfLY)k_WFA138%jZx+U!4J2r)w;H=!GVO9T`)AAn+6_Xq<61F+c-yO+nL zN=hh#@f~WHyk<*d#vT3JZD=924x@l8{c0I4%Am&jn$scxMx~E`i(mVCZs#=-n9JXv ze>TQcr#v8ydNzpzI`d$+C|Z=Wouvkh!en7#q^y8vPtYS*M+!*pua z?uc(bmM)sxRi2>2@l(e(Q^iWug)KOogY$j#np+t9{7CJ|{R9_$CTf^T=vYt7(Pi_l zN~d{>t${Q{JjBFJZ+FN8A9cpwd-FAe{db^G{gBgOyV-B_i>g7Mbk?;_tHJhuLFnF% z*L;w-XjSe$ORB5pdB%SAp^t$AXxl+xG!;p_wg31=NJ_lzIFaG%zig_bOZmJ}s3RJ$ zyF5qJHl*^)e&7giZet=eAU1L@E}=2$?*A}8<`eEE=(^pdC_}O3<(V0=8xScfk|f&v zX2opk?Rp@5wuY!&?E3sNQ!xk@oRODZdtL(ftyqMu8fS@3%TAOUa7J-yqv6LR#_Ioj zWz7!z0ik>%4cUpmO|ZMKu! zuHySeOSaM6l*H1sMe~hZY};Sm5?fX(&z{3gg=>M70seTml!II^lUt9JpmhCPm9r^x zjvRrJ_sa;2Z$c)&r$z0B{=F5Mu9mXyf7{4eG%~_I;q*i8EkWx?tkS~4Xg8@=ZjA3K zQ+~aF{^VWrm6>9S5TY?%rHC>o@K~0zeHyihiBm_uFjIz$Z|%IcYd`(@0?2p~HZmQ| zKkA5|-`;wx$kBN0zoafq$|xR`9$|5<>K~WK;oW^%5FL5j^79qjC5u0kb-k-L2eE*)7WB~?C2+pz;IYe0wNJ>hUZSlA;D}2$+`3@#QB22#WY2#FQP)9hg3!Guj8$P~ys$rnf*Z@FXS0f9jS|QvWKxmhhtuQ(z&bOcFv@cS?*H~!&$EE_u|z8FWA(PuYdC*2EUYES54M?MpeM0>g4nOr$ZCF)0LQy7bpw1PG(Ve z-F71-{^4~p*?S8ZJRUzqk6_}O5KI?`FT-~noSdAV_T=FFKmOQ!nd6FH6B${ypNf;6 z<^mAoZ9yZt7rJ5fcE>OOthRgQ-1IO2bA$=Q`UTv{I2lwA>KzV%Waf8hLZQP#RI_!1cjv^c>XNBf!KLbc!<@?ffVI$3fANM^$#IZOG z(o7l25wjPfK_yS7q%xV4-|fQQfbbGM60pBq9&^^Ek<1u{9CzE+=*p;s2!s=5MZBrE z6kUHz(>5x^{R9f8?1R*f(J5P`YZbcdszYogOL?K%QMxkJc97b%jEGjWl0wXP0+z-G zv9BfIrsP0rCiiWr8E3)hj96HEUDdP5Y1_ zn2VcG`8N{;(xs*s!uzNKHKH|kica z83hWBAIUktOPIfO{w8%1l|=Sb6!Z-(zPMTk5uQ?I3HUw7v=FZ^Z6iJ?$CQ4RvJFS-!3` z#ENs~sJ*h9b;`^o7`*C}K=hPKfV7A5^-9b0N{MDs)-iUHk!PD68-J|(r^ThoV&}v{ z8n3abIA*%PdkyW*tNY-DSB+_w?3c8}b6dg7CW~m1ggNOFemx!_x z?TP}MGK-}%SDUTjSx#sY>Qx|7WknPY_N; zGI8rkX52c4Ou~*ZB7$zg23_KsY<(0*V2o_>=!nn4lnm_nws+na*owRi!(pekOQE=3 z5af46ktI3ap7o3VRCp~K>FJR&V_E?Xh4*gye*Ju_X96d;c4jzIwl*`gJ-?f(puI3L zNR9XXcIV^J8rH8|t=@2Ax_idnYmR=&u+G!S=WJx7hfqu^wp{8YmBk4gjf4NL^fm4O zNSw%=+((tw!0$)cgHMGXuAet2&jKvVUf`rg2mR0}{^M}cIREsR;|GwcPQ}BiKb(UR zA1M3dWI7z3HYab1k@V6JWZTR5FVeBr+smF(%QJhcXQ{ zizt19@pIWw!om1ZpC3Si&oN!4mMktrj=hh$2c3WC>ac+~j;icqp?W zaRd725iq7H%2v~7&{g-xT+cTC^w(a57#JQAVajjuzk#6(FUh&#ns!}k8F$y@tcsz# zdztH`Pv z616OdYX7Sx7nayzs$8kc{0~+uK5qIlTCR~vc$_h8(NkZtk+zH&k1L3^I8!mK%>Y1M z#hS0j!du-IG82Lc-EV23O-S+oVQ<98v}7jryfO_UMxp{_nS44iMiB0fj!@A7jgd+n zmxHUtAP%z8_61XFt0jq^6B3D@lCSRP-7Bs5@UIA5CR|QQ1OO^Hy12NgJ|M6eqQM{? ziW`x`%=!xKylqd~JT7)b=Hn@-MkIds#F$WS(7UeP%{3pdb&ih!(wEQ$@vp$7Jxd z-1&i*caj&%_dt^J2XS6zt{@?WTwxV9EYt_m985Dii z&~Ar^LA~AWM1PE!hFtdSD|q#Q@XTUDiQbCGd?aO z{)L9NOGJ~}3bC24S(cyqby#+@RG2eHE7N8MNV$<_RE)7u<;C@EaF!H8m-RNIo^3bz z_yV$P8y+>)sVR*O{95=7QJ@-_EjniJ7Shc`iGHJrM|RH+p0ymzW{qAFh!D=GjhMoF zU;gTQrOw{xZ(~@rKUX6)U&NGce(;Zr77V8Q>662(z??H=Ai07AFEPDbSO`NH5x{2u z)RhO6S*EqBUGp${vC=G$T7LH?SKQux0GSC_P3GM%7PW+2dFfPOfsn^u4!7Ujg<}Sq zOq>wFImNIKwspe<*2Z9TJ|WHSQ|R&$+?2Gx%cOP!n}@YtB&Lt0n;%PE##+2)MT7q)NVOSsTtT12W~XUDofr_m@?SKMF%%kRY?#;G8+5*M@%^ffj6r} zUg^19Z9RXW{wh;^USpzw2@EkNO6Le_<}TED6-{9r@Z{IAS~b{o$o!Htm3Lm-%Y5g@ zEK^x+HES6yf#^?uf(a=n{7ED#h-fkPbUnFI`|?J0g|pypS$lx1ieF8qB$W*kcp zHjfkjDDqnoq!wz7L1y*rmTdm?`)@m0CQ-gH=dpGt^Au*tMk(|7So^%bbqssQnVvgI z|16j7yZ6Pt!fMIhv)IhVa_j&syVamZAyRTZ{0z6B4XkE8i2L(H%>83Wad(B4CC;i` zZZYItlVF$SY5B(%w85zGP?)m}a1n7{Ji7KWBNvnMpa^5s*zplOH>&#Py|wL=rUD?+ ze)v86MxE7qW5eMv08jtWV{Rt8_poZkuOc({qm=*gavJW!Q3W5eYSgZh{X~4|9ZEpU1j)z|i!G7ZnvMj^d>bntYz>}flmzt`j=@d!=$8?jFwlvM!|YEvec-Z%yS7p8AH_@U?w%)+4B@KK%bR@~ay;r{p7OH5rNxSJ?l4yY&?K&Zd%HuT za(Pghf5Idf&c&g^h2mOLvn@e-|188~B0(wP=BP6lFV@G4H#frRFY!sFXF~nsu#*pM zyFfn2TWr>p%yrFC&F_EFQ-+6AmMtZN%eEtLlz)>}9u{LEw>znTD7J4{C4;rA+OgaJ z<)rX&K8Js9=a)&|>)f~t^}1akvpLZK4WH&8kW*?hXzz)a^v#hK@if(3w5Ts6kNq-a zs;}XqFr!xErqQj^04R=5DK%vtawpr{pJhdASxF~cIa7GG5P(6;?}_hu1s=YT=R0ou zHXl4h!20gp$#Ux(E8#|`R(ai!32}iR*@!9rllMC4cQQK`0bw&$iXn z_BB3QV}0Uu(4C*R=u$Tu8QjD zl_DRX?!ZJQq@h&FZEGh!3x{#74E@_#0*xC*srq-5&ws*XnZyv~GB&ED4`o_43WOrF zUp;n+3nzT0%eB;)^m*+7zL?_L^`_g&ikUFAb``zfGY~M%@Mb^zj}4%jbElS`=pQac z@y}eE#P5w*k^OpoHs@QC#Eq_?qImhk-mh=lXR=5}pY#4U2E?*tQjV zR28bvX%^NzFDiGy{PQ%p`JYxw-(x%3DDA<^1t&ww=cB&+pQ718%b~9UdW+Ge!FDMM z?0t`}&F#x_(~F6%p^l|syPv=!2AK4LMU+GfDYch_fd6mxV`%yDuFSp$QdrC{+%TiG zU4WMiCxFxT?S-cd5Wq%Q92^3?R>#eF0PC9GkFHgB;`k*GnXiqYR>g*dTePlxv>)I_pIz=5iGG~1foTfP!)6WBi)%lu zyWSra+x?m0rQ8`8ASn$@-{P46z=3;F3sK^px7FLu@*LJ_MYVNtAE)CsZpd(GD4noi zoMZapE>&dW7w?+#)2XzJC^E){3yGZVv`<#Au|Uu3f8)3V+264bmxoXa+>mVozj1`@h_cf9aLYe0a!If^#^R zB4tvd>U@vXT_G^h+*EptG8#UDvz}}cKC5<8E>~JGF?=m8|8b!J`Q<6cKz!YW)83_= z*MT3pzfSbwbekkEWdcven(}-Bs8~jmFT4oXi+8U}L?TM>?QUt4p3lOs@p+8qUgr7d zilJDViG07)1FXJ*M(2j0wdgXdsAW>BpZq0P4dBLsKj#}9vVVSd6&BN<0xiu~eWc)u zCQttLACHhI&IP&w6*oWi?)gy*$7M!@|nrOmBB-=f%jvDL1uAydZJjK`{^@tktq{< zROS(?hO^f1lO}i}C8E-h^yjazm-gAKM9`Ab%05fr=B^wS&vp~qQJPCNL6|sGU2(=_ z(3l3|w0rlCfTfSU4*}zM_$i`i2oGLApPoPQNT5WhO zaolpr&o(#yvQaDAcUFi>Qc1|Vms3$GR!WZ&She~QeBN`V5X8`hyWuO;s*{+}1g>1M z?dU{8qS=!8%E3VWg)`^KF6c{&%apNDzRydk`=hauxaG&38B7r7C+@aO7KQ#{TtfeD z990v6GpBavzx$Y2Nd$*p02ihLhFy_UW~ON+)F?G>mKwF}I;8&FWRwdP5s#3Este47 z-32UizTn%N88@=)P3xkd5H^8NvQ9NG_PCOC&_o@D=ia%I*&>&Sza}QbHu1SEG?SG6 zq%)bxFu(n$!=11dC;#sD+sH~Qjs+*4uKH`urg)JT#Hgw1)S%b8P^>hcShgOT?z&&G zl5|Hcc^Ra^yTypSZAD6Is@Ga>Upl_NW{h6@kyV>2dUepc^!ZIK*PMi?HYMH*qU*D- zt74otgdaO8m5EKr`}eq*J(~3h4jgy8e@p^}_^0 zXVGOif2Hu<551}JK2OZ?21d^O;~lEN*Wu~2N9D9htiZp#mp*%!|A^Uj*WzE}I^SFZ z2;eor>s_-w)HJ5Fo&9+zY|wYV#CN}}WcA~Cy=A($^+d-um4sPG+p_mA-x>zh2h&lh z)|Ii5h#??#RdoBqyz@X~^AMD^PE0M;A_}x#YDX0v)mJ_L~&H z=Bu_BEo0FZ!Go!pXW0UvkryQyD=0stc83j~oFET9_=?LNUe@m!L?uk2Z;EvF^*aE< zzUP{kUsSq*@9nnG)25K`ZBZDzME(Shmi8E3XlQBtCL2}{+ju>Ntr#R1v(&P4_`+8^ z2TM$t9+?tTnu7*BPx^-IABK^$qn$Wq>BUvMAuhCcuyfC{5iedZwXh57C zsmPdGm@W{1Dw2cyGh#yDaLx?oWgn(DMzNPOi_CI-KjUVz9HmzhQxAlB7gYj4QX;w$bjDx2mI;<~Z;@%N;EVW~#NEB{8U zt?ipDW{<`iGg0plBV>2Tdt{ndIy~fdOWE(-Wg!zIsTJ=_>a~cd7$<q z7x3#@ro>2I>h~%?K)gs_FwQ2SGwNimM?} zMYI&j>fEQmo5}U(+T&3w0JsyPrfwFzUYdXF(zexc`_|s~`F`z0AzF9<)_%`J_|na5 z<;2$wu;W!*rPqh4+D@&SN1~4lQ1EVL)qO7uVeNF|B$Yhh%DK8DGFGX>MPu9v z7adTdQ{3~d4b>1^t8GRI$kc?ot~WG;o-h7 zVxZdM?eUZn%OR~|OHe_6uRU)}x8>eg={W~yAJu66o2Xej!L1CUwB2-*^`79%lc(5N zKOj;5j!x*`Z^@xSHd6uynHAan09x!B=Y03r4dT zl0_};!h`v@5PvIANdhu58Aq;sAW9A_q;MJO?!RXs@!9sCm6!QD4HYtVxT0jjNDw7) zkU!0~hkkbTKTD!`+Rw23G%yt?A}|6AVK=6f-K%YrA#1i`!cDo&o89rRFjHzPA#MRU zE8(g$^(ub#_$uO(rqRk((7(H}5%=#DEjH4XYGotIWTz`HNo+3?f#QcH-dzttDlXO# z;_CO0@Ua2q%IusItMI?@WY;hQS>=wtLbvWv0;uQWBQyLgs&%(NNzEc{Ztmf+>&NO&}JS2%8A0=zuS?6!(}7 zWfEH$UdOdAl)Pk)HZ__$Esm;Q0vvgoJ#@*|(o8L5+4`Q8QNyhpNQ#q}v_PRi-3Eq>1(FB?^}`q(5QkeF0ll0(YJ?ho%} z?W;CEKr-(4Zv=mvBa&2@=yngQ+m?x7Yzi<94koAh%46XFXX=wYs?px{IV|HrTmyv*nS{(Y;-VBfsd+_wF;!l-c>o%>rFE4I8C zg*#WV~se#+4mhg{XPtNc5=iRR!oQ1iQD+OF_95=4=_5r4B-^33=!`WErro!G! zHO8E;B}V*g?y1wFCYraJ^$zN7cdbe_HA1Nj7hkla#!Dp2qYuP)5p#=w1HMuztGZ=O zw8l3DBcb7#kV?>_(Wrj2viUVar4kiSjHE_Okpy;UTSBKfZItm!IxSb9Q9(O$ZIgWi zQS?03xh{Xb?U)fm_WH^M;_v@yKVzbh({i+}`_NiJ!s)0NNkBr+!sd6PHMHB*$Q4@q zt$i@VuatzDo%=l_S5=BMX5gYz4)5I-@a?7orLV#AZzqfmao;u)rBR~t z$(*sNH4~x+@sGm^`jtmYtfZNuY3{mL47$CD)v-qs>LdM;>)##icxZ-e=N9*TFzKudHBp_ z;@Z5?F9>K}R>5?xN{tbHhK2zNNm{C;ec+GP8ebVD(e`EJmBiQr5vtOb%?oTQgXst` z_fxwzBq$;TS5Z;1eSl7hO&paegf6{wv*i8=)j~quByxoDGYA4FMiDMoHi3}i>Z1&G zdo4SuP}Ao7Eat4gRo)hU(al2@7sq}vxM0cbA%NZL(cgvQpKHot&)V;38q%N`@Zm>a zsdNJ&&dWR!%37*d*%(S{KgeTtlD~AW(TE~g?9vYXL47JRxh=6TM-mzo(5ls{n?$zC z{RS;RWG39(b0SQw(B$+zdC}OpaHzF~Yf1FAqm@ucTNh%VUg>+UrutpD@`bqH0#O~v zM;wB|sWuT+aHQkN4>rmCJQ&1~y|+tuL}@u-l5Ax(suEQQVKFu>#d|VHno0xtw8NEM ziA0!7S%*+DJ&0IK%|rp=uKITBNYW zl$wbzldfrfQP4U)HKxQ6W3hncm$r<3G^BLPxLi=0xQ6)SRw}c?l9an3gi8HPE$P_| zA!*dOO=uwlj70=#$`MO1pDCjK-BNH(3j)sa0 z%v=)<5o3W$q9&mKql* zG9DVP1=*~&DBCwb_j&g%*MVkm_6iw{!ZuBc0VRACy~#*svz9O|kjXSbmL#3s5B=R$ z&sEX!#=SymQat!X-b~O{u3^9SJFRp&`M(~4FS!iRE8caBMZuxNR`$G_>rGkue^Usn zzb|~&{qQZfwQmKOeOmusNUmt`K<&w4RgiSIB;VF8t|y_?;pbJ7#N_o`^-!& zmq#9=lF1O!&G7fnWkVrWFgUb)!qXU?9N-;J=tlLK5ycVCzCW&*{`;^24Xe#|V`pOr ziWYdYNjrvS!R!(eBvx50q!T^mj<{y5<=5n$og@;Xa+X59R8fiVn!=1eB zqJJYV5)j^3vIdVOLQg_g8H#<~Ck>8`U}FeBPC&!5UbMl(PXoa=cdf2am@GTo#IQo* z`cYWl9hH?o>-FpOOhWz;Hr)8Mg!_-Je6i}GJTT%wO-6fspN_+6T27jb=^N{EJmaV> z%r8*A3`UnYb$MLeXr#lIQ3}xgoYG@R^4|2FShQONv&SA@XU>b#(=K>*z+#E zeN`l>{rli7M3&3T$o)qf<6<)JG5I7mYfSkfo)Hf+9FsKtCmR;fb77$tI4CQoY|b1v zm>%yw2(^9esoCA3#ys5sQyGHFx=R%%C~E; zPi|mqRi`+Vezpi;3?msfuOZCnunC-)Oo>F<{9zK!49?@jm7;Lr!m2sy1SuRUgvGOT zDPLJj8%M1XY`H8bT`V`h_y+<~h6#g)6LNZ8?oC=Xp34z73m)S;+*c!`9`o_i;&Mt< zwv|VGV}x3=O2FdKFySKV&R$+P_wWD2vAhg45_WrW=Ek>63@!T2CYRv6VxPRhfCz|F z4>gaKo1o5ZS~^l$J=s0VT)iyLdE9-zFnHQFNJ&~fi*W6cqpgnv|0OG)R!<&R zz1Hr5!p~K-{R6;2`9pEHx;HUN0?HfD7hpxjRg*{B;jQWq$0gO-fkj#kma9l$(#NTi z_t!bSZ9hl6Xi$#4**-rWl06hW35SH`YBVf7Nh_P-kg6YSComUmt=N@7lnNQJDBMYlDUPK59<0v$!}P*kU8SJ`;%e9$B@DeTX%aM1zu<| zpk>utFg)zmc8}i2jza}r{1C(5_W_Gt0;_Fp{Q7w1{^#@cZ3_)PQ;`I%854B^-H~f6 zh1a+j07`xt(nY^tC2>-SBn%gNz8!z=rg-SKYep8m7SthUp+2WM@i-axT}S2^k5^W& z$Lv??`8L!=Fhf7r`QZ2b+JO?63kw%_R9I~=F;cs@CNi)^f8nu1Ig{s`h9nASCLdc6 z0tE#{EyS^OY?XSK`duj(In8b^BsWil_umlq`3Ezd)3*5kEDi zNkPkmib)#35C|kDubdSHd-b>CQ1%ZB0fth!ntSrL->C&nrAg+SQ3LXYc+kydIIUh= zs1}K}YjVCQ65l5wuc3=+V2!YwbU-e+k=Sqv18Sq~6qan&(~Yqo3|8D13VLGj5HH_t zu(!TY#1f_}C~~t%PfXxhBia{XM8M*(1FCnZ-Mn}x^zRK@loXs5g>jj#`hRa4Tp9}2 zI*cBE_9`nAVg{grr1KXsDKB>32vSA2{z=XSquB+0im34gJg=i8+$Gs@Oj}kftiK^v zG3$8io3TR2rim!hjT$bPhfOeur=#zf+R9-K{%qs|b1+N`K1m>-bxR5Bvag_pAHmq+pj83098`4fBKKB|8KGKw;QYl3}8A z#G?AnoaDqhAgI1i2&T!c@s=6tQll$pbuyKpmo8iU0yW2f$xX-(O3r7Ouwq0YU{cR2 z)~77mOl3(bv>ukkp&}yaJ8g<1SZIRI{jl9Ejm=;ce$3*lYiau%fuj zqqys)@OESROe*Q7sk^FIadk7Y_Asm2aaWX3A&YF>UhezF8e1^J#jiNRM{> z{@Z4GLq{E*6RsPr+MF&%xpqg>(l21M>+z9y&>7qaqv_vs(`Hwl)p4`qQ+Y3+m_$uY z8pt^n2Fu1h-8(hV=ohHhN( zc`tUk)9YO@ThBTw^8RrS8Tirf>ChQyZ*{o5|K%g&oB3t&B=-3x_W4{=h@%QkJ(}GD z+KH+vLlw*(vj&j%|8tz%kPB*)l2}0Y5u!cw?Z;n)o?ko<7f8nL7nE?sm<$?&T9eZD z{vGMO>$v&Z-1%4q5XLQ1D)OqMij{i81je^miYS$bdO@PFZ>HSo2$jKUEAjfFw%1~0 zQVoJfpR)ZhAhiqHA`F+tuir;nW^m#%D~&g->3B$t`28c z6s}CB&|)p*x)^y;fJ4`aEdtH@)L$3sjq>i%R7<(@HS&5(r2qg^qqfV`Yat%Kj#Vp8 znRA7}VF!GLJ)uWY4SiW_X71rt8sNE%|GVBjXk`zQT4|=0$KmV_@aA%|{`(9Cj49*S@naU2oB;G<`!5xL4uOwl|f zqyWI9M~|*J^?R9t+6ICd5uKczJbHMJ6{{!&TB#<8Ms<5l6hwhJIRC)4bzbM(EYm-x zh=gHq7Y1TLVqgNM&3@;Tu9>-Sm%Dv<=!NFu6sj>0grj3wu;>>{F)vY46)Be|ZzLFP0Sp};l&3p{LXLxn-^bv(Md)Clyk0l4AW{g-n)12U;o;#6Pl`O z&PI47%^!y0xo5xo)vtcF+tGNy98&~h2NLewyK4xS`yCNo?zdwYa!JE55aNEn&vQz< z{rStUj2y7_+zJGQOvKEERYaV$=55wRISi8%O=CXZsQO_c6ST37yPac2# zacOzRYDR=AhJlk5R1I{6g*r|vlH>#iYf^u=*mR`L(Q?s)Jyn%#5MeeEA!K55W3|<4 zHI8Go;+m^ZLrS>=yZ}HLjFAW(>2-fhAG2GK1FEXDI-PC8 z5B-^1d>m0UR7`WZ*zE4#zrRm&CEAEOXGhgkjfigDy5%ppTCKL*Z4vLWDjygCYH*t; z%GF4V+R-^{cNhjRF^~|cAd!I>JHq8(!R6(pBZ?Jg)+4+J$5mwJ{k&CGBM8V|wi($& zit>JTy0v54Xf}jcRDDK|96)WFrq1vLFhat>4E14|#`V12A;L6_3ML}!>BMzM$O8bV zm0=j3eDcYZ(f~ElWE@9maHSCrA-wd`iy;I_mHC-r7LnO)kaK?NrI&u9kvs&;mEmgf`#Z#J9HeeTaTo2{yrtUaHgsJM6f-Me>x;e-F;&aK}Kl|DL z@+W^%jWG;>LM0oIgU|PGf7?6m+`f0Yd9+ylfFY;KIl?|mNEG5JM29BOEbr=;Rhq|-x__kGHk|8Nz{Te~dh)m4D zsr$Li4YkrN#fpfyr7ktqi6|HR}9;( z0IsA4ZYQk0vS_cH+7wDe#EirNOi>Mh{cl!_|3z7$poDbYcEL=V+dfd`PXHota8()NEI){yIYQ%56p@9(-F=~4-1X1PJ-2OgaB)v2S|Y^I*Q z&u-;lqcIzxFlE zETZ11xWQ!KxKGmrgqPb50HmA{k(jE!1(X84a{h`LFb9vLg1UiLYr3hTYwv z<&~VXV+N!oU@7G;{MhYwZ+iV3o_yg1JirRGOo~%w4NBQ}m|M~59 z>kh+nv$BdY`s>`k`}lLuKKtT>7fw!2$iRj5KEd!WbuXHj$PXqY;3b`bq^* zbJ=VzMT^t`Qm?@XguxAMa*o7ZgVni>^ z+KogURjs*0)iz7KL_pQ)=#di4mfqTU)rXRNusa+J;zbhy)ZjWp+3D1s?L^o;Ee--O zk+3vaz9L|C#@m7t)d#hkRJ@*dYsa#u2H721b}YgAB|po|Jxs3qJcAdKBjDHLIhH)H zWny!e?)4ndQc86Ok{SngkaH1g_9Z<8gNz=kMN-pbyW!UrLyTpx;PSccoW1Ws{O*uu zAE}S>eLIEi=$iYq?Z<9^!OlPGH+mWP@f|CPH|1P3w`>!nz*VkpXaF1n0iK<%sYcAzKv^P+B2LhlPS%%~mpNymx_Hwf zOq{D%Gk8S7Q%^nB{T4i%vuB>Toz{Z~51fhZ94kc3TK_Q5GX;MC``_;gbWS8;1wTMt zYQN9v)1UsdnHf-bX%;yM{7+BUKk<|Q)BXGROG8-wfPz-mbl;wMQUA`jzCDd21D2E{2hWUBLbs4SKR@r!lm{I? zeE85UL`o^S%q|NKNQzZ7$wYtzHNEDr)G#}c^LYrWf&?r4*1VS(nKfSAZ#V%$dz5hY~_u?}6LPERv{8eHv8jgB7xs8y3KzwLLsO+YYFwS~foenbM(4{x1)gf4{fYrJtqFDt9SwoC%J^}Y%LQp_jMk84J zAbp1mM^QKZv?uYqS3IJ|fDBvw0d}7T0uV%ArVIc8H7<7z>}^C{Sir*d%tz{jD;Y2# zv^lU(aRCVRYNYV;tna{YAIr?J?WgUC2ekAD5pf@{+GQ+FudW9zEHyk%`e@F>i}WFe zs{*n%9U37pp!7H63j;vx9{0V6Aq+(`IYdrZ6YPtDk*Rac!)i6SZYRV60J_76V@+;! z;0Izg;&EOQbw4j~BCB8SnqjwqP3oS~C1}Hdi0Z`4jw!oR`6?C8KfW9Gu1`;VFWA>z zeog$y^Uvjf?f^jlvg&h{bDwJ|gxx%c5FTDUJYB85bdph-XAyn)@ZtO3_r8mZi>~EB zCO>mmE+J!sc=dhDoJb!B-`%)&*oKPF@Rc5?4vZRodfjRxu3ooTXGs zzls4VAUW06%s7TI4kgc(7!SrwB33lB<8M+d1A($9q^r1*l=Je&A$WT2Ko~hxyVE)O zQVC4_$P9prNO52mDF(I8!hjgN#sq+!7RR7!Vnzso$O!jYM6&{t5(9&&Ma17Uze3mgs zM`7<>2e#Dj9(iV6bF93j4QmZ1_k-`|s(2#rAbhWVc z<&9qJS2l(1T|E zlpI3r-c{QE=~u&xagX5Wq01fH>BFK^jrzIiokWcBkN(4FzxAzeiI|qUQ$XU^zV@~M z>xX~2)o&0}&x`HLo1F9S|Niek^UN~@)tRUQ@<>is9){tAAN=6=fB*N-nrMmhG>aT$ zdg`gCKK}7fOw(iq0?|Crj3fwscX0o;kM&8^4N1&Q&9illnWt&Iyu4IZ|7c*~00eXN zk9mH6PQ=^o#sg^GdIbOw>aQR^40DYwXa^5$04S+{mGxtK+qY;gduEaEoa%Go8&EL6 z_{-2xkA@|}s?kEESas^vt`cfT?N4wirIdWsbi?8?thF2r0o_rqr&)X7d3`HX)m9)x zKv~VYFOIkyVT(?_5LYAj%+GOk!a&gD?gZIc$fFKe1SH^+66BYn=BtZKe#*EB|yg;gX zR}>i3m2QAcRXJCWs`_sXAcmpE(pf3uAWz^3ObC=yRY{swZNXk=t;+HPDYr`ouSQ_f zG)KfinTuAd+t#FlejPt&u{KKs&3FO6|>9NK@WWDi@b=ZjZdRSO}w zBZt$Yd?7dZl@VX~*$^WDTs(T@5L~&IE(L^OP>QVAC;R<=7zQvbrFcX}NjqWo7k91g ze!q9GtEJT2xnQf4b*{S7Vglaq)@sL~s+X6S{crWA$9gn0Au`1&h-vpNIcg}qmSDIF zd?8XGGh<{TI=OY$O%i$m_8wfZQr7)F6Jj?Vtg$bKM8S>wn?{yErRoyh6TXP%(wfEE zX&$JU{!kE#NMKIhlUWszkhp+b{j&IBM?}a7-FT8H=S*}^oTHk6fr1ht1Rzuuu!#x1 zUr}#F031p{vk-_FkW3_l6asHFO7(}Do2VN_M|bpW(xnlOYALy%mI z&`V=K>p}=>kWv~VOV=oojs^wVXm)1BQ-enc{?%i_;-BDcU=z8`MRBw7>=29et zpru5jV%09KP1wN96i8L~`~B^^cZz7vrD}YUw5VqZ_}8@EZmE8AEfi~UO?(MGO%nna z$&#}Qq$JTxT4|)(feLcKF0qRU%d-jlYsez%^rv^-YJK!r%6Lr(p=1mby)YKfqsE84gGv5`AtghXB;BfnD$KFLv zb4K))d|h+6a=rS?0urHULBlwV!!+&YeGG(XvIrXT;-F@p96ryPImR$-w_5-jhCx+; zg8S_H1qmU@EQADr!{B)v)eYOzIkPAb`}8ge z$7p7$7m1!duBqd{Q*4xkhfB>#ng_b&g1$r-iPsb%R(qSX8P~ z&F>;J046|kOdg%|eb`|7yW+Ms^=t_s1FH*qy6%Q#W`w}Vk(mh4fWUlHgUm=Z1*e5` ztC^w8H``8DvC4g`VWt_7eJ?AF{+~pyAXiI+##b4j?MB|#^%w8k%Ih!HsnylqjH(jZ zDmxqq5sY2Y0q9Sk`68qx5QDlsGE;->2ye=4So-ZD;xw&u&N>i0@3I{YF9Pg3?xq?h4HY>Q9_cL^ZGaU6*VtGWDvW!;C`rNX#{C8OlB%LM?L z*@Y86xw>Frxf@O??e}~CHt*cNJNw4y~leO9e>QJg6_*rlc^rPI^X zqGfq+8xkO>s1sqFRM~Tmd`ju~u=Cz?&b>{?h8o`9sf$FIvmgbv;*e7=1u3|_rJ2*Gii2Z|1E)J@ zx-~r&g_MOz!#JsGF%2Pjka>(TO9>$i9QI{fz{rSVY^I5z0^_g}cmGipvtbw}99$lT zgsQsPZ0?MALDVgM{5c$AETx=Gt5Qmu)9LByZq6LXD&%ub&4My{cDg=UPXS>%J@FLe zzyySX(bqtM_}TM^ul>H)-M+g&aXEVkWE}~j$ ziwXU_?%UtqaL97BZSf#2N$g6JM%Q8;LY#^o{Df7y(r&qH@d7;0GXl61EE5?s2REgY z&V^oXpzAg_WpC;ckvW)|*Vk?+hK-@-&2r!L&+~kGdWyjAovUh$G=wFtR0+2(`wy= z)){{tN3d#KcBrPOnun>`eLl{)VnFU1z3=xo!O^ujRN_TGE_LM_aC4&&7Q=@BJ zQpz|Eej=NcI{BNb?+XQdN-*)MLR=(i|9XkMW0p@CVL946C)t79<-Foj}lCkgnRm{L0(JRE9+NllxP18;d&DAay#3p#W%vj*CP{_?5ggdeI)$7(Qxr7R`2MQ zU26PlFXh~XVHk))a}39uR@!jjY*(Mc!)Ip-iUvrCq=4uXDuCm-EW)!6 zgf%AaAHOrFjwMELFmrzSl~=}bTn!_I(0Ad!@^m{{SRf74I4XfO6r#Vfv$Ff8+wFEl z%-pcgz ztt}Isot`?KY8nPVG>fSrAwf~eQeJs^Iv(GuqyatIY_oh{P}!vB)fv_*%Y*H#+tE(#l0>Noy5car3g?p|ttqaHe!BU%>-@ z(+@UlPVspzPU5B3mix_j{ZRrjSRMkvC2I`hMjv|iK)rjx^Lx;xoGt_^Qk_yn+&>OL zG4PO524+>;?)G4+6jU8iHw7ex7|Ct9n%A)#v4Puw4`Fb!`u*3w2Gs~GG6x=f!|i!c z<7&z|7s&y+&H4&z9{d0R+ehI&M7G=QzyIW?zWMd9nYty{PDX`XYz+9xS7WB^rP2b7ndf3Ul_90F5dRTUEgCZfVJ1VXV}>s5O65@9CM z)iCCwJ&+jNIVPs2PLil;z{~iM#>W9`&sQ%KZtSzP3%qikyVmH4X6q)+W~QhJf!zDZ zy&tVgk|-Q3pc!i>o`|X#EJT&K*yUBE2am#GyDs#`%=i!jD+DK4)y%58&BZIOz=r|a zj0lkl$k?B+g@(-lkl0MA2g2F{&_%@XYLM^Jq2l_w_o#v%<<~ANv19SC7A>$Wv4?z^ zn|{%&y#a(Og7oZOzcd^?lC!o z88M|qz(CgM(3H~5Lv)$%(oM5M5rB%|6LtszP}P&(RR@QT8&|@KFs*i8iRugu;TeXY zs7|FZcS2})S1E-hY`5E!lM^>HIf&eV`XLg+Rc2z#!39)+8d!S*{! zRZa8K=Cx;Ca}VmkD;=!L-2Ihs0hde6jI4w`Px@M{_&4*H@gZNt7?(HzmMbkz3=_8kA3W8BEneX zR-MV;>{js~zWMD>{$GEv-zSfv2_fv$?A>+zWL3|M;8N!?7ugT`-{yujR+hWH=E6Ry)G(6r7wwsGv7tcY&}l%JnuH!)Ad@5 zm?|)^p=K#+7!g$O+_~eVycikk-j@t&lC0C|=iOd%A%G;w@p(p4g@Gw=_v`gI@Ago{ zPy+q`e7)O`W!Zh-_q(jM_C9s0x_f$hE)q>q@`bV`QlbLM2q2qGlo+yPTeJ-Eg+UxS zlwJeLd2;li|Gc;QxrqZjWe9?neLwIs&n>U z>vze+Z|!|{RSz>DK+JS^b=5g%ul2ipzn?GFV_x;z1%wdH>70`&njG|%*<)HvGucYMo1w%;e z<`z#eJ8eBV@n*zib+!K@qAZ&uyg6q(P0W^8T;0_yZ(4pgQ$UN|$w@6m6m@ejoVO!r zT9v*1a_pIF9W4!LCKng`u!L!!8=%@LpCFdC9oCpQ4!-_(1x>p9pdAyh184<6?mbX6 zi?KaTOBfMFCR!I;ahJ9$%=Ky<$JV+&OPcmEFOswbT zrs{6NN6nd!$D^ejlUPwGrF7m!+8MBF3!*|kEAA>b10|;1+SF%&$al^!61hRE24vxl z&cx898fe+)Jq^s<+U(?>Oc0!*nO)kpFjE~$X|-}0&;fl(A$9DD3h2i=L5IjE z^5W6S8=xhkoH-4-AlPxbG8fQ(6AZ&3O;l;WKYRM@1JPPiUe)Y0bg_NO#KZ)6|Ni~p zY{yR*QW_$PWW)2jcb`6c#*`_>?Ct~!!NLtI(jGp1?}vZ*)5qfx2+%DUocnR-i4Zua z1WteO2Y=97BL`JAQFj-URV$8&pZ)A-@4Rp?2A;9H4ZU8R5A!_#_HY08YhVA9Itw|e z`aI8uv7dHCytsS*?|_kDDjZ+aGU_~;^HFwPRJ<}ni>Ew zci+M=3}+W-m(~{du*G#A-^P3Iy%!^%lCoGASVFh_fw`ZZoe_|ln&>bLZJJ}hHBD2v zwEJ=kXp!l6yFl3b0uFTN&YfqMmm542dxQ)!xoT@|s`JHALP;b!|36?*iv4A}_vp z{|jIE!niB3gN#XR6b<8W1_0OBhhP2GU%kA%H0SMbB|1Nm`ibxR9`K6ni5ab)LM&V;G0c35KzDnV#BAW zTsquB_f%D-rj&cihpiF9vCyN)IgZ%X{+DnU*{-9J)>@`!W`Z}ceF%9C;a&hu+aoKy zXDC6*mIw+9H900E=f2Jx%D~LtDtFULM8ViH%|$c2I$T$2V;K-pO%2=-nhFCKM0XEy zA5d41#sZj#!t9KMGS}nv!POYa%|!*>oEZR)hvV5$UVQOIRdo@tnm~{ut{YbwPKDxpN4FA*Bz{lz9gs`?{k<0Pg^wMX_r@P0TI*TKwbmUXB1@~O zWMYo$AlkN+`np7nsL#^-XQER!3=F#Ipf7rX`r`Sfp>e%3)2ZdhRabOFy$s6+=$2US zxtXxu9PRq8=`k*H(-m3%JoEWO&BRM)#fRIOBFqP{(+#(4t?kWvS{#N%b_v#c-j{q^ zM+P@W&?m6KO)BR}2IZX^wsonl3aKp!wD;x9geL~VF$olr#JohW%T{o%ZO-GE7{%Sd znUQ~=c#MWAUfxoM53a7pv)!$QMeKoh z!`b2L__2?EXRCD)DqE1YMEdJ_|G|szyz@>hwpCqKUF#YK)l`OI`0nri?pI!UC5S?Z zSV|@$6HPrFo?2^P{Nfj@bdHDA7GktW=}9Sl>|-DM!WX^}=ir9fb=oX^`O9Da)&K5S z-+S-gbPkrk9 zfBL6?`s(^p%|a)SYqke6BEIm#3t#=}SBVIz#O=PR4%N&aKKkbU`}f~}{20(%!&+;} z90+A1LT|C5jN)K7jNXKE0`TCYA@MZLIp@P++S;g=VyQ=TTtB;tL1Dm>w247~vjnSw z?#BIbJ|yY@%NVw;7K3iX6LltC#m~rOk8mvP@7%eQQbJ}zPK@1yyAjeVL?^cb2ieJ8m)sZDaOkeb7jv|u zk^LR8Gaw>kBt$~ybV{qUC4nO{ez^}I&8*iVh@Bd}IUhJ!Bi)}HBkXOL#SRGO3P!7# zFqRSF!zCvo)Rmy=ZA}UwB1U&}1}x(^9iFw;#!R(I$wPqT&W3SSi7*l&F$LS+Pnt&r z?2~nKcX5NT5`!y%Yxl%0>3`scJs2A?t+!6RcJ3D9q}74oF3TB_U_+PwR_u=FrBsNK zo)N;QuIFA;!9O%n_|}>>F5p{3@2!bql_+ohQP1O-gI0f9RyaIQ|M*a?^>(wng->mN zwQG{`)a6HEw3Sw^>)U8(T5A@$L`&U0j$_<*u>(7$+hRx80$L&l>vnEJBs3-#6=ocU zyiq$3p+L?#H#Go19uHa@;6)t$l*7;24?bp2kmvdMuYKxM?>>6ujyY%M_yYO-{QRxA z-WrBsp693FF;#Z=+AO8ypwFH?`!_!QnP_%ZwQxF>S*eq&fA@EPms9Coi}uja^`CJZ zKl#Z|e)`j&j=zyPWV0u^ubKVc@BQ9y|C9gycs#}hY-WgI_v{JtKk+yJ#$WuQ9~y=M zpyzPJj~08uVHm&kr7!)X-}v>&G_18|PO-HmqNd{RpZ)A-zxR8;_i#9DMm{%$^!FdU z__eQnE$70NTWi=w+Py-ZWDZv7)%9hERIE@r)6mw%-+r1uFE{+cI*t$-iycQy4pK_y zo=Z`62jJYnNr?e%St*&t5V5;!LotpdZp@5CDw2lcqQp#;Ky5x&W_A&BQxG$wMALCj zC6D7cOLORp`V}k`3uF@wyNkQe^NbG6xyclR98TDpj5#?1QBnv*$>J7>0WunZb?;u( z{^knK^Du7TN2swVP-%#@PJcx4lZz@SJs3WcUMq#AX=5fW-Dy5^XXQ7V!%4c`gYcq zXVVu1G_9&mq!eO9b9D1qRY$_HgXY4VXj^&AbIqyTyLW$I@NoIq%z!ADaa|`9ppy|g zf>GCxF2o7(;r40x*;kzZ<&Kyd#rR8e;UZ zPQPRBosx+dGbiqJ4sb)H#7s0)=>za#7$9W?LZFmV$wj59>VALj?r*;J_8V`!WhOuV zh^_weDv z-EJq+K^d`0ikGxbGXkWsuF-mg(XA!)_w;7LqiY)`Os>u)la;zLrS0) zJz0o>W6}^Z3^4`woQH@XNGXAuZLRqMH$Yca1jsqht#LwN>}mFhRh_hzT@OwMwJL(9 zr4%tOX>d0YQOCpuu`UhHsp=K?A?Nu1+ceVv=wvoCU~7Viq__goBRbdmv49<$%n1^~KkcSdHWE)l8Ofs1ix#pM@ENyLCW_xBoC z{(PUAi)l)muFJ{6$m9M6Fhrsd)&&&0=ZTT6A?R`9gDXQ z1_Lm#L|Z}Y@pz4W#fm{2jqJZTs;{oDy88tKjS}5>Of{WyF;P`bh?$eCSO-Y?$&T-e zh^_!Y>JT&i&W&L*bdKKXwAZul4p@(0O4x6Gj(0X9v;r^=3nO}!yDDJsUCqr*h|w%y zRFUUy!B^9s^aU&X!3n_ybn(dGiM#>eCtwu0gQGDKFazkiOw}l60l=_uX7ab*dh4v< z#aPfZ3?mK}Nsr))Kz#?XikY8VTpC7F1e=?wH#M=&J7dRN2uLvR0<-5`ytk&r%R)DL zHDASY!8BMeyPMk4oBkru&8Gdd4PCRoy9}QEL)Xl=y5w(#*1G+2EWFuuL(F~(`y{x5 z&%HGdT#c9=Tk%{6yaJz>WC~wEONr=&5{{pi$j$>=>`uaK?sE5OG7>3>1 zS!>Oq7p<#)n7KDqL9Yr4bYPq}Q4qFFs$9&6VKAoFS|SAExGznd2Be%1hr{cyzy9W% zZ(Ti`cDwyydUk$(7N?RU1yoN|@7{mm+2J}Mv4^W`A`0I6JWI(XWjb74xoGt;J!>o_ z#B^>oG;f@en&sTbXkpxR?X`1BX__X{s^Oi_*#U@AT*wuXRaMD`af~qII!T8X+xz6)kN@*ese|B^G zA~v;>hxo*s=&?3(LPXJ;b4KdoiA3O~wAOH`DII{ALd)IPu8V#x@^w&R5sh zLCF?VOdR|>M~^?-=9*ISsv&V&8xUl41Tz(BwN_%zIkncDP{Cbw7zXbF(pf~zA?J*Y z>ZWdoX#&D=IFIW*a3Ucb+BQ95&I$ipzlaRg4akXDRa4I1SyYgav@?wQ=aZ0J4XNvv zV<8lWmqi!KC&cucm+IXTe)?(qGroz;Lqu>55O@dh>jf~87W6KE}bW9aR z>Ir)2uyXwr;Z_*yvb*)oHGwMxS=^X7Jh;62JjpY=Bnx-xUfY16iG$ykwfj+ z^A{j0s+$LX-zs=#zlJ9`P`;vCE^@I(eN@P+>D6OoyUDS<=GAbaWpqH(CgLf0Mh z@F-fS13ihr;=enBIR-Q|%vrs8rS9Y>_h@m`W zDO%!iy@zevmeF{cC)+C8@^3}d`p|fWUd605BE6B;5ZVM^JI?qf;>3@vO+>$``}nXV ziQBmpx4x5Gc+Pml;x1h4_Z2C;4NQz*imNxoO2^~z`uaME$F!(;GB-f<8C)n$)XjyDUj5G ziNLX$-o5|A$-5=u66G%fKm|8x^*8~5s(6dCDRnadcEL+L+c7Iv6;Lx5G6GXdJWbQp z)m8M?s^P^#W>ke{TJjiJu{D}E_=qt@AR;BKwO(Cat;vilMJ>b>vESOA?^RvJbIxs^ z9n{1Uvo=vM02i%sD6fTG0JM?Gno#1^E4fV3(V9TScrb}bL`uX^opV}Sw8#lC^Ru(F zXrsrJS%XZ01{Q~lqMB$B9uze8_c4k{Jc#?>D=(M`Jffw3nBoJFn{+9!Oxqxr-20CkRUHX<%ww}pV(?XrMN3}KtYHElS0{!)O ziW_yq0=QYgjKf3B03PvoNOP;<@3)175%f(5Ma0^sVHm)b7~BNh0$CGHYy3rRuG2I% zw*XQsYAq0vC?CgC?%jXE>Jc60X<|HeU#AOrIm$)VmbM|*KkJqxHi_!0vIHF5l>WH8 z88Y{E006}}Pp~7R-66#o96$lQNA&?B76(HUcTo==nIT~R3Q=(TqV`>~_}tMI0THO@ zCb@E4ECdm#8Y2)_aI{!A#8Lp%gLYMNzMc+u?%s8oYC8@&8#ty6u6?rY2G{|7L}ciI zy-$x1b=<+rhj~*Y_8>n73>Q7GxL7kwHrz9aa_3;JQM-CDhtZzdtk$VhfqN zRSm3I-Pne%;V`$@klPEmBU=|mTO9PU`+4Do7p|_Z;+|WX&#QboCbZYr*V6pny?ZNE zGN+O_ds;Ul5cu4vMiJ3Ooue-&M8A7+aX3tGyz%DOzxK7c9swj}MnJXZMs6l6^PAty#G;BzJy8$WqGFUS58{5p+n12}K%^uT(fyy>sVI;JOTB1g#E6&_|twa6BH@cRvrM zwYjy1i3dupRp8=|+KqsyDj*Up1y#k=QyN!%%Hr5w>pVrwME%n;9j6@I+$9Avr8L*+ zcs!O;j&&v?bEm|-LCd9-0#z1I$5N%8gnLcqEfPd)jVW#^#ae8&VVb5`=}B#&^NL;* z0F4a157mRU8J{$f8pD_&=Q{T!N+N2e%voekrKsvu=REAtJ+w&QDx)PZTM-SEIB|@5 z%z;2mODbxOXzWoj3z;33Gdj*Ag6FRG*fjS|)@cVB;A=oMmBfK5Ugyj%?qx-?(+MsH z7EYlXbRdqIP2YSY=HZojc!JC+iYS;aqAngt(MGb%>%+i2R=60Gw;gaz#LW$RG z?^s>;Og2JvKniSXE#q);_fF z7H}L(J>f6xNO4;QUKrd7paD={`g$ikuOs4Ulb9J=m$=3dk(pB(X~fBU+k>kZ06TXfZ!Zl#oZHg)(Jm_=MQ zJPEW>RIQR}Sld=wPMP)2J|2&e2fp_4?*91k!zxd+i2iG|diL@kbGP(Jm`?KG@-{1MY|Lb3z?eE^db6>-7LJWviEu{pA zhH!E3E)Yrx48z{jBr(c#ok~8|c061^cPN(Xtzfz`#|TqZ4AxCv4abZaZ_RDWT37HPQ>o2CYhNyi&<0W1c5|~FICc#qK%x1&B7jqLHt#V zw2v%mK-5$aanhNVX$6rImZqX^xePuYco{Kk$R&ShPuIPKh)m9fVQneCKz3?5qFk zkEdzER_E44L`++Yv@=sT0z{qlR}=2r$47_6MoG&?D=|vCM>j}=g!Jg{jvhb9d=p$P z>AKGAx<-GFf)1lXl#}$<1`I7PzRofHelSb<1!wYan|P#Z8S40E@6NfXGcBI{?V{aJ z%op`{6fbgQ^(U!8q7|=HOAZ&ThqIsRh#Rdt+hw<*hV!#U*aixXW*89JNTDwg5cA1W zRu&m7Id)4J4t01Ehyij?LP4gluQXT=;%s)7%c>HA=rS?%`TSwzX0H_C1Lx4Sb`Mv> zFa=)9c#+_yc)kY2!HJhZEcVR-O+ zLp!4%S3=;0k=Re(Ec<_t?CEP%G<(BeMW#H=)eWQlt#q!`h|9`>Ty3RvV z-mjC?oQ~R&hbOWlPM3lzi(eZTd9E{;@!huR>R*3E?B?uZF=*E>uI`4+)%lIu znEM&Rk?!<|dsMiEwZjX@%Uixsty!^Bb^3TrY=?$*VtPCf*^^fDrL6!qsOV}+*I8I_ z!|Y2cgMz%Kj9v1uHQwOytGnxE*T;dpqtLsJXJLP~+_X9pjtj@UwlYv2=s_Isw_`bq zTH0Fy0i{%w?#~lyiNNz+@$Y9JU%+#7il1sZ6Ix0of6Rf}+ZUD-r~?^t^keiI?9g}O zhKOdClF~0?`B|sEq0DK^*YUgPK5`QZJ#1);cd>9(nLVv;Fpd35_As6x2}A_8nrNDA*f&GaDjSXPQzqkUwBJ^T|;@f%iy=uCMr0 zhQX7QjlquP!&|9~dr@5#YBDlUO->za82!MqsavNINuMiqR6FfzW9)?b?DF{d_+vrW z{ZaCU$aZ?{r|Lc^Hdw;B?g+gfX>qsHR;T-f2{2~b$dJ*zYBUp13=Dp z!}t(?fLph8^_>sW4_A+U(-m4zxY$ZWvP5De{*B*VOW(c;I~e4xFN~ilrr3KjSSU;2 zwBdSn*nw_iURgP3Jk?Qy(OkY)eI8JK#=rWyycQp~5D08gWiG*1AB+Au0g#edaFrCu zna|QGsV>=|asvSJ#R&*OG!8*uS5PgkGZObNK3pk^z{(MasxruYka5pv(noa+`RHFy zw(2D0EZw1k=e4r9UYZFSe@j31SLOlRr-{5@oC*oRN1xP|mw|yL-PEk0A(|Y~L62>8|*&YRYW9v>EEwLm}MX?SFgUF^lc? zhFCZ**`;6m`|?N~!&=;w_?$;jH-3xPwu{VLNxwgZ-F7cV{NB`dybo-+e^G=N2t7j& zgwah8&oPf;MY^Z!RZ>_Mp@fT@Z$DKn>{E8^dBFO+=SJMr_LzL-vr~j3&$?xQKoSan z;ky*p1ig?S&H*IdId%1AO!ZwcjvY9Teaz`P-9v*+Pk*B=P`f{VJj^%RldguGiHy|L zf2Y+E7~J@zwh7Iysp-f<`tk5kttMmo3&{4rO3xu%JMsS(eChlqMe&2?!+3vVb&mPp zaZpHM3Y#kS(0tR6M%L>7yYoFqyw||$>V&M~*5den318vlHg`DjPx;S`8DmR!~@J-qnP)Nui860xh<*;z6-g&sQDenL9C)+;SGFHavot&CDtBK9bG z>&{91=U7Z7WF>wx=+Y)pdU;Z5J<7_yYQwTuFEJ+>_ayZL0I-x8p|f| zY7Oqsl%vbiXdKI3p7d!>#?-usuiXzQ5adDNb(!`3yiE9YP-le$;PnXoaEFoeD!SP> z7XeonY}^g*&2kI~*dR=%LhI(amKF^32)J zgCk4V`Ue)k-roN43hfhld^nlYRmD%-kD#is89tH@FjK`SsW2SpXU1T&W`;NY=m1{q zq6f^vo8KZ^9g8X0G!gV6#pH$N`QvBKxRZt_o|qZBbw%bE-kT_=ei@9ibg&}K6%7v0 zJZJ(#!J-#sUpRp=XL(EfUeV)M;NuqUU*4{}o_7oDNgmNcW)hbSNKwsY#x07Q1RTyu z>7rPGa-wX{lP6ISJ-?5|c$B16tAtkSg2bcbOrpj{YL)~v7=X9*7A$yCg+d7-LMsuE z;V^n}6{FVb5hdH{Ih->*PYBZ>!mxyg5j%3T;9v6L2W#4SYmeeh=jtV4j^*NHgfi8U z1)LU7Q#GENeqzFr(#pl^X-oLPD#YekUKzExe|$}Ml__$qh{U4ClwP%8I?j0Em#{)EPMKPY&A2Y!N=%+ z7*1hnw)RzoMiW!Go$swt{hCQdV}dxu^SXzU_V3j#YGImP>vh0&%*ILT7tq%XL3@aS z9eWXs$l+>tEzfmYq%dTaJ?uBy-VtzHfR?`(Nrm3|yAqB$2_BBsdNG&CnL!*F5XL6l ztat^22+{t(cGH4o#T@=i994iOx4c>qN4nrd2 zXXt6-$4{F5`X-#L2L0QN*|ndwO-X(I*rDDg{go$-&vrO5r-ByvcBFPljh|YZStjEG zzltP8s;F-$N;9SiL)Q?MtxBM9k4Da|xr>M|Cg8hkVgFfj)A#H8E)~3|C+!|^jRAt{s2i+5 zE2mfZnYZdcf-L3K(bachgXnJq5eI%d(sx;pQ|Lb*wBLl(aL#sjq?ey$asqjF*YSAn zw-T^1+8UD56iXo;s02YvA^)Kj^;f4+S-r&c9U{oeYUQ8HaF@q}`a9wJu1mXr%|R*! zoIqC59W)ETOZxGw587(1`fZyx9>LM?_OEvJrnWwGE2Z6z65u6$^>GCqNVvO{zDV1U zhzX0Op0lj+A3j{^yxsgsUd6qm&Pg>(MZNcmpI>7dCMwz1{+HNd(>3NwY{x&!q}GHE zi!9JE5BBAWm$fept8yxpfIOn@vWa!jNMW1yZCusQ)PN+VgzUXzzvK;S96k6jl89r0 zzv6wTKD@T6{rMKXY5If_01U(cd(rx$LxfJtlQA=$1G@vTX+c&ZmC5wPl{KOkum=0j z+1eTUa@T5OCW(gV!#+7Y!+MitNpI5}8n>yj9)gI`C3*+2C!O)2&ZSpSrxf*4_o!%0 zMO(ck2r!QkDV^wQS&46%{42#`X-NoyNJSE7>V>>BT78cKf3{}9)JVkE`F!@A!YAdU zIIx6cl-Ab-YsWfyD3J-iej#V9(hFYw?E)k0 zMd**_15>)5yr;Eb9iXQxarf=0P2S%XgxHCcWgBJrxkM6~fx=+A9*&(qb3n%LJ^=G! zVWy^E(36#$G=0h(CwRWz%a2>EZ()o643XbJHi;K+CQana8P_{m40)LrWr|EHkxp<7 z*)54y2e$7)4O*O_1#N2H*gwazE^~-fyx%rR8Ls?Mg|y?F`RSUG5v|~L@@J1;MI!Xc z=m5ZXLPqmAE1RnTGQD-d4;bh`2#f?DiI4o`T5jibb+}X(;}->7J2vs<`?}eN+TVx! ztsaa;HcaM58yM(Q2gFZZwlTgricvo-cP%fmqkgBNih-w`VII`UzX=9XK`?*U>Q}kw z<07Z}*mX5E^k)Y=*dZ{9a`o&}?Z9i}(>3@1q5pWXdHC!+WF_Z?opu{1rU{)Pkl)+qgm&Ww=_SFxF|gRsW+^{@1# zFZ9-sugRDKJD^0&015PCUpVZnWhG#T0hgtuZ%rn{TDtbo?sBSzR0@r6Jh}?PlJ_3i zYCD#?e%120*L7Eq#^F5-5m9q~CY+Sq%vadl%CdNfvG|7rsA(cuJxP;M$TfZij{nya z^)&2YF7$vd?9_w^_Z61|d#vSe_3P8qQ#66lFm7MDf=@@&s3H@6A@!j(Ud!luVSIbT zM+GMvg6ajCk7CAyr4GlxHZRzPe;EKUK?Fw6JX#hRNaC1mA)=Kk?a7Yx4w!taYM||K3lzerysjGKWNo+~u`UG-oz6 z=BK`jZ2u|L^JjH+ISr?SGE!nT9-&(z_N=1sBD5vX#L!Ft2(;DQ#8qY`-tf1Jd!f%T zFl925A78nDG4YW(MQs7L0TEOJ6~6*->_mv>DOV`|i>&B=J%P7Yv7e31E>Y9uTLjF| zC85ORTdR~Qu}BVb<9QMBx^HQyb4APhCkra3Z$4WnG^=QNOqaFl<0xx}x0jp6@xGXl zZ;+*+^fUk1-TS-wpBe$V>}tR*E$~_LzYlwLGUEGw&re5VN9FPlhNJ%~1KzA7KP4Yx zJB6EPw4)%^3tz$PSnB0686w4wq~X{b6Z7O4GGpLSk}RoDmV@3O^_PEVv}BE*O~;#B zZ|`($`k>nNH>HclZkMocn;!x?YeND+ZsvCl!;vmP@8}4rr+Qrs)vIrN5pqYU6qH3o z+2d<+hGxBU_d`V`%K9~E;$r<>Fl;K*>Q88T!WCC;j57T~zQa(nh4isEYon=90aT6W zP>gTnbDvcylK3b7kJ_B-Ng>b9|8$*a@$&L+2=WFH(aVw=ac|wY z-x;FG#DW?S16``LzP0e7U7(>F&6(E2rdByj)Lyf+dP9V)U*kx02et5@%;($fVaEwo z_(C8YVy%BYq$G8EJsuW{K9GL{kVu86)!b=_yQs(WtY=ceBIAu9B`K{{{_rf_%iDY2 zhjrfED{(D-gVh8<){_6?*^j$n*A}Y*`*aBU)jXsS$-M*xmjC`}3p%ReYsWa~kz4-iRFEO{zjh@UeJi(e^rbFx!8WUT_SU?h zSf$CiN-qT{N!9Hv6K8M|`}jw4tcMb}>$W*2fBkqjfXvtZ#G)@Wzz*B2vy8}N3tvHX zEJ%#kWzv|!McI9x!sVLP>@##_B05m6Yjh473(eFNv#Dxb$nYhu6l48q5wmBcee*na z&Hc_(2n1Q)E>}`<1*MOmrJ&=?HyVBn9c&46Gc)f=j*`gj41@H7YR`2PZMLmuK@IH* z1EXOs#(BK5VYAv*pcA|KxnE+0(4baGMA6J ziai=hzm--Uu#|(JJo3_O4T&w-aZBAJYGi73|eE7k<6l>Sstk`LfQnDRsaQUi&<@s?%X9#OV-`^E=GYK(PX5`rta^TvCxBj^m+Zdm-0G<%`aJ~|y zaFhpq-q7{+_3e?Q@klu}5hICG+U17yjbW7G(l^kgNb+VkGTM;}Z3%ijf4s9tClTIr zRJ{ZMtF|$>iy0r$rP3fWZK&pX!&`Z8biX+8v2(ENVZZAksbwWzcXD0FONVs2tm}L# zs_1^cXt{tG#*#pcBr;ft7kHfFy`Nfi`);mUHT`K1987GR6tUVBcC_=@*QJKtH2R`K z%m9A&3gb8WK0s&Y#)489m2MY*28~qwkXa2rxainY5nJ56cj(7^Xl7wC zXtfZiZDJxy_YI#HGhmeSV%I<)!ci8@?IMOUvE_1x>}euC;6|e>UR}(zab#p{u^<+9 z$@@Cm=b2(c5NnneM&6@x4JSDFhiTaf>M>uoBrn{rC=-@eAkU$SJ=9PSmf{ve{e~7) z3c|t){}7yzm$04RL<4CyP+%b&=~)T}Q4V-HA=G=^GQ@uDNWZ6_$QBCcFRb5vvmJmI zMmnvtKyXvz_{Rqig-rf({Q48iAZ!k|Ro|zfTt<9ZC|xIct%{)| z(8$IYy+0V!_K`U&!)O7y%c%oT!p{~lbB+GMRy?4gj-th&ud5H-TwvQ0V%$3kPC;f2 zbG^^;>+=_($A1$*fV%=K7c24)M%WDyCGXynR~M1xU~u27LO98QF=9M@UtXY0ARwXmA&k^ zGvB5z+=8SuC?6QY!7mp6vH?Bo#8RCvt(a9XDiCWY^BsZzHt5!Byb2HJ$5+~?qz`TU zJeh`t0mbBJcc<>@_PY&1HUTE*t{?el4#QF>dIZ>6wd38Ty$1B~?tbkf&HFue9;~9v(Jo@k7m8G28V(9=72xaY>kn&}&7?;%rx;v#7s2l~Rf%J2d+txB#Bf<&jjNc@H|} z*~wqpw>D9fnLqc$NWI5nsR&)|P~%j*@>DdGIS1RyyH6s7sX*PoYp0&OzbG>*W!|B0 z;mvkT^~%&z%jg~niO<)=*K>bk&+nx!F@Bb+rkA8@O)2Tkv~*KnEs4kgfqrn?H2kOU za;mk$o~qmfayGybqB{C~^oI+2jnLj)4I;1c?p zt+;QP0Rr;w_)P)M&K$uM)Zi4ppigsi{mb;6&tVy{Q{_1ga|x}*As7JdBWiv$IoYNx z5ymQDX^Ew)YR6zt)$DBjO7EDdFYq^~uByhYI?>a8V!(%ubOwy&jXij2I!!BFxySEm z5RAeRyaCmLs5&lBUcS1?{#8Fb%CyTF-j?m5${8u?Ic5hjQ5t(r42pMj<*v&b8Bv2Q zythIr_YpbGr1t|teZRXs#~tIu=(ei!m=)5)W!a|wF}OZox;W4r)IQ-nu-EeO*}AQX zo3VI=1qFCL+o48uIbY7y7UgS>pP*1NyRd)^N81oQ@RccK`T@ESw(X(PKvx9>K-=>W z;xxdGdOm|SqLcV`pRTPiNhUfr8R#D`0Az`#e1%8{@+#S6V+jml?OPE`6)~ z@@9n1p?$yZK+uGW&pv8H=(^bE^=xg;kv6<0_@-a=~ql6Yene@d! zS&L4<%Lb%I36bJ^JioNgl)o)=N+_ofI>wF=^9{gf`j8M)pTpUY_aRg+^JCCkx*w7l zn$r?Q@`}1&SV29J1+(1W#$3lf^{f&A4ubO6r*IZcy`KO2MbQ;iz} z9#8eGfh{wQ9)cLUY%b{%>WJ55LC8_%jrBG$vnZNKvSMX5){dIUcdS@ma=%{3R#g!(Q#KNGoak*kh_5cIWerbs2yX3Gk5^GZMB={G_&cua}2as2P%?J zH+Im6bNDf4u=L(*f6|AX7S2WiEUo3o&Q4@Rn#B|fDVY=AMwX@1wFlDa^1E!L_E4HJ zGg8D?(*gM--m+nR$_3Cy{6Q@*#7Wv=8Yj|3u^q(dVx1RLFkxW`?F_ZdwAd3vp~iQO`DV8_+Pgvb&s3- z^;su(V+BvYpIpB2L$+<^_awZH$MGa)7)l%E&dPs+ZBedJXwDLn4PKXMLex3b7PrwL zW-5D_#bSEJNjDR~Oq!4PpXf zhaU?--c;_*4PT4XQ)sH(;qCoHnl$Dd!cfUi`>9^Pd!Kz3Hz_AQ?(c?~NQaGH9FQQN z;S(#C?5HM=ICX|@JI6H-!g=Mf`45XOi%XuF_n}9}JOG#8KrNd$`Yz>248J|qZZI)w zQk=2S6YClJoo4U?qdfg1(%ueh|JHx3Sv#jW^TeH|;D&ngU+f#^_nfuiC;#sCoj8A} zHwghghEg0ikDB1hhEPyw!MrOct(9GrUF|5qs+#CBk-s0}p2GsS$&8Nafnmu|7L@UV zi$mt*%`>+|D|iH%u_=UK3O1U_t&g!U$~|sGTau8>Sb5p^jV*IteK%9bY6W!)2z(5X z+cRl;xc)oc8c_HnY0Z~bj0=cn4dp{)@2WF7T2LHmf*Q6%jt&|Mvv?Fb%up{r0Y!l_ z)Y82(wLpUje3~A^I>!jc!8&aadvba@l~$^cMK`De3-0-+K8?+J6bt_Mag&OyLY*i> zjy#tey}X6p8Nkb)hOp*NdB*50H*! zk|%|}$?60@yX954D6T7%VTs+lwN2%j2#OwtU;YKmWUSytwqxEgBSGQ1AR9TmY@9fW)tib!CXu*m|nsT z{;v<=)=$C95Z#qrZ^(J+=GVjrABH>Ev>z?ooyEEbDwV*wdH4Q;lHc&+O;&s%;ua8AJ|mYkLVY#4atUXE3pOH`|av!~mii zaU1AqTxnO^@^f2!fXyN7eCqyb*TbL%o|m_bmzOYTvwOEAzWHTVS|3IZmPpI*mB{Mc zz89W1E6A$3jeM`hmm1R#>t_AgUq0getK}4{RV{76`^~ABX1>x zMV8w!yJv7Ux9UDNA5?oGCC^jnSKHX7b#R_!V$qU(IS=3_GNV5MJvO(8mj46@pe3@Y)S;#odB+>WTrMa-*L^5k!Y zkruz!MiGRBRsPl1 z<9>%|CBe1joM1nW;JWvTkonEU`qkF;U_gAF787_%oQgj$m1}Cj5x}{_u64O%57Sl6 zv9@B0YI^aZZq3c^Z0bs1e^4GTNdGA&)1JO@kDEOx^ zT|2DIAd@jQQ#gSlvXI>tV>YX!dK=+IG}(#e*INRQ<*^lZP7y*QfJZHAD-L73g@r*B04T-M=t4es!|k+!_2zQ z*xmh6tpRERKa(KW;Z%p|J|T#k{--x!-!y%j72&nM=*wLM)F#Zm2@WY73&8cD8>q^vO%L?a~TxoRJC0z&>ymQMFOj{tBbJ1V!K;I9K&=8|nO@t6!>rLfpNf|fZY!LLFTCa2L1Vgxmm@mIqmgHWX~~>0PBdRP zuUl_0gMF~XWn%l#jOAb|K&#sBi>g+x0*2(CKyFm+G3{V6QB%`4ZI09ca)Imi$fPD# zz!UIN;Q9KYG6#etm7Eqbg#s`^MeNlH@G<>_0F}Dg#`(1o z-~S>FvXy}iBvH9P;;H)QS{z;J-^q@s|4v(>&dajVhNREz;ZO6U8NShr*0dlW>Q<^N zqlIYo;#l*gjCUP{udzYZV#yyngr|2q*mrvEsH!(Lt2bJO1y)wDCe5n>fR!{^vlo;Y zz5O?Ktz@4odHSH={wR02$dAGU8Z~Ak`B6x5WokxrY41cfq#ozcT!l4g(_vhLDAGgP| zFpukh4ZwttDp8BQGJg$+>-ApX1hsET@~l(1$F@O!+{D=0p5 zB1CXVWG1kAvEz1j?K9^gM)$YTvu|7|2)@kd_WldECsxppd6*)GPJ{BclUv#^@^B!5 z{0yCE9RG@gnVO<~B{GK9^Zj zLfKsSPoYA(wxiDxFN>4#Q?Z!rK5;YIa#>Tx9z(STd)J`mQs09Qn&ucK{Gl3ZoH&sh zX`f>UpNw~Tx0Y*#-H@j+cIx|WK)?Bio|sj&r0zivlc%j(q}BYCumu|v$@#C4Vhx)5 zgVR5H?0~}>f>;8-=R@n&62M6(5r>F|uYb_Gp+G^46 zvoFKyr*xV@@P|B6WduNf-^LveAfi6_S5<#DJy20p_R5S)4Au(PTbQ5z+_8K^L|xTx zaWa0dL+0oT+x)QhdH~#XZmcOZYxOJUmVdmA0=uF7Fd!(-XKy7biU~NuS68ps(T_yL zFJUOI-`%`^|9%${wvUINl~m>9WAo_3NBc+t z+W`+@4@W6sf1X&N^C8WdH?qeZWyp~e^!!Eo@{P3b)nS1%SeH0RZ!1fTA-U^%zv~3O z%Ne*&EVwpY?HEiQyC!{)_h|fc3heA9=Ij`_AriXgRdj#O{`gh3;fLqLq~8=j_AMGh z@uSvmWq}Ja_$O6`4Y{-}x+*ugKQb~%I%q=8X%!5>u)+alFDxCdwk7@kO=T%&YL%1g zS`?iFuLWgt?Kzq^5Xk9@YGUl|f*2_nfrnJC3Z)reR4X-gA8l@Le+}H4#~7;Cz6Z^4 zO}dx)mN^*!zuGxk67Jq&sD~_21A*$@6f3hch-40InWiPFgQX?BMdIqWx;(t~j24Wf zS#fDYKu-W~OlD2Z(M`?jd~#gEJ$^H?me|&ZpqO0w3gVKmu+;21M_K2-Rgp0i;xt7} zAzZ>`ruAyx1j+qgPCu^wR#D|lm^QMA*2zsUJxoKbeKg|Ccm9;)rs5PpD&u~BAlY=X zpeep#|3Oi>{jTNK(oJ0XXu}~ons*!fP0ON-Z=F?_xbO%EE~$F0>KYIE5D%M4{z5_9 zW6Xz9VtP5%KSVHhi2F3-uL7M9Y0Iy?4`Oe%2jfW5iN*wr;IpKbQ=gYaKd|~boAhhe z?}EaPX{>)8SrC3O^(*XX^{ICR5)kH_FX_&0Z)XF6m{eEJ0CCE<_ymxzImVpwKj#x^ zn9GN;C4oJQy4jF3(msm(c;*djH{DsV& z-`ZmJa@=N6h{9*!FW~fcM@xgM%ts4LLIPuTK7ld98LO6dm0kg!R_h{Zaha%rd!LNY zvvXpU{s}%)<*asLw%XJfRwi+<+xRTLcIICsB4-I(n=_Ztq9+e#dqHl*pi0s&qIkiREY)SZtfSeo}hO{bA zpR2w#cXT;c?g*KqKivss6tiyodljTV``L>AOlv!HOrbUCaYbVM>S(n-WL=*s+~;L- zSq6Hle)avTGp|@6BDQme$+`rsxC%WvvlvnmxtFus9u0RaG-2XOcu49x5stO0j4Cxx zr^#u{0F#2#PI(`$A5YNhng@T)zIxT?-F)FX3f>V9JFN)4xeG3`pDL#w|EJ$*l(`jl zGy8ZlYiQxZy=Wi!JeTog`6ytA_pX=syhRLG04uiRS$Wl48B5T$eb-4|eaMASIm8CiNgEfBK$W$WU>vKb0OzW?VB(L6XdRT zy&b0G<+yR71o9E}d5cU@WA8G$7=LZr9Af$2p4_*ts1K2GvWm1d4$R<$V2us_+_9@! z0DOKy4Gl+pYwD#gkM0RqwnV{fCfkm-31JNt)SnnZzw=X<4>S&msHtHdHeKpQ+$$jmw#Cgjq$bgywfsrgT?@FoMKp`0P z7|LJ_KsTg<#~7mc2|@iT+D5vt;ArefvMunwCu)CVO@#Z$$nwsSbzYp+5xPc^uR>AG zxpwqn>d|6l1MH$TO5o%8hP;XLdF0nvYV_0clPX6#%&R zcek^hV2uuON`m415pv&iv8%BFx%EXVp%kN6qShIp`6+mMNsYuf<_mCHnG^- zYgcp&~|Oe!VwId6K*_CYPox zYs%ZHLHE~JT+fC@mS8WA-s?)-vsgEq07=mcibx$*w|`P2UyD!%uJoBP6}61)t3l-6 zxHDM`jE9$Gyx&0r@#l&&D+V}g;{rq(B?A+c=Y^GC))ht;gkt3%@TS-PwxZE-v|=f( z10W!S0c;?%vb(keW)Te#v*PfVc$(T5>?h=a!XL(#)du%W{Vf}5_mXQo?p06wZeZD&>8`&Xu*ALE)im;}{ zZ5MdYGYS9WyR-4I#g-6LPFA(qe4U-Of}nSEuY(RQ<}9=l(iXnxkE=X!k2<=kJNi!v zS&Z%k6*p0la+iIcan*Lc`R_$lA9m1`AGebw-NJfwhCa(49w%uj!JBPQ3r*j=4@b1H zI&Awrv^*Z8({Wqxk?KEnKdLqXe108W-JUgu9ix-PRn9=Raf(lg8S!H@w@7=bv%Q-7 zz-f~glpawMm!9S95cJXSY7b1;l-4I6_I^0FEf2qcxNDkw-B?~`^LB?yGq9uzMF+m4*16^L$=T@~jp#s!gZZ?Q4I{TuVwHtgWHFRk zcJB}r1ekoz5?O)wbr;l{3vXZI{T${0h5Jv<*a2ChgK6UT?s@?4u+8CK- zU~7TerfqPBIA^rc!sL`{Yfd3Ue2%fyt$o-7`Z!LSV?<75Ugsjl#(7;=g9eMj9-d$b zatr8${Q2RB-mqUXic?u^6{m|WsA4v>mQWvDc7@_&*ZC+PuFTJ`P~fwEBbbAQMT>$# z7y?=JMh;IJ=?817s(a}VLp_>F4gJ{Je3<(45!($BD_sLicM8dg0Kg6OWivP?$Pft* z#O5Kr4y*7So}7NOS(MURofqnBkP@&@ydd2ZhW&~PcV`pJxm>0{KulCh`2lx)hBcK_-RD zw57jP6AZh_#~fU#YDRG>XKOdhvnMoG^s+N~eVq`mC(?ZP$p(IVN@+mI>fn1&-cs)V zgrnQOx3N%`%jTd>^Dt^H_Vs6>R!+F*88OB=5gD91_SWxc?@NX*^@-q9ZUz#rr5t$k z(h#1(b#}*o`r6-fqUBwhIDPAp@N_v7lws`hP_?Kat<@;g7ov}TOeNO1(>m~F;R1ax z$v$=0c6>t?OfPFyFj*Gn?`nax1k2)oH~aMuKc78%2&P6NQGb7a-XIMfyzTnaxyof$ zWM&bv?N!9q?*FIYC~&Q8XV4>CpVA@BH>hP1lqP~(k}G~(B7%y>4NPmuoDsnWMV3Dm zV=y2j5$&H=P{4-BWYH6W0SeeLc?AdKg<%herYVeg_|WlMVqI0vx#?Ga;;#kxV_4i) z>DhA!3eM1)-Q%ULE%N!KUs(Hk@dL(Xug6E;_35;mz3i6PH{}Y5czwSIhn*K6-R>K& zZrWAemSP|rgp(nsXvDEn8@Mr(!*jVelfCJx^Qcq$>{-|=!uPr+rf9T>6ubP z5B^4QLE56_)0;-YyNbV*eZ^$ky%QnGK$IN}KQ@*wjz|cO+K_lh0ej};*nVy`-)?AK z5&Vi7a|o*e3wN8f0a#^T+0^VP*9#yKP_h3?Q(VKHh_P^!o+p}*fgc5u5P~N-axSs+ zIq53v$5aZDuY0d@|1`%Z#b-H3?TLtB6Eb`DV**4Y*o=y+mhT*^lK?Zhz#L%~!Z}@5 zXGI#{4#{x6aOhQb#rr`3$hgQ>fqIP-g$(*H^WDz?NVlP9^gFhT&2DeQ5CEa~M*x^- z;m4Go;fy&WK*GS#?^k{A(qx!ZMM~Ue3@*y-3noRkYC*XCnAid(bRb!og$@J;fj)OH z4okqV2ul=KzBZQxX5RH-@KaFpS2J?LGuKb*6TRZ8K-P*zJ5AZO2$?3L?sQ@idFy+b zj@P`)QTIbl`t2B#Rs`juwjK~dLd!9!U&~N4Q&oIhdOy)y6}oi}plkvs1o4WHdJxo| z7L7XbgbmwF1*EKPH%CVZK(h{WB9qe!OyPOA$*vUr^VmBwFFr4(8sz-D$z5d8%M03} zcyXSz!+NQ~Sa%u0xMa)D`9av@`NONvTchr8BrD<_I9QKjxYPKWmKVD=4kzBU(}2ny zHB)n{eGkZd#=9^3&aj-<^zv3ECbvRRF2Wf3d7;%GC)ypA$WJo+0!jhrjg18z;{rgx zav%2bh&LagB+OCIKfI4n-Fp6ELF#N?8ar2okl@>y`FPh+Ue`V9pdg}ZG;ZU3^W?5} z_0(l&hZj8es`ben_UJaplwo;X9RC~YuL@a?13d&U_$ptTQpl5WPMD}!>40$)pDSdE z2H0cRIl-VrSWqKN_yKzI^30clQE^iaa?5Xq-mV@#x*I#;Cc2-)rsi zJ6ajPUmEB0v-nLV5D)LT$r%s%gNCI2+S(X2w%8d(@6N4wH=(Y&(9E2xqYxWYM86np zo~n}cnZ(VO#lsdliw(d(OD-^J855)cJT^T3c9RahqXrF}xDH6WVE*%<=jE;celt9` zRM2L$FB!-a^aWZ}jswaYW8919KcwX0Cu=P2RwZly-mYuiS^ug@<1BNiS#i*<-Q(BP zMDv#mwlxOK!hx_JVHxQ)mbyxN%)ZjkU)S1g6a8t`lk^;6bNNF74Yqj5AK^WhOA}_TE#2M zVIA(g-2Qx}e*^r!OJlut%#GH8b>Ac~N+Q}&x!%B|huY8`OBopvIc${41z=iGr`1N1 z);(SB-%KIji;@FYtq|+f$)Q{&;cRBs*PolAax5}$H9r`hz2w#MBytT&Z0PJv(aX}! z)E&Ee^Ac;6JIDrx{T&=0181t2uIR#Oc~xJ58Sj>en{gI%ForGT*En>nj*EY$yaAz< z^#puIkz&Si^yieR!k6sU#IU=Tj|PA7PNUgmtw zYsHt->@A|1Yd&`e7bhofxz5xGLJyeZ_RI>ao#?JFI^tEb)<0~s- z|56Ps>|>COW>T{@C#i8p3K)HS@}#fkxa7EV^;XhskZOj@U#L?8Jt8W)cYExp0jX4u zo=HH#F|m9qOd)4@-?#eE1>M}UZ=sM^7;(4-u}_Wy=Q_|!WW4XcDUAvX(lO@WZznoUTF9aD<2Cb-pK|Tt-djtMaI9z4uAn-D^pSTSFlQO^>byoa_f}A4#uXXZ{t`I@~~M&z2(~O zmucXrAwCgPiEG9xcUA_cmQo^5;~vj-zH)KjUczoZ{gFaxH5jbD&8Gw$m`*>^#`22_ zeF^lZ`X~JQ%SEGf6qTgD$do}wR76^h)!Jc#mYSr8>U2;uL0Y}pSHK8Io>5t`N;G{e zMj2_RfT`f%0)fSF76_yvPhasi}i9sa6kP*se_Ae|`H|g!3uL zSOta+@{DCsk~vQ!z-oQ*hO1gZEVm43I{iJH*(9^9t&Ex)^m*>%;o9#B!8vl{gNW44 zer4E_5PRg;?R%5Qnu}#qnaY5pt{4JDwC9f{@uttaj?ZEEBvzxCqZE=&bU}~-7i<;25p%h|pY|5YNNQtBIF*Qb|%{G&fb; zKH}csV+wL&0KvsTce6Kl4bF$!2+o-@0KW1U!-_@6(*gr1qtO=r%U3C8^7{FY-n z2GiRD;pVz;KsVL^beY$~7|U;R zH5hVy6CuI4V2w`Ilx!`@WO(b#tEDFn)5bm+h{nKJG-=bdmh+8r1V0fiAs_}HhdCUd zy7!~FSobK|m85sW`0)0rqtxdPJslaSvlHO6w0PdmwR6kW_A6ED=+Wri(bCfs|CzRm zoucnOh6GsH-L3DesNKy=yc3tj_Cy#{vQmmRgV~PStGENOHhbnxo*Ybmw{oSj)G{AU z%FivBIPot?vsn!ISp9W4Fw2-AGKTC~$7#XB#n!BV(ze*^Z4_-3n#Y@CJXHNd+b@w@ zOh&)rT87A>p$z4xY%<7g@9i!fKAI@(^5CRBUT5hNoey z5UVvS8vlwk(Tp@*iS_jIFU1B%UB^aeM1h3FGPr|SU}%+T-B}KP#H;ri1Q9qGOPOsb zTJOeZ8acWqy;C{yqH8Jcej30hIE1L)CU;!JoTkJB`F==xGAB)JISPWiPBNqbu>TP4 z*i)wpDCO=2z_OXQ12jE6dwW!$sR`=Wa)D&i)L-EtJu-Ge843v=wXjGO4|8UgM?D{M zO5$M6&e}OMHrexEKDWCtRZVYKptTM5LedAO+kERx3S&koOg}VdB!!q;eDd zg|*c0XJF3UhG}T%7Mr(^o!0u{6tMO#d~VW2eclIdb)`(?QT5<92U>A$|A;-*2w zZ`k8sa=ajL7x-fM#}9rBw%>{Wmj#%s-t_X0?AI8JE6jdfrtt(38SReyuF@wsxb5lP zvFf@7)PhJB!fXl7V@{t>&rpHU32`0mRp^u^|7l{}c4pXne*8!*r9~i0i5DS~@*YE^ zyxm*prwbF8kRbGgOVW|7XqH0Lmpk;>hK^0rjeiSMnL3y!?`(iPW6C*q9)%nPaegCB zi(H%ageXN!XsoAR9sGMAV44x>JWu3c>;!lO=f-n4=#r2x;0+n|r9TVbBc{-j>qixD zuxfn#FB>Hgha7TC=&y|DEp;90GtXQ<=H85~^1HngGqzQ>G!#iJY7uagwiYFRKckq; z;4=Uh^M39nw=@esmnF-mT}<QZc6Vp(Eq~9iU|vJ2P(58+&+6pFIXMq2$S9I^ zoBZy>BOUf2T?ul!;?D74A$^9}BnPL%9I{nUvAVC;;k{p2m;o;-wS$*sv z`4#V_Y5)970h~wW4`o-7e^r(1YP?42Obqqz&b^{*Qx-%v7^T)OnF~1I=Vf$l&}0+s(aMgB4;*?!JqF|gN=Xi~R;*n|s||)_ zeqO5ZxHVlHBLXF{`I~xe4`XX76d23@@eFIl{g`VJ!V(qRTRh@e7)R~Q6ctId3rU%n z=|#gFWu{`+ht&DAQ`TD+3MPN)Rqs!0j-s1$4m8a zFkj6!|A-pA(dVU;U+t6$6)1h<-9t&&$7Rl;#STW45=*<$76#}`yf+@$pGx^Lo-K!R z-hauNN6}cE`srdd88qF_hH>#L6)3)uzRHQ)#feDSY!-g&$5G6>6arr1`GIQ#aV#}H|Ku?Fl zRnl?oPs2Tj%RD^E^>INMqw>?EqiTp6gDG#|wUEn`10sSdxPwtf0{01$C>2E~xXz%q73jb}$9J?6Vb!m7GH>*JO`}n|%79 z9i*S~Y2AA%!H%cx1csBaFvBM)XjvGnjOGF#46vq z#@ClR|Joz!UwrN-&|=CYuKava=C*bLWs(lJkJY%L{%0XPL6gJC<;Wt{s`>XV_@dAX zYybX25)%#CzsqeeMsP%N_+C?YZ-t#;;@LF57_;jO41zYY#!Tjyvo#M5id9mJ>DkIO z-`OpSj<9+=SBYL8XKkUye{L1wOc+78fC~((^=lrO>aCLfjJdmn^s&*LiVd)3(A zy6>^C#e3g@cu^&>Ey6s(!OQd?KUCR^T?YhR{sl0L<(z%p$kHBp?+Zjm;iuFvWoo#- z(9NGeU3$gceBTt)AB9BmPr^mOI9}3amSc=^?~7;tMzYiGL)? zHJ_H2d(rw&qWBU5Wq7YyoUsP^t)3+Iu}Dkfz;*F03DkdEX^H0715|{< zdSEs%rLX?9L~NzY840O+5AW#)@~SQOU2Bu8w2WYZ3bY(7;P404w{I0b-u+b?1J$Vx z+%LEuq}li%4~fWJq;+te%30Cd%i@;St!F!wbq6jU=W2znkNkq9tj(aS@T52E?^}PVqOnWS5r)i=O5cv_1({o4 z=`PH}NVUPd7X|6>-k}F~LT?7|H~+iGUT3w$Qn`fpq1XZH-1XGb-63O#G($;?77Rhh z{zT$UZ`b%+C#xl5B*qy=!p^Q>EzYpv@0#gf`yKOl z6GC2l*NmIkQzHv9`;l^sYI>=AG&PeeX>#%pD`@uVx5xeCDphX$%Up|MAJJMHy|gVM z#?Nzq>1je$MyOH8Z`v(RGS{$OTDaXve^fD#Go0`M!2) zG2l23LpHPTb1Z3Y%22%HAijNA$~>`frzrtR8+gINuj4jBH;NU<;Z>zGQ)j4~ik0-t zQ<3`V&BRc5j)w-hsUkBH7OSkxV4)oM#TH|QRG==anUN(xF3gxY(f|y1N|XmBsS79S$tjJYOC}~tTXa$4ulN4=hGsh z=R}|CFje#p1!=0M0}UVF01yn=mlyi_98VGo{xNwL1=lZ`o0^}c4|3lS;wqz>OJ7(Y zNtXw=7NtD>@lJmmy)R@wM8a0-=(0#WB=XWHspaRRIXuymsmi4rWk}M~4YcFpd=7`e zlg-)|4BI8mTgtF*)dvY+C;9_~h+*R1N^t;TL_d@+r*J;U6?LtN55sOu_^k6K?_3J! zi9U{dxyHC+Iwg%SqvI*9luvd5NzGfJ_Zr@+QLIWIk*MuR&rbq4!rp;d{OzY+l;VK~ z%YX~}>5fz5j?>GHybV|pIl1CfK))^r*FM-=Xvw?lVf#4V%2|`4QIi!_n&}7!AYoHl zH$7Us$CX-NX z8NvTzNjh#u?svTW+xS|9{}DjNM$KHL8waPYu;7~mX2n=~BWmrYVTSP+WiCoveEOOPPKK3FIaf7hp z_P}}w2$YGFaE9cd?BNdufi!=l=iAKSEL_iCacBEk=Z-seIDezpETY3R$^8Bp$U zdCu>)>tE8_>fcNeSETxV*~OZVZ;b~7B@0nqFu~{5r!$Qi0%a|~8&{HX*(sT}DH#jL z$4+L$y*gSQ2cGc0IxT4`pNYe?K2v<o+vj`G_*44}^5&B@iIgaitCI zl}*b`%^2qjTP$Q=eQy+JU}PEc9e%s)bowL_>(XSn<7nV3AZU8-Ch1ox(Q>hjzjS!? zH34cR4L5lCgj1foujs*4Ob#4Xf0CjrnlBK6V16|BXA_6HIf~r6cZxj25Eln-pKA;^ zUjKrTvj>n7!o>ZN8WxY$UcCl0bSh(gxFk}t1_A6Xw8UFx9Ef4X|IY-w%zr&p~amKyXeC8 zUTmtX%xAys1R)Fp9=mfy=2ylJmR&L+D_!4m%p1+^`}E^7v{=~9+WZ!2u?RETVPA_3 z^eyhT@MLtM6atA#NQ4HRZWj6B3+OV9@oEry9@>IC<=xs3|K54>+}7=1?#!-Re1S{G zTY;#1TpO}dFP%dV?eeaV!+6c77A3dT%QIR=T;zKgZ@x1I+(lBUQoul@9ORtv9>g9Z ztmBgQ{$#A1t;AQ~8%`1p_CmqB0Vm4+@W>6klu&?%?^wKAoukOa)aYN*8u$2#Iyt@|}kJ?Vo)n~R{9u^iF zMkkLhRD)$!aLIfc=I3rtF+rRf-Uq}p!z0d7n)Dja*+bMELP{I%dQn?$>Vx7rN2ks@ z0a?jgDS;pB_ZCCP-6W9BXq?*_;%p=x1imxc@OgLhe(5cIUI#|&o+)FLl0xj{coSUh3q*JIAlyIpPXVA#z>Hq^tzzy#OR=l`
*24;J`ESii=C)XehCql;$WH|ql*#F9#lb~-T$3{rRNZg=YAG#{82O{b z2p3lGpKE-q4Qmd*J{!5e8QB;3f^--+uHcB;)y=z_0LT$MTffNk^0!f&lrh4Vt=`vX zTA_fhbt`Kzj=EgvX|*8dUsO6IJmf#bkk4(|Wrlm`2Hu%^0?odDho5osLY8!`| zrzqmAAt?fNYDZxPIf1kX(h0&g6OJ_Wu>2%8YqO5~1(GDJ=HlLKP2hPZgW7Z=b1U4h zKi`WN;lWq#&)xoGyRt3S{9U419CkS{)8nSE_JORP*u=cSI5f}CdTA**9V7>aRvIp9 zc?*Q3(TjRGKfhl^dl8M!v&aJfUFALo?6Wu!ZlV<;(82*)E`+i#HR&@-;Z9Z z_D?za|DMo7vouAD4MrUl9jwLF{lfhUU{WASoYmLVXur?(P%7HFep}OCbO758$@_z$fLYB37=8 zZ)y22!`vuD|CX8?yW0!TZUsc38x7V4a`&Qi8y3IgR!8k5RBFbC-M8V-fGUBc`jF-` zvLPcUE-LKhx1w~8<(GfyNTMyM|I?_I0{e&RRJ287YkPCMbUQ$1tg_$~Ny(uJQ!CFv z0q3WN(Z4A5>fUVZEp-AR8T534-m6IkJ4)BtObdAI#(z;j^Ps~Yh_^p{m~p)sdGj+C z#5*8==&GujKy)PdhDmlnbP~X)1N-pYqy@tJOVc%v_dGH14Ll-q{>SNCNBhD+EBEzr zeLL_z03f@d>%ANc>UmjW{f(5t!iRYm|A~R>4j4Su>kKKPrzKO?`}0~>JuH6hD@wT zhxgm!x~IxwIztx?m{Mz7GCotEmW7XB+4e|?9JJY%alN+-?7Hu+u8cM!qnSAsCf|cN z!JM*hEZ#YX3s&mjd%$t|N*!1DH6AruAskroM6IwTT|KBp8Tq3-bnV^$f(Z|Ppk>6*-otIe1` zQLnIS|Nf9kQc_YtH`>GCAn|0E>?g(Gu>QF~$+z^F!fnXJi}o^2lkjjIANe^T(pA0xgEE*d*$cFn^BA#xb}N>n6IpPU^APEqCdpZILXL zT>7wghph3ddBhYlH-5kA<#5xV4}+n2CvI@vf>yn7WeJ%22NC__f-D}O8a+*ZwILrKUd-^{{oJ`OGFOEGZh`l>->HKcm?D{G%bWazM%?+ldP0v=wZ**QSxcc5V zQSC|lhUVJ+sX@EC$bA+}x9I%m>8H)i&qm?m3*Kmn9AI?bUDPx z!kCdd+x$Z>=#vPmK|iZGkKY2=N5B2R4u?$if~%dazHqxB!L-rND%)!}X+Kns*E=b) zkt>S4w66fBneldv(Pmv-dC#}+ZGXJLw1->U>A|DC3+uCOm{$IfL({HDa^!v*2(c7P18M(L*N#-1Y5%3hp{6tG>AliD+n8kdd#Z<@C?4`b zke1Z)5T;&LRq~Sxc1;J%B5G~f+t(nSRJqqsF|JpVuDI))Bh?51M z2m~ahr$f%{?*F(pym%kfXQT^#h#bm0IF`9zk_x>uG2U0h@r}ijg?PkV{PqprNVwZf z@X^%>#Cgl~B@5MPxPR443p@g}OTTxyUsX;J+RAu`o-g=1l>?$Fg;C;Tdqb|J8nbM%T-p;Q`&gyHsvQ5d}qwJLL5eqJ50yI$ei7v^?2$nav ze3sSeebw1921YfnhL*2_6G36_V->DKJyw-3u)n|H6Yb(G*z*b73ZNlqVqzMZq#;mg z#(kD184Q8)+e$`NJaH&#iWvdJ7!N0s*kdoajlo>^E)N#Eybs5y=i@7|DwfJm^N zDJd1n3kEE0N2y}WaM@P032Er=`237jBCDo?vT`1$H~VYayw(5JYAv`>QB=!A_OjPF zGH!B*+QeJoLtXy7k%|RJSH?%=7U63b2i?Kc&m`C%qVTnmm(?e5DV#S<2FQkb#ZEDW zfMW)x?bR!Cvf0E(FH|vE-UgBZAqqs*!SxsDjkIMStW`tb$4lJLcoPiaCv~d7vlTq{ zn8Z5>J9c-kf8}4a7B70N>xznKjDv&W;v)PZPI_bY9%iAjo)VABOGXlfhTp44%s2l4 z%bgudNKmlS?gkJygokayy1=CR^qg+!$I$V+>YZx3z&t9b909&@>ZN(e?brSG>odtb zvPv^lTDzXbhoh8lA-4;@_xb0K2=PpmOO{Tnw4?%V#$E$GgsT(7a_`bK;0)q(a;0o? z@-G5{Dt!JVtyaZ1ncRcfWC)^Iwdg>8g`+DZs>tE0M+lq6A9vFgkSdA8d-?#&xjMh^ zIpS_Ha38C4ch`kWLf=IVKf!k?BpPKFcmjN`H!PL`OaP!xztixIvZQ>dZ|bhN<4%M` z%^ZWHjDww@d<4WWab&Kk?g^EYO%=^P!u}*NN&tOf^J}%xEgl}vSZZmlRD$s!scnE5vJ8NXS1h(Ml1R8{mObp^@xDABnia%DHat*x5q4g{y>!07_w4p z`d*p(WHJ50ch3pN=U+%V7syg0i&CeI%57X@GBU(e0-_k*t+pJrC$*oObh7-e7LD&e zHAWNL6{>rYiW`4;hdO;Jn=b}yRCJ%!!+fVBst;lEmwQg=aNq@aDjm&Uj{93 zEl9VYQoZ4!&u{aM=+FJdoF`C8E$4w(-;oZB?Rxzy#1;UPtr*=RBnYAce_g`ZW5)Gf z*#$=$?@N+kFkGaBgS#I_A$}Xxw$^IA4U2sF4U{uoI1mz%k@Q)`lf^)DZQ7QAFA_@H z9!8QT3!{C(AOAeWpTjuYDi%@x1vh{PgpK%LYi!gD?&4X6xI$X%Q})aT1Sib+t$)r2 z_-YwH#fDJ9-AVJAO7eXcWj9u%mC0X%KeE~8&?Or}DR!$pkAT#Mmu8i4$vW zEHAn$EAi?;}@b=Ewc=0RgLlZ(~g-ML&(-u6?Sb1yE%GK=P~j^dVC z)RG6iy*i@Uu#bZ5KTKDuewNbUFk!}pEWkaTl&<-uC=)a`I>zyfsksTaI#!4%UC0Kl zdEoV~jQkg6oYh~~FEIX*|Ca?gFy(BU3BF&y-ZwW@SMC%Hz8YVu%c>}LFh75NTre&2 zt+B<}SAU$r@k1GzFPN%JZx8<^!}gBB;(`gwkMe)33BAl8@1jX_WwJJ!9H^4|zDYN? zwWS&@kUgMQ$uLZPGUzDqTw=z2FSUs6*eBO+y?SY%hnrizT(dfReSFJ6p>#BSVphjd zq4?JIs&_x=w$f|)A!;%_L(AndUSug9y>;iM9>T_yyH0~}%+b>y@VXxOyy07X>&2%x zn#A1mLf%_a(pZzt{j?Ij@H%ACAw#8q{=8)&q~rCekrPM3HryWSpI1UstP5{E1--GR zZQ136I+*gDiGZxPm&d$@m7d5MF{C~euwk=(CKTaNl>Ce9wV|p0@PW%-l69oJui_vB zDr2U}c*Oo>YCR^#)E=3iXy7+)=0sn%d@831@5=7<-j#Cj|6H$ZC-TN^VWHST#|iQ1 z(J2FII6~;i-m|THW+xtNon$XktvqE1bo{)HILA->&mXY z@#*8a4b)t$^ZXMml!B4ZaBj}!e^W})bP|fV*e^!6YC$iF{CXN~=w*2sgbA@|F@%3s^5o#i2`Ncl zgh@mZwydw(2lv-Pz$ZnT-?Ql+l&u$0>^*i=$(c>po8FRtsvL{POx?{poxq!xC=CT=2M*i++~{4tL%q&n7_;k+WI2D ztN$JC^MmDKEApiEIi6O#Q&Hrc8?#WI{u2^55lpnSkEE^+%uP_*F{PZqWVf#-2`v{_MySLO=Vt%vI>#YgJf! z*>67 z*IsF2(&6J7e0wpr0}m3-#wbWRa#1c*LcWy0#-hY?LV#RlUsAI~b!LTCBb0UWB~BL8 zY*hSL?*71z_sLvyPDMd~i37YnH3S2ajaWMletu+w9s(ESwz=q^&h2e&Phd5EXDj1I zz6p#Sdkm3ZES%IjI$AtmGrOOcOjM=ds); zQ;$wvZHvb(UKbN*{MoB@%$?L&u`n8(%hDnT%?R%n(+gCT)z0c3Aon<{X=b-%RFVH+0^|lD3^#==PZJ_w!tv#8*Sz zL3)aiaJX1Lo(Q6NBv&m5(lvzO7^>@`1C`fRX8~0ZU)_}2V5LI)IOfBUzr|J*1$eFt z%J5Ce;Zx(J$jY-a9?RKLzUoPmQ-{~D<)=>Hijgdd9V@f+hvUsao5hU4e0-{Kjvtdc zPHnxrNMU`as=0l|7ayFwFzi~uX!O|35ZgjvS`;Z^FAH1z=N#75UP-MCPtG$|IlnVPY+c)1(NxaLwSt-L(q4{0XT$4M+^LEmM$#{LKfnpE~ivgFE8;nO`zyolipt zMP?Q6D>5BBcjbp_h=x(S8x7ZIp3Y9CbxM9?!_?2&S8wnQnD1=YmsfFMW~N;fykHKY zVh6m)74-w=6MW@EDQxb+qkl63xPCk3|5;7Tr)KpaL+~#<9&f!pMd{M>y@}ayg6?ki z04hZAx#7xBKEN84?49gF&iL) zkO78+5ve~g&KePnUC~B|z?a!y$q}*bd2GsKliZEV9N)!^jZ5GbHG))HnL?1aa8wWO z>gqaMP+n(L+*)5#mZ7R*G&K3Op(0hG%4nVOOUBxnAz-5kzE}Z{@p0H;!@m~N;rePB zO!hsb-$ZK)XZ+Z)V4^q-B+*8LRrF{Fk4ksh6?Zom$`X*ffAC}=kB!Iqlm>N#;+4aD zPLksB?JgqK%By9v=Q}F&3jxP|?1`Wum${Ic0FWrKb54x%4U6{wC0$li%-m>FPeEb0+WfnU>WWky*p|Wr zuYbYtqyh7ht`wKr+0d3ou;>#D5JBRb+1>g^@2J{cW`KFq3yTZ4wXGu%U2heaIw4B7 ziW0JRXbmC3vISMO{LTYl3x`I}nF>`2JC8DXc3AxlQ)3*8b7u*$32^1D;ZModu^(=z z?oneyR7UaCeSCXYE_wxMLhrOmKP2aa7~j3KYVOCBt=P5Z{FCn6?;HkyZgP52P|IxX z_1zwEq+kV;WgPO7U&p~vS5_Ayx;@wF!?4yBMOBeR=R!j+SNUPz@; zc|`--jIHGyRFb(GgL0)9+!4KJB~QA&`*U{YBTcsuJZxU!;EOZOt3@AM`}tJ!4RmbQ zc?uXfYEM1Q{?!u+!wCi?N9hE6>B8V>hYJ6l`~-7(WLQ2MvLKQr`H9o0*xlALN$pgt=H@ffj?M&vf3q|0L7vrcYG!?kq#w z$TU6AXq2#k&?5PcCH8MtraO)%#~qkCsbjZeggHWjgHNRx@1>uK+}|{GT%Ej-V9?}T zTVG$t4_PMEUHB@b;h@PSr)P+=4{aL!&{QX}lcW7of`ts<-}V_UbEj&Jr+}r&4#m-5 z#g~mOdU)^AgU9E2ZFg5Y5It3W{d2VV`68hDy%oSn|GT=n0^aAC{`26a^M$3QG#$9T z$zH@BE6QLy{^zemr#%^(C%a_%g>wvo1`XFLS@O ztfJr5_iGIK%3KgG1ZD#75(+mDym8!7gO*_*2U&MjX{bqbEU);TmoD&zbyLT~WPh1| z1!J||U5qi_-QBAp+I)#*k=jCVC^JX{jZ}6T>>qm%Q5mqxj*bEODNcvuGl9sEEY-~= zv{W;)d{#F0%&dt&hU`fs`F?EEg9<%Q_ub4mp?BHN1NFoe2W|O^hw8j2U9e()5Bo zQp70$!}0%ik?=L3Nj|kb&1S`>fIM{m*O&fv)>+wcSg>G^6EpPuU2{?0!z53qNLixv zovhYULmx`+YmW3l0fB`SLIE5P_i5qRP?EfKpXw1+g~kaZu6YCgmUG^`#hc-T!&wJj z5*(Gq+v~4iuUqWCnV5%NCK9k@&6LGu90%g9YTZoaSrqCJ@ck<`izdH0uj=9&U=xQhRt zYotCXhRIyAn74j;Kn#V_MgC5U2kGdf6YZtb28t*h$hS-kHD!d8z1$zPkOrsj#0)-r z;${dN_-TU8NnB8;_yA&P`u($nP~VjN*s9>ZZygzdt+UeXk;LC1WB0C~oO|(X5BSc#D+79Ba~wk+DebT-Z|uk|g5-Ac>27?UE!AP9j^P0S$v5?azUZkB>* z(rMG4=igeZIn~B#7M~bzAMwIS*&O`T4 z*91q7zukVk-#8Dw=K`9=`!|5K>4MFtg+8TpVW)P){5Q@CQXUniLqS0;N4?4-vh)YJgWcp_EuuQ z)iW^g8o(e_5Ix2$@lBubMU+}No5I`T(5<8`dW`z!?@ZVqptQeo7jj%2=8v$c)z=O@`$rR(6F~K;_HBYP2;UdD z?<}g!V8+8s&qN`e0%wSL{Lb z*ev5)Y6UvXtS|SS$PIRmBX(py;>aK0488o@5ImSTa8P7o!UW^paHobHO}UjbTQa{Y zoTqiG@@nE_jOf|*9H!7myg*!6b5c=J!E3X)Js4J5noImP+xLu}Agnf};~{1Nlp?G| zxNSU-&78^~QLwTO$GE61Yg%IqjJRA5@84ByXyv8oAk#tCWVTPaDRVE!LvMy#0F+j6 z?jx@Dm3b}@G*7DI`d8>hak_oOT-5)%rCmA&b$kR_|lR*PID9fYvjA#3<1YmvksJh&Q=dqFk=Ju@ zG2rvwTAF@pw2Dg^Q-6{Z8L90i-Dt(aKQV+qk^P9$fL(HwMYuF0*v<9JVR5?GIaS35 z@$1@|E+)y2O$<9FXY$wRq1clTz1GTaULicIyUf9X2E~FjMH%z9aLZId?5B9xi4bCD zY;xB7fsK@N`0X|sDi?MP6$8-_KnQ?37e(o=jX-sl@lm!Qtp2B z(y11T4@Neb+pgvb(Xz45;lx-u^GqDRj;T3vIi)QGZ(rx29i)ZU!%^OrHlJoVsjmDcn>fO!~M@% zo7%kzpUSh6>D4Vt!hB$^4322N$>4Ff!B@{S+!Li~%+ung zTrwT^+lGSw3ba6z6dR4YQ_Gs08g$-AolgNe#M(#U5pj~4-kx1O4cz^zWvN*ZWwNd|H-Tvx0bVa74 zwH0$H0Rpos>*`S`hwRfXT?}@dsA=U&9)8Nz5HKE!%Tc(QkvSiiIn2AsxO6WRQoxHG z;vCY$T#$yIzP?Wgy&x?ojv{@>n$H5!PDiz0{NMrBUCusT;egHM%|wdOi^(5r*Go6+ zz+0bf7OT1%RdH0Hume} zEJew|?_(^h=7J#}B^C;Z3L9t^$1IrDeR~de7dd%DQfHPSZpEvbPs4cdf9oysenSMU%o2hU#&<%T;n zjOUeNC~Xu-k6Q0IeqH%(@KznSa>ku~=moy{^IsVQc{je&*H=3UMF%DH(m_53wmEin z%L$<)Y&<-!NFLPAj~@z z&$lyRSqN%noEKCCd-zWOK1z!3%TNP=W0TxEh~F5)o-UW*kVKWnMy}E*lx_)hG}XW1 z>$u+3!it|CqIcFg;sQq{m9E9~3E}jcg06xcWu}H%nuC9PsF$kx4U5;&BY8%Rkr8s{ zT(PV42fRBX)2|t}D_A9+Ro7`+rmo6nH~clXJdSEb4i%(7*!l!}7q#I`PleC zi?@1g(FOsJl9<$=@es1LzHUs_VQ4$r#^0BDX%1mPNHs=9nwyzP2VV&~{DfA0mH5J> zoZ(nHl{$ViGZJ!kdAwmYZqB;&9qE}dv%9+scr7))8#k3pUv;PtUM@$FhOFD&jko%3 z>-AoPt->EeM{=dE|EuMbTRAzgDBz4?8980Y#EgXA9Rp4>8KHQJ05B^hE2yzW;$~p! zPQv_pwj+0g2BBCWjLzv!zg%59KD^(yyB~zxH4Z;!K~2|i?l{`sck|q)v?8KE@Vg8l z4RA9SZ+B}*7NFBa$8%0aL%D*fprkV?oC*-7t8jD6^m(JIbMAj42KZ$*{HGS5rZx$| zRA--t)lOk7i;$Gug{8>;qQrj55nYaq=CQyLDMR7JbWSmO5ach4!9R^RqeOkOd7WU0 zug=!1v8ADcdtD9ZsU?DmmyL*-40T|J^eY9anT@I^9?F5he~FZP_{irWuGE^Ky_FRe z^9*!JL`!BE6c>;B#N^lxZV+xcBH+yqvJ_g4)Ao<*#LTGEx#EhalPcU2;(`StYTOI; z1#`Cq94=Q|gQa+>=xDfvPrCj-M0hAEaUpwFc2eHy`Jqa!K;ssJhD5mX(c>O;;+@fn z;m%Q95lU0JkDe#WU0glXv4wSkK*ekd`Yq?sJTegKj|Gw(LY{6KT#+oPs2)Hjoy4je z#>_&cd%~Et%e%$ll%M{>cDaq5s1?mdEOGsmY4#}vPJmsm%^+HJ=s0Ou-e|&Q;uQfV z2*AmsbSZq*GCo~lFQXK#ap^xj;Vs_Ngcr^lJKb-a2Wz|!xzoC9NlOzcZ3FmT_T_b} zTZQx)+y)nMec$BVlL+&TRK;>M-_02gIU+%ulv6_i=JEEuxYU{})bZ5G4x3vJi-qfQ ztCpI?+&B;2Vz1}jwFi1opx|dFegoO%?ScZ&Ie|2uhJ+5&1JUf~>%!@4dV||`McG%} z#bT!1Hd3|tqrPlC7zRd^h;g2RYWr?GCcpEy)s+w>QKb`k3skuVtq7`Sy>mzP`Ri>QHuNLxM)OlJCr&lWuNi zw-anKAAKi#3s?#Ww0*{1n=b&d-_cL4P;?z0>ES~zhkrjcuevruH={!@V))mFYauUn zd}<eg^m7a5Md$81~gM$A>j2G?WolyqXl_cOukh zgIav}g5aySyIrAjj*aG)?pr+ScsbEsZo0DKO`>1=6)KEQn zghJISLG)+?-=&)f8~uz**L0$*&X-KFOS`8Z{<-y*zY%K4&MEtEIap=(Qt_~2tF=Wwa@L+3rfQk9L%KUDv z2D}aJptX7Pt0Zh4YR*3z4k_g!~}8Di($zLgeWF$lw?!=eLh^S5Gj?f zKy8Wgn$#2R1CHd@`(zHcF0K1k7v}9iVsu)raE}$Nw(-5Asc;DHm&{0o5qUR_SEL93 zn$^?Rr(`AAZU!gI1+Z2eU(tH#8@*nN4~s7WJ)ZdqO5gg0QU+thruyY{rH#^4KRsK! zyStQR{PykJ`E`tqp&ur)nb=s_jNg*H^TAaKtk%Kk|o+I>)8ao$@pp( z^?~k>BbI?Sb)rq_QqX-HfD#^Wit%uYRN&7>Bofq3NgpL8+$`?jaWkp6=wvr2vAH>z)3WnYo)azuiyh`^=q5cocN&ML`y_ zcPw)P$YDJJ^|_yU>e|bLW z-XYQxs#-M0t$~rZ_||(N{15*{kXp6pxeDv4l157ue^^FQ0#xyi65it>Nnz=Z|J3u; z{VC)R)BcprYl2Z{dW}d9l&LXw%6oM&p&njh1o#K&sbDm=tU5go28XWuJ4+}F76XUc zB6-_$%$u0MZwW0by1c4n>KCQDOpW^x&nCJNPiQlsyl`ayU)9dUCMpE-do1`;h9ewD zc7y^QAwhD+pWbK4@%U{jH=~8^0`bJd9aeQ&&3BglJ|7M^KfCFp)=ykb1hS0r`D|F7 z8s)`1Y1q5ErWNpAUM*&4pA?mM67>&C6OwJz4e{wL|bfmRsw4;t%_sRf!IZTK%%?IaX5gx>oiDQJL)F?Rji>KM#b$B^Ei0*x&58LF|e$wU*yzgsxD9 z90J2>uvu+}cM(Ybe`q=ncQ)9!4JT&o1Xa|C&=$4Tj#{y)T{UWzShe?#9iwU$vA5bv zQ+pJ(mDVb?_oz{n+F#z|JAVEHhj{Wl_kCUGNn4!q)mbL!@I3f<>@M6M2lx9JP#_dtgY62u^rKVE(?Z?tOZ!pE89WWyurV{TeC^j zdGX(>b&=ck+Mo*1POKqU=x6tQQ0%9j4an{G$o?RaxZi4&nB0UI+zcGL$t9Hn7 zGdUsPsls0v-p8~U#VV08zaO8a3%?WhUy9}ld4&tW=js8f81Aaa=QY34#i;UDFM~SW zq1Bp-Y`?FFAYAq62A?P{4 zgSC9#@&J};1I~zn7=f-Sp<+Ve9Ui?w7-znTE%MR8N*X59m}QMTBZ0p(+R1EdwoD<)cZwHMAT!dM9qg}B{ppzsBx-HVw0c{u$!a5ms`OBE~h#@HHCZ1 zhzK=5fjsb_B*^INqSLV$|iI|GcVrV{Cr0YQo*Bwa97#mSGv2*slGIPbBKI!@Cm$%9wSouLe3*~}1s@zVm7|>nAE=B?gxJ11L`4HkoyyDA~HpChW14j@%WEzrTwAHP#W z2-#aCfZ9Sv%;Wf6-ShtG4KxDXU~0P3tYyUvj}J#+j9Rj7W%VvUl>CH1A_0L#yW~wN zH8EeRd$0Ii+L#e~=#Bol=ONheDu?of1QHoZu}}rh+VhJzY3|#Ir2FdBX;S33Kzoc& z0N>gaMJ7dLF=YXYdL{qh_sI4@^?B*dyQOD@$=+d2tM$t1u0W20pk_5Q zVl~2EkyG60mDn<3vnIP41_mk`9*$l?-aI0gw=Q&j2!WA*7*tlv{avIq>S1lMQYb)A_KAK})PHaD0>$Go|w*xB{1b2LFjzl|K02!SYY>TFHa1z4o7pRaCP zF1%_NAX|11F+F(qrX7pHFf*g((LEhV#zP?Tk;h?ep*A(DJDxgSOf z+CAYf1x~cu{u+T>KD%mt@oU6{dO0sjdT~OLIjRC%ALR744W7*C#{TU{DSs$F9dJsw z-1|FLMUeHr60EyMcqaLBQP-O?iRJoN<(>fHp93Oths^TI8Z*)dzP`$P79D9BZL^HY$R2oXTR5;5nr1PAg>z+IO06f_YVtexM>YD!V1yA@(H zrti1|>A;f|hxc$l^`p%eda10(@D|JNe!w56Pu?TT_RWV2k9jb>t5ph=lqDF80e&YE z5+<*cO$bvB`mWn_PDnplEl?f`mCIKGeGm32aX_yVEW}4lR@eE8TRWk2z#?Uz{4A^5 z9KB_u$?iErWl6eE(L>vGXg1iedyC)33%T&=-7uSo0nTY%twn=TxYhCy9$XjB$pnfW z&@dB+8&fmT3r_NSOtc6Y66aYf6q@YTM$ zLurVjA_aZrcp^U4q-8LulUOV6IfyGgl^>iptt}s^c?`<`eO$GHCe-QrRgVTu522pU zOR5%*;*G)N%iSHKG?Ti!Bfj<(#)5m;bQmIJWt)od+P&gZL=^&&tW@eQkEQ zi)zJgNkzq94fa9$`@*388{EnZrn>XH=k%|}k}odS^XYJRGK~RG->VgsLg(4m8uBTm z_}Me9VkhNiESS{3mxlY4mIcTQPlULZT*LJASw@d}lN0^|%;r?bEYn$huMfu_gR-NVmd73M68d z>XToRke62W;mdyCD#fOYT_lWSyWM3F_sk+-oh^>x866F4Wyf>9H1*gOxMtaTpqi&! zUAQZ8P0J0d&qkv5cz;L*)HZyj@tn|&&3v!ht%HlTF!>0JR3UnnEv;7LsYikxnS8)& z8vSxDX+v4eNoeCk&iH`{I?D=f4Hm|A1OYkIZ(K_%#_i?GU}d?q!dO>k?XMvliLV<| zqJC=cyKuF5lQl`&xC?ySrY%P3!IoSVbiOB?3tmizCqC-&$mzTTtq)Y9UIQ}BGgujl0 zW@i+jIfAY}o3)=^?isx$%rIHnq>#7c}zhBk01S<8N%yp;^CDlD>;ABAhb zny4|K6Ht;ZHEG-|h??jffoVvnOf|2BQ)2^(|8d zmQ~em#Y_GL+8_=@>Qw5=0X;2PV0Qoo8s&KjAC?a0x;jD7tC1QpG z-+c;PN!+9OvrbPa7a?>X;Z0`DuxR2N6ObCT)1GBdI(+=N97|pLQ2qPcn9U2!U);{6 zwnLJwV7B}@y=A*2?}ls0W%$xvc;iy=`A+otaABiZ?P8nz)ts_fYg?d3#>ZBXd|BL) zf;7rUa2y1znb3g6@$Su$e}DKfGHOi5x0d&D*iVw0Px<<_T~Y7pdyg!4u0$ITD-=Wg zq;lILN8Z%`h5ic8L2yKl_M=*+xlNC+lZAM32c(R^iKmw$aL(Uc691<~1=~#dIUS(U z&=AoJ@hPLp96bpXXJU~_z?qnnNWr8Q$gm$HAL!z&)2?oJg}^**(Nqi-8+}qYuU$hz zv=C^f#A*hj;$(n`2EfI|rGY9yh5BtM%}C>wt9W2^U~kr=C}zMmTblK}Sxf@VQhV|U zK)}JF-8ccyQX=@kK$fN}s>7zIBjV-ZiLc)B13)0}fM)kt?)QC5s{N^1@TlWCQBq-9 zR#qiP%6h4dQJOtBeL=;9KIxx7zE3^Ker=0Z-Xp=cG<1aZfTOc$m{ni)>^aAxudV`+ za@J0gnkg+1H^psa4XIqS`jEO`ol2OHE=kfza%XsoMrPnMGT2;t=6-FtGq7^U(=?6H z$e~>QP$H8ZCjaNt@oQ%~<%f_2he$!UB2&c$`p_L7N>isI($+_>NZp$qfe0%L zRRp^{$_?L1*)N#&5v&-eSsA&16?86`W@vz~h$2`jk-+E5(&tFF?mb;BB5o0a;AJu> zSyM!F5DA`}#cC%tkI5x69Uu4y1yLLr-oNko)Rd)*dN2NuYi5CK^H1EjgJ%VH(ewbf z7|roo*e?}Z^1ZpeXt2+WbrrKo%Z`YCdo+g|O9w7>{(b!H1T(h2Vfc~*8zym=_pit$ zxWDsyKjeFWa%smW0b(*?$LgFpya-%sLFV%H-S-Wx=Z)!x&sAswJb}PcNs`g%{>YBo ztUC}%hN`tStkwW zQH=668Y53D&l5OZ2h4SA3k5UanTA5(#V=s)?-SgV*qGT|(RMB1K3oW9KV@vUR2`uK zH~3Os2UbQC9kyo}HO|L2+k;^}qEjf^Q#{#Nl4HnM0RVvqC{J7(0_|mMO*(>DqTg_+ zJkMP_ARd{NHD1ZTtudBSx6%Hg)~I$e?}%;BuKZ}N2|E_QZz9d{J2!OBTvn1j>Pf;? zywWlfDqs|mFejt@gpeI54UCu1HerGdaqw`#HCuab8gNba+TfD~nR(6Y@VhhHo|am68--u$FAU=TfT4du6{dGE%`|@JhvMH5q_)#``0&3KiV|w`*<87 z2*17CO{<+)*E)}f%WWC_Yg&4Idbc^6g?-V-XgTr6SDXoDfrIlSjmZ;>1s;9#nPWZE z%A0R;d;K%scJ1iY>h4>3<8WQ``TUJrBbI&2nC4yI2!F>luA~)WIseMkl<9opk2n>6 zeAX+-Ai3Ln%Y*@wBJ1j==Tkq118t_lapgGFXaVkPgsG=J|tWg`9{LSCb#T0o&Q6Yd!dp?6#=#a zOl6A9@_m^OKvF~6t~aiR$Qmrmd9)~h&&%Z2)_UNJlDDK*#bwj*W9)=$R+;e=E6-*^ z0K_Fbhuum49w|P`m2lmp@$lP8pk(tS>G1N?4Kf?d+)J?qpWOu7c)NpPtJ?OnIS(9$ z3jc1-JoWazOQY1wS<)VXH=*JJ0>b4zQra!G=~sZU*m;k9Qhu zjAF^1MOECWAW6o4RZD+X4sTaFuU#y=ghovr&{_8P1ij*vG$>3LeBZW|{o@21jW&IF z^eGMlDJp(y)r_VQW|s>+;!KN@8JhZd$jjX2R}I~MCEY+CPp%_`yR2x)u6&}qm0S7? z9*3y7TQGEifP%DKB_K=hF4HA9e`Tl?J3bq6=rFlDsc3|foqVq7;Sm(imL>7H$6O$5 zm5pK1u_<*_qx_fUguNSK4*=@9t6fAJ+T9~;3yX*ROjdLbKA!li*6W=8GCgxUUiCuH zg!xuq(C|KWmT2D6cler4U9)x%rQ& z_i;Rev-Ycul0?M85D)V}vfd)9*q}lCIKl&&6^HcSIeur3p^xb*Te}@B>L*O<5iD}w z_8XRow*OueA(>>P* zFczKn7vVBln>|ugi}JlxZFdT`YpzE9*PEFa0?vNS*N7ip_^j~2>$6`jG${0Z+AqQ| zps{fOviuH*y4Het!U#PQko#OvEpfCWPbTnM90n)8Cs*nBtU!tYfa`7Z%8VU#F(Qjp zJRQtrArdISBKr?0V7}F-w(%d3C*_d`?@2vJm2@x%)SBjZI zdrv>d$E)BbVXsRqPPHX~y!e>PP~w=Cp#b#|fpF<2q8%+aZH&TnRlhir(cl3gHnzg5 zExlYuZ5mY-HXlNvrs+0=*{`yADn$gwQH~68U$Hp657C*4ZPJ0ax>(V>TZlbzgxqDkWJg*&64!sFw*LFt=yY44@db)>--cgirqA|Y zyxW^&2j~+t_DsZ)&dw9@b}f+I2X&#>EWLebbIYP&yi9#qv3tDBM!G+zAN%XNC6+EMn3gyV@5zPila`(}s>u-2GE(jh1^%b@3hZ+P{pc;7a7osz{n>hg zWh3#7iTgP8RqfGxieeg*tz#78C#!7Pe9SzVcsvd+q7{-%nbmHzL&-&Y$O?=<6&=9y5gv_Q2Cv)#89rE{kg|ikwyT zhwe!L4Tsyy^y~<}Q0w`;=lsb^36AKJ7GYctYWg06F?Mvp=LmaqU-1-VB^tN(Nn_&E zFDHO&Zo018dxz58fH%Igsh0GgaCMJRfbUx%a#A?6Tt$;rQn;0n-C)In{NzG>BS_Mz zZves4*=Yhn<^sO?^}I0 z>*dUy?(JhQ`Y227DPvN+)+^^mDVBF3*JIC$Do)`1!>Q5L^FI7k0oJ$w*{$+!F7hg~ z1VeDDoG_M`}Q|+NWi-i^UD%XH)@4EgW4iK z#N~fBxuu)-PAS%O_)xm;qyj>%dgM2n^?YiUq@H}Ai4aJ_nsu=0y=vwrT1WYH}9?#*yy;D+&hV7!R%gV zbVws@=D5nyii1a3?SF+x%>@lFAYiPJEepVuVeA;cTyp{Xo+;d6{6-oen{Fe?B3I4J z2%(_k#$u792*l8G&DPcyi`|Ms`J!-&Pf1*dOd}_0BDbaIXKb>)4WH3fKglKKz!@3Jt@NN z+LI{_VsS_+K~jLMqkp%!5dP{elV^nUx9x-9vQOVCnGrnSNVfP{q`9+7J+u=C#N1*TnM!T6wz}?LzHXK6jO4*I^pBdj+N zz$>{V({xMio4xj4{OeYUUw4S;O@6z2;D9^%0{$Jv8IdTD_k_2T=+mq6o%b(X%&PXN zQ0WL)E2K%R{(rsV^9zmPY&;^!TQ5L2^78j_;gE%;Wvi1yjal_RVhIx5Obw?`RC{=*pdVaOUQ4u$arzzh^TBz@B)-7EBy8HGnaFr%6QI}dTu}~5g_V?x1;VrI2u_p6R z!Srz;L*;hBinijq;a%U-&)hsG`ErjQG8{O+|E;YV14-6rvjkOniSv1+=}sDpq-7f@ zzf3z&0{r<IMPYhl`3`b0(T4cH(BH9JMhns2n{z87(Ax5~<- zlP77-!z0vQ5lFrBPoMko=*|ja&`dw2Y#RJ^hhd;Er zHg?vcYjJ7DoN=~)QipL7!&9c{M*B-t!| z*p(kCt=O$*aMvM5SR672&!~4#OCg-IKYh+uyL;{Ee{BkyFA~aXJOYPtJ~T(=4qSg` z{NU0_U{3P=CbW$azl`qwPpKmD5H}d|oA=5a)gP{gJUyGuTV_puSKl@o;uf4Am++hv zS6d=JG&@=*08EUbAG>C7oU_r{2E)a>P($+@TZm=cV$jaUq;Q&jM;ja-uxApo+4`() z)+xr?c}^Hv%_fAOX`F!Wa|^s&CxP+JfyQBWA{63bucQug0*9Z3+{@_wK+%)vN$5T}}DO+p+Q4UVbxWR{nW@1MLG8rhCLR(j^XB%u=7fMG{Xj|IE zEq*@L^qa=a{g}jcFy95A7O`#&k#ovpQ*YTk6noc-alwqTrN9$SSY{blqoo0MoGA{6 z0oyVR-k3Rwn0tkMPoz-9zMxZN5IzOkmJYaS7hcrG>^%GoV$Du z<}Yv{-e=?rq6+IFPbO~$saW7I(@H3NzJ85lhw5cvXI5dq;3Y~G>JOp{rY)smwQu>* zCvYEE;tcLu%-RdJ0^Ky5S&E|8Xoyg@wjSE@edd7BfHA0&v=R(Ec?r*) z(9O7Uin0EC6luDRJ$?Br;Tpn^`O`W;Y)d9o!XL1H;5ZE+NXXDW(;M+lbzg*(uj;) zFx}soDC5&1O_o}3RQW#XSdG7`8$UJQE|Os@Ej>v093mfvfYF9p#<3TwFZrWJ;DjIE zpGM^VPN1xeWs(NR6gAsQIjnNrKGhbqD6}8>joZ!eotLM(Qkn+x?(M;VNC?*N+dJrv z)8M(o!9j~?7EnBg-1HzR<^nw~f>-98C_s&xQXi<4iXAs3w#w@|i!wE6K!L2kghj^H zRct7>#EpOd`oQ2^B)TP8dL2>iueHi)EC1Mf0V`T;Mjd=SWGj#}G2qJ!M*uYD!^mjd zyC=FPOHx65#4O1Z7NwN9DRRdJR;=^SXsvYcKXAENcLm?z03pDsp#nD(Ti};oa4v z!){bHOr+aDB1`(`8h+ok8Z|S$>_;WqhPCAA0h>w)jqG4EI&W~=H}(cs*=5*#r8|4| znJdLf8Y4#1HOW=mQNIMb*lftaHFAC>9jUji?TfkpPIkF_75KgIgXTNdpo_t^bmxU8 zkHcW*Xu5o7C?RCHZk}(e;hR1|cb1X5B1AR^{4p6P@EyJFKEH0}PbH1eRm=2$&iUSW z?`^|L$RA9I-{GP(Amd#M`ejzSeOkBr^umW*Vwt}mjU8{V7`T|C*t!$B@Xpht@BW0` zIte>Ae4g&6#_6UFP)AoChgY~~ zT%Vl3>wle3gY!CePnOQV#^DnC|74k8UB2`IB!u=}ASBr82PXR8fs3%s&4eu#v2{kA zBeMB%IWAv4t>SCq)!aZxCAsJUU&jcBm!iy%9!&KlLGTDTzgUA5+aZ61MiG>pEa^#6?8Mb_<-Z-(4-e)U z0Uw(s5Cl`Co1^!-jKG|UGyeC%DG!Npc}O zjb6~EMi`LZa@QJ`)b6vH#1>4XKKFFvNfa=geAIJ_sFgX?$kS|c6gugY?|}4dk7t68 z^s~6&!yG&+4Fq6`B?EANF(2D^OTmw`_((w1nCEgM2c%sXD{;-sn%Escr~pObm2Cim zQfZ&7HNFqO#kT(R_jGfOW@jh?FMZLmEJC!g8;(`rdN}@QMm`?!j*kjoftRxvrGvxR zSNMBYw>lxnOIoB}p5qHsN3$1Nxz3R%mt|}K@$#K#qZPsqki0y2-zlsULDo(KH|A)Vrv_qP*RUA~QoL~MRR z5%fb#s{@Eg5rK$^HhD3vf_9;pDc{iDl^8(Sa zTf;|J7-O-gI)&c$?jqv1vzW5a$P4|Q0)+?=OfEiI3T&t`)q5&8(vETS(s9z$fCsgQ`u_ORlDhLTv<-9Y zW2DVg)Kw238tM+W-qJdn1juJ?`OyuT(exhal7d+h`X{#hULm!82nOhY$^&DzSkJSQ z%X$s$G>++*LB;uFGjhAaL(^ck;YrGtAB);lv&5>nbHhtUMF0LHN1svhMZ)P}Cwu)V zy%|MnCmOGejeT&g47u>wi5!utP#_0T^td%yk481&hw|Ln`g@U0f9_89Rh2G&c`h#u z5=!6y(ePgNn4c+-y$C}n4<@6lH3CO_aYA>uz`Oj1Kn}(}+ zMRO}Po=}GWJ-$e{x5ZRFP~F-n%Ix$}n*D^6e;Fh{rWrrbBmtfZ34!{1focbX2XwR! zax0aODk!OQmnEY4o^E~vjvv>r7*(>#BN8@q2Wk6?FMXp}0Sj9%5e}!T>$ps-$MCpf z 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�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%0ADRB$Z(E9OtJiYq#!u+y{y4jwJQk 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 Date: Tue, 7 Dec 2021 10:28:21 +0100 Subject: [PATCH 26/46] fix(main_callab): fix path, for BlenderProcHelper --- examples/advanced/lens_distortion/main_callab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/advanced/lens_distortion/main_callab.py b/examples/advanced/lens_distortion/main_callab.py index cfe0fe594..c42bfec5e 100644 --- a/examples/advanced/lens_distortion/main_callab.py +++ b/examples/advanced/lens_distortion/main_callab.py @@ -63,10 +63,10 @@ # test: compare generated image with real image if "img1" in os.path.basename(args.config_file): - real_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "images", "lens_img1_real.png") + real_path = os.path.join("images", "lens_img1_real.png") norm_corr_limit = 0.660 # low since the real background is large and different elif "img2" in os.path.basename(args.config_file): - real_path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "images", "lens_img2_real.png") + real_path = os.path.join("images", "lens_img2_real.png") norm_corr_limit = 0.890 # less background else: raise Exception("Reference real image not found.") From e72be724a9fcd176d0eefb87382aa88ca0e0ddef Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Tue, 7 Dec 2021 13:34:50 +0100 Subject: [PATCH 27/46] fix(FlowRenderUtility): change setting of use_pass_vector to blender 3 API --- blenderproc/python/renderer/FlowRendererUtility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blenderproc/python/renderer/FlowRendererUtility.py b/blenderproc/python/renderer/FlowRendererUtility.py index de77284f0..71dfd4c8e 100644 --- a/blenderproc/python/renderer/FlowRendererUtility.py +++ b/blenderproc/python/renderer/FlowRendererUtility.py @@ -105,7 +105,7 @@ def _output_vector_field(forward_flow: bool, backward_flow: bool, output_dir: st # Flow settings (is called "vector" in blender) bpy.context.scene.render.use_compositing = True bpy.context.scene.use_nodes = True - bpy.context.scene.view_layers["View Layer"].use_pass_vector = True + bpy.context.view_layer.use_pass_vector = True # Adapt compositor to output vector field tree = bpy.context.scene.node_tree From 20f004b833173fa0cceb6d61ded9face3cea245d Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Mon, 13 Dec 2021 16:44:04 +0100 Subject: [PATCH 28/46] fix(debug): Fixes debugging with relative script paths on windows --- blenderproc/debug_startup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blenderproc/debug_startup.py b/blenderproc/debug_startup.py index dac9185da..4f0b0170d 100644 --- a/blenderproc/debug_startup.py +++ b/blenderproc/debug_startup.py @@ -29,7 +29,7 @@ text.filepath = str(Path(__file__).with_name("debug_temp.py").absolute()) else: # Just load python script into blender text object - text = bpy.data.texts.load(argv[0]) + text = bpy.data.texts.load(os.path.abspath(argv[0])) # Declare operator that runs the blender proc script From 9f0b3db8acf5dc85bf9dc65c24b70dfab7b573b2 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Tue, 14 Dec 2021 09:30:39 +0100 Subject: [PATCH 29/46] fix(Struct): fix the clear_all_cps fct for blender 3 --- blenderproc/python/types/StructUtility.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/blenderproc/python/types/StructUtility.py b/blenderproc/python/types/StructUtility.py index 86709bf94..cef892a71 100644 --- a/blenderproc/python/types/StructUtility.py +++ b/blenderproc/python/types/StructUtility.py @@ -90,8 +90,12 @@ def get_all_cps(self) -> list: def clear_all_cps(self): """ Removes all existing custom properties the struct has. """ - keys = self.blender_obj.keys() - for key in keys: + # iterating over the keys is not possible as deleting them changes the structure of the + # underlying blender object -> to solve this we always remove only the first element until no element is left + while len(self.blender_obj.keys()) > 0: + # extract first element of the keys + key = list(self.blender_obj.keys())[0] + # delete this first element del self.blender_obj[key] def get_attr(self, attr_name: str) -> Any: From 9a3c236afde13716a7e0af6ab633909bdec9bfbd Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Tue, 14 Dec 2021 12:33:03 +0100 Subject: [PATCH 30/46] Fix(bop_challenge): remove set_samples --- examples/datasets/bop_challenge/main_hb_random.py | 1 - examples/datasets/bop_challenge/main_icbin_random.py | 1 - examples/datasets/bop_challenge/main_itodd_random.py | 1 - examples/datasets/bop_challenge/main_lm_upright.py | 1 - examples/datasets/bop_challenge/main_tless_random.py | 1 - examples/datasets/bop_challenge/main_tudl_random.py | 1 - examples/datasets/bop_challenge/main_ycbv_random.py | 1 - 7 files changed, 7 deletions(-) diff --git a/examples/datasets/bop_challenge/main_hb_random.py b/examples/datasets/bop_challenge/main_hb_random.py index 2661c453c..ec51e6694 100644 --- a/examples/datasets/bop_challenge/main_hb_random.py +++ b/examples/datasets/bop_challenge/main_hb_random.py @@ -57,7 +57,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_icbin_random.py b/examples/datasets/bop_challenge/main_icbin_random.py index 729319a7a..ba6026d7e 100644 --- a/examples/datasets/bop_challenge/main_icbin_random.py +++ b/examples/datasets/bop_challenge/main_icbin_random.py @@ -55,7 +55,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_itodd_random.py b/examples/datasets/bop_challenge/main_itodd_random.py index ba866217c..b759a7af1 100644 --- a/examples/datasets/bop_challenge/main_itodd_random.py +++ b/examples/datasets/bop_challenge/main_itodd_random.py @@ -55,7 +55,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_lm_upright.py b/examples/datasets/bop_challenge/main_lm_upright.py index daf85c238..47e6b9e01 100644 --- a/examples/datasets/bop_challenge/main_lm_upright.py +++ b/examples/datasets/bop_challenge/main_lm_upright.py @@ -55,7 +55,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_tless_random.py b/examples/datasets/bop_challenge/main_tless_random.py index 020d4fa23..75ba204df 100644 --- a/examples/datasets/bop_challenge/main_tless_random.py +++ b/examples/datasets/bop_challenge/main_tless_random.py @@ -57,7 +57,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_tudl_random.py b/examples/datasets/bop_challenge/main_tudl_random.py index 73dd9baf9..50bb22e1e 100644 --- a/examples/datasets/bop_challenge/main_tudl_random.py +++ b/examples/datasets/bop_challenge/main_tudl_random.py @@ -57,7 +57,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): diff --git a/examples/datasets/bop_challenge/main_ycbv_random.py b/examples/datasets/bop_challenge/main_ycbv_random.py index b215117cb..9ea5fe617 100644 --- a/examples/datasets/bop_challenge/main_ycbv_random.py +++ b/examples/datasets/bop_challenge/main_ycbv_random.py @@ -57,7 +57,6 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -bproc.renderer.set_samples(50) for i in range(2000): From d9c0bb536f9c9ad448c4224ec7d64787aca81ee9 Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Tue, 14 Dec 2021 15:00:35 +0100 Subject: [PATCH 31/46] remove keep_using_base_color from light_surface and make_emissive --- blenderproc/python/lighting/SuncgLighting.py | 8 +++----- blenderproc/python/lighting/SurfaceLighting.py | 9 +++------ blenderproc/python/loader/Front3DLoader.py | 4 ++-- .../python/modules/lighting/SurfaceLightingModule.py | 10 ++-------- .../modules/manipulators/MaterialManipulator.py | 2 +- blenderproc/python/types/MaterialUtility.py | 11 +++++------ examples/datasets/scenenet/README.md | 2 +- examples/datasets/scenenet/config.yaml | 3 +-- examples/datasets/scenenet/main.py | 2 +- .../datasets/scenenet_with_cctextures/config.yaml | 3 +-- examples/datasets/scenenet_with_cctextures/main.py | 2 +- examples/datasets/shapenet_with_scenenet/config.yaml | 3 +-- examples/datasets/shapenet_with_scenenet/main.py | 2 +- 13 files changed, 23 insertions(+), 38 deletions(-) diff --git a/blenderproc/python/lighting/SuncgLighting.py b/blenderproc/python/lighting/SuncgLighting.py index d9ecc7d89..0e802ecba 100644 --- a/blenderproc/python/lighting/SuncgLighting.py +++ b/blenderproc/python/lighting/SuncgLighting.py @@ -80,8 +80,7 @@ def _make_lamp_emissive(obj: MeshObject, light: Tuple[List[str], List[str]], # If the material corresponds to a lampshade emission_strength = lampshade_emission_strength - m.make_emissive(emission_strength, keep_using_base_color=False, - emission_color=m.blender_obj.diffuse_color) + m.make_emissive(emission_strength, emission_color=m.blender_obj.diffuse_color) collection_of_mats["lamp"][old_mat_name] = m @staticmethod @@ -119,7 +118,7 @@ def _make_window_emissive(obj: MeshObject, collection_of_mats: Dict[str, Dict[st transparent_node = m.new_node('ShaderNodeBsdfDiffuse') transparent_node.inputs['Color'].default_value[:3] = (0.285, 0.5, 0.48) - m.make_emissive(emission_strength=10, keep_using_base_color=False, emission_color=[1, 1, 1, 1], + m.make_emissive(emission_strength=10, emission_color=[1, 1, 1, 1], non_emissive_color_socket=transparent_node.outputs['BSDF']) collection_of_mats["window"][mat_name] = m @@ -149,6 +148,5 @@ def _make_ceiling_emissive(obj: MeshObject, collection_of_mats: Dict[str, Dict[s m.set_name(m.get_name() + "_emission") if not m.get_nodes_with_type("Emission") and m.get_nodes_with_type("BsdfPrincipled"): - m.make_emissive(emission_strength=ceiling_emission_strength, emission_color=[1, 1, 1, 1], - keep_using_base_color=False) + m.make_emissive(emission_strength=ceiling_emission_strength, emission_color=[1, 1, 1, 1]) collection_of_mats["ceiling"][mat_name] = m diff --git a/blenderproc/python/lighting/SurfaceLighting.py b/blenderproc/python/lighting/SurfaceLighting.py index 90643bcb5..b93b0b126 100644 --- a/blenderproc/python/lighting/SurfaceLighting.py +++ b/blenderproc/python/lighting/SurfaceLighting.py @@ -3,14 +3,12 @@ from blenderproc.python.types.MeshObjectUtility import MeshObject -def light_surface(objects: List[MeshObject], emission_strength: float = 10.0, - keep_using_base_color: bool = False, emission_color: list = None): +def light_surface(objects: List[MeshObject], emission_strength: float = 10.0, emission_color: list = None): """ Add emission shader to the materials of the given objects. :param objects: A list of mesh objects whose materials should emit light. :param emission_strength: The strength of the emitted light. - :param keep_using_base_color: If True, the base color of the material will be used as emission color. - :param emission_color: The color of the light to emit. Is ignored if keep_using_base_color is set to True. + :param emission_color: The color of the light to emit. Default: Color of the surface. """ empty_material = None @@ -39,8 +37,7 @@ def light_surface(objects: List[MeshObject], emission_strength: float = 10.0, # add a custom property to later identify these materials material.set_cp("is_lamp", True) - material.make_emissive(emission_strength=emission_strength, emission_color=emission_color, - keep_using_base_color=keep_using_base_color) + material.make_emissive(emission_strength=emission_strength, emission_color=emission_color) diff --git a/blenderproc/python/loader/Front3DLoader.py b/blenderproc/python/loader/Front3DLoader.py index 78746debf..449fb86cd 100644 --- a/blenderproc/python/loader/Front3DLoader.py +++ b/blenderproc/python/loader/Front3DLoader.py @@ -190,7 +190,7 @@ def _create_mesh_objects_from_file(data: dict, front_3D_texture_path: str, ceili mat.set_principled_shader_value("Base Color", used_image) if "ceiling" in used_obj_name.lower(): - mat.make_emissive(ceiling_light_strength, keep_using_base_color=False, emission_color=mathutils.Vector(used_mat["color"]) / 255.0) + mat.make_emissive(ceiling_light_strength, emission_color=mathutils.Vector(used_mat["color"]) / 255.0) if used_mat["normaltexture"]: # get the used image based on the normal texture path @@ -222,7 +222,7 @@ def _create_mesh_objects_from_file(data: dict, front_3D_texture_path: str, ceili principled_node.inputs["Base Color"].default_value = mathutils.Vector(used_mat["color"]) / 255.0 # if the object is a ceiling add some light output if "ceiling" in used_obj_name.lower(): - mat.make_emissive(ceiling_light_strength, keep_using_base_color=False, emission_color=mathutils.Vector(used_mat["color"]) / 255.0) + mat.make_emissive(ceiling_light_strength, emission_color=mathutils.Vector(used_mat["color"]) / 255.0) else: used_materials_based_on_color[used_hash] = mat diff --git a/blenderproc/python/modules/lighting/SurfaceLightingModule.py b/blenderproc/python/modules/lighting/SurfaceLightingModule.py index 81b67e2c3..93e6f596d 100644 --- a/blenderproc/python/modules/lighting/SurfaceLightingModule.py +++ b/blenderproc/python/modules/lighting/SurfaceLightingModule.py @@ -7,8 +7,8 @@ class SurfaceLightingModule(Module): """ Adds lighting to the scene, by adding emission shader nodes to surfaces of specified objects. - The speciality here is that the material can still look like before and now also emit light, this can be done - by setting `keep_using_base_color` to `True`. If the material should not be kept this can be set to `False` and + The speciality here is that the material can still look like before and now also emit light if emission_color is not set. + If the material should not be kept this can be set to `False` and with the key `emission_color` a new color can be set, if none is given it will assume `[1, 1, 1]`, which is white. **Configuration**: @@ -26,10 +26,6 @@ class SurfaceLightingModule(Module): * - emission_strength - The strength of the emission shader. Default: 10.0. - float - * - keep_using_base_color - - If this is True, the Base Color of the material is kept, this means if the material was yellow before. \ - The light now is also yellow. This is also true, if a texture was used before. Default: False. - - bool * - emission_color - If `keep_using_case_color` is False it is possible to set the color of the light with an RGB value. All \ values have to be in the range from [0, 1]. Default: None. @@ -39,7 +35,6 @@ class SurfaceLightingModule(Module): def __init__(self, config: Config): Module.__init__(self, config) self.emission_strength = self.config.get_float("emission_strength", 10.0) - self.keep_using_base_color = self.config.get_bool("keep_using_base_color", False) self.emission_color = self.config.get_vector4d("emission_color", None) def run(self): @@ -52,6 +47,5 @@ def run(self): light_surface( objects, emission_strength=self.emission_strength, - keep_using_base_color=self.keep_using_base_color, emission_color=self.emission_color ) diff --git a/blenderproc/python/modules/manipulators/MaterialManipulator.py b/blenderproc/python/modules/manipulators/MaterialManipulator.py index d5e07240c..d4a72ac7e 100644 --- a/blenderproc/python/modules/manipulators/MaterialManipulator.py +++ b/blenderproc/python/modules/manipulators/MaterialManipulator.py @@ -559,7 +559,7 @@ def _switch_to_emission_shader(self, material: Material, value: dict): :param material: Material to be modified. :param value: Light color and strength data. """ - material.make_emissive(emission_strength=value["strength"], emission_color=value["color"], replace=True, keep_using_base_color=False) + material.make_emissive(emission_strength=value["strength"], emission_color=value["color"], replace=True) @staticmethod def _infuse_texture(material: Material, config: Config): diff --git a/blenderproc/python/types/MaterialUtility.py b/blenderproc/python/types/MaterialUtility.py index 72f4cbe10..80b2a6d68 100644 --- a/blenderproc/python/types/MaterialUtility.py +++ b/blenderproc/python/types/MaterialUtility.py @@ -155,14 +155,13 @@ def remove_emissive(self): for node in self.get_nodes_created_in_func(self.make_emissive.__name__): self.remove_node(node) - def make_emissive(self, emission_strength: float, replace: bool = False, keep_using_base_color: bool = True, - emission_color: List[float] = None, non_emissive_color_socket: bpy.types.NodeSocket = None): + def make_emissive(self, emission_strength: float, replace: bool = False, emission_color: List[float] = None, + non_emissive_color_socket: bpy.types.NodeSocket = None): """ Makes the material emit light. :param emission_strength: The strength of the emitted light. :param replace: When replace is set to True, the existing material will be completely replaced by the emission shader, otherwise it still looks the same, while emitting light. - :param keep_using_base_color: If True, the base color of the material will be used as emission color. - :param emission_color: The color of the light to emit. Is ignored if keep_using_base_color is set to True. + :param emission_color: The color of the light to emit. Default: Color of the original object. :param non_emissive_color_socket: An output socket that defines how the material should look like. By default that is the output of the principled shader node. Has no effect if replace is set to True. """ self.remove_emissive() @@ -188,7 +187,7 @@ def make_emissive(self, emission_strength: float, replace: bool = False, keep_us emission_node = self.new_node('ShaderNodeEmission', self.make_emissive.__name__) - if keep_using_base_color: + if emission_color is None: principled_bsdf = self.get_the_one_node_with_type("BsdfPrincipled") if len(principled_bsdf.inputs["Base Color"].links) == 1: # get the node connected to the Base Color @@ -196,7 +195,7 @@ def make_emissive(self, emission_strength: float, replace: bool = False, keep_us self.link(socket_connected_to_the_base_color, emission_node.inputs["Color"]) else: emission_node.inputs["Color"].default_value = principled_bsdf.inputs["Base Color"].default_value - elif emission_color is not None: + else: emission_node.inputs["Color"].default_value = emission_color # set the emission strength of the shader diff --git a/examples/datasets/scenenet/README.md b/examples/datasets/scenenet/README.md index 7a396a59f..7d4ee1d5e 100644 --- a/examples/datasets/scenenet/README.md +++ b/examples/datasets/scenenet/README.md @@ -60,7 +60,7 @@ By selecting random texture and putting them in this `unknown_texture_folder`, w ```python # Make all lamp objects emit light lamps = bproc.filter.by_attr(objs, "name", ".*[l|L]amp.*", regex=True) -bproc.lighting.light_surface(lamps, emission_strength=15, keep_using_base_color=True) +bproc.lighting.light_surface(lamps, emission_strength=15) ``` The first function call will make the lamps in the scene emit light, while using the assigned material textures. diff --git a/examples/datasets/scenenet/config.yaml b/examples/datasets/scenenet/config.yaml index 0546cd0e6..f7a5bfaf8 100644 --- a/examples/datasets/scenenet/config.yaml +++ b/examples/datasets/scenenet/config.yaml @@ -72,8 +72,7 @@ "name": ".*[l|L]amp.*" } }, - "emission_strength": 15.0, - "keep_using_base_color": True + "emission_strength": 15.0 } }, { diff --git a/examples/datasets/scenenet/main.py b/examples/datasets/scenenet/main.py index 8e03efc01..d24f8d779 100644 --- a/examples/datasets/scenenet/main.py +++ b/examples/datasets/scenenet/main.py @@ -36,7 +36,7 @@ # Make all lamp objects emit light lamps = bproc.filter.by_attr(objs, "name", ".*[l|L]amp.*", regex=True) -bproc.lighting.light_surface(lamps, emission_strength=15, keep_using_base_color=True) +bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(objs, "name", ".*[c|C]eiling.*", regex=True) bproc.lighting.light_surface(ceilings, emission_strength=2) diff --git a/examples/datasets/scenenet_with_cctextures/config.yaml b/examples/datasets/scenenet_with_cctextures/config.yaml index 47d782a18..d019482fa 100644 --- a/examples/datasets/scenenet_with_cctextures/config.yaml +++ b/examples/datasets/scenenet_with_cctextures/config.yaml @@ -151,8 +151,7 @@ "name": ".*[l|L]amp.*" } }, - "emission_strength": 15.0, - "keep_using_base_color": True + "emission_strength": 15.0 } }, { diff --git a/examples/datasets/scenenet_with_cctextures/main.py b/examples/datasets/scenenet_with_cctextures/main.py index 59969ef5b..db22bf2b6 100644 --- a/examples/datasets/scenenet_with_cctextures/main.py +++ b/examples/datasets/scenenet_with_cctextures/main.py @@ -53,7 +53,7 @@ # Make all lamp objects emit light lamps = bproc.filter.by_attr(objs, "name", ".*[l|L]amp.*", regex=True) -bproc.lighting.light_surface(lamps, emission_strength=15, keep_using_base_color=True) +bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(objs, "name", ".*[c|C]eiling.*", regex=True) bproc.lighting.light_surface(ceilings, emission_strength=2) diff --git a/examples/datasets/shapenet_with_scenenet/config.yaml b/examples/datasets/shapenet_with_scenenet/config.yaml index ec836bad8..3349bc6db 100644 --- a/examples/datasets/shapenet_with_scenenet/config.yaml +++ b/examples/datasets/shapenet_with_scenenet/config.yaml @@ -74,8 +74,7 @@ "name": ".*[l|L]amp.*" } }, - "emission_strength": 15.0, - "keep_using_base_color": True + "emission_strength": 15.0 } }, { diff --git a/examples/datasets/shapenet_with_scenenet/main.py b/examples/datasets/shapenet_with_scenenet/main.py index 05e56132e..6136f5f2b 100644 --- a/examples/datasets/shapenet_with_scenenet/main.py +++ b/examples/datasets/shapenet_with_scenenet/main.py @@ -36,7 +36,7 @@ # Make all lamp objects emit light lamps = bproc.filter.by_attr(room_objs, "name", ".*[l|L]amp.*", regex=True) -bproc.lighting.light_surface(lamps, emission_strength=15, keep_using_base_color=True) +bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(room_objs, "name", ".*[c|C]eiling.*", regex=True) bproc.lighting.light_surface(ceilings, emission_strength=2) From 0cff1d6db65dfbb86c1dc073631c00b7940a329a Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Tue, 14 Dec 2021 18:35:12 +0100 Subject: [PATCH 32/46] chore(readme): Adds docu of how to debug with IDEs --- README.md | 64 +++++++++++++++++++++- blenderproc/command_line.py | 3 +- blenderproc/python/utility/SetupUtility.py | 15 +++-- 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 828753661..67857dd38 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ blenderproc vis hdf5 output/0.hdf5 Thats it! You rendered your first image with BlenderProc! -### Debugging +### Debugging in the Blender GUI To understand what is actually going on, BlenderProc has the great feature of visualizing everything inside the blender UI. To do so, simply call your script with the `debug` instead of `run` subcommand: @@ -122,6 +122,68 @@ As in the normal mode, print statements are still printed to the terminal. The pipeline can be run multiple times, as in the beginning of each run the scene is cleared. +### Breakpoint-Debugging in IDEs + +As blenderproc runs in blenders separate python environment, debugging your blenderproc script cannot be done in the same way as with any other python script. +Therefore, remote debugging is necessary, which is explained for vscode and PyCharm in the following: + +#### Debugging with vscode + +First, install the `debugpy` package in blenders python environment. + +``` +blenderproc pip install debugpy +``` + +Now add the following configuration to your vscode [launch.json](https://code.visualstudio.com/docs/python/debugging#_initialize-configurations). + +```json +{ + "name": "Attach", + "type": "python", + "request": "attach", + "connect": { + "host": "localhost", + "port": 5678 + } +} +``` + +Finally, add the following lines to the top of your blenderproc script which you want to debug. + +```python +import debugpy +debugpy.listen(5678) +debugpy.wait_for_client() +``` + +Now run your blenderproc script as usual via the CLI and then start the added "Attach" configuration in vscode. +You are now able to add breakpoints and go through the execution step by step. + +#### Debugging with PyCharm Professional + +In Pycharm, go to `Edit configurations...` and crate a new configuration based on `Python Debug Server`. +The configuration will show you, specifically for your version, which pip packge to install and which code to add into the script. +The following assumes Pycharm 2021.3: + +First, install the `pydevd-pycharm` package in blenders python environment. +Unfortunately, the package cannot be installed into a custom separate packages folder, therefore, make sure to add `--not-use-custom-package-path`. + +``` +blenderproc pip install pydevd-pycharm~=212.5457.59 --not-use-custom-package-path +``` + +Now, add the following code to the top of your blenderproc script which you want to debug. + +```python +import pydevd_pycharm +pydevd_pycharm.settrace('localhost', port=12345, stdoutToServer=True, stderrToServer=True) +``` + +Now first run your `Python Debug Server` configuration in PyCharm and then run your blenderproc script as usual via the CLI. +PyCharm should then be in debug mode, blocking the next code line. +You are now able to add breakpoints and go through the execution step by step. + ## What to do next? As you now ran your first BlenderProc script, your ready to learn the basics: diff --git a/blenderproc/command_line.py b/blenderproc/command_line.py index b2bd8f631..7de0dceec 100644 --- a/blenderproc/command_line.py +++ b/blenderproc/command_line.py @@ -60,6 +60,7 @@ def cli(): format_dict = lambda d : '\n'.join("{}: {}".format(key, value) for key, value in d.items()) parser_pip.add_argument('pip_mode', choices=options['pip'], help=format_dict(options['pip'])) parser_pip.add_argument('pip_packages', metavar='pip_packages', nargs='*', help='A list of pip packages that should be installed/uninstalled. Packages versions can be determined via the `==` notation.') + parser_pip.add_argument('--not-use-custom-package-path', dest='not_use_custom_package_path', action='store_true',) # Setup all common arguments of run and debug mode for subparser in [parser_run, parser_debug]: @@ -177,7 +178,7 @@ def handle_sigterm(signum, frame): blender_path = os.path.dirname(blender_bin) if args.pip_mode == "install": - SetupUtility.setup_pip(user_required_packages=args.pip_packages, blender_path=blender_path, major_version=major_version) + SetupUtility.setup_pip(user_required_packages=args.pip_packages, blender_path=blender_path, major_version=major_version, use_custom_package_path=not args.not_use_custom_package_path, install_default_packages=False) elif args.pip_mode == "uninstall": SetupUtility.uninstall_pip_packages(args.pip_packages, blender_path=blender_path, major_version=major_version) else: diff --git a/blenderproc/python/utility/SetupUtility.py b/blenderproc/python/utility/SetupUtility.py index 2e9625fe8..2573dcfcd 100644 --- a/blenderproc/python/utility/SetupUtility.py +++ b/blenderproc/python/utility/SetupUtility.py @@ -104,7 +104,7 @@ def determine_python_paths(blender_path: str, major_version: str) -> Union[str, return python_bin, packages_path, pre_python_package_path @staticmethod - def setup_pip(user_required_packages: Optional[List[str]] = None, blender_path: Optional[str] = None, major_version: Optional[str] = None, reinstall_packages: bool = False) -> str: + def setup_pip(user_required_packages: Optional[List[str]] = None, blender_path: Optional[str] = None, major_version: Optional[str] = None, reinstall_packages: bool = False, use_custom_package_path: bool = True, install_default_packages: bool = True) -> str: """ Makes sure the given user required and the general required python packages are installed in the blender proc env At the first run all installed packages are collected via pip freeze. @@ -114,11 +114,13 @@ def setup_pip(user_required_packages: Optional[List[str]] = None, blender_path: :param blender_path: The path to the blender installation. :param major_version: The version number of the blender installation. :param reinstall_packages: Set to true, if all python packages should be reinstalled. + :param use_custom_package_path: If True, the python packages are installed into a custom folder, separate from blenders own python packages. + :param install_default_packages: If True, general required python packages are made sure to be installed. :return: Returns the path to the directory which contains all custom installed pip packages. """ required_packages = [] # Only install general required packages on first setup_pip call - if SetupUtility.installed_packages is None: + if SetupUtility.installed_packages is None and install_default_packages: required_packages += DefaultConfig.default_pip_packages if user_required_packages is not None: required_packages += user_required_packages @@ -136,7 +138,7 @@ def setup_pip(user_required_packages: Optional[List[str]] = None, blender_path: if found_package_to_install: SetupUtility._ensure_pip(python_bin, packages_path, pre_python_package_path, force_update=True) - packages_were_installed = SetupUtility._pip_install_packages(required_packages, python_bin, packages_path) + packages_were_installed = SetupUtility._pip_install_packages(required_packages, python_bin, packages_path, use_custom_package_path=use_custom_package_path) # Make sure to update the pip package list cache, if it does not exist or changes have been made cache_path = os.path.join(packages_path, "installed_packages_cache.json") @@ -150,7 +152,7 @@ def setup_pip(user_required_packages: Optional[List[str]] = None, blender_path: return packages_path @staticmethod - def _pip_install_packages(required_packages, python_bin, packages_path, reinstall_packages: bool = False, dry_run: bool = False): + def _pip_install_packages(required_packages, python_bin, packages_path, reinstall_packages: bool = False, dry_run: bool = False, use_custom_package_path: bool = True): """ Installs the list of given pip packages in the given python environment. :param required_packages: A list of pip packages that should be installed. The version number can be specified via the usual == notation. @@ -158,6 +160,7 @@ def _pip_install_packages(required_packages, python_bin, packages_path, reinstal :param packages_path: Path where our pip packages should be installed :param reinstall_packages: Set to true, if all python packages should be reinstalled. :param dry_run: If true, nothing will be installed and it will only be checked whether there are any potential packages to update/install. + :param use_custom_package_path: If True, the python packages are installed into a custom folder, separate from blenders own python packages. :return: Returns True, if any packages were update/installed or - if dry_run=True - if there are any potential packages to update/install. """ # Install all packages @@ -211,8 +214,10 @@ def _pip_install_packages(required_packages, python_bin, packages_path, reinstal extra_args.append("--no-cache-dir") if not dry_run: + if use_custom_package_path: + extra_args.extend(["--target", packages_path]) # Run pip install - subprocess.Popen([python_bin, "-m", "pip", "install", package, "--target", packages_path, "--upgrade"] + extra_args, env=dict(os.environ, PYTHONPATH=packages_path)).wait() + subprocess.Popen([python_bin, "-m", "pip", "install", package, "--upgrade"] + extra_args, env=dict(os.environ, PYTHONPATH=packages_path)).wait() SetupUtility.installed_packages[package_name] = package_version packages_were_installed = True else: From 7c0af910cb2b258de8bc13389fb81f1468aad662 Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Tue, 14 Dec 2021 18:43:02 +0100 Subject: [PATCH 33/46] chore(readme): Fixes typos --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 67857dd38..0c4a42a4e 100644 --- a/README.md +++ b/README.md @@ -162,12 +162,12 @@ You are now able to add breakpoints and go through the execution step by step. #### Debugging with PyCharm Professional -In Pycharm, go to `Edit configurations...` and crate a new configuration based on `Python Debug Server`. -The configuration will show you, specifically for your version, which pip packge to install and which code to add into the script. +In Pycharm, go to `Edit configurations...` and create a [new configuration](https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#remote-debug-config) based on `Python Debug Server`. +The configuration will show you, specifically for your version, which pip package to install and which code to add into the script. The following assumes Pycharm 2021.3: First, install the `pydevd-pycharm` package in blenders python environment. -Unfortunately, the package cannot be installed into a custom separate packages folder, therefore, make sure to add `--not-use-custom-package-path`. +Unfortunately, the package cannot be installed into our custom separate packages folder, therefore, make sure to add `--not-use-custom-package-path`. ``` blenderproc pip install pydevd-pycharm~=212.5457.59 --not-use-custom-package-path @@ -180,8 +180,8 @@ import pydevd_pycharm pydevd_pycharm.settrace('localhost', port=12345, stdoutToServer=True, stderrToServer=True) ``` -Now first run your `Python Debug Server` configuration in PyCharm and then run your blenderproc script as usual via the CLI. -PyCharm should then be in debug mode, blocking the next code line. +Then, first run your `Python Debug Server` configuration in PyCharm and then run your blenderproc script as usual via the CLI. +PyCharm should then go in debug mode, blocking the next code line. You are now able to add breakpoints and go through the execution step by step. ## What to do next? From af37901e9c192a3cc649e6e83fc2117e29fd6f95 Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Tue, 14 Dec 2021 18:56:45 +0100 Subject: [PATCH 34/46] chore(readme): Adds missing help text --- blenderproc/command_line.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blenderproc/command_line.py b/blenderproc/command_line.py index 7de0dceec..e4a395a0d 100644 --- a/blenderproc/command_line.py +++ b/blenderproc/command_line.py @@ -60,7 +60,7 @@ def cli(): format_dict = lambda d : '\n'.join("{}: {}".format(key, value) for key, value in d.items()) parser_pip.add_argument('pip_mode', choices=options['pip'], help=format_dict(options['pip'])) parser_pip.add_argument('pip_packages', metavar='pip_packages', nargs='*', help='A list of pip packages that should be installed/uninstalled. Packages versions can be determined via the `==` notation.') - parser_pip.add_argument('--not-use-custom-package-path', dest='not_use_custom_package_path', action='store_true',) + parser_pip.add_argument('--not-use-custom-package-path', dest='not_use_custom_package_path', action='store_true', help='If set, the pip packages will not be installed into the separate custom package folder, but into blenders python site-packages folder.') # Setup all common arguments of run and debug mode for subparser in [parser_run, parser_debug]: From 92ca6cecf491e504350a52d5bb7e7cc9719a0d13 Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Wed, 15 Dec 2021 11:20:10 +0100 Subject: [PATCH 35/46] Fix(light_surface): explicit emission color --- examples/advanced/random_room_constructor/config.yaml | 1 + examples/advanced/random_room_constructor/main.py | 2 +- examples/datasets/scenenet/config.yaml | 1 + examples/datasets/scenenet/main.py | 2 +- examples/datasets/scenenet_with_cctextures/config.yaml | 1 + examples/datasets/scenenet_with_cctextures/main.py | 2 +- examples/datasets/shapenet_with_scenenet/config.yaml | 1 + examples/datasets/shapenet_with_scenenet/main.py | 2 +- 8 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/advanced/random_room_constructor/config.yaml b/examples/advanced/random_room_constructor/config.yaml index 79421fd2c..092aaf765 100644 --- a/examples/advanced/random_room_constructor/config.yaml +++ b/examples/advanced/random_room_constructor/config.yaml @@ -54,6 +54,7 @@ "name": "Ceiling" }, "emission_strength": 4.0 + "emission_color": [1, 1, 1, 1] } } }, diff --git a/examples/advanced/random_room_constructor/main.py b/examples/advanced/random_room_constructor/main.py index 3889a1b18..42618a2c1 100644 --- a/examples/advanced/random_room_constructor/main.py +++ b/examples/advanced/random_room_constructor/main.py @@ -21,7 +21,7 @@ materials=materials, amount_of_extrusions=5) # Bring light into the room -bproc.lighting.light_surface([obj for obj in objects if obj.get_name() == "Ceiling"], emission_strength=4.0) +bproc.lighting.light_surface([obj for obj in objects if obj.get_name() == "Ceiling"], emission_strength=4.0, emission_color=[1,1,1,1]) # Init bvh tree containing all mesh objects bvh_tree = bproc.object.create_bvh_tree_multi_objects(objects) diff --git a/examples/datasets/scenenet/config.yaml b/examples/datasets/scenenet/config.yaml index f7a5bfaf8..4d34d0f5f 100644 --- a/examples/datasets/scenenet/config.yaml +++ b/examples/datasets/scenenet/config.yaml @@ -86,6 +86,7 @@ } }, "emission_strength": 2.0, + "emission_color": [1, 1, 1, 1] } }, { diff --git a/examples/datasets/scenenet/main.py b/examples/datasets/scenenet/main.py index d24f8d779..53e577344 100644 --- a/examples/datasets/scenenet/main.py +++ b/examples/datasets/scenenet/main.py @@ -39,7 +39,7 @@ bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(objs, "name", ".*[c|C]eiling.*", regex=True) -bproc.lighting.light_surface(ceilings, emission_strength=2) +bproc.lighting.light_surface(ceilings, emission_strength=2, emission_color=[1,1,1,1]) # Init bvh tree containing all mesh objects bvh_tree = bproc.object.create_bvh_tree_multi_objects(objs) diff --git a/examples/datasets/scenenet_with_cctextures/config.yaml b/examples/datasets/scenenet_with_cctextures/config.yaml index d019482fa..26b4b714a 100644 --- a/examples/datasets/scenenet_with_cctextures/config.yaml +++ b/examples/datasets/scenenet_with_cctextures/config.yaml @@ -165,6 +165,7 @@ } }, "emission_strength": 2.0, + "emission_color": [1, 1, 1, 1] } }, { diff --git a/examples/datasets/scenenet_with_cctextures/main.py b/examples/datasets/scenenet_with_cctextures/main.py index db22bf2b6..c293c48c8 100644 --- a/examples/datasets/scenenet_with_cctextures/main.py +++ b/examples/datasets/scenenet_with_cctextures/main.py @@ -56,7 +56,7 @@ bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(objs, "name", ".*[c|C]eiling.*", regex=True) -bproc.lighting.light_surface(ceilings, emission_strength=2) +bproc.lighting.light_surface(ceilings, emission_strength=2, emission_color=[1,1,1,1]) # Init bvh tree containing all mesh objects bvh_tree = bproc.object.create_bvh_tree_multi_objects(objs) diff --git a/examples/datasets/shapenet_with_scenenet/config.yaml b/examples/datasets/shapenet_with_scenenet/config.yaml index 3349bc6db..2eb164cb6 100644 --- a/examples/datasets/shapenet_with_scenenet/config.yaml +++ b/examples/datasets/shapenet_with_scenenet/config.yaml @@ -88,6 +88,7 @@ } }, "emission_strength": 2.0, + "emission_color": [1, 1, 1, 1] } }, { diff --git a/examples/datasets/shapenet_with_scenenet/main.py b/examples/datasets/shapenet_with_scenenet/main.py index 6136f5f2b..f351c375d 100644 --- a/examples/datasets/shapenet_with_scenenet/main.py +++ b/examples/datasets/shapenet_with_scenenet/main.py @@ -39,7 +39,7 @@ bproc.lighting.light_surface(lamps, emission_strength=15) # Also let all ceiling objects emit a bit of light, so the whole room gets more bright ceilings = bproc.filter.by_attr(room_objs, "name", ".*[c|C]eiling.*", regex=True) -bproc.lighting.light_surface(ceilings, emission_strength=2) +bproc.lighting.light_surface(ceilings, emission_strength=2, emission_color=[1,1,1,1]) # load the ShapeNet object into the scene shapenet_obj = bproc.loader.load_shapenet(args.shapenet_path, used_synset_id="02801938") From be87d4f97312aa2c019a51f15ada84b4b5d0454b Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Wed, 15 Dec 2021 12:11:35 +0100 Subject: [PATCH 36/46] fix(example): Fixes category id in random_background example --- examples/advanced/random_backgrounds/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/advanced/random_backgrounds/main.py b/examples/advanced/random_backgrounds/main.py index da344b634..da6849a0a 100644 --- a/examples/advanced/random_backgrounds/main.py +++ b/examples/advanced/random_backgrounds/main.py @@ -13,6 +13,7 @@ # load the objects into the scene obj = bproc.loader.load_obj(args.scene)[0] +obj.set_cp("category_id", 1) # Randomly perturbate the material of the object mat = obj.get_materials()[0] @@ -69,7 +70,7 @@ data = bproc.renderer.render() # Render segmentation images -seg_data = bproc.renderer.render_segmap(map_by=["instance", "class", "name"], default_values={"class": 0, "name": "none"}) +seg_data = bproc.renderer.render_segmap(map_by=["instance", "class", "name"]) # Write data to coco file bproc.writer.write_coco_annotations(os.path.join(args.output_dir, 'coco_data'), From b1de13c7e367420c3502e9f45220d26de9122d0d Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Wed, 15 Dec 2021 12:12:53 +0100 Subject: [PATCH 37/46] Fix(random_room): missing comma --- examples/advanced/random_room_constructor/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/advanced/random_room_constructor/config.yaml b/examples/advanced/random_room_constructor/config.yaml index 092aaf765..25f84221c 100644 --- a/examples/advanced/random_room_constructor/config.yaml +++ b/examples/advanced/random_room_constructor/config.yaml @@ -53,7 +53,7 @@ "conditions": { "name": "Ceiling" }, - "emission_strength": 4.0 + "emission_strength": 4.0, "emission_color": [1, 1, 1, 1] } } From f9fbac6cc54d345603a7161d5f150d8e492d8f97 Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 17 Dec 2021 10:02:51 +0100 Subject: [PATCH 38/46] Update README_BlenderProc4BOP.md --- README_BlenderProc4BOP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_BlenderProc4BOP.md b/README_BlenderProc4BOP.md index 7087fcf87..d2301484b 100644 --- a/README_BlenderProc4BOP.md +++ b/README_BlenderProc4BOP.md @@ -41,7 +41,7 @@ The cameras are positioned to cover the distribution of the ground-truth object ## Results -Results of the BOP Challenge 2020 and the superiority of training training with BlenderProc images over ordinary OpenGL images is shown in our paper `BOP Challenge 2020 on 6D Object Localization` [5]. +Results of the BOP Challenge 2020 and the superiority of training with BlenderProc images over ordinary OpenGL images is shown in our paper `BOP Challenge 2020 on 6D Object Localization` [5]. ## References From 280636af543ca271852bfaaf5233d630138fbf7a Mon Sep 17 00:00:00 2001 From: Martin Sundermeyer Date: Fri, 17 Dec 2021 10:02:55 +0100 Subject: [PATCH 39/46] Update examples/datasets/bop_challenge/README.md --- examples/datasets/bop_challenge/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/datasets/bop_challenge/README.md b/examples/datasets/bop_challenge/README.md index cc047bb4c..c933c6a42 100644 --- a/examples/datasets/bop_challenge/README.md +++ b/examples/datasets/bop_challenge/README.md @@ -16,7 +16,7 @@ For LineMOD, the objects are placed upright on a plane based on the [bop_object_ Here, we explain the usage with the new python format introduced in BlenderProc2, for the original config files, check [below](#original-config-file-usage). -Download the necessary [BOP datasets](https://bop.felk.cvut.cz/datasets/). +Download the necessary [BOP datasets](https://bop.felk.cvut.cz/datasets/). Base archives and 3D models are sufficient. Execute in the BlenderProc main directory: From 4ce9cd6fe17dd396b26fa86604b7506aca55c788 Mon Sep 17 00:00:00 2001 From: MartinSmeyer Date: Fri, 17 Dec 2021 10:45:25 +0100 Subject: [PATCH 40/46] Feat(bop_challenge): num_scenes optional argument --- examples/datasets/bop_challenge/README.md | 4 +++- examples/datasets/bop_challenge/main_hb_random.py | 5 +++-- examples/datasets/bop_challenge/main_icbin_random.py | 5 +++-- examples/datasets/bop_challenge/main_itodd_random.py | 5 +++-- examples/datasets/bop_challenge/main_lm_upright.py | 5 +++-- examples/datasets/bop_challenge/main_tless_random.py | 5 +++-- examples/datasets/bop_challenge/main_tudl_random.py | 5 +++-- examples/datasets/bop_challenge/main_ycbv_random.py | 5 +++-- examples/datasets/bop_object_on_surface_sampling/main.py | 2 +- examples/datasets/bop_object_physics_positioning/main.py | 2 +- examples/datasets/bop_object_pose_sampling/main.py | 2 +- examples/datasets/bop_scene_replication/main.py | 2 +- 12 files changed, 28 insertions(+), 19 deletions(-) diff --git a/examples/datasets/bop_challenge/README.md b/examples/datasets/bop_challenge/README.md index cc047bb4c..2f00ad626 100644 --- a/examples/datasets/bop_challenge/README.md +++ b/examples/datasets/bop_challenge/README.md @@ -30,14 +30,16 @@ blenderpoc run examples/datasets/bop_challenge/main__ resources/cctextures examples/datasets/bop_challenge/output + --num_scenes=2000 ``` * `examples/datasets/bop_challenge/main__.py`: path to the python file. * ``: path to a folder containing BOP datasets. * `resources/cctextures`: path to CCTextures folder * `examples/datasets/bop_challenge/output`: path to an output folder where the bop_data will be saved +* `--num_scenes`: How many scenes with 25 images each to generate -Tip: If you have access to multiple GPUs, you can speedup the process by dividing the 2000 iterations of the outer loop in a multiple of 40 iterations. Then run the script multiple times with different output folders. At the end, rename and merge the scenes in a joint folder. For example, if you have 10 GPUs, set the outer iterations to 200 and run the script 10 times with different output folders. +Tip: If you have access to multiple GPUs, you can speedup the process by dividing the 2000 scenes into multiples of 40 scenes (40 scenes * 25 images make up one chunk of 1000 images). Therefore run the script in parallel with different output folders. At the end, rename and merge the scenes in a joint folder. For example, if you have 10 GPUs, set `--num_scenes=200` and run the script 10 times with different output folders. ### Complete the BlenderProc4BOP datasets diff --git a/examples/datasets/bop_challenge/main_hb_random.py b/examples/datasets/bop_challenge/main_hb_random.py index ec51e6694..18228b703 100644 --- a/examples/datasets/bop_challenge/main_hb_random.py +++ b/examples/datasets/bop_challenge/main_hb_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -58,7 +59,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20, replace=False)) diff --git a/examples/datasets/bop_challenge/main_icbin_random.py b/examples/datasets/bop_challenge/main_icbin_random.py index ba6026d7e..9d1e60ff1 100644 --- a/examples/datasets/bop_challenge/main_icbin_random.py +++ b/examples/datasets/bop_challenge/main_icbin_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -56,7 +57,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20, replace=False)) diff --git a/examples/datasets/bop_challenge/main_itodd_random.py b/examples/datasets/bop_challenge/main_itodd_random.py index b759a7af1..6f343b573 100644 --- a/examples/datasets/bop_challenge/main_itodd_random.py +++ b/examples/datasets/bop_challenge/main_itodd_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -56,7 +57,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=25, replace=False)) diff --git a/examples/datasets/bop_challenge/main_lm_upright.py b/examples/datasets/bop_challenge/main_lm_upright.py index 47e6b9e01..560e9c172 100644 --- a/examples/datasets/bop_challenge/main_lm_upright.py +++ b/examples/datasets/bop_challenge/main_lm_upright.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -56,7 +57,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=15, replace=False)) diff --git a/examples/datasets/bop_challenge/main_tless_random.py b/examples/datasets/bop_challenge/main_tless_random.py index 75ba204df..c87e37678 100644 --- a/examples/datasets/bop_challenge/main_tless_random.py +++ b/examples/datasets/bop_challenge/main_tless_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -58,7 +59,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=20)) diff --git a/examples/datasets/bop_challenge/main_tudl_random.py b/examples/datasets/bop_challenge/main_tudl_random.py index 50bb22e1e..5c041b528 100644 --- a/examples/datasets/bop_challenge/main_tudl_random.py +++ b/examples/datasets/bop_challenge/main_tudl_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -58,7 +59,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=3, replace=False)) diff --git a/examples/datasets/bop_challenge/main_ycbv_random.py b/examples/datasets/bop_challenge/main_ycbv_random.py index 9ea5fe617..e4e13e9df 100644 --- a/examples/datasets/bop_challenge/main_ycbv_random.py +++ b/examples/datasets/bop_challenge/main_ycbv_random.py @@ -6,7 +6,8 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', help="Path to the bop datasets parent directory") parser.add_argument('cc_textures_path', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', help="Path to where the final files will be saved ") +parser.add_argument('--num_scenes', type=int, default=2000, help="How many scenes with 25 images each to generate") args = parser.parse_args() bproc.init() @@ -58,7 +59,7 @@ def sample_pose_func(obj: bproc.types.MeshObject): # activate depth rendering without antialiasing and set amount of samples for color rendering bproc.renderer.enable_depth_output(activate_antialiasing=False) -for i in range(2000): +for i in range(args.num_scenes): # Sample bop objects for a scene sampled_target_bop_objs = list(np.random.choice(target_bop_objs, size=21, replace=False)) diff --git a/examples/datasets/bop_object_on_surface_sampling/main.py b/examples/datasets/bop_object_on_surface_sampling/main.py index dba8b43f3..7e7aea03e 100644 --- a/examples/datasets/bop_object_on_surface_sampling/main.py +++ b/examples/datasets/bop_object_on_surface_sampling/main.py @@ -7,7 +7,7 @@ parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', nargs='?', default="examples/bop_object_on_surface_sampling/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', nargs='?', help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() diff --git a/examples/datasets/bop_object_physics_positioning/main.py b/examples/datasets/bop_object_physics_positioning/main.py index 9f3afe21c..2a9291032 100644 --- a/examples/datasets/bop_object_physics_positioning/main.py +++ b/examples/datasets/bop_object_physics_positioning/main.py @@ -7,7 +7,7 @@ parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") parser.add_argument('cc_textures_path', nargs='?', default="resources/cctextures", help="Path to downloaded cc textures") -parser.add_argument('output_dir', nargs='?', default="examples/bop_object_physics_positioning/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', nargs='?', help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() diff --git a/examples/datasets/bop_object_pose_sampling/main.py b/examples/datasets/bop_object_pose_sampling/main.py index f53c157df..5e1177c72 100644 --- a/examples/datasets/bop_object_pose_sampling/main.py +++ b/examples/datasets/bop_object_pose_sampling/main.py @@ -6,7 +6,7 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('output_dir', nargs='?', default="examples/bop_object_pose_sampling/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', nargs='?', help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() diff --git a/examples/datasets/bop_scene_replication/main.py b/examples/datasets/bop_scene_replication/main.py index 8783f1cc9..c3ae29128 100644 --- a/examples/datasets/bop_scene_replication/main.py +++ b/examples/datasets/bop_scene_replication/main.py @@ -5,7 +5,7 @@ parser = argparse.ArgumentParser() parser.add_argument('bop_parent_path', nargs='?', help="Path to the bop datasets parent directory") parser.add_argument('bop_dataset_name', nargs='?', help="Main BOP dataset") -parser.add_argument('output_dir', nargs='?', default="examples/bop_scene_replication/output", help="Path to where the final files will be saved ") +parser.add_argument('output_dir', nargs='?', help="Path to where the final files will be saved ") args = parser.parse_args() bproc.init() From b68980091562e2c6c844234e0d678628ddb81196 Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Fri, 17 Dec 2021 12:24:27 +0100 Subject: [PATCH 41/46] chore(readme): Improves docu --- README.md | 4 ++-- blenderproc/command_line.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c4a42a4e..54cc36ef0 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ Now add the following configuration to your vscode [launch.json](https://code.vi } ``` -Finally, add the following lines to the top of your blenderproc script which you want to debug. +Finally, add the following lines to the top (after the imports) of your blenderproc script which you want to debug. ```python import debugpy @@ -173,7 +173,7 @@ Unfortunately, the package cannot be installed into our custom separate packages blenderproc pip install pydevd-pycharm~=212.5457.59 --not-use-custom-package-path ``` -Now, add the following code to the top of your blenderproc script which you want to debug. +Now, add the following code to the top (after the imports) of your blenderproc script which you want to debug. ```python import pydevd_pycharm diff --git a/blenderproc/command_line.py b/blenderproc/command_line.py index e4a395a0d..c8b426a4d 100644 --- a/blenderproc/command_line.py +++ b/blenderproc/command_line.py @@ -60,7 +60,7 @@ def cli(): format_dict = lambda d : '\n'.join("{}: {}".format(key, value) for key, value in d.items()) parser_pip.add_argument('pip_mode', choices=options['pip'], help=format_dict(options['pip'])) parser_pip.add_argument('pip_packages', metavar='pip_packages', nargs='*', help='A list of pip packages that should be installed/uninstalled. Packages versions can be determined via the `==` notation.') - parser_pip.add_argument('--not-use-custom-package-path', dest='not_use_custom_package_path', action='store_true', help='If set, the pip packages will not be installed into the separate custom package folder, but into blenders python site-packages folder.') + parser_pip.add_argument('--not-use-custom-package-path', dest='not_use_custom_package_path', action='store_true', help='If set, the pip packages will not be installed into the separate custom package folder, but into blenders python site-packages folder. This should only be used, if a specific pip package cannot be installed into a custom package path.') # Setup all common arguments of run and debug mode for subparser in [parser_run, parser_debug]: From afe06e11e77ce498bc0e081ed028bad23e839234 Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Fri, 17 Dec 2021 14:20:24 +0100 Subject: [PATCH 42/46] fix(coco): Fixes vis coco when category name is an int --- blenderproc/scripts/vis_coco_annotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blenderproc/scripts/vis_coco_annotation.py b/blenderproc/scripts/vis_coco_annotation.py index b2b396596..bc2c70127 100644 --- a/blenderproc/scripts/vis_coco_annotation.py +++ b/blenderproc/scripts/vis_coco_annotation.py @@ -30,7 +30,7 @@ def cli(): def get_category(_id): category = [category["name"] for category in categories if category["id"] == _id] if len(category) != 0: - return category[0] + return str(category[0]) else: raise Exception("Category {} is not defined in {}".format(_id, os.path.join(base_path, conf))) From c07a5c87a0e91f52cb7e4e5eef7fd00821f3f878 Mon Sep 17 00:00:00 2001 From: Dominik Winkelbauer Date: Fri, 17 Dec 2021 14:27:51 +0100 Subject: [PATCH 43/46] fix(debug): Hides irrelevant error messages --- blenderproc/debug_startup.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/blenderproc/debug_startup.py b/blenderproc/debug_startup.py index 4f0b0170d..a3a907b01 100644 --- a/blenderproc/debug_startup.py +++ b/blenderproc/debug_startup.py @@ -51,7 +51,11 @@ def execute(self, context): sys.path.append(import_path) # Run the script - bpy.ops.text.run_script() + try: + bpy.ops.text.run_script() + except RuntimeError: + # Skip irrelevant error messages (The relevant stacktrace+error has already been printed at this point) + pass return {"FINISHED"} bpy.utils.register_class(RunBlenderProcOperator) From 8a5f374ef81cf6cb0354083489d8cd10973bbb46 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Fri, 17 Dec 2021 14:34:42 +0100 Subject: [PATCH 44/46] chore(github_actions): remove action on every push --- .github/workflows/blenderprochelper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/blenderprochelper.yml b/.github/workflows/blenderprochelper.yml index b683a1280..3713547fc 100644 --- a/.github/workflows/blenderprochelper.yml +++ b/.github/workflows/blenderprochelper.yml @@ -1,6 +1,6 @@ name: BlenderProcHelper -on: [push, pull_request, workflow_dispatch] +on: [pull_request, workflow_dispatch] jobs: Run-BlenderProcHelper: From 4e419b6cf4b65b31d5d54d1bb477de48d281c285 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Fri, 17 Dec 2021 14:40:57 +0100 Subject: [PATCH 45/46] feat(change_log): update to v2.2.0 --- change_log.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/change_log.md b/change_log.md index 3aa2f9499..f954ac2e8 100644 --- a/change_log.md +++ b/change_log.md @@ -1,13 +1,28 @@ - # Planned Features -- Adding a complete python API and phasing out the `.yaml` files (Goal for 2.0.0) -- Add support for all YCB objects (not just BOP) +- Add URDF loader to define articulated objects and robots - Add support for more object datasets (ideas are welcomed, just open an issue with a dataset you want to see integrated) -- Improve the documentation +- Support non-rigid physics simulation +- Improve performance +- Deprecate Global Storage # Version History +## Version 2.2.0 17th Decemeber 2021 +- switch blender version to 3.0.0 instead of 2.93.0 + - we now rely on Cycles X, making the rendering much faster than before + - this also depreactes the usage of `bproc.renderer.set_samples()`, this is now replaced with `bproc.renderer.set_noise_threshold()`. This fcts allows to set the desired noise ration on a pixel basis, giving a much higher control to ensure a certain consistent noise level in the whole image. + - it is still possible to limit the amount of samples per pixel with a new function named: `bproc.renderer.set_max_amount_of_samples()` + - as the whole image is now rendered at once we removed the auto-tile addon + - the BLENDER denoiser is no longer available, we recommend using the INTEL denoiser. +- remove the argument `keep_using_base_color` from `bproc.lighting.light_surface()` and `Material.make_emissive()`, now either a emission color or the base color is used +- changes for the bop integration + - install bop_toolkit automatically + - add BlenderProc2 python scripts for BOP challenge + - allow to pass list of objects to `write_bop` for which to save pose annotations + - divide `load_bop()` into `load_bop_objs()`, `load_bop_scene()` and `load_bop_intrinsics()` to decouple the functionalit +- fix a bug after uninstalling pip packages they were not truly removed + ## Version 2.1.0 17th Novemeber 2021 - add new lens distortion module, adding the possibility to simulate `k1, k2, k3, p1` and `p2` parameters. - improve usability of distance rendering, make it the default in all examples From 95ada1c7ef35b38f1a56ac74a41931a4b88a1925 Mon Sep 17 00:00:00 2001 From: Maximilian Denninger Date: Fri, 17 Dec 2021 14:41:27 +0100 Subject: [PATCH 46/46] feat(version): change to 2.2.0 --- blenderproc/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blenderproc/version.py b/blenderproc/version.py index a33997dd1..04188a16d 100644 --- a/blenderproc/version.py +++ b/blenderproc/version.py @@ -1 +1 @@ -__version__ = '2.1.0' +__version__ = '2.2.0'