基于ROS的YOLOV3实现目标检测项目过程记录

    
            

2020.08.07

问题记录

1.要命的darknet_ros

整体逻辑是用yolo检测出目标,然后通过ros节点将目标类别和位置信息发布出来,因此选择ros_darknet,2个问题:
(1)依赖opencv和boost,boost库安装过程中并没有出现"安装成功"的最后提示,但是在工控机上编译仍然能通过
(2)工控机上运行roslaunch时,加载完.weights后进程突然死掉,在百度和github issues上搜了很多方法,仍然没有解决.之后将问题定位到创建yolo线程这一步,但是没有解决办法

创建线程造成进程死掉,对如此莫名其妙的问题,换个平台试试

2020.08.10

问题记录

1.放弃darknet_ros,发现darknet的Python接口

借鉴了欧阳博士的检测锥桶项目,发现了藏在Python文件夹下的darknet.py,编写了简单的测试程序,初步可以在程序里建立ROS节点,把目标框的信息用String格式的消息发送出来

2020.08.11

问题记录

1.改造darknet.py

代码逻辑:用opencv读取一段视频,对每一帧图片,调用detect()函数检测,返回r,进入for()循环干2件事

(1)在ROS节点里把r里面的信息发布出去

(2)调用opencv把每一帧图片都显示出来,编写pythn程序把框画到图片上

原版的程序里detect()函数第三个参数是图片路径,需要将其改为IMAGE类型,参考用python调用Darknet接口处理视频对程序进行改造,其中image.c和image.h中添加的内容不必拘泥于作者指定的地方,image.c中只有找到其他函数外面就行,image.h在程序前面的部分找个空白位置就行.

画框的代码参考Darknet-修改源码使用python文件调用模型检测视频流中的main()函数部分

2.运行darknet.py的结果可视化问题

运行后可以正常发出r列表中的目标信息,光哥提出需求:运行程序时能显示视频,并在画面中将目标框出来.

2020.08.12

问题记录

1.程序不稳定

今天解决2次代码编写错误导致的电脑重启问题:
(1)ros节点发布消息时没有指定发布频率导致重启,原因未知
(2)检测的目标信息r为空和不为空(对应图片中没有目标和有目标)时怎么发布消息,刚开始加了if()...else()语句判断,后来去掉判断语句,直接for i in (len(r)):简化代码
1次重启问题没有解决:解决上面两个问题后,还是会重启,原因未知

2.画面卡顿

detect()函数返回目标信息r后,调用cv2.imshow()还原视频中的帧,并利用python代码将r中的目标位置,用方框标注在还原的图片上.此时画面非常卡顿,与光哥讨论可能的原因有
(1)没有充分利用GPU硬件资源
(2)代码执行效率低

3.确定darknet对每一帧都做了检测

初步想法是在while(vid.isOpened())循环里,ret, arr = vid.read()对每一帧图片标上序号,至于怎么将序号也发出去,暂时不知道

4.darknet检测性能

怎么知道程序中darknet每秒钟检测了多少帧图片,darknet有检测视频的命令,需要GPU和opencv编译,用ros自带的opencv3.1.1编译不通过,安装opencv4.3.0试试

5.对darknet_ros不死心

ros自带的opencv3.1.1编译不通过,安装opencv4.3.0

2020.08.13

问题记录

1.安装opencv4.3.0

参考ubuntu16.04安装opencv3.4.1教程

2.继续编译darknet_ros

在这里插入图片描述/usr/lib/下没有jni,而且安装opencv过程中,在cmake后,最后显示Java下的JNI是没有的,不确定编译不通过是否跟opencv有关.

3.指定darknet_car_from_video.py在GPU上运行

查看GPU信息时参考Linux查看GPU信息和使用情况
在GPU上运行程序参考【python基础】python开启GPU加速
测试后发现画面还是卡顿。

4.米文动力的实现方式

今天参考了米文的样例,逻辑是一样的:调用opencv读取每一帧图像,调用函数将检测结果保存在result中,然后利用C++程序在图像上画框,最好调用cv2.imshow()将画框的图像展示出来。
米文有两个亮点:
(1)模型转换:运行模型转换脚本,将yolo里训练出来的.weights转换为特定的格式。
(2)SDK加速:加速模块可以提高检测效率

5.darknet_ros终于运行成功

在域控制器(基于Nvidia Xavier)上试着运行了下,终于成功!利用ros_darknet检测本地视频参考ROS 基于yolo的本地视频识别
域控制器环境配置:
(1)arm架构,Ubuntu18.04,卸载了刷机时自带的ROS,手动安装了ROS melodic,ROS中包含opencv库,又另外安装了sudo apt install libopencv-*各种opencv库
(2)没有安装boost库。

6.darknet_ros接受的消息格式

在这里插入图片描述

7.darknet_ros 3个问题

(1)30多的FPS是怎么计算的
(2)显示检测结果图片为什么卡顿?
(3)GPU利用信息,运行nvidia-smi显示找不到命令

2020.08.14

问题记录

1.darknet_ros代码框架分析

参考darknet_ros(yolo移植到ros系统)代码分析

2.darknet_ros FPS计算

在这里插入图片描述从参数服务器中读取名字为image_view/enable_console_output的参数值,并将其存储在enableConsoleOutput_中,如果无法从服务器检索该值,则使用default_val = false

在这里插入图片描述在这里插入图片描述FPS就是fetchInThreaddetectInThread两个线程完成各自任务所用时间之和的倒数.

3.darknet_ros显示检测结果图片

在这里插入图片描述可以看出是3ms刷新一次.

在这里插入图片描述show_image_cv()包含于darknet/src/image.c文件中,extern "C"|表示这个函数在编译时要按照C语言的编译规则.

在这里插入图片描述

4.运行米文摄像头程序

GSML摄像头发布数据格式sensor_msgs/Image,用rviz可视化

5.运行米文目标检测例程

今天实现了一个节点一个摄像头的目标检测程序,需要修改.launch文件中"camera1_topic"的value为摄像头发布的话题名称,程序运行后在rviz中看到检测效果.

.launch文件中<param name=" "  value=" "  />
对应
.cpp文件中 nh_.para()

 
   
   
   
   
  • 1
  • 2
  • 3

6.明天2个任务

(1)修改.cfg .labels .weights,换成我的文件
(2)用两个摄像头,检测ApolloScape视频里的车辆 行人 交通标志,测试两个程序并行运行效果.
(3)辅助完成用autoware摄像头内参标定

2020.08.17

问题记录

1.生成 .caffemodel

yolov3训练出来的权重对应的要修改yolov3_SDK.prototxt而不是yolov3-tiny_SDK.prototxtnum_output参数值的修改类似yolo中.cfg文件的修改,都是修改与yolo层相邻的上一个conv的类别数目,这里是conv59 conv67 conv75.
model_transfer.sh脚本不但要修改-w后面的参数,还有修改-m后面的参数,这一点readme中没有提到。

2.生成SDK加速模型,及以后的运行命令

运行命令时初始化大概需要3分钟,需要等待。。。在这里插入图片描述
生成tensorcache文件后,运行命令简化为video文件 视频名文件 标签文件 .tensorcache文件

3.用自己的模型预测失败问题

在这里插入图片描述
在这里插入图片描述

.cpp文件里更改了加载的模型和标签文件,但是运行.launch文件后显示加载的模型是algorithm里自带的模型。
在这里插入图片描述
20号再次思考这个问题,在看源码的时候发现,在进行JetPack版本选择时程序执行的是JPVERSION=422分支里的代码,加载了algorithm/里的权重,更改了JPVERSION版本,使程序进入加载自己权重的分支后就可以了。此时另一个问题又出现:BDD100K训练出来的权重把车全部识别成了人,但是之前用的时候并不是这样,有待进一步验证。
20号晚上用了更改JPVERSION的方法对识别交通标志的程序进行了测试,发现对汽车、行人这类大目标不再做检测了,但是对标志牌检测出来的结果还是coco数据集里的类别,反复看代码后无果。
21号再次思考,决定放弃用米文的demo,原因是刷机时的JPVERSION会决定检测时执行的代码,这些被执行的代码不是我想要的,而且由于只提供了函数接口,没有核心代码,想要修改也无从下手。
想清楚选择的理由,也要想清楚放弃的理由

2020.08.18

问题记录

1.上车调试摄像头

域控制器有8个GMSL接口,分两组,A组和B组A组标号dev0B组标号dev1。摄像头有3个,一个长焦60°,两个广角120°,全部接到A组就行,选择运行一个节点,发三个摄像头话题。

2.“摄像头没有及时回复”问题

(1).launch文件的摄像头数量参数要改为实际接入的摄像头数量
(2)摄像头出连接线扣不住,防止松弛导致摄像头信号断掉
(3)新摄像头接入域控制器时,要重新进行Sensing基础配置

2020.08.19

问题记录

1、摄像头标定

先标定再上车
.yaml文件里的camera name要与,launch文件里的一致
修改distortion_model

2、摄像头录制并保存视频

(1)raw数据容量太大,发生溢出,且不能回放,换固态硬盘后再试试
(2)compressed压缩数据容量小,但是录制时显示写错误,可能是硬盘写权限问题
(3)rviz订阅compressed话题时导致摄像头进程死掉
待域控制器装上固态内存后再试。

2020.08.20

问题记录

1、bash bin/demo导致重启

昨晚刚在室内运行过,上午上车后出现问题,打算在室内再试试。

2、rviz卡顿

ROS demo中的权重换成厂家提供的权重,仍然卡顿。
目标导向来看,有点被带偏了,无需纠结于检测视频数据时rviz中的画面卡顿。项目目标是:摄像头实时检测时,在车内显示屏上可以看到实时检测结果。上车测试时,程序可以对移动的人进行持续地检测,证明这个目标已经实现了,此时再纠结rviz的可视化卡顿问题,完全没有必要,要搞清楚最终想要什么效果的。

2020.08.21

问题记录

1、辅助电源问题

同样的程序,在室内运行正常,上车崩溃,不一样的就是显示器和电源,昨天只想到可能是电源的问题,漏了显示器。今天虽然证实问题确实出在电源上,但是昨天定位问题时思考的还是不全面。
对程序运行前后的电流测量对比后,发现是辅助电源功率太小:电压24V,正常电流0.8A左右,最大功率20W左右,程序运行瞬间电流增大到1.5A左右,瞬时功率40W左右,导致域控制器关机。
这种问题是在项目传感器规划时,就要根据每个传感器工作功率来制定的
解决方法是把功率小的显示器从13口换到15口,摄像头从原有的24V接口换到12V的15口。
(2020.09.19更新)辅助电源返厂修复,将域控制器的电源接口改为60w,目前运行3个摄像头,同时检测行人、车道线、交通标志,暂时没有再出现关机问题。

2、需要多少个程序

前左——2个,交通标志,车道线
前右——1个,车辆和行人
后——1个,车辆和行人

2020.08.22

利用`miivii`程序启动3个摄像头
前左基于`darknet_ros`,利用自己的权重检测交通标志
前右和后 基于`miivii`的加速权重检测`行人、车辆、自行车`

 
   
   
   
   
  • 1
  • 2
  • 3

darknet_ros 代码修改

1、功能包下CMakeLists.txt

(1)修改项目名称
(2)与项目名称关系密切的是add_executable(),将.cpp文件转为可执行文件,名称一般为PROJECT_NAME或者PROJECT_NAME_NODE,可执行文件的名称就是.launch文件中的type

2、package.xml

只需修改PROJECT_NAME和下一行的描述

3、.cfg与.weights

将自己的.cfg和.weights文件分别放入yolo_network_config/cfgyolo_network_config/weights

4、 ros.yaml 参数文件

在这里插入图片描述

(1)subscribers publishers actions等不用修改,在程序运行后,参数服务器加载这些参数时,会在参数前面加上ns命名空间,可以对不同命名空间里名称相同的参数进行区分,例如darknet_ros/publishers/objectdetector/topic
(2)需要修改topic,程序运行后,节点发布的就是这些话题

5、 yolov3.yaml 参数文件

在这里插入图片描述

(1)将config_fileweight_file替换为自己的文件
(2)将detection_classes替换自己的类别

6、 front_traffic_sign.launch 修改

在这里插入图片描述
(1)arg作用域仅限于本节点,param存在于参数服务器,作用于全局
(2)type.cpp文件生成的可执行文件
(3)几乎所有行都要修改

7、 right_rear_human_car_miivii.launch 修改

在这里插入图片描述
(1)这一行要修改
(2)修改摄像头个数
(3)修改摄像头话题名称
(4)修改publish_result_image值为true
(5)修改debug_time值为ture,这样在终端可以打印FPS

8、3个摄像头接入域控制器顺序

程序是按照接口的接入顺序,对各个摄像头标注序号的。由于右和后用的同一个程序,会从1开始表序号,左是单独的程序,可以随意指定序号,因此接口插入顺序:右——后——左

问题记录

1、辅助电源功率不够

域控制器切换到15w模式,不会关机,但是检测速度慢,每秒只有10帧左右

2、检测距离问题

楼下走廊里5米以外就检测不到,初步推测是光线问题,明天上路测试。
(2020.09.19更新)两个广角摄像头检测行人的距离大概在10米~20米,检测车辆的距离大概在40~50米,长焦摄像头检测交通标志的距离在50~60米。

3、检测类别问题

前、后检测行人、车辆、自行车,检测不到摩托车,由于自行车、摩托车移动速度不同,是否会对规划和决策产生影响

4、时间同步问题

节点发布出去的话题是否包含时间信息。

2020.09.19

问题记录

  • 今天在测试国创的辅助电源时,发现米文自带的检测行人、车辆程序,并没有发送检测框和类别的消息,后续要看程序里有没有这些信息
  • darknet_ros运行很卡,初步估计是硬件资源问题。后续只运行这一个程序,看是否还卡。

darknet_ros发出的检测消息

darknet_ros_msgs/BoundingBoxes

darknet_ros_msgs/ObjectCount

转载:https://blog.csdn.net/cxhmike/article/details/107976467

你可能感兴趣的:(ROS相关知识,yolov3,yolo训练)