From d2f65aeef156b5f177c7104d50fbb33932af0afa Mon Sep 17 00:00:00 2001 From: Jasmeet Singh Date: Tue, 27 Feb 2024 00:49:35 +0530 Subject: [PATCH] Added load_parameters() function and updated logger --- object_detection/config/params.yaml | 7 +- .../object_detection/ObjectDetection.py | 66 +++++++++++-------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/object_detection/config/params.yaml b/object_detection/config/params.yaml index eb69547..d235775 100644 --- a/object_detection/config/params.yaml +++ b/object_detection/config/params.yaml @@ -1,12 +1,11 @@ object_detection: ros__parameters: - input_img_topic: /kitti/camera/color/left/image_raw + input_img_topic: color/image_raw output_bb_topic: object_detection/img_bb output_img_topic: object_detection/img - publish_output_img: 1 model_params: detector_type: YOLOv5 model_dir_path: /root/percep_ws/models/yolov5 weight_file_name: yolov5.onnx - confidence_threshold : 0.5 - show_fps : 1 \ No newline at end of file + confidence_threshold: 0.5 + show_fps: 1 \ No newline at end of file diff --git a/object_detection/object_detection/ObjectDetection.py b/object_detection/object_detection/ObjectDetection.py index 5e1848d..18c65e5 100644 --- a/object_detection/object_detection/ObjectDetection.py +++ b/object_detection/object_detection/ObjectDetection.py @@ -32,49 +32,63 @@ class ObjectDetection(Node): def __init__(self): super().__init__('object_detection') - # create an empty list that will hold the names of all available detector + # Create an empty list that will hold the names of all available detector self.available_detectors = [] + # Create a logger instance + self.logger = super().get_logger() + + # Declare parameters with default values self.declare_parameters( namespace='', parameters=[ - ('input_img_topic', ''), - ('output_bb_topic', ''), - ('output_img_topic', ''), - ('model_params.detector_type', ''), - ('model_params.model_dir_path', ''), - ('model_params.weight_file_name', ''), - ('model_params.confidence_threshold', 0.7), + ('input_img_topic', 'color/image_raw'), + ('output_bb_topic', 'object_detection/img_bb'), + ('output_img_topic', 'object_detection/img'), + ('model_params.detector_type', 'YOLOv5'), + ('model_params.model_dir_path', '/root/percep_ws/models/yolov5'), + ('model_params.weight_file_name', 'yolov5.onnx'), + ('model_params.confidence_threshold', 0.5), ('model_params.show_fps', 1), ] ) - - # node params - self.input_img_topic = self.get_parameter('input_img_topic').value - self.output_bb_topic = self.get_parameter('output_bb_topic').value - self.output_img_topic = self.get_parameter('output_img_topic').value - - # model params - self.detector_type = self.get_parameter('model_params.detector_type').value - self.model_dir_path = self.get_parameter('model_params.model_dir_path').value - self.weight_file_name = self.get_parameter('model_params.weight_file_name').value - self.confidence_threshold = self.get_parameter('model_params.confidence_threshold').value - self.show_fps = self.get_parameter('model_params.show_fps').value + # Load parameters set by user + self.load_parameters() # Fill available_detectors with the detectors from Detectors directory self.discover_detectors() # Load the detector specified through the parameters self.load_detector() - # Create a logger instance - self.logger = self.get_logger() - self.img_pub = self.create_publisher(Image, self.output_img_topic, 10) self.bb_pub = None self.img_sub = self.create_subscription(Image, self.input_img_topic, self.detection_cb, 10) self.bridge = CvBridge() + self.logger.info("[OBJECT DETECTION] Initialized Object Detection Node") + + def load_parameters(self): + # Node params + self.input_img_topic = self.get_parameter('input_img_topic').value + self.output_bb_topic = self.get_parameter('output_bb_topic').value + self.output_img_topic = self.get_parameter('output_img_topic').value + + self.logger.info("[OBJECT DETECTION] Input image topic set to {}".format(self.input_img_topic)) + self.logger.info("[OBJECT DETECTION] Publishig output image on topic {}".format(self.output_img_topic) + + " and bounding box data on topic {}".format(self.output_bb_topic)) + + # Model params + self.detector_type = self.get_parameter('model_params.detector_type').value + self.model_dir_path = self.get_parameter('model_params.model_dir_path').value + self.weight_file_name = self.get_parameter('model_params.weight_file_name').value + self.confidence_threshold = self.get_parameter('model_params.confidence_threshold').value + self.show_fps = self.get_parameter('model_params.show_fps').value + + self.logger.info("[OBJECT DETECTION] Detector type set to {} and".format(self.detector_type) + + " using weigth file from {}".format(self.model_dir_path + self.weight_file_name)) + self.logger.info("[OBJECT DETECTION] Confidence threshold for detection set to: {}".format(self.confidence_threshold)) + def discover_detectors(self): curr_dir = os.path.dirname(__file__) dir_contents = os.listdir(curr_dir + "/Detectors") @@ -88,7 +102,7 @@ def discover_detectors(self): def load_detector(self): # Raise an exception if specified detector was not found if self.detector_type not in self.available_detectors: - self.logger.error("{} Detector was set in parameters but was not found. Check the " + + self.logger.error("[OBJECT DETECTION] {} Detector was set in parameters but was not found. Check the " + "Detectors directory for list of available detectors".format(self.detector_type)) raise ModuleNotFoundError(self.detector_type + " Detector specified in config was not found. " + "Check the Detectors dir for available detectors.") @@ -101,7 +115,7 @@ def load_detector(self): self.detector.build_model(self.model_dir_path, self.weight_file_name) self.detector.load_classes(self.model_dir_path) - self.logger.info("Your detector: {} has been loaded!".format(self.detector_type)) + self.logger.info("[OBJECT DETECTION] Your detector: {} has been loaded!".format(self.detector_type)) def detection_cb(self, img_msg): cv_image = self.bridge.imgmsg_to_cv2(img_msg, "bgr8") @@ -109,7 +123,7 @@ def detection_cb(self, img_msg): predictions = self.detector.get_predictions(cv_image=cv_image) if predictions is None: - self.logger.warning("Image input from topic: {} is empty".format(self.input_img_topic), throttle_duration_sec=1) + self.logger.warning("[OBJECT DETECTION] Image input from topic: {} is empty".format(self.input_img_topic), throttle_duration_sec=1) else: for prediction in predictions: confidence = prediction['confidence']