pythoncaffe
A. 怎样用python调用已经训练好的caffe
定义CAFFE为caffe跟目录,caffe的核心代码都在$CAFFE/src/caffe 下,主要有以下部分:net, blob, layer, solver.
net.cpp:
net定义网络, 整个网络中含有很多layers, net.cpp负责计算整个网络在训练中的forward, backward过程, 即计算forward/backward 时各layer的gradient。layers:
在$CAFFE/src/caffe/layers中的层,在protobuffer (.proto文件中定义message类型,.prototxt或.binaryproto文件中定义message的值) 中调用时包含属性name, type(data/conv/pool…), connection structure (input blobs and output blobs),layer-specific parameters(如conv层的kernel大小)。定义一个layer需要定义其setup, forward 和backward过程。blob.cpp:
net中的数据和求导结果通过4维的blob传递。一个layer有很多blobs, e.g,对data,weight blob大小为Number * Channels * Height * Width, 如256*3*224*224;
对conv层,weight blob大小为 Output 节点数 * Input 节点数 * Height * Width,如AlexNet第一个conv层的blob大小为96 x 3 x 11 x 11;
对inner proct 层, weight blob大小为 1 * 1 * Output节点数 * Input节点数; bias blob大小为1 * 1 * 1 * Output节点数( conv层和inner proct层一样,也有weight和bias,所以在网络结构定义中我们会看到两个blobs_lr,第一个是weights的,第二个是bias的。类似地,weight_decay也有两个,一个是weight的,一个是bias的);
blob中,mutable_cpu/gpu_data() 和cpu/gpu_data()用来管理memory,cpu/gpu_diff()和 mutable_cpu/gpu_diff()用来计算求导结果。slover.cpp:
结合loss,用gradient更新weights。主要函数:
Init(),
Solve(),
ComputeUpdateValue(),
Snapshot(), Restore(),//快照(拷贝)与恢复 网络state
Test();
在solver.cpp中有3中solver,即3个类:AdaGradSolver, SGDSolver和NesterovSolver可供选择。
关于loss,可以同时有多个loss,可以加regularization(L1/L2);Caffe
Caffe的所有message定义在$CAFFE/src/caffe/proto/caffe.proto中。Experiment
在实验中,主要用到两个protocol buffer: solver的和model的,分别定义solver参数(学习率啥的)和model结构(网络结构)。- 好吧,了一大段,不晓得有没有帮助,说点accuracy = 0.5的问题。简单说,就是分错了,好吧我知道这是废话。既然是分错了,那么就要检查下了,首先检查你的训练模型。
- 根据训练过程来看,训练应该是已经收敛了,(反正loss一直在减小)。
- 这句可能是我理解问题,如果模型收敛的话,loss应该趋于平稳,如这样。
安装python:yum install python-devel.x86_64
Makefile.config修改WITH_PYTHON_LAYER := 1 #取消注释
安装python依赖如果安装 Anaconda Python可以免去下面步骤cd $CAFFE_ROOT/python
for req in $(cat requirements.txt); do pip install $req; done编译make cleanmake pycaffe -j32make test -j32
使Caffe的python接口永久生效vim /etc/profileprofile最后添加: export PYTHONPATH=/root/$CAFFE_ROOT/python:$PYTHONPATHsource /etc/profile
Protocol buffer:
上面已经将过, protocol buffer在 .proto文件中定义message类型,.prototxt或.binaryproto文件中定义message的值;
B. caffe的python接口求助
一、前期环境以及准备1、安装在caffe中,python2和python3的接口都有。但frcnn中只能支持python2.7,所以千万不要装成python3。为了方便,不用自己去pip一大堆库,我建议安装anaconda2,里面已经安装了很多第三方的库。另附python,Windows的第三方库,里面很全。或许有一些库你要去官网上下载。2、安装(更新)显卡驱动和cudaNVIDIA的显卡驱动安装应该不用我说了吧,到官网上下载吧。我要说明一点的是,我的1080ti在安装显卡驱动时,说和Windows不匹配。怎么解决呢?更新Windows,到官网上下驱动,再安装。成功!还有就是记得更新你的显卡驱动,以防老的驱动不支持cuda。CUDA安装的话,也是傻瓜试的安装。提醒一点的是,不要改变他的安装路径,默认路径。然后去NVIDIA的官网上下载cudnn库,这个库的话需要去NVIDIA注册一个账号,然后问你用这个来完成什么工作之类的巴拉巴拉。这个库长什么样呢?下载完解压缩,得到一个cuda的文件夹,里面有3个文件夹然后打开你的CUDA文件夹,默认路径是C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v8.0把cudnn库里面的3个文件夹里面的文件,分别加到cuda里面对应的文件夹。然后打开cuda需要编译的部分,默认路径是C:\ProgramData\NVIDIACorporation\CUDASamples\v8.0因为我用的VS2015,那么我就用打开2015的那个,然后改成release运行。至此,显卡计算的环境就搭建完成了。3、cmake和gitcmake的话,我建议直接下载编译好的能运行的文件(到官网上下载),然后解压文件,把bin的路径添加到Path中。git:因为frcnn里面有很多linux的脚本,你可以不用,但用的话会很方便的。所以我建议安装git。同样,傻瓜式的安装,直接到官网上下载。二、py-faster-rcnn1、编译caffe的python接口GPU版本(如果你编译过了就不用了)因为frcnn的编译过程用需要用到python的caffe包,所以必须要先编译一次caffe。如果你已经编译过caffe的py接口就不用了。下载微软的Caffe,git的地址你可以用git直接下载,或者在git的地址里下载,随便你。[plain]打开caffe\scripts,然后编辑build_win.cmd文件第7行的VERSION是你VS的版本,VS2015对应的是14,VS2013对应的应该是12;第8行改为0;第9行改为0(如果你不用GPU,那就还是1);13行的python_version是你的python版本,2.x就是2,3.x就是3;24,28行是你的python的安装目录,如果你是anaconda就改你的anaconda的目录,否则就不改。同样69-95行同样修改。以上2张图是我的cmake文件配置。进入caffe\scripts,打开cmd,直接执行build_win.cmd。注意他会自动下载需要的库,因为服务器呢都不在国内,所以我建议挂个VPN,不然你且等呢吧。这样cmake后呢,python的接口就已经编译好了,不用再编译一遍了。把caffe\python下的caffe的文件夹到python的第三方包的文件夹就ok。这样caffe的python接口就好了,你可以进cmd的python试一下importcaffe。如果说,他提示少了什么包,你直接pip这个包就好了,找不到的话,网络一下就有。但只要你跟着上面我的方法做应该不会出现什么问题。2、编译py-faster-rcnn依赖库首先呢,我们先去编译一下frcnn的依赖库。Windows下,不能使用自带的lib,把自带的lib删了,重新下载,这里给出git的地址。好了,现在你的库应该长成这样,有setup.py和setup_cuda.py。进cmd,install这2个文件。现在你肯定会遇到问题,提示你VC版本不对怎么呢,先set一下:输入SETVS90COMNTOOLS=%VS140COMNTOOLS%,VS后面的数字就是你的版本。还有不要忘了把你VS的c1.exe加到path下。编译好frcnn的依赖库后,应该是这个样子的。3、给caffe加frcnn的层现在,我们再下载一个caffe,跟前面一样,把build_win.cmd进行修改。然后我们就可以把frcnn的一些特有的层加到caffe里编译了。1)添加层和文件打开py-faster-rcnn\caffe-fast-rcnn\src\caffe\layers文件夹,找到4个文件分别为然后到你新的caffe的对应文件夹caffe\src\caffe\layers里。接着我们添加头文件,打开py-faster-rcnn\caffe-fast-rcnn\include\caffe,把fast_rcnn_layers.hpp这文件到caffe的对应文件夹下caffe\include\caffe。2)配置2个新层打开你的caffe\src\caffe\proto下的caffe.proto,进行编辑。在407行左右往原来的文件里添加新的层的配置信息[plain]_pooling_param=8266711;_l1_loss_param=8266712;messageROIPoolingParameter{//Pad,kernelsize,//,Xpairs.optionaluint32pooled_h=1[default=0];//_w=2[default=0];//Thepooledoutputwidth////_scale=3[default=1];}messageSmoothL1LossParameter{//SmoothL1Loss(x)=//0.5*(sigma*x)**2--ifx<1.0/sigma/sigma//|x|-0.5/sigma/sigma--otherwiseoptionalfloatsigma=1[default=1];}3)cmake新的caffe的python接口就是再执行一遍build_win.cmd就行。编译好之后,把caffe根目录下的python文件夹替换py-faster-rcnn\caffe-fast-rcnn的python文件夹。三、demo完成以上步骤你的py-faster-rcnn就已经编译成功了。如果你想用demo测试一下的话可以用.\data\scripts里的脚本去下载已经训练好的model,文件挺大的、速度挺慢的。所以给大家提供一个网络5,把caffemodel文件放在data\faster_rcnn_models,然后执行tools\demo.py就能看到结果了
C. 如何用python接口调用caffemodel
在python中调用dll文件中的接口比较简单,实例代码如下:如我们有一个test.dll文件,内部定义如下:extern "C"{int __stdcall test( void* p, int len){ return len;}
D. 为什么每次从python导入caffe都要编译接口
原因
E. 怎么才能让python2和python3同时都能调用caffe
设置一个环境变量就可以了,这样在命令行下就可以使用那个版本的python。
一些python的IDE还会让你选择哪一个python版本做为编译器。
F. python caffe 怎么做测试
sudo ./build/examples/cpp_classification/classification.bin \ 路径/deploy.prototxt \ 路径/1_iter_500.caffemodel \ 路径/mean.binaryproto \ 路径/synset_words.txt \ 路径/test.jpg
G. 如何将caffe/python加到环境变量里去
不会的,你设置一个环境变量就可以了,这样在命令行下就可以使用那个版本的python。我同时装的3.5和2.7。一些python的IDE还会让你选择哪一个python版本做为编译器。非常方便。
H. caffe中怎么写python层
这两天一直在研究faster rcnn的源码,可是依旧感觉云里雾里,故下定决心把caffe调用Python
layer的流程仔细走一遍,好明白到底是什么在调用python layer。话说 linux
调试还真是蛋疼啊,木有ide那样直接下断点,gdb又不会用,只能傻比比的不断的LOG(INFO)输出。还好最终还是明白了,我就直接顺着
faster rcnn来说,并记录在此。
faster
rcnn最核心的代码就是在lib文件中,其他的都只是各种调用文件而已。不过lib里写了很多个模块,如何让caffe知道模块在哪里,并调用呢?这是
我搞一晚上的初衷。我先大概说一下caffe正常的流程,首先从文件中读入solver并生成一个solver,然后根据solver的net路径生成一
个net,net调用layer_factory循环生成每个层,最后根据读入model或是filler来初始化参数。实际上也怪自己马虎大意,没太细
看代码,导致所用的时间比较多。从上面的流程可以知道layer_factory是循环生成每个层,我看.cpp文件也的确写了#if
WITH_PYTHON_LAYER,然后有什么什么操作,比如储存python
layer的python_param,并调用setup,不过我没看出来这里实际上已经是利用boost进行C++
Python混编了。这些操作的定义就在python_layer.hpp文件中,我当初还以为在什么pythonXXX.cpp中,找了半天也没找到。
layer_factory中python
layer的setup相关具体操作是,先根据param找到mole的位置,再加载mole,再根据层名加载层,然后前向计算反向计算什么的。
这些就已经算是达到目的了。不过只是知道相对路径,怎么可能加载成功呢?然后又继续找啊找,终于在faster
rcnn的tools文件中找到。_init_paths里有写一些预操作,比如将lib路径写入PYTHONPATH中,当然如果写入的话,这样就可以
直接加载了。终于搞定。
这次也算是个小问题而已,不过只有再理清了整条脉络,看代码才会更加清晰,故也算是个重要的问题吧。不过这次也算是暴露了我不认真的问题,以后还是要耐心仔细找答案才行啊。
I. 如何让caffe同时支持python2.7和python3.4
你可以在caffe的目录里修改Makefile.config这个文件相关参数,来配置Python3.4.Ubuntu系统允许多个版本存在。目前,版是Python 3.5,较好安装python anaconda工具开发。
Caffe可以说是第一个工业级深度学习工具,始于2013年底由UC Berkely的贾杨清编写的具有出色的CNN实现功能的开发语言,在计算机视觉领域Caffe仍然是最流行的工具包