本文主要是介绍前视声呐目标识别定位(二)-目标识别定位模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前视声呐目标识别定位(一)-基础知识
前视声呐目标识别定位(二)-目标识别定位模块
前视声呐目标识别定位(三)-部署至机器人
前视声呐目标识别定位(四)-代码解析之启动识别模块
前视声呐目标识别定位(五)-代码解析之修改声呐参数
前视声呐目标识别定位(六)-代码解析之目标截图并传输
前视声呐目标识别定位(七)-代码解析之录制数据包
前视声呐目标识别定位(八)-代码解析之各模块通信
前视声呐目标识别定位(九)-声呐驱动
基于前文介绍的基础知识,结合Yolo即可实现目标识别及位置解算。再强调一次仅依靠二维声呐图像是无法实现三维位置的解算的,只能获得位置的距离及水平开角,缺少竖直开角的信息。
项目地址:GitHub - cabinx/yolov5_humble_fls: forward looking sonar object recognition with yolov5 based on ros humble for self use
一、目标物message格式(object_msgs)
ObjectAzimuthRange.msg(单个目标msg)
string class_name # 目标种类
float64 probability # 置信率
float64 object_azimuth # 目标水平开角
float64 object_range # 目标距离
int64 num # 废弃,原构想是目标序号
int64 xmin # bounding box
int64 ymin # bounding box
int64 xmax # bounding box
int64 ymax # bounding box
ObjectsAzimuthRange.msg(图像中所有目标msg)
std_msgs/Header header
ObjectAzimuthRange[] object_azimuth_range
二、声呐图像格式
项目中我将声呐图像封装成sensor_msgs/Image的格式方便Yolo识别模块。根据前文介绍的前视声呐图像像素点位置解算的知识,需要声呐水平开角及量程信息。比较合理的方式是重新设计一个msg,将以上所有信息包含。在此我为了开发方便,就将水平开角及量程信息以字符串的形式封装进sensor_msgs/Image中Header下的frame_id里。以水平开角120度,量程10m为例,在msg中的格式为:frame_id: '[120 10]'。两个数据以空格间隔。
三、识别模块(yolov5_humble_fls)
识别模块主要基于Yolov5 V7.0:https://github.com/ultralytics/yolov5/tree/v7.0
相应代码及预训练权值可以在上述链接获取,模型训练等教程也可以参见上述链接。
后续结合ROS2 Humble完成了识别模块,在此简单介绍一些关键步骤的代码注释。
yolov5_sonar.py
def image_callback(self, image):....#获声呐当前帧的水平开角和量程# loading the range and azimuth of sonarsonar_info = image.header.frame_idmid_index = sonar_info.find(' ')sonar_azimuth = float(sonar_info[1 : mid_index])sonar_range = float(sonar_info[mid_index + 1 : -1])...
def dectshow(self, org_img, boxs, sonar_azimuth, sonar_range):...for box in boxs:...#取目标框的中心点并解算该像素的水平开角及距离作为目标位置object_x = (int(box[0]) + int(box[2])) / 2.0 #widthobject_y = (int(box[1]) + int(box[3])) / 2.0 #heightobject_azimuth_range.object_azimuth = (object_x / (image_width / 2.0) - 1.0) * (sonar_azimuth / 2.0)object_azimuth_range.object_range = (1.0 - object_y / image_height) * (sonar_range)...
参数文件:yolov5_humble_fls.yaml
/yolov5_humble_fls/yolov5_ros2:ros__parameters:yolov5_path: # yolov5 源码路径weight_path: # 模型路径image_topic: # 声呐图像topic名称objects_info_pub_topic: #目标物信息topic名称conf: # 置信率use_cpu: # 是否启用Cudadisplay_image: # 是否展示识别图像
四、离线测试数据包
链接:百度网盘 请输入提取码
提取码:jm67
该数据包是使用我之前开源的UATD数据集中的rov目标图像合成的数据包。模型训练也是使用了该数据集。为了方便我将声呐的开角及量程都写死固定。能满足测试需求,只不过目标物的位置信息不正确罢了。
五、测试
ros2 launch yolov5_humble_fls start.launch
ros2 bag play sonar_mono
展示的目标框的注释为:目标种类-置信率:(水平开角,距离)
测试视频:
yolov5-sonar-test_2
这篇关于前视声呐目标识别定位(二)-目标识别定位模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!