一:caffe-jainto编译
1.参考博客
https://github.com/tidsp/caffe-jacinto/blob/caffe-0.17/INSTALL.md
进行了1、2、3
进行不下去了,怀疑caffe是否安装上了,暂时放弃,决定先安装caffe。
2.参考
https://jingyan.baidu.com/article/a948d651d43f3e0a2dcd2ee6.html
安装失败。
3.回到git
https://github.com/tidsp/caffe-jacinto
直接新建build文件夹,然后查cmake ..
出现错误
No module named numpy
运行
pip install numpy
后就可以顺利cmake.. 了。紧接着,make。
问题
/usr/local/lib/libopencv_imgcodecs.so.3.4.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'
查询,博主
http://www.manongjc.com/article/33159.html
说是因为多个opencv库导致caffe运行异常。
4.在anaconda3下安装anaconda2
参考博主
https://blog.youkuaiyun.com/u014044032/article/details/82223932
在anaconda3下安装anaconda2
失败了。
5.转而去安装caffe,配置了一下,anoconda3创建的python27的虚拟环境。
安装caffe参考
https://blog.youkuaiyun.com/lovemi93/article/details/102636178
失败了。
6.在bashrc中注销anaconda3的环境变量等初始化。
然后,在build中cmake .. ,然后make。就不在报错误了。
7.以上cmake估计有问题
正确步骤应该是在caffe-jacinto文件夹下直接make
注销bashrc中的anaconda3的环境变量初始化,就会启用系统自带的python2.7。
然后参考博主
https://blog.youkuaiyun.com/qq583083658/article/details/85207159
博主最后也事换用系统自带的python,这里我没有启用超级用户切换,而是用上面的注销的方式。
终于在最后make pycafffe不报错了。
也看了看博主
http://e2e.ti.com/support/processors/f/791/p/727622/2715287
最后
make test
make runtest
make pycaffe
来测试caffe-jacinto
但是在make runtest中,我出现了如下错误:
参考博主
https://blog.youkuaiyun.com/striker_v/article/details/51983173
运行
export CUDA_VISIBLE_DEVICES=0
不管用。
但是博主说了:
“最后加一句,一些make runtest中的测试就算不通过也不会耽误使用的,一般只要make all , make pycaffe 和 make test不出错即可。”
我好像在这3个make都没有报错。
重新检查一遍
make clean
make -j8
除了有几个warning
没有报其他错误。
make pycaffe
make test
没有报错
说一下一个我经常遇到的错误
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libturbojpeg.a(libturbojpeg_la-turbojpeg.o): relocation R_X86_64_32 against `.data’ can not be used when making a shared object; recompile with -fPIC /usr/lib/x86_64-linux-gnu/libturbojpeg.a: 无法添加符号: 错误的值
解决方法
sudo ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0.1.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so
二:caffe-jainto-model运行稀疏量化例子
1.参考git
https://github.com/tidsp/caffe-jacinto-models
https://github.com/tidsp/caffe-jacinto-models/blob/caffe-0.17/docs/VOC0712_ObjectDetect_README.md
先在
上下载数据集
感觉数据需要转换LMDB格式,参考git和博客
https://github.com/weiliu89/caffe/blob/4817bf8b4200b35ada8ed0dc378dceaf38c539e4/README.md#citing-ssd
https://blog.youkuaiyun.com/a8039974/article/details/79836564
一些报错的处理,参考安装caffe时的处理方式
https://blog.youkuaiyun.com/lovemi93/article/details/102636178
但是又会报出新错误,与boost有关,这里索性还是用annaconda3创建的python27环境来安装,看是否会出现问题。
bashrc加上anaconda3的init。
make clean
make -j8
不管用,还是会出现该问题。
先删除anaconda3的bashrc初始化
参考博主
https://blog.youkuaiyun.com/CAU_Ayao/article/details/83899878
没有解决
2.后来发现其实caffe-jainto中已经有相关的软件了,VOC0712
(1)下载的数据放在home根目录下的data文件夹下,并解压
文件夹要放对啊。
(2)运行,文件夹/home/leon/Desktop/Caffe2TI/A3_Work/caffe-jacinto/data/VOC0712下的create_list.sh
cd到该目录下,并运行
bash create_list.sh
注意时bash,而不是sh,否者会报错
这与linux shell使用的是/bin/sh,还是/bin/bash有关系。我的脚本中指定使用的是/bin/bash shell,但是我在调试的时候使用的是sh shell,因此调试时导致错误提示信息。所以用bash。
正确结果:
(3)同样在该文件夹下运行
bash create_data.sh
就可以产生LMDB文件。Vocdevkit下多了个文件夹
制作自己的数据的时候要用小工具制作test.txt,val.txt,train.txt。并将train.txt和val.txt合并。放到Main文件夹下。
参考博主
https://blog.youkuaiyun.com/a8039974/article/details/79836564
测试VOC训练时,注意使用命令
python examples/ssd/ssd_pascal.py
而非
python ssd_pascal.py
否者会报如下错误
3.接下来利用caffe-jacinto-model来进行训练
在trained中
使用voc0712自带例子进行训练需要注意修改的地方
【1】run.sh文件
- caffe.bin路径:caffe训练程序。要对应caffe-jacinto/build/tools/caffe.bin,即一开始编译caffe-jacinto生成的文件。
- solver.prototxt路径:配置文件
- .caffemodel路径:权重文件
- gpu"0":只有一个显卡要改为“0”
- run.log路径:训练过程中的日志保存文件。
【2】solver.prototxt文件
- train_net路径:训练配置文件,train.prototxt
- test_net路径:测试配置文件,test.prototxt
- snapshot_prefix路径:快照。将训练出来的model和solver状态进行保存,snapshot用于设置训练多少次后进行保存,默认为0,不保存。snapshot_ptofix设置保存路径。
【3】test.prototxt文件
- data_param中的source:设置为VOC0712的lmdb的训练的文件夹,VOC0712_test_lmdb。
- batch_size:此处的设置会影响GPU内存是否不足。我的时1060 3G显存,设置到4,设置到16的时候训练会报错。
- annotated_data_param中的label_map_file:此为标签,在caffe-jacinto转换lmdb数据的时候已经设置,此处改为该路径。
- save_output_param中的label_map_file:这个也是标签,同上。labelmap_voc.prototxt
- save_output_param中的name_size_file:caffe_jacinto转换lmdb数据的时候生成的文件,test_name_size.txt
- detection_evaluate_param中的name_size_file:同上。
【4】train.prototxt文件
- data_param中的source:设置为VOC0712的lmdb的训练的文件夹,VOC0712_test_lmdb。
- batch_size:此处的设置会影响GPU内存是否不足。我的时1060 3G显存,设置到4,设置到16的时候训练会报错。
- annotated_data_param中的label_map_file:此为标签,在caffe-jacinto转换lmdb数据的时候已经设置,此处改为该路径。
【5】deploy.prototxt
- szve_output_param中的label_map_file:同上的标签路径。
- szve_output_param中的name_size_file:caffe_jacinto转换lmdb数据的时候生成的文件,test_name_size.txt。
修改过后,能够训练了,但是依然不知道其中参数的含义。
4.solver.prototxt中参数的含义
先贴一个solver.prototxt实例。参考博主
https://blog.youkuaiyun.com/xygl2009/article/details/77484522
train_net: "/home/leon/MyProgram/A5_Caffe2TI/A3_Work/caffe-jacinto-models/training/TestVoc0712/initial/train.prototxt"
test_net: "/home/leon/MyProgram/A5_Caffe2TI/A3_Work/caffe-jacinto-models/training/TestVoc0712/initial/test.prototxt"
test_iter: 619
test_interval: 2000
base_lr: 0.01
display: 100
max_iter: 120000
lr_policy: "multistep"
gamma: 0.1
power: 1.0
momentum: 0.9
weight_decay: 0.0001
snapshot: 20
snapshot_prefix: "/home/leon/MyProgram/A5_Caffe2TI/A3_Work/caffe-jacinto-models/training/TestVoc0712/initial/voc0712_ssd"
solver_mode: GPU
device_id: 0
random_seed: 33
debug_info: false
snapshot_after_train: true
test_initialization: true
average_loss: 10
stepvalue: 60000
stepvalue: 90000
stepvalue: 300000
iter_size: 2
type: "SGD"
eval_type: "detection"
ap_version: "11point"
show_per_class_result: true
- train_net:训练配置文件
- test_net:测试配置文件
- test_iter:表示测试的次数;比如,你的test阶段的batchsize=100,而你的测试数据为10000张图片,则你的测试次数为10000/100=100次;即,你的test_iter=100;
- test_interval:表示你的网络迭代多少次才进行一次测试,你可以设置为网络训练完一代,就进行一次测试。
- base_lr:表示基础学习率,在参数梯度下降优化的过程中,学习率会有所调整,而调整的策略就可通过lr_policy这个参数进行设置;
-
lr_policy:
–>fixed:保持base_lr不变;–>step: 如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter 表示当前的迭代次数;
–>exp: 返回base_lr * gamma ^ iter, iter为当前迭代次数;
–>inv:如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
–>multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而mult-step则是根据stepvalue值变化
–>poly: 学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
–>sigmoid:学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
-
weight_decay:表示权重衰减,用于防止过拟合
-
momentum:表示上一次梯度更新的权重
-
max_iter:最大迭代次数
-
snapshot:保存模型间隔
-
snapshot_prefix:保存模型的前缀
-
solver_mode:是否使用GPU
-
device_id:在cmdcaffe接口下,GPU序号从0开始,如果有一个GPU,则device_id:0
-
average_loss:取多次foward的loss作平均,进行显示输出
-
iter_size:处理batchsize*itersize张图片后,才调用一次ApplyUpdate函数根据学习率、method(SGD、AdaSGD等)进行梯度下降
-
type:caffe优化算法类型,caffe提供了六种优化算法来求解最优参数:
Stochastic Gradient Descent (type: “SGD”);AdaDelta (type: “AdaDelta”);
Adaptive Gradient (type: “AdaGrad”);
Adam (type: “Adam”);
Nesterov’s Accelerated Gradient (type: “Nesterov”);
RMSprop (type: “RMSProp”)
5.参考git上
https://github.com/tidsp/caffe-jacinto-models
的说明进行训练。
(1)请在scripts文件夹下,使用命令
bash train_image_object_detection.sh
(2)git上说明了
一开始没有注意到这句话,运行bash train_image_object_detection.sh的时候,总是会报错误
no model named model_libs
我的环境变量
#---<caffe-jacinto>---#
export PYTHONPATH=/home/leon/MyProgram/A5_Caffe2TI/A3_Work/caffe-jacinto/python:$PYTHONPATH
export CAFFE_ROOT=/home/leon/MyProgram/A5_Caffe2TI/A3_Work/caffe-jacinto
#--->caffe-jacinto<---#
实在不懂git上这句话的意思,索性将caffe-jacinto-models中的文件scripts文件夹剪切到A3_Work下,居然没有该错误了。将scripts文件夹剪切回去,然后能训练了,什么鬼,我刚才做了什么。这里先记录一下,回头研究怎么回事。
三:需要重新安装boost
注意,git上
https://github.com/tidsp/caffe-jacinto/blob/caffe-0.17/INSTALL.md
sudo apt-get install --no-install-recommends libboost-all-dev
这一句,可能有问题,最好先不要安装。
安装自己的boost。
1.尝试安装1.46版本,但是会报如下错
Unicode/ICU support for Boost.Regex?... not found.
暂时不知如何解决。
2.尝试安装boost_1_54_0
参考博客
https://www.bbsmax.com/A/KE5Qm3Rj5L/
进行安装
注意要加sudo,这个很重要。
sudo ./bootstrap.sh
sudo ./b2 install
环境变量
#---<boost1.54>---#
export CPLUS_INCLUDE_PATH=/usr/local/include/boost:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
#--->boost1.54<---#
运行例子
#include <string>
#include <iostream>
#include <boost/version.hpp>
#include <boost/timer.hpp>
using namespace std;
int main()
{
boost::timer t;
cout << "h" << endl;
cout << "min timespan: " << t.elapsed_min() << "s" << endl;
cout << "now time elapsed: " << t.elapsed() << "s" << endl;
cout << "boost version" << BOOST_VERSION <<endl;
cout << "boost lib version" << BOOST_LIB_VERSION <<endl;
}
运行
g++ boost_test.cpp -o boost_test
输出以下结果
h
min timespan: 1e-06s
now time elapsed: 6.4e-05s
boost version105400
boost lib version1_54
编译caffe-jacinto时会报如下错误
/usr/bin/ld: cannot find -lboost_thread
怀疑boost未全部安装,改为命令
sudo ./b2 install --build-type=complete --layout=versioned threading=multi
安装
但是,安装完成后,编译caffe-jacinto的时候还是会出现
/usr/bin/ld: cannot find -lboost_thread错误
再试
在/usr/local文件夹下新建boost_1_54_0文件夹
sudo ./bootstrap.sh --prefix=/usr/local/boost_1_54_0
sudo ./b2 install --build-type=complete --layout=versioned threading=multi --prefix=/usr/local/boost_1_54_0
配置环境变量后,连例子都不能运行了。细节:在/usr/localboost_1_54_0文件夹下先建立lib,后建立include文件夹。
再试
在/usr/local文件夹下新建boost_1_54_0文件夹
sudo ./bootstrap.sh --prefix=/usr/local/boost_1_54_0
sudo ./b2 install --with-python --with-atomic --with-chrono --with-context --with-coroutine --with-date_time --with-exception --with-filesystem --with-graph --with-graph_parallel --with-iostreams --with-locale --with-log --with-math --with-mpi --with-program_options --with-random --with-regex --with-serialization --with-signals --with-system --with-test --with-timer --with-wave --with-thread
细节:先建立include文件夹,后建立lib文件夹
运行例子,报如下错误
fatal error: boost/version.hpp: No such file or directory compilation terminated.
这是include路径不对,我在bashrc中的路径是
export CPLUS_INCLUDE_PATH=/usr/local/boost_1_54_0/include/boost:$CPLUS_INCLUDE_PATH
应改为:
export CPLUS_INCLUDE_PATH=/usr/local/boost_1_54_0/include:$CPLUS_INCLUDE_PATH
boost可以用了,例子能编译。但是caffe-jacinto仍然不能够编译。
改为boost_1_46_0版本,再试,编译boost_1_46_0,编译成功
但是,编译caffe-jacinto出现新问题
/usr/local/boost_1_46_0/include/boost-1_46/boost/thread/xtime.hpp: At global scope:
/usr/local/boost_1_46_0/include/boost-1_46/boost/thread/xtime.hpp:88:1: error: expected declaration before ‘}’ token
} // namespace boost
^
Makefile:610: recipe for target '.build_release/src/caffe/layer_factory.o' failed
make: *** [.build_release/src/caffe/layer_factory.o] Error 1
重新用如下命令安装boost1.58
sudo apt-get install --no-install-recommends libboost-all-dev
运行boost例子显示版本未boost1.54
bashrc注释boost1.54的环境变量
运行boost例子显示版本boost1.58
然后编译caffe-jacinto
问题依然没有解决。
尝试利用anaconda2新建虚拟环境py2,然后一路安装编译,其中caffe-jacinto会报boost版本冲突的warning,暂时不理会,制作lmdb数据的时候又根据需求安装了几个依赖包,最后稀疏量化训练,结果还是显示boost有问题。重头来,发现不能够编译了。看来anaconda就是不能用,果断屏蔽anaconda2的环境变量,发现需要注意的一点是在执行下面这一句话的时候要改成下下面这句话,否者,会报红色的error.
for req in $(cat python/requirements.txt); do pip install $req; done
改为
for req in $(cat python/requirements.txt); do pip install $req --user; done
caffe-jacinto编译成功,训练还是会出现boost版本问题。
编译时报如下类似的错误,说明opencv没有安装好
caffe /usr/local/lib/libopencv_imgcodecs.so: undefined reference to `jpeg_destroy_compress@LIBJPEG_9.0'
先总结一下:在自带系统下安装,不要anaconda,后来要是用anaconda,先安装opencv,后安装anaconda,防止opencv的一些东西被安装或链接在anaconda目录下。boost1.58就可以,感觉自己瞎折腾了。
四:问题集锦