yolov3的训练(七)使用darknet_ros框架进行识别与模型导入


##################################
同学们,这个系列的文件不要直接就跟着我操作了,因为这个是踩坑的记录,不是教程,我只是将整个流程记录下来,让后面的同学操作的时候能够避开这些坑,希望你能将整个系列的操作流程看了一遍斟酌后进行操作
##################################

使用darknet_ros框架进行识别

那么现在训练的模型时可以使用的,但是我这里想要用ROS的框架进行操作

首先需要下载安装darknet_ros的功能包
参考文件
ubuntu20 ros darknet 安装记录

安装功能包

cd catkin_ws/src/
git clone --recursive git@github.com:leggedrobotics/darknet_ros.git

在这里插入图片描述
结果下载失败

jetson agx xavier +darknet ros——编译出错

重新下载

cd ~/catkin_ws/src
git clone --recursive https://github.com/leggedrobotics/darknet_ros

在这里插入图片描述


到工作空间后单独编译darknet_ros这个功能包

cd ..
catkin_make -DCATKIN_WHITELIST_PACKAGES="darknet_ros"

在这里插入图片描述


编译进行到后面,会下载识别模型yolov2-tiny.weights,可能有网速原因会慢一点
在这里插入图片描述


如果你不想下载的话,打开README.md文件,将这些下载操作进行注释或删除(不确定这个是否正确)
在这里插入图片描述

重新进行编译
在这里插入图片描述

编译完成
如果是个新的工作空间那就得记得环境变量
在这里插入图片描述

模型导入darknet_ros

当darknet_ros下载编译完成后,我们就要将训练的模型导入

首先打开【/home/heying/catkin_ws/src/darknet_ros-master/darknet_ros/config】目录

新建一个yaml配置文件,这里取名为yolov3-voc.yaml

roscd darknet_ros/config/
touch yolov3-voc.yaml
gedit yolov3-voc.yaml

在这里插入图片描述
然后进行编辑

yolo_model:

#指定的cfg的配置文件名称
  config_file:
    name: yolov3-voc.cfg

#指定的进行识别的权重文件名称
  weight_file:
    name: yolov3-voc_5000.weights

#检测阈值的设定,只显示0.3或更高置信度检测的对象
  threshold:
    value: 0.3

#当前模型识别的类别
  detection_classes:
    names:
      - red
      - green
      - 'null'

在这里插入图片描述

####################注意了####################

标签的错误转义

要注意在这里的其中一个类别【- ‘null’】中,如果直接写上【- null】的话,识别终端会报错。如果将【 - null】置于首位,在后面的流程中运行识别后你会看到如下信息
在这里插入图片描述

可以看到在

	 * /darknet_ros/yolo_model/detection_classes/names: [None, 'red', 'gr…`

这本应该是【null】变成了【None】,这说明可能null被转义成了None,造成了程序的错误,这里便是数据集标注的其中一个坑

补救方法是添加单引号,使之成为字符。
不过最好的方法是在标注流程中就不要使用特别的字符,如null,none等

添加单引号后
再次运行便可以看到应用的是正确的

 * /darknet_ros/yolo_model/detection_classes/names: ['null', 'red', '...

检测类型的对调

在上述中,为了方便终端的信息查看,特地将【yolov3-voc.yaml】中的检测类别进行了位置的对调,如图
在这里插入图片描述

那么如果进行位置的对调后没有重新更换回来的话便会出现错误的情况
运行识别后
可以看到原本应该显示的【null】被显示出了【green】这是由于在yaml配置文件中的识别类别排序错误的原因
在这里插入图片描述

将yaml进行修改后

	#当前模型识别的类别
	  detection_classes:
	    names:
	      - red
	      - green
	      - 'null'

可以看到此时便是正常的
在这里插入图片描述


顺序判断的依据是在进行训练时,我认为是在训练时编写的【voc2021.names】
在这里插入图片描述


继续流程

然后在文件中相对应的配置文件与权重文件移动到/home/heying/catkin_ws/src/darknet_ros-master/darknet_ros/yolo_network_config/相对应的文件中
在这里插入图片描述

将生成的权重文件复制到/home/heying/catkin_ws/src/darknet_ros-master/darknet_ros/yolo_network_config/weights
在这里插入图片描述

然后将训练过程中使用的yolov3-voc.cfg文件移动到/home/heying/catkin_ws/src/darknet_ros-master/darknet_ros/yolo_network_config/cfg
在这里插入图片描述

打开/home/heying/catkin_ws/src/darknet_ros-master/darknet_ros/launch目录下的yolo_v3.launch文件,这是我们使用识别的launch文件

然后修改 network_param_file参数,使用刚刚编写的yaml文件

  <arg name="network_param_file"         default="$(find darknet_ros)/config/yolov3-voc.yaml"/>

在这里插入图片描述
完成后保存并退出


测试

首先连接摄像头

然后启动摄像头的驱动

roslaunch usb_cam usb_cam-test.launch

在这里插入图片描述

正常会呼出摄像头的信息


然后启动识别

roslaunch darknet_ros yolo_v3.launch

在这里插入图片描述
识别的效果
在这里插入图片描述

此时也可移动查看识别效果
在这里插入图片描述


至此,darknet版本使用yolov3进行红绿灯训练与识别的流程结束

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要配置Yolov4的Darknet ROS,使其只识别person类,可以按照以下步骤进行: 1. 首先,需要在`darknet_ros/config/ros.yaml`文件中指定你的模型文件和类别文件。具体来说,需要指定以下参数: ```yaml yolo_model: config_file: <path-to-config-file> weight_file: <path-to-weight-file> threshold: <detection-threshold> detection_classes: <list-of-classes-to-detect> ``` 其中,`config_file`是你的Yolov4模型的配置文件路径;`weight_file`是你的Yolov4模型的权重文件路径;`threshold`是一个检测阈值,用于控制检测的敏感度;`detection_classes`是一个包含你想要检测的类别的列表。 2. 接下来,需要在`darknet_ros/config/yolov4.yaml`文件中指定你的Yolov4模型的类别文件。具体来说,需要指定以下参数: ```yaml classes: - class1 - class2 - ... ``` 其中,`class1`、`class2`等是你的Yolov4模型支持的所有类别。 3. 最后,你需要修改`darknet_ros/src/darknet_ros/darknet_ros.cpp`文件中的`image_callback`函数,使其只返回person类的检测结果。具体来说,你需要修改以下代码: ```cpp for (int i = 0; i < num; ++i) { int cls = -1; for (int j = 0; j < classes; ++j) { if (dets[i].prob[j] > thresh) { if (cls < 0) { cls = j; } else if (dets[i].prob[j] > dets[i].prob[cls]) { cls = j; } } } if (cls >= 0) { bbox_msg.Class[i] = names[cls]; bbox_msg.prob[i] = dets[i].prob[cls]; } } ``` 修改为以下代码: ```cpp for (int i = 0; i < num; ++i) { int cls = -1; for (int j = 0; j < classes; ++j) { if (dets[i].prob[j] > thresh && strcmp(names[j], "person") == 0) { cls = j; break; } } if (cls >= 0) { bbox_msg.Class[i] = names[cls]; bbox_msg.prob[i] = dets[i].prob[cls]; } } ``` 这样,`image_callback`函数将只返回person类的检测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值