一.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