关于pvanet的配置、编译、训练和测试流程的总结

最近一段时间,在学习用caffe框架弄pvanet的目标检测,从一开始的配置就很头大,期间遇到各种问题,各种百度,各种看帖子,才算解决吧。。。总结一下。其实,这个流程和faster-rcnn是基本一样的,只不过二者网络文件不一样而已。先大概写一下,后面想到了,在补充吧。

PVANET
一、安装与配置
参考网址http://blog.csdn.net/qq_29133371/article/details/53945143
http://www.cnblogs.com/LaplaceAkuir/p/6484500.html

1.安装cuda7.5(cuda8.0应该也是可以的)
安装cuda直接选择默认路径就可以。安装成功后,系统会自动配置两个环境变量,如下:
CUDA_PATH:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
CUDA_PATH_V7_5:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5
如果电脑中同时安装了两个版本的cuda,那么注意将CUDA_PATH和你将要用的cuda版本保持一致,以免后面出错。
安装后需要测试一下是否安装成功:
首先在cmd输入nvcc –V,出现如下字样:
这里写图片描述
然后进入C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5 点击Samples_vs2013.sln编译运行,出现如下结果表明cuda安装成功:
这里写图片描述

2.caffe与pvanet的配置,生成libcaffe.lib
地址:https://github.com/sanghoon/pva-faster-rcnn
第三方库地址:http://pan.baidu.com/s/1mg1iJrE,还有boost
https://sourceforge.net/projects/boost/files/boost-binaries/
下载对应网络的安装文件,以及对应的caffe安装包,其实就是文件夹,里面有该网络用到的各种网络层文件,也有一些python代码,用于训练和测试等。值得一提的是,在上述网站下载pvanet的压缩包解压之后,caffe那个文件夹里是空的,只要把caffe那个文件夹单独下载再放进去就可以了。
这里要注意的是,一定要用对应的网络的文件夹资源,因为网络不同,用到的网络层也会不一样。比如pvanet网络caffe下面的src中网络层和faster-rcnn的就有不一样的。我一开始就用的faster-rcnn,因为pvanet是在这个基础上修改的,以为把include和src中的文件都添加进去就肯定不会少,结果训练还是检测时报错说少proposal_layer,仔细检查才发现faster-rcnn中根本没有这个层,pvanet下面的caffe里就有。
同时也要准备所用到的依赖库,后面编译工程时都需要加载进去,包括cudnn的库、python安装库(这里用的是Anaconda),还有一些第三方库,放在3rdparty文件夹,放在caffe下面的路径。至于Opencv就不提供地址了。
下载对应网络的caffe,准备编译工程。新建一个空的解决方案,然后新建libcaffe项目,把src和include中的都加进去(当然,有些网络层是用不到的,但是为了保险,都加进去)。这里最好分类,看着比较好看一点,如下图:
这里写图片描述
这里写图片描述 这里写图片描述
编译前着重注意以下几点:
(1) 改为x64,Release版本
(2) 右击项目,生成依赖项 -> 生成自定义,勾选cuda7.5
(3) 修改常规中的内容如图:
这里写图片描述
(4) 项目属性添加附加包含目录(包括cuda、cudnn、Anaconda、include和src、opencv与3rdparty里的库)。
这里写图片描述
(5) 在C/C++ ->预处理器中,加入以下几个宏,其中第一个可以避免后面编译时报的某些错误。
_CRT_SECURE_NO_WARNINGS
WITH_PYTHON_LAYER
USE_CUDNN
USE_OPENCV
USE_LEVELDB
USE_LMDB
(6) 参考网址http://blog.csdn.net/lqp888888/article/details/77943837 生成相应文件,其中头文件放在include/proto中,也要加载到项目中。
(7) 在C/C++ -> 常规 -> 将警告视为错误 设为否。
(8) 看一下加入的cu文件,右击,选择 属性–常规–项类型–CUDA C/C++,否则编译的时候会跳过这些cu文件。
然后开始编译,编译之后会报很多错误:
1) 缺少caffe\proto\caffe_pb2.h
修改:上面的[6]没完成,运行相应bat脚本文件即可生成caffe_pb2.h
2) 无法识别getpid
修改:在报错的cpp一开始加上以下语句

#if defined(_MSC_VER)
#include <process.h>
#define getpid() _getpid()
#endif

3) identifier”::caffe::kBNLL_THRESHOLD” is undefined in device code
修改:找到报错的cpp,这里有一个参数定义const float kBNLL_THRESHOLD = 50. ,这里直接注释掉这一句,把用到该参数的地方直接改成50. 就行了。
4) error C2051: case 表达式不是常量,以及SA_RESTART不是属性等错误
修改如下:

#ifdef _MSC_VER
    case SIGBREAK:  // there is no SIGHUP in windows, takeSIGBREAK instead.
      got_sighup = true;
      break;
#else
    case SIGHUP:
      got_sighup = true;
      break;
#endif
    case SIGINT:
      got_sigint = true;
      break;
②修改HookupHandler()方法与UnhookHandler()方法
void HookupHandler() {
    if (already_hooked_up) {
      LOG(FATAL) << "Tried to hookup signal handlersmore than once.";
    }
    already_hooked_up = true;
#ifdef _MSC_VER
         if (signal(SIGBREAK,handle_signal) == SIG_ERR) {
                   LOG(FATAL) <<"Cannot install SIGBREAK handler.";
         }
         if (signal(SIGINT, handle_signal)== SIG_ERR) {
                   LOG(FATAL) <<"Cannot install SIGINT handler.";
         }
#else
         struct sigaction sa;
         // Setup the handler
         sa.sa_handler =&handle_signal;
         // Restart the system call, if atall possible
         sa.sa_flags = SA_RESTART;
         // Block every signal during thehandler
         sigfillset(&sa.sa_mask);
         // Intercept SIGHUP and SIGINT
         if (sigaction(SIGHUP, &sa,NULL) == -1) {
                   LOG(FATAL) <<"Cannot install SIGHUP handler.";
         }
         if (sigaction(SIGINT, &sa,NULL) == -1) {
                   LOG(FATAL) <<"Cannot install SIGINT handler.";
         }
#endif
}
void UnhookHandler() {
           if(already_hooked_up) {
#ifdef _MSC_VER
                     if(signal(SIGBREAK, SIG_DFL) == SIG_ERR) {
                              LOG(FATAL)<< "Cannot uninstall SIGBREAK handler.";
                     }
                     if(signal(SIGINT, SIG_DFL) == SIG_ERR) {
                              LOG(FATAL)<< "Cannot uninstall SIGINT handler.";
                     }
#else
                     structsigaction sa;
                     // Setupthe sighub handler
                     sa.sa_handler= SIG_DFL;
                     // Restartthe system call, if at all possible
                     sa.sa_flags= SA_RESTART;
                     // Blockevery signal during the handler
                     sigfillset(&sa.sa_mask);
                     //Intercept SIGHUP and SIGINT
                     if(sigaction(SIGHUP, &sa, NULL) == -1) {
                              LOG(FATAL)<< "Cannot uninstall SIGHUP handler.";
                     }
                     if(sigaction(SIGINT, &sa, NULL) == -1) {
                              LOG(FATAL)<< "Cannot uninstall SIGINT handler.";
                     }
#endif
                     already_hooked_up= false;
           }
  }

5) error C2360: “occurrences_32”的初始化操作由“case”标签跳过。
修改:每个case后面的语句都用{}括起来。
6) error C3861: “_open”: 找不到标识符
修改:在报错的cpp开头加上如下语句

#if defined(_MSC_VER)
#include <io.h>
#endif

7) error C2948: 显式实例化;专用化中不允许存储类说明符“static”
修改:报错语句改为 template static float iou(const float A[], const float B[]);
8) error LNK2001: 无法解析的外部符号 “__declspec(dllimport) void __cdecl google::InstallFailureSignalHandler(void)”
修改:这个错误直接把对应的函数注释了就行,不会有什么影响。
编译成功之后,生成了对应的libcaffe.lib,也就是caffe的接口,接下来要用这个接口生成caffe的python接口。

再新建一个项目pycaffe,找到_caffe.cpp,添加为源文件,准备编译:
(1) 改为x64,Release版本
(2) 右击项目,生成依赖项 -> 生成自定义,勾选cuda7.5
(3) 项目属性中,添加附加包含目录(包括cuda、cudnn、Anaconda、include和src、opencv与3rdparty里的库),这个跟libcaffe项目中的一样。不过需要再额外添加一个E:\Anaconda\Lib\site-packages\numpy\core\include
(4) 添加附加库目录,对应着包含目录来添加就行,这里还要额外加一个libcaffe.lib所在的目录。接下来就是附加依赖项。
这里写图片描述
附加依赖项:
caffelib.lib; opencv_core249.lib; opencv_imgproc249.lib; opencv_highgui249.lib; cudart.lib; cuda.lib; nppi.lib; cufft.lib; cublas.lib; curand.lib; gflags.lib; libglog.lib; libopenblas.dll.a; libprotobuf.lib; libprotoc.lib; leveldb.lib; lmdb.lib; libhdf5.lib; libhdf5_hl.lib; Shlwapi.lib; cudnn.lib

(5) 在C/C++ ->预处理器中,加入以下几个宏,其中第一个可以避免后面编译时报的某些错误。
_CRT_SECURE_NO_WARNINGS
WITH_PYTHON_LAYER
USE_CUDNN
USE_OPENCV
USE_LEVELDB
USE_LMDB
(6) 在“通用属性”中,添加新的引用,引用libcaffe,然后将对应的属性改为False, False, True, True, True
(7) 在C/C++ -> 常规 -> 将警告视为错误 设为否。
(8) 在配置属性 –>常规中,修改“目标文件名”为“_caffe”,“目标文件扩展名”为“.pyd”,配置类型为“动态库(.dll)”。如图:
这里写图片描述
然后编译生成caffe的python接口_caffe.pyd。
编译过后,python的接口_caffe文件名的四个文件,以及一些需要的dll什么的,具体是在caffe文件夹下的python中caffe文件夹复制到Anaconda\Lib\site-packages下,否则后面会无法引入caffe模块。打开Anaconda下的python.exe,输入import caffe,看看是否报错,如果没报错,就说明模块导入成功了。
如果提示说缺少dll,那么可以用depends工具查看_caffe.pyd缺少了哪些,补上就行了。

二、数据集的制作
参考网址:http://blog.csdn.net/sinat_30071459/article/details/50723212
VOCdevkit2007 ->VOC2007,里面是Annotations(xml文件)、JPEGImages(图片)、ImageSets、Labels,其中ImageSets中有子文件夹Main,Main中是trainval.txt,train.txt,val.txt,test.txt。用BBox-Label-Tool中的main_jpg.py来标定,标定的txt文件生成在Labels中,再用main_toXml.py来转化成xml文件,供训练使用。注意,这里要仔细一点,如果某个标定框未被加上标签,后面训练是会报错,’Nonetype’ object has no attribute of ‘lower()’
三、训练和检测
1、建立Cython模块
这一步也是必不可少。在pvanet下的lib文件夹中,编译newsetup.py和setup_cuda.py等,参考网址http://lib.csdn.net/article/deeplearning/55081 ,当中遇到什么没有的模块,直接在cmd窗口中pip install就可以了。
这里经常会出现错误TypeError: object of type ‘NoneType’ has no len(),这就需要添加VS的cl.exe到环境变量中,如图。为了保险起见,就把电脑中所有cl.exe所在的路径都添加。
这里写图片描述
2、修改相关python文件
参考网址http://www.cnblogs.com/louyihang-loves-baiyan/p/4906690.html,主要是修改train.prototxt的内容,修改 input、cls_score、roi-data 中的 num_classes(或是num_output)为(类别+1),修改bbox_pred中的num_output为(类别+1)*4。
imdb.py:在代码行 boxes[:, 2] = widths[i] - oldx1 - 1 下面加入代码:

for b in range(len(boxes)):  
    if boxes[b][2]< boxes[b][0]:  
        boxes[b][0] = 0  

pascal_voc.py:修改成自己训练的类别,类别一定都要弄成小写的,否则后面训练会报has no attribute of ‘lower()’的错。如图:
这里写图片描述
然后就是调用tools\train_net.py,在cmd窗口写命令训练了。训练如果报错out of memory,是显卡内存不够的问题,可以考虑修改lib\fast_rcnn\config.py里的一些参数,主要是TRAIN.BATCH_SIZE,改为64,32等等,还可以修改TRAIN.SCALES和TRAIN.MAX_SIZE等,但是后两个值不能改的太小,这就又会报另一个错误ValueError: attempt to get argmax of an empty sequence。
测试的话,是调用test_net.py,测试时可能会出现size不一致的问题(参考网址http://blog.csdn.net/zhangla1220/article/details/50697352 ),这就要在代码中进行修改,重新编译,重新训练,检测等。
另外,还可能会报错,说找不到对应的xml文件,这个要在voc_eval.py中修改xml文件的路径。
测试我还遇到了一个could not find or load Qt platform plugin的问题,按照网址http://blog.csdn.net/qq_29343201/article/details/54707173 的介绍,直接将qt有关的python库都卸载重装一下,就可以了。
最后还要很感谢引用的博客的作者们,正是站在了巨人的肩膀上才最终成功。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值