CelestialSurveyor
/
main.py
113 строк · 6.5 Кб
1
2if __name__ == '__main__':3from multiprocessing import freeze_support4
5freeze_support()6import argparse7import os8import sys9
10from backend.find_asteroids import predict_asteroids, save_results, annotate_results11from backend.progress_bar import ProgressBarCli12from backend.source_data_v2 import SourceDataV213from logger.logger import get_logger14from user_interface.main_window import start_ui15
16logger = get_logger()17
18version = "0.3.0"19arg_parser = argparse.ArgumentParser(20prog='CelestialSurveyor',21description='It\'s is designed to analyze astronomical images with the primary goal of identifying and '22'locating asteroids and comets within the vastness of the cosmic terrain')23
24arg_parser.add_argument('-c', '--cli_mode', dest='cli_mode', action="store_true", default=False,25help='Run app in command line mode')26arg_parser.add_argument('-s', '--source_folder', dest='source_folder', type=str, required=False,27help='Path to the folder with xisf or fit or fits files to be analyzed')28arg_parser.add_argument('-o', '--output_folder', dest='output_folder', type=str, required=False,29help='Path to the folder where results will be stored')30arg_parser.add_argument('--dark_folder', dest='dark_folder', type=str, required=False, default="",31help='Path to the folder with Dark frames (Optional)')32arg_parser.add_argument('--flat_folder', dest='flat_folder', type=str, required=False, default="",33help='Path to the folder with Flat frames (Optional). Work only if DarkFlat '34'folder is provided')35arg_parser.add_argument('--dark_flat_folder', dest='dark_flat_folder', type=str, required=False,36default="",37help='Path to the folder with DarkFlat frames (Optional). Work only if DarkFlat '38'folder is provided')39arg_parser.add_argument('-m', '--model_path', dest='model_path',40type=str, default="",41required=False,42help='Path to the AI model file')43arg_parser.add_argument('-n', '--non_linear', dest='non_linear', action="store_true", required=False,44help='Provide this key if the images are not in linear state')45arg_parser.add_argument('-d', '--debayer', dest='debayer', action="store_true", required=False,46default=False, help='Debayer color FIT images if required')47arg_parser.add_argument('-a', '--align', dest='align_images', action="store_true", required=False,48default=False, help='Do image alignment when loading')49arg_parser.add_argument('-v', '--version', dest='version', action="store_true", required=False,50help='Display version of this app.')51arg_parser.add_argument('-l', '--magnitude_limit', dest='magnitude_limit', type=float, required=False,52default='18.0')53provided_args = arg_parser.parse_args()54
55if provided_args.version:56print(f"CelestialSurveyor v{version}")57if not provided_args.cli_mode:58start_ui()59else:60if not os.path.exists(provided_args.source_folder):61logger.log.error(f"Provided source folder {provided_args.source_folder} does not exist")62sys.exit(0)63if not os.path.exists(provided_args.output_folder):64try:65os.makedirs(provided_args.output_folder)66except Exception as e:67logger.log.error(f"Unable to create output folder {provided_args.output_folder} due to {str(e)}")68sys.exit(0)69if provided_args.magnitude_limit >= 25.0:70logger.log.error(71f"Provided magnitude limit {provided_args.magnitude_limit} is too high. Maximum value is 25.0")72sys.exit(0)73if provided_args.model_path and not os.path.exists(provided_args.model_path):74logger.log.error(f"Provided model path {provided_args.model_path} does not exist")75sys.exit(0)76if provided_args.flat_folder and not os.path.exists(provided_args.flat_folder):77logger.log.error(f"Provided flat folder {provided_args.flat_folder} does not exist")78sys.exit(0)79if provided_args.dark_folder and not os.path.exists(provided_args.dark_folder):80logger.log.error(f"Provided dark folder {provided_args.dark_folder} does not exist")81sys.exit(0)82if provided_args.dark_flat_folder and not os.path.exists(provided_args.dark_flat_folder):83logger.log.error(f"Provided dark flat folder {provided_args.dark_flat_folder} does not exist")84sys.exit(0)85
86source_data = SourceDataV2(provided_args.debayer)87img_paths = source_data.make_file_paths(provided_args.source_folder)88source_data.extend_headers(file_list=img_paths)89source_data.load_images(progress_bar=ProgressBarCli())90dark_files = source_data.make_file_paths(provided_args.dark_folder) if provided_args.dark_folder else None91flat_files = source_data.make_file_paths(provided_args.flat_folder) if provided_args.flat_folder else None92dark_flat_files = source_data.make_file_paths(93provided_args.dark_flat_folder) if provided_args.dark_flat_folder else None94
95source_data.calibrate_images(96dark_files=dark_files,97flat_files=flat_files,98dark_flat_files=dark_flat_files,99progress_bar=ProgressBarCli())100if provided_args.align_images:101source_data.plate_solve_all(progress_bar=ProgressBarCli())102source_data.align_images_wcs(progress_bar=ProgressBarCli())103source_data.crop_images()104if not provided_args.non_linear:105source_data.stretch_images(progress_bar=ProgressBarCli())106source_data.images_from_buffer()107
108results = predict_asteroids(source_data, model_path=provided_args.model_path, progress_bar=ProgressBarCli())109image_to_annotate = save_results(source_data=source_data, results=results,110output_folder=provided_args.output_folder)111
112magnitude_limit = float(provided_args.magnitude_limit)113annotate_results(source_data, image_to_annotate, provided_args.output_folder, magnitude_limit=magnitude_limit)114logger.log.info(f"Results are saved in {provided_args.output_folder}")115