import os, yaml, platform def get_default_download_folder(): system_platform = platform.system() # Gets the system platform, e.g., 'Linux', 'Windows', 'Darwin' if system_platform == "Windows": # Typically, the Downloads folder for Windows is in the user's profile folder default_output_folder = os.path.join(os.getenv('USERPROFILE'), 'Downloads') elif system_platform == "Darwin": # Typically, the Downloads folder for macOS is in the user's home directory default_output_folder = os.path.join(os.path.expanduser("~"), 'Downloads') elif system_platform == "Linux": # Typically, the Downloads folder for Linux is in the user's home directory default_output_folder = os.path.join(os.path.expanduser("~"), 'Downloads') else: default_output_folder = "set/path/to/downloads/folder" print("Please manually set the output folder") return default_output_folder def build_LM2_config(): dir_home = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) # Initialize the base structure config_data = { 'leafmachine': {} } # Modular sections to be added to 'leafmachine' do_section = { 'check_for_illegal_filenames': True, 'check_for_corrupt_images_make_vertical': True, 'run_leaf_processing': True } print_section = { 'verbose': True, 'optional_warnings': True } logging_section = { 'log_level': None } default_output_folder = get_default_download_folder() project_section = { 'dir_output': default_output_folder, # 'dir_output': 'D:/D_Desktop/LM2', 'run_name': 'test', 'image_location': 'local', 'GBIF_mode': 'all', 'batch_size': 40, 'num_workers': 2, 'dir_images_local': '', # 'dir_images_local': 'D:\Dropbox\LM2_Env\Image_Datasets\Manuscript_Images', 'path_combined_csv_local': None, 'path_occurrence_csv_local': None, 'path_images_csv_local': None, 'use_existing_plant_component_detections': None, 'use_existing_archival_component_detections': None, 'process_subset_of_images': False, 'dir_images_subset': '', 'n_images_per_species': 10, 'species_list': '' } cropped_components_section = { 'do_save_cropped_annotations': False, 'save_cropped_annotations': ['label'], 'save_per_image': False, 'save_per_annotation_class': True, 'binarize_labels': False, 'binarize_labels_skeletonize': False } modules_section = { 'armature': False, 'specimen_crop': False } data_section = { 'save_json_rulers': False, 'save_json_measurements': False, 'save_individual_csv_files_rulers': False, 'save_individual_csv_files_measurements': False, 'save_individual_csv_files_landmarks': False, 'save_individual_efd_files': False, 'include_darwin_core_data_from_combined_file': False, 'do_apply_conversion_factor': True } overlay_section = { 'save_overlay_to_pdf': False, 'save_overlay_to_jpgs': True, 'overlay_dpi': 300, # Between 100 to 300 'overlay_background_color': 'black', # Either 'white' or 'black' 'show_archival_detections': True, 'show_plant_detections': True, 'show_segmentations': True, 'show_landmarks': True, 'ignore_archival_detections_classes': [], 'ignore_plant_detections_classes': ['leaf_whole', 'specimen'], # Could also include 'leaf_partial' and others if needed 'ignore_landmark_classes': [], 'line_width_archival': 12, # Previous value given was 2 'line_width_plant': 12, # Previous value given was 6 'line_width_seg': 12, # 12 is specified as "thick" 'line_width_efd': 12, # 3 is specified as "thick" but 12 is given here 'alpha_transparency_archival': 0.3, 'alpha_transparency_plant': 0, 'alpha_transparency_seg_whole_leaf': 0.4, 'alpha_transparency_seg_partial_leaf': 0.3 } plant_component_detector_section = { 'detector_type': 'Plant_Detector', 'detector_version': 'PLANT_GroupAB_200', 'detector_iteration': 'PLANT_GroupAB_200', 'detector_weights': 'best.pt', 'minimum_confidence_threshold': 0.3, # Default is 0.5 'do_save_prediction_overlay_images': True, 'ignore_objects_for_overlay': [] # 'leaf_partial' can be included if needed } archival_component_detector_section = { 'detector_type': 'Archival_Detector', 'detector_version': 'PREP_final', 'detector_iteration': 'PREP_final', 'detector_weights': 'best.pt', 'minimum_confidence_threshold': 0.5, # Default is 0.5 'do_save_prediction_overlay_images': True, 'ignore_objects_for_overlay': [] } armature_component_detector_section = { 'detector_type': 'Armature_Detector', 'detector_version': 'ARM_A_1000', 'detector_iteration': 'ARM_A_1000', 'detector_weights': 'best.pt', 'minimum_confidence_threshold': 0.5, # Optionally: 0.2 'do_save_prediction_overlay_images': True, 'ignore_objects_for_overlay': [] } landmark_detector_section = { 'landmark_whole_leaves': True, 'landmark_partial_leaves': False, 'detector_type': 'Landmark_Detector_YOLO', 'detector_version': 'Landmarks', 'detector_iteration': 'Landmarks_V2', 'detector_weights': 'best.pt', 'minimum_confidence_threshold': 0.02, 'do_save_prediction_overlay_images': True, 'ignore_objects_for_overlay': [], 'use_existing_landmark_detections': None, # Example path provided 'do_show_QC_images': False, 'do_save_QC_images': True, 'do_show_final_images': False, 'do_save_final_images': True } landmark_detector_armature_section = { 'upscale_factor': 10, 'detector_type': 'Landmark_Detector_YOLO', 'detector_version': 'Landmarks_Arm_A_200', 'detector_iteration': 'Landmarks_Arm_A_200', 'detector_weights': 'last.pt', 'minimum_confidence_threshold': 0.06, 'do_save_prediction_overlay_images': True, 'ignore_objects_for_overlay': [], 'use_existing_landmark_detections': None, # Example path provided 'do_show_QC_images': True, 'do_save_QC_images': True, 'do_show_final_images': True, 'do_save_final_images': True } ruler_detection_section = { 'detect_ruler_type': True, 'ruler_detector': 'ruler_classifier_38classes_v-1.pt', 'ruler_binary_detector': 'model_scripted_resnet_720_withCompression.pt', 'minimum_confidence_threshold': 0.4, 'save_ruler_validation': False, 'save_ruler_validation_summary': True, 'save_ruler_processed': False } leaf_segmentation_section = { 'segment_whole_leaves': True, 'segment_partial_leaves': False, 'keep_only_best_one_leaf_one_petiole': True, 'save_segmentation_overlay_images_to_pdf': True, 'save_each_segmentation_overlay_image': True, 'save_individual_overlay_images': True, # Not recommended due to potential file count 'overlay_line_width': 1, # Default is 1 'use_efds_for_png_masks': False, # Requires calculate_elliptic_fourier_descriptors to be True 'save_masks_color': True, 'save_full_image_masks_color': True, 'save_rgb_cropped_images': True, 'find_minimum_bounding_box': True, 'calculate_elliptic_fourier_descriptors': True, # Default is True 'elliptic_fourier_descriptor_order': 40, # Default is 40 'segmentation_model': 'GroupB_Dataset_100000_Iter_1176PTS_512Batch_smooth_l1_LR00025_BGR', 'minimum_confidence_threshold': 0.7, # Alternatively: 0.9 'generate_overlay': True, 'overlay_dpi': 300, # Range: 100 to 300 'overlay_background_color': 'black' # Options: 'white' or 'black' } # Add the sections to the 'leafmachine' key config_data['leafmachine']['do'] = do_section config_data['leafmachine']['print'] = print_section config_data['leafmachine']['logging'] = logging_section config_data['leafmachine']['project'] = project_section config_data['leafmachine']['cropped_components'] = cropped_components_section config_data['leafmachine']['modules'] = modules_section config_data['leafmachine']['data'] = data_section config_data['leafmachine']['overlay'] = overlay_section config_data['leafmachine']['plant_component_detector'] = plant_component_detector_section config_data['leafmachine']['archival_component_detector'] = archival_component_detector_section config_data['leafmachine']['armature_component_detector'] = armature_component_detector_section config_data['leafmachine']['landmark_detector'] = landmark_detector_section config_data['leafmachine']['landmark_detector_armature'] = landmark_detector_armature_section config_data['leafmachine']['ruler_detection'] = ruler_detection_section config_data['leafmachine']['leaf_segmentation'] = leaf_segmentation_section return config_data, dir_home def write_config_file(config_data, dir_home, filename="LeafMachine2.yaml"): file_path = os.path.join(dir_home, filename) # Write the data to a YAML file with open(file_path, "w") as outfile: yaml.dump(config_data, outfile, default_flow_style=False) if __name__ == '__main__': config_data, dir_home = build_LM2_config() write_config_file(config_data, dir_home)