From ff85a79052564137d9653afb48de4b99e95742cc Mon Sep 17 00:00:00 2001 From: pabloinigoblasco Date: Mon, 11 Nov 2024 21:51:47 +0100 Subject: [PATCH 1/2] classes selection --- LICENSE => image_object_detection/LICENSE | 0 README.md => image_object_detection/README.md | 0 .../config}/image_object_detection.yaml | 0 .../launch}/image_object_detection_launch.py | 0 .../package.xml | 3 +++ .../requirements.txt | 0 .../resource}/image_object_detection | 0 .../resource}/models | 0 .../resource}/utils | 0 setup.cfg => image_object_detection/setup.cfg | 0 setup.py => image_object_detection/setup.py | 0 .../src}/image_object_detection/__init__.py | 0 .../image_object_detection_node.py | 18 ++++++++++++++- .../image_object_detection/test_publisher.py | 0 .../src}/models/__init__.py | 0 .../src}/models/common.py | 0 .../src}/models/detect.py | 0 .../src}/models/experimental.py | 0 .../src}/models/yolo.py | 0 .../src}/utils/__init__.py | 0 .../src}/utils/activations.py | 0 .../src}/utils/add_nms.py | 0 .../src}/utils/autoanchor.py | 0 .../src}/utils/aws/__init__.py | 0 .../src}/utils/aws/mime.sh | 0 .../src}/utils/aws/resume.py | 0 .../src}/utils/aws/userdata.sh | 0 .../src}/utils/datasets.py | 0 .../src}/utils/general.py | 0 .../src}/utils/google_app_engine/Dockerfile | 0 .../additional_requirements.txt | 0 .../src}/utils/google_app_engine/app.yaml | 0 .../src}/utils/google_utils.py | 0 .../src}/utils/loss.py | 0 .../src}/utils/metrics.py | 0 .../src}/utils/plots.py | 0 .../src}/utils/torch_utils.py | 0 .../src}/utils/wandb_logging/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin .../__pycache__/wandb_utils.cpython-38.pyc | Bin .../src}/utils/wandb_logging/log_dataset.py | 0 .../src}/utils/wandb_logging/wandb_utils.py | 0 .../test}/test_copyright.py | 0 .../test}/test_flake8.py | 0 .../test}/test_pep257.py | 0 .../yolov7-tiny.pt | Bin image_object_detection_msgs/CMakeLists.txt | 21 ++++++++++++++++++ image_object_detection_msgs/package.xml | 18 +++++++++++++++ .../srv/SetDetectionClasses.srv | 4 ++++ 49 files changed, 63 insertions(+), 1 deletion(-) rename LICENSE => image_object_detection/LICENSE (100%) rename README.md => image_object_detection/README.md (100%) rename {config => image_object_detection/config}/image_object_detection.yaml (100%) rename {launch => image_object_detection/launch}/image_object_detection_launch.py (100%) rename package.xml => image_object_detection/package.xml (91%) rename requirements.txt => image_object_detection/requirements.txt (100%) rename {resource => image_object_detection/resource}/image_object_detection (100%) rename {resource => image_object_detection/resource}/models (100%) rename {resource => image_object_detection/resource}/utils (100%) rename setup.cfg => image_object_detection/setup.cfg (100%) rename setup.py => image_object_detection/setup.py (100%) rename {src => image_object_detection/src}/image_object_detection/__init__.py (100%) rename {src => image_object_detection/src}/image_object_detection/image_object_detection_node.py (95%) rename {src => image_object_detection/src}/image_object_detection/test_publisher.py (100%) rename {src => image_object_detection/src}/models/__init__.py (100%) rename {src => image_object_detection/src}/models/common.py (100%) rename {src => image_object_detection/src}/models/detect.py (100%) rename {src => image_object_detection/src}/models/experimental.py (100%) rename {src => image_object_detection/src}/models/yolo.py (100%) rename {src => image_object_detection/src}/utils/__init__.py (100%) rename {src => image_object_detection/src}/utils/activations.py (100%) rename {src => image_object_detection/src}/utils/add_nms.py (100%) rename {src => image_object_detection/src}/utils/autoanchor.py (100%) rename {src => image_object_detection/src}/utils/aws/__init__.py (100%) rename {src => image_object_detection/src}/utils/aws/mime.sh (100%) rename {src => image_object_detection/src}/utils/aws/resume.py (100%) rename {src => image_object_detection/src}/utils/aws/userdata.sh (100%) rename {src => image_object_detection/src}/utils/datasets.py (100%) rename {src => image_object_detection/src}/utils/general.py (100%) rename {src => image_object_detection/src}/utils/google_app_engine/Dockerfile (100%) rename {src => image_object_detection/src}/utils/google_app_engine/additional_requirements.txt (100%) rename {src => image_object_detection/src}/utils/google_app_engine/app.yaml (100%) rename {src => image_object_detection/src}/utils/google_utils.py (100%) rename {src => image_object_detection/src}/utils/loss.py (100%) rename {src => image_object_detection/src}/utils/metrics.py (100%) rename {src => image_object_detection/src}/utils/plots.py (100%) rename {src => image_object_detection/src}/utils/torch_utils.py (100%) rename {src => image_object_detection/src}/utils/wandb_logging/__init__.py (100%) rename {src => image_object_detection/src}/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc (100%) rename {src => image_object_detection/src}/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc (100%) rename {src => image_object_detection/src}/utils/wandb_logging/log_dataset.py (100%) rename {src => image_object_detection/src}/utils/wandb_logging/wandb_utils.py (100%) rename {test => image_object_detection/test}/test_copyright.py (100%) rename {test => image_object_detection/test}/test_flake8.py (100%) rename {test => image_object_detection/test}/test_pep257.py (100%) rename yolov7-tiny.pt => image_object_detection/yolov7-tiny.pt (100%) create mode 100644 image_object_detection_msgs/CMakeLists.txt create mode 100644 image_object_detection_msgs/package.xml create mode 100644 image_object_detection_msgs/srv/SetDetectionClasses.srv diff --git a/LICENSE b/image_object_detection/LICENSE similarity index 100% rename from LICENSE rename to image_object_detection/LICENSE diff --git a/README.md b/image_object_detection/README.md similarity index 100% rename from README.md rename to image_object_detection/README.md diff --git a/config/image_object_detection.yaml b/image_object_detection/config/image_object_detection.yaml similarity index 100% rename from config/image_object_detection.yaml rename to image_object_detection/config/image_object_detection.yaml diff --git a/launch/image_object_detection_launch.py b/image_object_detection/launch/image_object_detection_launch.py similarity index 100% rename from launch/image_object_detection_launch.py rename to image_object_detection/launch/image_object_detection_launch.py diff --git a/package.xml b/image_object_detection/package.xml similarity index 91% rename from package.xml rename to image_object_detection/package.xml index 4143738..3c7e08f 100644 --- a/package.xml +++ b/image_object_detection/package.xml @@ -18,8 +18,11 @@ cv_bridge image_transport vision_msgs + std_msgs + image_object_detection_msgs ament_python + diff --git a/requirements.txt b/image_object_detection/requirements.txt similarity index 100% rename from requirements.txt rename to image_object_detection/requirements.txt diff --git a/resource/image_object_detection b/image_object_detection/resource/image_object_detection similarity index 100% rename from resource/image_object_detection rename to image_object_detection/resource/image_object_detection diff --git a/resource/models b/image_object_detection/resource/models similarity index 100% rename from resource/models rename to image_object_detection/resource/models diff --git a/resource/utils b/image_object_detection/resource/utils similarity index 100% rename from resource/utils rename to image_object_detection/resource/utils diff --git a/setup.cfg b/image_object_detection/setup.cfg similarity index 100% rename from setup.cfg rename to image_object_detection/setup.cfg diff --git a/setup.py b/image_object_detection/setup.py similarity index 100% rename from setup.py rename to image_object_detection/setup.py diff --git a/src/image_object_detection/__init__.py b/image_object_detection/src/image_object_detection/__init__.py similarity index 100% rename from src/image_object_detection/__init__.py rename to image_object_detection/src/image_object_detection/__init__.py diff --git a/src/image_object_detection/image_object_detection_node.py b/image_object_detection/src/image_object_detection/image_object_detection_node.py similarity index 95% rename from src/image_object_detection/image_object_detection_node.py rename to image_object_detection/src/image_object_detection/image_object_detection_node.py index 855ddab..f327ded 100644 --- a/src/image_object_detection/image_object_detection_node.py +++ b/image_object_detection/src/image_object_detection/image_object_detection_node.py @@ -28,11 +28,12 @@ from utils.plots import plot_one_box from utils.torch_utils import select_device from vision_msgs.msg import Detection2D, Detection2DArray, ObjectHypothesisWithPose +from image_object_detection_msgs.srv import SetDetectionClasses + from ament_index_python.packages import get_package_share_directory PACKAGE_NAME = "image_object_detection" - class ImageDetectObjectNode(Node): def __init__(self): super().__init__("image_object_detection_node") @@ -112,6 +113,13 @@ def __init__(self): callback=self.set_processing_enabled_callback, ) + self.set_classes_service = self.create_service( + SetDetectionClasses, + 'set_detection_classes', + self.set_detection_classes_callback + ) + + if self.subscribers_qos == "best_effort": self.get_logger().info("Using best effort qos policy for subscribers") self.qos = QoSProfile( @@ -166,6 +174,14 @@ def __init__(self): self.initialize_model() + + def set_detection_classes_callback(self, request, response): + self.selected_detections = request.classes + self.get_logger().info(f"Updated selected_detections: {self.selected_detections}") + response.success = True + response.message = f"Successfully updated detection classes to {self.selected_detections}" + return response + def initialize_model(self): with torch.no_grad(): # Initialize diff --git a/src/image_object_detection/test_publisher.py b/image_object_detection/src/image_object_detection/test_publisher.py similarity index 100% rename from src/image_object_detection/test_publisher.py rename to image_object_detection/src/image_object_detection/test_publisher.py diff --git a/src/models/__init__.py b/image_object_detection/src/models/__init__.py similarity index 100% rename from src/models/__init__.py rename to image_object_detection/src/models/__init__.py diff --git a/src/models/common.py b/image_object_detection/src/models/common.py similarity index 100% rename from src/models/common.py rename to image_object_detection/src/models/common.py diff --git a/src/models/detect.py b/image_object_detection/src/models/detect.py similarity index 100% rename from src/models/detect.py rename to image_object_detection/src/models/detect.py diff --git a/src/models/experimental.py b/image_object_detection/src/models/experimental.py similarity index 100% rename from src/models/experimental.py rename to image_object_detection/src/models/experimental.py diff --git a/src/models/yolo.py b/image_object_detection/src/models/yolo.py similarity index 100% rename from src/models/yolo.py rename to image_object_detection/src/models/yolo.py diff --git a/src/utils/__init__.py b/image_object_detection/src/utils/__init__.py similarity index 100% rename from src/utils/__init__.py rename to image_object_detection/src/utils/__init__.py diff --git a/src/utils/activations.py b/image_object_detection/src/utils/activations.py similarity index 100% rename from src/utils/activations.py rename to image_object_detection/src/utils/activations.py diff --git a/src/utils/add_nms.py b/image_object_detection/src/utils/add_nms.py similarity index 100% rename from src/utils/add_nms.py rename to image_object_detection/src/utils/add_nms.py diff --git a/src/utils/autoanchor.py b/image_object_detection/src/utils/autoanchor.py similarity index 100% rename from src/utils/autoanchor.py rename to image_object_detection/src/utils/autoanchor.py diff --git a/src/utils/aws/__init__.py b/image_object_detection/src/utils/aws/__init__.py similarity index 100% rename from src/utils/aws/__init__.py rename to image_object_detection/src/utils/aws/__init__.py diff --git a/src/utils/aws/mime.sh b/image_object_detection/src/utils/aws/mime.sh similarity index 100% rename from src/utils/aws/mime.sh rename to image_object_detection/src/utils/aws/mime.sh diff --git a/src/utils/aws/resume.py b/image_object_detection/src/utils/aws/resume.py similarity index 100% rename from src/utils/aws/resume.py rename to image_object_detection/src/utils/aws/resume.py diff --git a/src/utils/aws/userdata.sh b/image_object_detection/src/utils/aws/userdata.sh similarity index 100% rename from src/utils/aws/userdata.sh rename to image_object_detection/src/utils/aws/userdata.sh diff --git a/src/utils/datasets.py b/image_object_detection/src/utils/datasets.py similarity index 100% rename from src/utils/datasets.py rename to image_object_detection/src/utils/datasets.py diff --git a/src/utils/general.py b/image_object_detection/src/utils/general.py similarity index 100% rename from src/utils/general.py rename to image_object_detection/src/utils/general.py diff --git a/src/utils/google_app_engine/Dockerfile b/image_object_detection/src/utils/google_app_engine/Dockerfile similarity index 100% rename from src/utils/google_app_engine/Dockerfile rename to image_object_detection/src/utils/google_app_engine/Dockerfile diff --git a/src/utils/google_app_engine/additional_requirements.txt b/image_object_detection/src/utils/google_app_engine/additional_requirements.txt similarity index 100% rename from src/utils/google_app_engine/additional_requirements.txt rename to image_object_detection/src/utils/google_app_engine/additional_requirements.txt diff --git a/src/utils/google_app_engine/app.yaml b/image_object_detection/src/utils/google_app_engine/app.yaml similarity index 100% rename from src/utils/google_app_engine/app.yaml rename to image_object_detection/src/utils/google_app_engine/app.yaml diff --git a/src/utils/google_utils.py b/image_object_detection/src/utils/google_utils.py similarity index 100% rename from src/utils/google_utils.py rename to image_object_detection/src/utils/google_utils.py diff --git a/src/utils/loss.py b/image_object_detection/src/utils/loss.py similarity index 100% rename from src/utils/loss.py rename to image_object_detection/src/utils/loss.py diff --git a/src/utils/metrics.py b/image_object_detection/src/utils/metrics.py similarity index 100% rename from src/utils/metrics.py rename to image_object_detection/src/utils/metrics.py diff --git a/src/utils/plots.py b/image_object_detection/src/utils/plots.py similarity index 100% rename from src/utils/plots.py rename to image_object_detection/src/utils/plots.py diff --git a/src/utils/torch_utils.py b/image_object_detection/src/utils/torch_utils.py similarity index 100% rename from src/utils/torch_utils.py rename to image_object_detection/src/utils/torch_utils.py diff --git a/src/utils/wandb_logging/__init__.py b/image_object_detection/src/utils/wandb_logging/__init__.py similarity index 100% rename from src/utils/wandb_logging/__init__.py rename to image_object_detection/src/utils/wandb_logging/__init__.py diff --git a/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc b/image_object_detection/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc similarity index 100% rename from src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc rename to image_object_detection/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc diff --git a/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc b/image_object_detection/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc similarity index 100% rename from src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc rename to image_object_detection/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc diff --git a/src/utils/wandb_logging/log_dataset.py b/image_object_detection/src/utils/wandb_logging/log_dataset.py similarity index 100% rename from src/utils/wandb_logging/log_dataset.py rename to image_object_detection/src/utils/wandb_logging/log_dataset.py diff --git a/src/utils/wandb_logging/wandb_utils.py b/image_object_detection/src/utils/wandb_logging/wandb_utils.py similarity index 100% rename from src/utils/wandb_logging/wandb_utils.py rename to image_object_detection/src/utils/wandb_logging/wandb_utils.py diff --git a/test/test_copyright.py b/image_object_detection/test/test_copyright.py similarity index 100% rename from test/test_copyright.py rename to image_object_detection/test/test_copyright.py diff --git a/test/test_flake8.py b/image_object_detection/test/test_flake8.py similarity index 100% rename from test/test_flake8.py rename to image_object_detection/test/test_flake8.py diff --git a/test/test_pep257.py b/image_object_detection/test/test_pep257.py similarity index 100% rename from test/test_pep257.py rename to image_object_detection/test/test_pep257.py diff --git a/yolov7-tiny.pt b/image_object_detection/yolov7-tiny.pt similarity index 100% rename from yolov7-tiny.pt rename to image_object_detection/yolov7-tiny.pt diff --git a/image_object_detection_msgs/CMakeLists.txt b/image_object_detection_msgs/CMakeLists.txt new file mode 100644 index 0000000..107bf4a --- /dev/null +++ b/image_object_detection_msgs/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.8) +project(image_object_detection_msgs) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +find_package(ament_cmake REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +rosidl_generate_interfaces(${PROJECT_NAME} + "srv/SetDetectionClasses.srv" +) + +ament_export_dependencies(rosidl_default_runtime) +install( + DIRECTORY srv + DESTINATION share/${PROJECT_NAME} +) + +ament_package() \ No newline at end of file diff --git a/image_object_detection_msgs/package.xml b/image_object_detection_msgs/package.xml new file mode 100644 index 0000000..aed5890 --- /dev/null +++ b/image_object_detection_msgs/package.xml @@ -0,0 +1,18 @@ + + + + image_object_detection_msgs + 1.0.0 + Messages for image object detection + Pablo IƱigo Blasco + BSD-3-Clause + + ament_cmake + rosidl_default_generators + rosidl_default_runtime + rosidl_interface_packages + + + ament_cmake + + diff --git a/image_object_detection_msgs/srv/SetDetectionClasses.srv b/image_object_detection_msgs/srv/SetDetectionClasses.srv new file mode 100644 index 0000000..cc5e818 --- /dev/null +++ b/image_object_detection_msgs/srv/SetDetectionClasses.srv @@ -0,0 +1,4 @@ +string[] classes +--- +bool success +string message From 1f42c56a9caa59d32c66d537b5002fe563ae2e6e Mon Sep 17 00:00:00 2001 From: pabloinigoblasco Date: Mon, 11 Nov 2024 21:52:25 +0100 Subject: [PATCH 2/2] minor --- .../__pycache__/__init__.cpython-38.pyc | Bin 173 -> 0 bytes .../__pycache__/wandb_utils.cpython-38.pyc | Bin 11379 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 image_object_detection/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc delete mode 100644 image_object_detection/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc diff --git a/image_object_detection/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc b/image_object_detection/src/utils/wandb_logging/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index f5eb56d516c615c1039768c69f1c361a5f2febcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmWIL<>g`kg1PJMli7guV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~EAApMN|+*JLd z{KO)C$Dk1Xg4Ckq)Pj=C{5<{K{FKz3_>!W`#GGRN%KV)CGV}P%yp&4)(vnP|NO@vj oN>Y4IetLRlUb=ofP%5(|K3=b&@)m~;P-|&UsvXF#&p^xo02h!f%m4rY diff --git a/image_object_detection/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc b/image_object_detection/src/utils/wandb_logging/__pycache__/wandb_utils.cpython-38.pyc deleted file mode 100644 index a67c72084c0945359366496bd8b8519b85e919e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11379 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 Do0Hx=