diff --git a/wyzely_detect/utils/cli_args.py b/wyzely_detect/utils/cli_args.py index e8a88bb..dcf2766 100644 --- a/wyzely_detect/utils/cli_args.py +++ b/wyzely_detect/utils/cli_args.py @@ -15,16 +15,35 @@ def set_argparse(): else: print("No .env file found") + + # One important thing to consider is that most function parameters are optional and have a default value + # However, with argparse, those are never used since a argparse always passes something, even if it's None argparser = argparse.ArgumentParser( prog="Wyzely Detect", description="Recognize faces/objects in a video stream (from a webcam or a security camera) and send notifications to your devices", # noqa: E501 epilog=":)", ) - # One important thing to consider is that most function parameters are optional and have a default value - # However, with argparse, those are never used since a argparse always passes something, even if it's None - argparser.add_argument( + video_options = argparser.add_argument_group("Video Options") + stream_source = video_options.add_mutually_exclusive_group() + stream_source.add_argument( + "--rtsp-url", + default=os.environ["RTSP_URL"] + if "RTSP_URL" in os.environ and os.environ["RTSP_URL"] != "" + else None, # noqa: E501 + type=str, + help="RTSP camera URL", + ) + stream_source.add_argument( + "--capture-device", + default=os.environ["CAPTURE_DEVICE"] + if "CAPTURE_DEVICE" in os.environ and os.environ["CAPTURE_DEVICE"] != "" + else 0, # noqa: E501 + type=int, + help="Capture device number", + ) + video_options.add_argument( "--run-scale", # Set it to the env RUN_SCALE if it isn't blank, otherwise set it to 0.25 default=os.environ["RUN_SCALE"] @@ -34,7 +53,7 @@ def set_argparse(): type=float, help="The scale to run the detection at, default is 0.25", ) - argparser.add_argument( + video_options.add_argument( "--view-scale", # Set it to the env VIEW_SCALE if it isn't blank, otherwise set it to 0.75 default=os.environ["VIEW_SCALE"] @@ -45,7 +64,7 @@ def set_argparse(): help="The scale to view the detection at, default is 0.75", ) - argparser.add_argument( + video_options.add_argument( "--no-display", default=os.environ["NO_DISPLAY"] if "NO_DISPLAY" in os.environ and os.environ["NO_DISPLAY"] != "" @@ -54,69 +73,7 @@ def set_argparse(): help="Don't display the video feed", ) - argparser.add_argument( - "--object-confidence-threshold", - default=os.environ["OBJECT_CONFIDENCE_THRESHOLD"] - if "OBJECT_CONFIDENCE_THRESHOLD" in os.environ - and os.environ["OBJECT_CONFIDENCE_THRESHOLD"] != "" - else 0.6, - type=float, - help="The confidence threshold to use", - ) - argparser.add_argument( - "--face-confidence-threshold", - default=os.environ["FACE_CONFIDENCE_THRESHOLD"] - if "FACE_CONFIDENCE_THRESHOLD" in os.environ - and os.environ["FACE_CONFIDENCE_THRESHOLD"] != "" - else 0.3, - type=float, - help="The confidence (currently cosine similarity) threshold to use for face recognition", - ) - argparser.add_argument( - "--faces-directory", - default=os.environ["FACES_DIRECTORY"] - if "FACES_DIRECTORY" in os.environ and os.environ["FACES_DIRECTORY"] != "" - else "faces", - type=str, - help="The directory to store the faces. Can either contain images or subdirectories with images, the latter being the preferred method", # noqa: E501 - ) - argparser.add_argument( - "--no-remove-representations", - default=os.environ["NO_REMOVE_REPRESENTATIONS"] - if "NO_REMOVE_REPRESENTATIONS" in os.environ - and os.environ["NO_REMOVE_REPRESENTATIONS"] != "" - else False, - action="store_true", - help="Don't remove representations_.pkl at the start of the program. Greatly improves startup time, but doesn't take into account changes to the faces directory since it was created", # noqa: E501 - ) - argparser.add_argument( - "--detect-object", - nargs="*", - default=[], - type=str, - help="The object(s) to detect. Must be something the model is trained to detect", - ) - stream_source = argparser.add_mutually_exclusive_group() - stream_source.add_argument( - "--rtsp-url", - default=os.environ["RTSP_URL"] - if "RTSP_URL" in os.environ and os.environ["RTSP_URL"] != "" - else None, # noqa: E501 - type=str, - help="The RTSP URL to use", - ) - stream_source.add_argument( - "--capture-device", - default=os.environ["CAPTURE_DEVICE"] - if "CAPTURE_DEVICE" in os.environ and os.environ["CAPTURE_DEVICE"] != "" - else 0, # noqa: E501 - type=int, - help="The capture device to use", - ) - - # Defaults for the stuff here and down are already set in notify.py. - # Setting them here just means that argparse will display the default values as defualt notifcation_services = argparser.add_argument_group("Notification Services") notifcation_services.add_argument( "--ntfy-url", @@ -153,6 +110,56 @@ def set_argparse(): type=int, help="The time (seconds) before another notification can be sent", ) + + + face_recognition = argparser.add_argument_group("Face Recognition options") + face_recognition.add_argument( + "--faces-directory", + default=os.environ["FACES_DIRECTORY"] + if "FACES_DIRECTORY" in os.environ and os.environ["FACES_DIRECTORY"] != "" + else "faces", + type=str, + help="The directory to store the faces. Can either contain images or subdirectories with images, the latter being the preferred method", # noqa: E501 + ) + face_recognition.add_argument( + "--face-confidence-threshold", + default=os.environ["FACE_CONFIDENCE_THRESHOLD"] + if "FACE_CONFIDENCE_THRESHOLD" in os.environ + and os.environ["FACE_CONFIDENCE_THRESHOLD"] != "" + else 0.3, + type=float, + help="The confidence (currently cosine similarity) threshold to use for face recognition", + ) + face_recognition.add_argument( + "--no-remove-representations", + default=os.environ["NO_REMOVE_REPRESENTATIONS"] + if "NO_REMOVE_REPRESENTATIONS" in os.environ + and os.environ["NO_REMOVE_REPRESENTATIONS"] != "" + else False, + action="store_true", + help="Don't remove representations_.pkl at the start of the program. Greatly improves startup time, but doesn't take into account changes to the faces directory since it was created", # noqa: E501 + ) + + + + object_detection = argparser.add_argument_group("Object Detection options") + object_detection.add_argument( + "--detect-object", + nargs="*", + default=[], + type=str, + help="The object(s) to detect. Must be something the model is trained to detect", + ) + object_detection.add_argument( + "--object-confidence-threshold", + default=os.environ["OBJECT_CONFIDENCE_THRESHOLD"] + if "OBJECT_CONFIDENCE_THRESHOLD" in os.environ + and os.environ["OBJECT_CONFIDENCE_THRESHOLD"] != "" + else 0.6, + type=float, + help="The confidence threshold to use", + ) + # return argparser