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