AID数据集示例代码中的MatConvNet的使用和配置

MatConvNet的使用,费尽时间,非常煎熬:

自带的 MatConvNet包不行,新下载的 

 

 

下载的版本 及编译后的结果

 

 

 

 

 

 

 

 

 

开始没有安装vs2015,安装后,重启matlab,执行:

中间提示没有cl.exe,找到vs下的cl.exe

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin我的vs2015在这个目录下,吧它放MatConvNet 的matlab目录下

 mex -setup c++
MEX 配置为使用 'MinGW64 Compiler (C++)' 以进行 C++ 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
    包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
     您需要更新代码以利用
     新的 API。您可以在以下网址找到相关详细信息:
     http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。

要选择不同的 C++ 编译器,请从以下选项中选择一种命令:
MinGW64 Compiler (C++)  mex -setup:C:\Users\gg\AppData\Roaming\MathWorks\MATLAB\R2016a\mex_C++_win64.xml C++
Microsoft Visual C++ 2015 Professional  mex -setup:'D:\Program Files\MATLAB\R2016a\bin\win64\mexopts\msvcpp2015.xml'C++
>> mex -setup:'D:\Program Files\MATLAB\R2016a\bin\win64\mexopts\msvcpp2015.xml' C++    这样才能使用vs c++
MEX 配置为使用 'Microsoft Visual C++ 2015 Professional' 以进行 C++ 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
    包含 2^32-1 个以上元素的 MATLAB 变量。不久以后,
     您需要更新代码以利用
     新的 API。您可以在以下网址找到相关详细信息:
     http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。
>> vl_compilenn
使用 'Microsoft Visual C++ 2015 Professional' 编译。
错误使用 mex
data.cpp
cl: 命令行 error D8027 :无法执行“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Bin\amd64\c1xx.dll”

出错 vl_compilenn>mex_compile (line 478)
mex(mopts{:}) ;

出错 vl_compilenn (line 439)
    mex_compile(opts, srcs{i}, objfile, flags.mexcc) ;

一直出错。。。。。。

核心解决方法:

晚上想跑个程序,结果VC 2010头一次罢工:
            cl: 命令行 error D8027 :无法执行“E:\prog\vc2010\bin\c1xx.dll”
     上网搜索了下,也没找到一个解决方法(官方说明)。正郁闷着,突然间想到cl.exe可以正常运行,而c1xx.dll不能正常运行,会不会是c1xx.dll的依赖库出问题了,于是调出dependency一查,果然少了个msvcp100.dll(估计是某个卸载软件造成的),从别处拷贝一个到bin目录,问题解决。

最后从C:\Windows\System32  下找到了 msvcp100.dll放到了对应的   “C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Bin\amd64\c1xx.dll” 同一路径下

终于编辑成功。庆祝一下。。。。。。。

 

>> vl_compilenn
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Visual C++ 2015 Professional (C)' 编译。
MEX 已成功完成。
>> vl_setupnn

ok。。。。。

参考的博文:

https://blog.csdn.net/weixin_38493025/article/details/80700774

git地址:https://www.robots.ox.ac.uk/~luca/cfnet.html 
参考教程: 
https://www.jianshu.com/p/bd5f49f900a3 
https://blog.csdn.net/zhumiankuan/article/details/80402810

一、安装MatConvNet

下载地址:http://www.vlfeat.org/matconvnet/ 
解压后添加路径到matlab,

cd D:\MATLAB2016b\toolbox\matconvnet-1.0-beta25 %解压路径
addpath matlab
  •  

测试:

>> vl_compilenn
  •  

报错:

错误使用 vl_compilenn>check_compability (line
535)
Unsupported VS C++ compiler, ver >=14.0
required (VS 2015).

出错 vl_compilenn (line 197)
check_compability(arch);

解决:

安装高版本的C++编译器,参考: 
https://blog.csdn.net/rong_toa/article/details/79002711 
设置环境变量,添加到matlab环境中: 
http://blog.sina.com.cn/s/blog_167bbdec10102x113.html

再测试报错

>> vl_compilenn
'cl.exe' 不是内部或外部命令,也不是可运行的程序 
或批处理文件。 
错误使用 vl_compilenn>check_clpath (line 656)
Unable to find cl.exe

出错 vl_compilenn (line 426)
    cl_path = fileparts(check_clpath()); % check
    whether cl.exe in path

解决:

1、使用VS2017的C++编译器 
其实我之前电脑有装VS2017的,但是matlab2016b和matlab2017a有个bug就是不能识别这个编译器,根据版本下载对应的补丁(https://ww2.mathworks.cn/support/bugreports/1487958?s_tid=mwa_osa_a)到matlab安装路径(在matlab中运行matlabroot语句可查看)中,将压缩包中对应的文件覆盖到安装路径对应的路径上。运行mex -setup修改默认编译器:

mex -setup

2、在我的电脑搜索cl.exe,我的cl.exe是在

D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\SDK\ScopeCppSDK\VC\bin

将其复制到MatConvNet的解压路径下即可。

再测试还报错

>> vl_compilenn
使用 'Microsoft Visual C++ 2017' 编译。
错误使用 mex
data.cpp
c1xx: fatal error C1060: 编译器的堆空间不足

百度谷歌了一天多,都无解,卒。生无可恋之时,抱着侥幸心理解压了之后下载的VITAL代码,发现里面也配送matconvnet工具箱,运行里面compile_matconvnet.m代码,出现警告: 名称不存在或不是目录,这个不管。然后再运行matconvnet下子文件夹matlab中的vl_compilenn.m,神了奇,竟然编译成功了:

>> cd D:\Tracking\backup\Vital_release-master\Vital_release-master\matconvnet
>> addpath matlab
>> vl_compilenn %CPU
Starting parallel pool (parpool) using the 'local' profile ... 
使用 'Microsoft Visual C++ 2017' 编译。
MEX 已成功完成。

至于GPU的编译依旧是困难重重啊

%把cudnn放在当前路径下的local里面,与matlab文件夹同级
>>addpath(genpath('当前路径')) 
>>vl_compilenn('enableGpu',true,'cudaRoot','C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5', 'cudaMethod' ,'nvcc', 'enableCudnn','true', 'cudnnRoot','local/cuda') %GPU

报错

nvcc fatal   : nvcc cannot find a supported version of Microsoft Visual Studio. Only the versions 2010, 2012, and 2013 are supported

解决:忘了查了百度谷歌多久了,无意间看到一个方法,结合自己的实际情况,我大胆地尝试了一下: 
直接打开VS2013 x64 兼容工具命令提示

cd c:\

"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\nvcc" -c "D:\Tracking\backup\Vital_release-master\Vital_release-master\matconvnet\matlab\src\vl_imreadjpeg.cu" -DNDEBUG -DENABLE_GPU -DENABLE_CUDNN -Ilocal/cuda -D__SSSE3__ -I"D:\MATLAB2016b\extern\include" -I"D:\MATLAB2016b\toolbox\distcomp\gpu\extern\include" -Xcompiler /MD -o "D:\Tracking\backup\Vital_release-master\Vital_release-master\matconvnet\matlab\mex\.build\vl_imreadjpeg.obj"

注:上面这么长的一段其实我在matlab下断点中得到的,在vl_compilenn.m中的nvcc_compile函数里面打印输出nvcc_cmd这个变量,然后改一下xxx.cu文件所在的路径(打印输出的是相对路径,改为绝对路径)。 
然后我一个个.cu文件就这样在VS2013 x64 兼容工具命令提示进行编译。总体是顺利的,除了nnpooling_cudnn.cu和nnconv_cudnn.cu外,对于这2个后来我把cudnn换成V4和V2也就好了。 
对于后缀是.cpp的文件,直接在matlab运行就行(注释掉以下这一句代码

nvcc_compile(opts, srcs{i}, toobj(bld_dir,srcs{i}), flags.nvcc) ;

建议mex_compile和mex_link分开编译。如果不成功,就mex-setup换一个C++编译器,好像有的地方我用的是VS2012有的是VS2013。这样就大功告成了。 
测试运行

>> vl_test_nnlayers

PS:偷懒快捷的方法

感谢这个博客的作者,http://blog.sina.com.cn/s/blog_679e13290102v6o8.html 
直接用作者编译好的(windows-CPU)matconvnet-1.0-beta7(链接:http://pan.baidu.com/s/1o62thOI 密码:pqij),用VS2012的c++编译器(作者是VS2010),我也编译成功了!实在太感人了! 
ps:vs2017找不到MFC解决方案: 
https://jingyan.baidu.com/article/77b8dc7f8bdf216174eab689.html 
下面这个是我经过上面重重困难编译成功的,大家可以试试能不能直接拿去用,就是先下载vital的代码,然后解压放在里面matlab文件夹里面,与src、xtest文件夹同级。祝好! 
链接:https://pan.baidu.com/s/1LKUbdW4svhYRBDtedj1K4g 密码:4uza

后记:在CFnet作者用的是matconvnet-1.0-beta24,所以我又再搞了一次,发现GPU编译的时候老是出错,说什么Error using mex nvcc fatal : Unsupported gpu architecture ‘compute_61’,明明我在matlab运行gpuDevice第三行显示计算能力6.1来着。后来我尝试直接用vl_compilenn(‘enableGpu’,true)居然成功啦!测试了一下CFnet中tracking文件夹的代码 
如果报错未定义函数或变量 ‘MulConst’。则先运行startup.m

>> run_cfnet1_evaluation
        sub-seq 1/3
        sub-seq 2/3
        sub-seq 3/3

dist: 32.25 overlap: 60.94  fps: 24.6

这是我在WIN10 64位系统下编译后的matconvnet-1.0-beta24,有需要自取: 
链接:https://pan.baidu.com/s/1xSZMgGkC_YVuERsexKoz7A 密码:k74v

 

 

最终结果 :

 

> In SVMClassification_aid (line 10) 
iteration: 1
Accuracy = 48.675% (3894/8000)
iteration: 2
Accuracy = 49.2875% (3943/8000)
iteration: 3
Accuracy = 48.55% (3884/8000)
iteration: 4
Accuracy = 48.3% (3864/8000)
iteration: 5
Accuracy = 49.3375% (3947/8000)
iteration: 6
Accuracy = 48.275% (3862/8000)
iteration: 7
Accuracy = 48.275% (3862/8000)
iteration: 8
Accuracy = 48.6% (3888/8000)
iteration: 9
Accuracy = 48.7625% (3901/8000)
iteration: 10
Accuracy = 48.7625% (3901/8000)

acc_mean =

   48.6825


acc_std =

    0.3816

iteration: 1
Accuracy = 50.525% (4042/8000)
iteration: 2
Accuracy = 51.225% (4098/8000)
iteration: 3
Accuracy = 50.1125% (4009/8000)
iteration: 4
Accuracy = 49.975% (3998/8000)
iteration: 5
Accuracy = 50.4375% (4035/8000)
iteration: 6
Accuracy = 50.575% (4046/8000)
iteration: 7
Accuracy = 51.05% (4084/8000)
iteration: 8
Accuracy = 50.9875% (4079/8000)
iteration: 9
Accuracy = 50.0375% (4003/8000)
iteration: 10
Accuracy = 50.6625% (4053/8000)

acc_mean =

   48.6825   50.5588


acc_std =

    0.3816    0.4356

iteration: 1
Accuracy = 41.3125% (3305/8000)
iteration: 2
Accuracy = 41.025% (3282/8000)
iteration: 3
Accuracy = 41.6% (3328/8000)
iteration: 4
Accuracy = 41.8625% (3349/8000)
iteration: 5
Accuracy = 41.025% (3282/8000)
iteration: 6
Accuracy = 41.7125% (3337/8000)
iteration: 7
Accuracy = 40.95% (3276/8000)
iteration: 8
Accuracy = 41.05% (3284/8000)
iteration: 9
Accuracy = 41.2625% (3301/8000)
iteration: 10
Accuracy = 40.5625% (3245/8000)

acc_mean =

   48.6825   50.5588   41.2362


acc_std =

    0.3816    0.4356    0.3969

 


版权声明:本文为gdengden原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。