YOLO2的行人跟踪上机的问题汇总(不喜勿喷)

一.cmakelist.txt:只能进行对.cpp文件进行编译

1、查看Opencv的链接是否完整(电脑中有多个版本时应该注意链接的那个版本的动态库,以及目录问题不一定都在根目录下),opencv名称的查看是在opencv.pc或者自己命名的.pc文件中。
版本号查看:$ pkg-config --modversion opencv
链接查看:$ pkg-config --cflags --libs opencv3

A、配置opencv的动态链接库,首先打开目录

$ cd /etc/ld.so.conf.d

然后,新建一个名为opencv.conf的文件,并在文件里添加你所安装的opencv的动态库绝对路径,可以是多个路径

$ sudo gedit opencv.conf

添加路径/XX/XX/XX/lib并保存,$ sudo ldconfig使之生效。
B、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

C、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。 这是通过gcc 的参数"-Wl,-rpath,“指定,当指定多个动态库搜索路径时,路径之间用冒号”:"分隔)
D、默认的动态库搜索路径/lib
E、默认的动态库搜索路径/usr/lib

2、Opencv的路径和环境位置
在CMakelist.txt中指定路径:

set(OpenCV_DIR "/home/linhan/opencv3/share/OpenCV")

解决版本冲突问题:

find_package(OpenCV 3.2.0 REQUIRED)
set(CMAKE_PREFIX_PATH "/home/linhan/opencv3/share/OpenCV")

3、设置编译环境:gcc或者是g++,还牵扯到C++版本问题,暂时没有明白。

4、C和C++的混合编译
A、fatal error:core.hpp必须被编译为C++文件。这是由于CMakelist中添加的执行文件不能含有.c和.h和.hpp文件,其中牵扯到C和C++的混合编译以及动态库的设置。见其后。
B、混合编译,C++引用C代码
C和C++编译器对编译函数符号的生成规则是不一样的,因为C只有单一的命名空间,不支持函数重载之类的特性,例如对于函数void fun(int a, int b),经过编译后生成的符号为_fun, C链接器链接的时候就会去找_fun这样的函数符号;C++为了支持函数重载(即函数名字可以相同,参数类型或个数不同),允许存在同名的函数,这一点在C中是做不到的。其实,C++甚至可以存在相同的类型、变量等,因为在C++中命名空间的存在。在C++中,对于函数void fun(int a, int b),经过编译后,生成的类似为_fun_int_int, 新生成的符号名不仅带有函数名,还有参数类型。正因为他们两者编译函数的时候,生成的符号规则不一样,所以,在混合编程中,如果我们不进行任何处理,而相互效用的话,必然会出现在链接的时候,找不到符号链接的情况。

为实现混合编程,我们不得不提到extern “C” , extern "C"是C++的特性,是一种链接约定,通过它可以实现兼容C与C++之间的相互调用,即对调用函数能够达成一致的意见,使用统一的命名规则,使得实现方提供的接口和调用方需要的接口经按照指定规则编译后,得到的都是一致的函数符号命名。具体用法,#ifdef __cplusplus表示如果是C++来调用该接口,则该函数接口经编译后的函数符号生成规则按照C风格走, 否则没有extern “C” , 这样提供的接口同时支持C和C++两者的调用。

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
 code...
#ifdef __cplusplus
}
#endif // __cplusplus

混合编译参考:
https://blog.csdn.net/this_is_me_anyway/article/details/79397018

C、导入darknet.so动态库时须在include_directories()加上动态库路径,再在target_link_libraries(parrot_bebop2 …)加上绝对路径

5、编译出错(make)
error:[ 12%] Built target parrot_bebop2,有些文件需要权限。

$ sudo make

二.代码修改问题
1、载入图片路径删除:注意实时信息传输以及变量的修改
2、图片格式转换问题要注意:图片格式转换必须加头文件
3、Couldn't open file: data/sence.names
由于配置文件algo/yolo_model/cfg/sence.data
下的names文件路径错误。
4、代码结构层次不能变
5、C++引用darknet出现的问题https://blog.csdn.net/u013228894/article/details/79544109
https://www.cnblogs.com/rainsoul/p/8711229.html

三.上机问题
1、time out:节点连接超时,重新启动

2、

[ERROR] [1539220506.643663177]: [ARCONTROLLER_Network] 09:15:06:643 | ARCONTROLLER_Network_ReaderRun:1294 - ARCOMMANDS_Decoder_DecodeBuffer () failed : 3
[bebop/bebop_driver-1] process has died [pid 8505, exit code -11, cmd /home/linhan/bebop_ws/devel/lib/bebop_driver/bebop_driver_node __name:=bebop_driver __log:=/home/linhan/.ros/log/32b5d4d2-ccf0-11e8-8a71-5800e32f73e0/bebop-bebop_driver-1.log].
log file: /home/linhan/.ros/log/32b5d4d2-ccf0-11e8-8a71-5800e32f73e0/bebop-bebop_driver-1*.log

bebop包出错,重新配置即可,参考https://www.ncnynl.com/archives/201701/1259.html

四.实验记录
1、基础one:实验室效果测试,框人不灵敏,效果很差
2、yolo2+基础one:实验室测试,框人可以,检测人时会有误判。能够识别动态行人,也会存在误识别。修改算法顺序后能够实现动态跟踪,但是在无人或者视角边界时,会发生误判。
3、yolo2+基础one:室外试飞,在测试飞机控制完好后,在起飞后的第二次上升指令发送后(进入自动模式指令发送前),飞机左倾斜朝左上方快速飞行,迫降后,机翼损坏,电池盒破裂,起脚架出现裂痕

错误后果:造成训练准确率的断崖式下跌
两种出现地点:
1)在loss函数中出现nan
出现原因:一般是因为tf中的log函数输入了‘负数’或‘0’值(出现log(0)*0的情况)
解决方法:使用tf.clip_by_value限制tf.log的输入值
例如cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-8,tf.reduce_max(y))))

   cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-8,1e+100)))

  cross_entropy = -tf.reduce_sum(y_*tf.log(y+1e-8))

    safe_log = tf.clip_by_value(some_tensor, 1e-10, 1e100)       

                                   


 2)在更新网络时出现nan
      出现原因:一般是学习率设置过高导致的(-->梯度值过大-->梯度爆炸)
      解决方法:调低学习率
    3)脏数据
       出现原因:训练数据中存在脏数据,不适应当前网络,输出错误数值
       解决方法:人工清理数据

REF:https://blog.csdn.net/strive_for_future/article/details/81625006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值