0


二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测

一. 背景介绍

  1. 在我前面的博文 十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型 中,我介绍过在基于Jetson Nano硬件平台和Ubuntu 18.04 with JetPack4.3, CUDA 10.2软件平台测试各种物体检测网络的检测速度的结果, 最终根据测试结果,以及各物体检测网络的性能和精准度等因素,我选择使用基于PyTorch YOLO v5.
  2. 但那个过程只是在开发环境那中,安装Python3,安装PyTorch,执行YOLO v5, coco数据集的静态图片跑了跑YOLO v5的过程. 这里我将实现YOLO v5ROS系统的对接, 获取ROS实时视频图像帧,发送到YOLO v5网络模型进行物体检测,并将检测结果实时显示在处理后的视频图像帧上, 最终实现端到端的实时物体检测. (对应ROS功能包实现源码,见文末)

二. 准备工作

  1. 除最基本的硬件和软件开发环境外,我们需要做:
  1. 在基于Jetson nano硬件的Ubuntu 18.04上安装PyTorch,这主要包括torch和torchvision包,其他包PyTorch可选:

    1. 这个安装过程我在 十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型 中已经介绍过这里不再阐述.
  2. 可选.由于PyTorch基于Python3, 而ROS的Melodic版本, 其很多支持包仍然是基于Python2.7的,所以我们有个工作,让ROS支持Python3代码. 这个并不难一般安装Python3(我安装的是Python3.6)后,并在*.py文件头部中添加"#!/usr/bin/env python3"即可.

  3. 也是较难处理的一步, 和图像打交道必然会用到Open CV,ROS系统也不例外,其处理Image类型消息和cv2之间的类型转换使用cv_bridge库, 但ROS Melodic发型的还是Python2.7的库, 在我们的Python3代码中无法正常调用(core dumped). 所以我买了需要下载cv_bridge源码自己编译Python3版本的cv_bridge.

    1. 具体编译过程,网上有很多,但都是较老的文章,介绍的都是介于catkin编译方法,我试过均失败. **推荐大家参考另一篇基于最新catkin_make编译的方法,我也是基于此文编译成功的, 看这里: ** ROS——在Ubuntu18.04下基于ROS Melodic编译python3cv_bridge

编译过程我也遇到自己的困难,并发表与上面博文的评论里和博主互动.

附上当时的交流截图:

  1. 准备自己的物体检测网络代码. 这个需要自己处理;

三.详细过程与思路

  1. 同样准备工作做完, 我们先要捋清楚为了实现我们的目标还需要哪些更细节的步骤, 先想清楚再动手做. 承接上一篇博文(十九. )这里给出一张流程图:

1.订阅ROS消息获取相机Image数据, 这个过程是标准ROS过程,和上篇博文不同的是,上篇博文我采用C++编写,这里我采用Python3编写,大致过程如下:

  1. #网络检测网络初始化
  2. self.detector = Yolov5Detector()
  3. self.detector.detectorInit()
  4. self.detector.detectorWarmUp()
  5. #必要的发布和订阅
  6. self.pubDetectedImage = rospy.Publisher('camera/image_raw/detect', Image, queue_size=1)
  7. self.subCameraInfo = rospy.Subscriber("/camera/camera_info", CameraInfo, callback=self.onCameraInfoCallback, callback_args=None, queue_size=1)
  8. self.subCameraImage = rospy.Subscriber("camera/image_raw", Image, callback=self.onCameraImageCallback, callback_args=None, queue_size=1)

2. ROS消息类型转换为CV2,并处理为物体网络支持类型,然后送入网络

  1. def onCameraImageCallback(self,imageData):
  2. try:
  3. cvImage = self.bridge.imgmsg_to_cv2(imageData, "bgr8")
  4. # 图像去畸变, 使用相机内参和畸变系数可以图像去畸变
  5. #self.current_image_frame = cv2.undistort(cvImage, self.camera_intrinsic_value, self.distortion_coefficients, None, self.camera_intrinsic_value)
  6. self.current_image_frame = cvImage
  7. image_np = np.swapaxes(self.current_image_frame,0,2) # [H,W,C] -> [C,W,H]
  8. image_np = np.swapaxes(image_np,1,2) # [C,W,H] -> [C,H,W]
  9. cvImgRet, detect, imageLabelList = self.detector.detectImage(image_np,self.current_image_frame)
  10. except Exception as e:
  11. print(e)

3. 对输出结果做cv2转ROS消息处理 并发布检测结果消息

  1. image = self.bridge.cv2_to_imgmsg(cvImgRet, "bgr8")
  2. self.pubDetectedImage.publish(image) #发布检测结果图像帧
  3. self.pubDetectedResult.publish(detectedResult) #发布边框信息,得分,类别

4. 详细的YOLO v5过程不在阐述.

四.实现效果

  1. ![](https://img-blog.csdnimg.cn/53fd405047b944d698349381ada5843f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAb2tnd2Y=,size_20,color_FFFFFF,t_70,g_se,x_16)

最后,应很多网友要求,我上传了这个ROS功能包的源码资源: 基于YOLO v5的物体检测ROS功能包实现


本文转载自: https://blog.csdn.net/okgwf/article/details/122443209
版权归原作者 okgwf 所有, 如有侵权,请联系我们删除。

“二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测”的评论:

还没有评论