Coverage for orchestrant/yolo/cli.py: 100%

35 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-22 09:57 +0000

1"""CLI argument parsing for the YOLO monitor.""" 

2 

3from __future__ import annotations 

4 

5import argparse 

6 

7from orchestrant.paths import default_model_path 

8 

9 

10def parse_args(argv: list[str] | None = None) -> argparse.Namespace: 

11 """Parse command line arguments.""" 

12 parser = argparse.ArgumentParser( 

13 description="Object Detection with System Monitoring", 

14 formatter_class=argparse.RawDescriptionHelpFormatter, 

15 epilog=""" 

16 Examples: 

17 yolo-monitor --backend opencv 

18 yolo-monitor --backend gstreamer 

19 yolo-monitor --backend gstreamer --width 1280 --height 720 --fps 60 

20 yolo-monitor --web --host 0.0.0.0 

21 """, 

22 ) 

23 

24 parser.add_argument( 

25 "--backend", type=str, choices=["opencv", "gstreamer"], default="opencv" 

26 ) 

27 parser.add_argument( 

28 "--ui", 

29 type=str, 

30 choices=["auto", "flet", "opencv"], 

31 default="auto", 

32 help="flet: the Flet viewer; opencv: OpenCV's window; auto: flet where installed", 

33 ) 

34 parser.add_argument( 

35 "--web", 

36 action="store_true", 

37 help="Serve the Flet viewer to browsers instead of opening a window", 

38 ) 

39 parser.add_argument("--host", default="127.0.0.1", help="Address --web binds") 

40 parser.add_argument("--port", type=int, default=8550, help="Port --web serves on") 

41 parser.add_argument("--camera", type=int, default=0) 

42 parser.add_argument("--width", type=int, default=1920) 

43 parser.add_argument("--height", type=int, default=1080) 

44 parser.add_argument("--fps", type=int, default=30) 

45 parser.add_argument( 

46 "--model", 

47 type=str, 

48 default=None, 

49 help="ONNX model; default: $ORCHESTRANT_MODEL, the install's models dir, then resources/models (how to fetch it: resources/models/README.md)", 

50 ) 

51 parser.add_argument( 

52 "--self-test", 

53 action="store_true", 

54 help="Load the model, run one inference on a blank frame and exit; needs no camera or display", 

55 ) 

56 parser.add_argument("--conf", type=float, default=0.5) 

57 parser.add_argument("--gpu", type=int, default=0) 

58 parser.add_argument("--no-display", action="store_true") 

59 _add_overlay_args(parser) 

60 _add_debug_args(parser) 

61 

62 args = parser.parse_args(argv) 

63 if args.model is None: 

64 args.model = str(default_model_path()) 

65 return args 

66 

67 

68def _add_overlay_args(parser: argparse.ArgumentParser) -> None: 

69 parser.add_argument( 

70 "--cpu-plot", 

71 action="store_true", 

72 help="Show 2D time-series plot of this process CPU%% over time", 

73 ) 

74 parser.add_argument( 

75 "--cpu-history", 

76 type=int, 

77 default=180, 

78 help="Number of samples kept for process CPU history plot", 

79 ) 

80 parser.add_argument( 

81 "--map", 

82 action="store_true", 

83 help="Enable 2D running minimap (person trails) overlay", 

84 ) 

85 parser.add_argument( 

86 "--map-size", 

87 type=int, 

88 default=260, 

89 help="Size (px) of the 2D running minimap overlay", 

90 ) 

91 

92 

93def _add_debug_args(parser: argparse.ArgumentParser) -> None: 

94 parser.add_argument( 

95 "--debug-output", 

96 action="store_true", 

97 help="Log raw model output shapes once at startup", 

98 ) 

99 parser.add_argument( 

100 "--debug-detections", 

101 action="store_true", 

102 help="Log sample decoded detections every few seconds", 

103 ) 

104 parser.add_argument( 

105 "--debug-boxes", 

106 action="store_true", 

107 help="Log decoded bbox coordinates for debugging", 

108 ) 

109 parser.add_argument( 

110 "--log-level", 

111 type=str, 

112 default="DEBUG", 

113 choices=["TRACE", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], 

114 )