<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-b5506197d8.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h1><a name="t0"></a><a name="t0"></a><a id="20200807_0"></a><em>2020.08.07</em></h1>
问题记录
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
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
就是fetchInThread
与detectInThread
两个线程完成各自任务所用时间之和的倒数.
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.prototxt
,num_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组
标号dev0
,B组
标号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
只需修改<name>PROJECT_NAME</name>
和下一行的描述
3、.cfg与.weights
将自己的.cfg和.weights
文件分别放入yolo_network_config/cfg
和yolo_network_config/weights
4、 ros.yaml 参数文件
(1)subscribers publishers actions
等不用修改,在程序运行后,参数服务器加载这些参数时,会在参数前面加上ns
命名空间,可以对不同命名空间里名称相同的参数进行区分,例如darknet_ros/publishers/objectdetector/topic
(2)需要修改topic
,程序运行后,节点发布的就是这些话题
5、 yolov3.yaml 参数文件
(1)将config_file
和weight_file
替换为自己的文件
(2)将detection_classes
替换自己的类别
6、 front_traffic_sign.launch 修改
(1)arg
作用域仅限于本节点,param
存在于参数服务器,作用于全局
(2)type
是.cpp
文件生成的可执行文件
(3)几乎所有行都要修改
7、 right_rear_human_car_miivii.launch 修改
(1)<node...>
这一行要修改
(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