From 9069d699be451d31e44551415c39c5b208c45e61 Mon Sep 17 00:00:00 2001 From: apoorva Date: Tue, 28 Mar 2023 17:22:37 +0530 Subject: [PATCH] ros package to run yolo detection with ros --- .../launch/pipe_detection.launch.py | 25 + ros2_ws/src/yolov3_ros/models/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 154 bytes .../models/__pycache__/common.cpython-310.pyc | Bin 0 -> 26093 bytes .../__pycache__/experimental.cpython-310.pyc | Bin 0 -> 4934 bytes .../models/__pycache__/yolo.cpython-310.pyc | Bin 0 -> 12942 bytes ros2_ws/src/yolov3_ros/models/common.py | 593 ++++++++ ros2_ws/src/yolov3_ros/models/experimental.py | 121 ++ .../src/yolov3_ros/models/hub/anchors.yaml | 59 + .../yolov3_ros/models/hub/yolov5-bifpn.yaml | 48 + .../src/yolov3_ros/models/hub/yolov5-fpn.yaml | 42 + .../src/yolov3_ros/models/hub/yolov5-p2.yaml | 54 + .../src/yolov3_ros/models/hub/yolov5-p34.yaml | 41 + .../src/yolov3_ros/models/hub/yolov5-p6.yaml | 56 + .../src/yolov3_ros/models/hub/yolov5-p7.yaml | 67 + .../yolov3_ros/models/hub/yolov5-panet.yaml | 48 + .../src/yolov3_ros/models/hub/yolov5l6.yaml | 60 + .../src/yolov3_ros/models/hub/yolov5m6.yaml | 60 + .../src/yolov3_ros/models/hub/yolov5n6.yaml | 60 + .../models/hub/yolov5s-LeakyReLU.yaml | 49 + .../yolov3_ros/models/hub/yolov5s-ghost.yaml | 48 + .../models/hub/yolov5s-transformer.yaml | 48 + .../src/yolov3_ros/models/hub/yolov5s6.yaml | 60 + .../src/yolov3_ros/models/hub/yolov5x6.yaml | 60 + .../models/segment/yolov5l-seg.yaml | 48 + .../models/segment/yolov5m-seg.yaml | 48 + .../models/segment/yolov5n-seg.yaml | 48 + .../models/segment/yolov5s-seg.yaml | 48 + .../models/segment/yolov5x-seg.yaml | 48 + ros2_ws/src/yolov3_ros/models/tf.py | 628 +++++++++ ros2_ws/src/yolov3_ros/models/yolo.py | 336 +++++ ros2_ws/src/yolov3_ros/models/yolov3-spp.yaml | 51 + .../src/yolov3_ros/models/yolov3-tiny.yaml | 41 + ros2_ws/src/yolov3_ros/models/yolov3.yaml | 51 + ros2_ws/src/yolov3_ros/models/yolov5l.yaml | 48 + ros2_ws/src/yolov3_ros/models/yolov5m.yaml | 48 + ros2_ws/src/yolov3_ros/models/yolov5n.yaml | 48 + ros2_ws/src/yolov3_ros/models/yolov5s.yaml | 48 + ros2_ws/src/yolov3_ros/models/yolov5x.yaml | 48 + ros2_ws/src/yolov3_ros/package.xml | 18 + ros2_ws/src/yolov3_ros/resource/yolov3_ros | 0 ros2_ws/src/yolov3_ros/setup.cfg | 4 + ros2_ws/src/yolov3_ros/setup.py | 43 + ros2_ws/src/yolov3_ros/test/test_copyright.py | 25 + ros2_ws/src/yolov3_ros/test/test_flake8.py | 25 + ros2_ws/src/yolov3_ros/test/test_pep257.py | 23 + ros2_ws/src/yolov3_ros/utils/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 568 bytes .../__pycache__/augmentations.cpython-310.pyc | Bin 0 -> 9107 bytes .../__pycache__/autoanchor.cpython-310.pyc | Bin 0 -> 6274 bytes .../__pycache__/datasets.cpython-310.pyc | Bin 0 -> 35713 bytes .../__pycache__/downloads.cpython-310.pyc | Bin 0 -> 3954 bytes .../utils/__pycache__/general.cpython-310.pyc | Bin 0 -> 30294 bytes .../utils/__pycache__/metrics.cpython-310.pyc | Bin 0 -> 10975 bytes .../utils/__pycache__/plots.cpython-310.pyc | Bin 0 -> 18009 bytes .../__pycache__/torch_utils.cpython-310.pyc | Bin 0 -> 11921 bytes ros2_ws/src/yolov3_ros/utils/activations.py | 101 ++ ros2_ws/src/yolov3_ros/utils/augmentations.py | 277 ++++ ros2_ws/src/yolov3_ros/utils/autoanchor.py | 164 +++ ros2_ws/src/yolov3_ros/utils/autobatch.py | 57 + ros2_ws/src/yolov3_ros/utils/aws/__init__.py | 0 ros2_ws/src/yolov3_ros/utils/aws/mime.sh | 26 + ros2_ws/src/yolov3_ros/utils/aws/resume.py | 40 + ros2_ws/src/yolov3_ros/utils/aws/userdata.sh | 27 + ros2_ws/src/yolov3_ros/utils/callbacks.py | 76 + ros2_ws/src/yolov3_ros/utils/dataloaders.py | 1221 +++++++++++++++++ ros2_ws/src/yolov3_ros/utils/datasets.py | 1036 ++++++++++++++ .../src/yolov3_ros/utils/docker/Dockerfile | 75 + .../yolov3_ros/utils/docker/Dockerfile-arm64 | 41 + .../yolov3_ros/utils/docker/Dockerfile-cpu | 42 + ros2_ws/src/yolov3_ros/utils/downloads.py | 149 ++ .../yolov3_ros/utils/flask_rest_api/README.md | 73 + .../utils/flask_rest_api/example_request.py | 19 + .../utils/flask_rest_api/restapi.py | 48 + ros2_ws/src/yolov3_ros/utils/general.py | 841 ++++++++++++ .../utils/google_app_engine/Dockerfile | 25 + .../additional_requirements.txt | 4 + .../utils/google_app_engine/app.yaml | 14 + .../src/yolov3_ros/utils/loggers/__init__.py | 159 +++ .../utils/loggers/clearml/README.md | 271 ++++ .../utils/loggers/clearml/__init__.py | 0 .../utils/loggers/clearml/clearml_utils.py | 164 +++ .../yolov3_ros/utils/loggers/clearml/hpo.py | 84 ++ .../yolov3_ros/utils/loggers/comet/README.md | 284 ++++ .../utils/loggers/comet/__init__.py | 508 +++++++ .../utils/loggers/comet/comet_utils.py | 150 ++ .../src/yolov3_ros/utils/loggers/comet/hpo.py | 118 ++ .../utils/loggers/comet/optimizer_config.json | 209 +++ .../yolov3_ros/utils/loggers/wandb/README.md | 147 ++ .../utils/loggers/wandb/__init__.py | 0 .../utils/loggers/wandb/log_dataset.py | 27 + .../yolov3_ros/utils/loggers/wandb/sweep.py | 41 + .../yolov3_ros/utils/loggers/wandb/sweep.yaml | 143 ++ .../utils/loggers/wandb/wandb_utils.py | 532 +++++++ ros2_ws/src/yolov3_ros/utils/loss.py | 234 ++++ ros2_ws/src/yolov3_ros/utils/metrics.py | 331 +++++ ros2_ws/src/yolov3_ros/utils/plots.py | 469 +++++++ .../src/yolov3_ros/utils/segment/__init__.py | 0 .../yolov3_ros/utils/segment/augmentations.py | 104 ++ .../yolov3_ros/utils/segment/dataloaders.py | 332 +++++ .../src/yolov3_ros/utils/segment/general.py | 160 +++ ros2_ws/src/yolov3_ros/utils/segment/loss.py | 186 +++ .../src/yolov3_ros/utils/segment/metrics.py | 210 +++ ros2_ws/src/yolov3_ros/utils/segment/plots.py | 143 ++ ros2_ws/src/yolov3_ros/utils/torch_utils.py | 318 +++++ ros2_ws/src/yolov3_ros/utils/triton.py | 85 ++ ros2_ws/src/yolov3_ros/yolov3_ros/__init__.py | 0 .../yolov3_ros/yolov3_ros/yolov3_ros_node.py | 257 ++++ 108 files changed, 13364 insertions(+) create mode 100644 ros2_ws/src/yolov3_ros/launch/pipe_detection.launch.py create mode 100644 ros2_ws/src/yolov3_ros/models/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/models/__pycache__/__init__.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/models/__pycache__/common.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/models/__pycache__/experimental.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/models/__pycache__/yolo.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/models/common.py create mode 100644 ros2_ws/src/yolov3_ros/models/experimental.py create mode 100644 ros2_ws/src/yolov3_ros/models/hub/anchors.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-bifpn.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-fpn.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-p2.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-p34.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-p6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-p7.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5-panet.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5l6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5m6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5n6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5s-LeakyReLU.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5s-ghost.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5s-transformer.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5s6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/hub/yolov5x6.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/segment/yolov5l-seg.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/segment/yolov5m-seg.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/segment/yolov5n-seg.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/segment/yolov5s-seg.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/segment/yolov5x-seg.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/tf.py create mode 100644 ros2_ws/src/yolov3_ros/models/yolo.py create mode 100644 ros2_ws/src/yolov3_ros/models/yolov3-spp.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov3-tiny.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov3.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov5l.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov5m.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov5n.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov5s.yaml create mode 100644 ros2_ws/src/yolov3_ros/models/yolov5x.yaml create mode 100644 ros2_ws/src/yolov3_ros/package.xml create mode 100644 ros2_ws/src/yolov3_ros/resource/yolov3_ros create mode 100644 ros2_ws/src/yolov3_ros/setup.cfg create mode 100644 ros2_ws/src/yolov3_ros/setup.py create mode 100644 ros2_ws/src/yolov3_ros/test/test_copyright.py create mode 100644 ros2_ws/src/yolov3_ros/test/test_flake8.py create mode 100644 ros2_ws/src/yolov3_ros/test/test_pep257.py create mode 100644 ros2_ws/src/yolov3_ros/utils/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/augmentations.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/autoanchor.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/datasets.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/downloads.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/general.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/metrics.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/plots.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/__pycache__/torch_utils.cpython-310.pyc create mode 100644 ros2_ws/src/yolov3_ros/utils/activations.py create mode 100644 ros2_ws/src/yolov3_ros/utils/augmentations.py create mode 100644 ros2_ws/src/yolov3_ros/utils/autoanchor.py create mode 100644 ros2_ws/src/yolov3_ros/utils/autobatch.py create mode 100644 ros2_ws/src/yolov3_ros/utils/aws/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/aws/mime.sh create mode 100644 ros2_ws/src/yolov3_ros/utils/aws/resume.py create mode 100644 ros2_ws/src/yolov3_ros/utils/aws/userdata.sh create mode 100644 ros2_ws/src/yolov3_ros/utils/callbacks.py create mode 100644 ros2_ws/src/yolov3_ros/utils/dataloaders.py create mode 100755 ros2_ws/src/yolov3_ros/utils/datasets.py create mode 100644 ros2_ws/src/yolov3_ros/utils/docker/Dockerfile create mode 100644 ros2_ws/src/yolov3_ros/utils/docker/Dockerfile-arm64 create mode 100644 ros2_ws/src/yolov3_ros/utils/docker/Dockerfile-cpu create mode 100644 ros2_ws/src/yolov3_ros/utils/downloads.py create mode 100644 ros2_ws/src/yolov3_ros/utils/flask_rest_api/README.md create mode 100644 ros2_ws/src/yolov3_ros/utils/flask_rest_api/example_request.py create mode 100644 ros2_ws/src/yolov3_ros/utils/flask_rest_api/restapi.py create mode 100755 ros2_ws/src/yolov3_ros/utils/general.py create mode 100644 ros2_ws/src/yolov3_ros/utils/google_app_engine/Dockerfile create mode 100644 ros2_ws/src/yolov3_ros/utils/google_app_engine/additional_requirements.txt create mode 100644 ros2_ws/src/yolov3_ros/utils/google_app_engine/app.yaml create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/clearml/README.md create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/clearml/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/clearml/clearml_utils.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/clearml/hpo.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/comet/README.md create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/comet/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/comet/comet_utils.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/comet/hpo.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/comet/optimizer_config.json create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/README.md create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/log_dataset.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/sweep.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/sweep.yaml create mode 100644 ros2_ws/src/yolov3_ros/utils/loggers/wandb/wandb_utils.py create mode 100644 ros2_ws/src/yolov3_ros/utils/loss.py create mode 100644 ros2_ws/src/yolov3_ros/utils/metrics.py create mode 100644 ros2_ws/src/yolov3_ros/utils/plots.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/augmentations.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/dataloaders.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/general.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/loss.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/metrics.py create mode 100644 ros2_ws/src/yolov3_ros/utils/segment/plots.py create mode 100644 ros2_ws/src/yolov3_ros/utils/torch_utils.py create mode 100644 ros2_ws/src/yolov3_ros/utils/triton.py create mode 100644 ros2_ws/src/yolov3_ros/yolov3_ros/__init__.py create mode 100644 ros2_ws/src/yolov3_ros/yolov3_ros/yolov3_ros_node.py diff --git a/ros2_ws/src/yolov3_ros/launch/pipe_detection.launch.py b/ros2_ws/src/yolov3_ros/launch/pipe_detection.launch.py new file mode 100644 index 00000000..cd028590 --- /dev/null +++ b/ros2_ws/src/yolov3_ros/launch/pipe_detection.launch.py @@ -0,0 +1,25 @@ + +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, SetEnvironmentVariable +from launch.substitutions import LaunchConfiguration +from launch_ros.actions import Node + +def generate_launch_description(): + + return LaunchDescription([ + + # Launch arguments + DeclareLaunchArgument('best_weights', default_value='src/pipe_weights.pt', description='Path to best weights file (.pt)'), + + # Nodes to launch + Node( + package='yolov3_ros', executable='yolov3_ros_node', output='screen', + parameters=[{ + 'best_weights':LaunchConfiguration('best_weights'), + }], + # remappings=[ + # ('rgb_img', LaunchConfiguration('rgb_topic')), + # ('depth_img', LaunchConfiguration('depth_topic')), + # ('camera_info', LaunchConfiguration('camera_info_topic'))] + ), + ]) diff --git a/ros2_ws/src/yolov3_ros/models/__init__.py b/ros2_ws/src/yolov3_ros/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ros2_ws/src/yolov3_ros/models/__pycache__/__init__.cpython-310.pyc b/ros2_ws/src/yolov3_ros/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52d0fe190eba32bfabbd2ca43c07a030360e686f GIT binary patch literal 154 zcmd1j<>g`kg0pL$B!lS3AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUTB{oK@)%tZZy z;xzrVqSVx!#JuFpymbAMNgOv9o<&=FIDW`*!Cy;W+ zK8uvILCTXzIcGnNl!t?qr;zd<`w^r(vTiQE4^NNU=katt$bY|WUJ1=T-pV8|G-|a* zJy&bkE7g*dyhj*am@|B<*l4cte!1XY$360Vt*~4|BwVO9=S+XJv|3)uyQ)xknhmGq zC#ogaEvajb)w!e}ec^-8J@@Q~{A}@hsdyu=O0TSxRjF30yN;jMY0k>hQhC*n7aP@v za$Mz)mg_}bCf`Jp{%Eamqm;MHH_J}>TD9a))Eo7Dt+1MRR+>#!a-4Fb?x&q%p<2op z8x3VUeqwd)*7dWiYpZLFuC5_^>-t>SPdr_(H{62TP<~XmhZhSsOZi5dkYfu&AY~bE+syJl|aN zlTTF3j*I8!Q#sUkpPiWuwe}QN+(xrt&p%OZU_PCv5b2h~QYWzjb;m_BB|luQyGSx_ z_(rqeC$$$9`LUpyeRy!92;yeWunhG8qD5RoKh6Pv&OCxr2y`z5nwNY%v;^8_M_x;S z@%!Gyob?1h#uK=>XigJ>8(I%_jE#^H za?MKEGd$A^dzNbRtt`k&+CQbnyEPiM{zlvxTKLY(#GRP zYlQup?{;+yM#NB7FoHnpg*v=2Z5`7yHsp^Gyf7D*mK7IR5qIvI>S4zBFzCT^06R+! zb*rFkmU9S}Q${N-y$CY4bRvR6(uoWry-ozptM?*t&eR=Xo$3h&n;K0Ab?29eG$TH-^#5V3k!O4LRbLIl3_&iF>JkMF`7~=#f z->Q*@hnI`?TvV_6dzkkK1Hz|zlmQ`A$-rd_dJxI70tJVS)|l>e4;lehy_L9%WqF!) zJi~y{pr`vHWBtYMPwlhFIEU-Lg&-c9G8I#{Olug4{N3kNbf;A&71ZLjI7kyG7o zdAVLHDBpM`ATBrk?29W^x6JZSgYSbHfg78(f*)Q26+&

qKn#jiOq>eY<5Qk~*UZ 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