相信很多朋友在Windows下配置Caffe的时候都会在编译libcaffe时候遇到关于opencv无法调用的问题。今天终于把它解决了,记录一下。出现问题的原因可能是之前在环境变量里已经配置过opencv的路径。因为我之前就用到opencv,所以我的环境变量里有opencv3.10的路径配置。所以我决定用自己的opencv,不用自动下载的。
先总结一下网上给出的有用的解决方案。
1、右键解决方案,管理解决方案的NuGet包,卸载opencv2.4.10对所有工程的关联如图把勾全去掉就可以
然后点击联机搜索opencv重新安装,由于版本的更新,所以你再重新下载opencv的版本是2.4.11,安装完,这时候就需要更改.vcxproj里的路径,把vcxproj文件里面的所有关于Opencv2.4.10的字样改为Opencv2.4.11,具体怎么操作呢,先卸载该项目,然后右键点击编辑.vcxproj文件,打开进行上述更改就可以了,更改完记得保存,重新加载项目,如图我这里只是举个例子,卸载的是classification。然后对每个项目这么操作就行了。
2、第二种方法就有点玄学了,用管理员身份运行vs2013,然后发现报错提示的opencv.pro文件路径里多了一个斜杠,打开pro文件删除斜杠。这种方法我试过,只在部分情况下有效,比如用第一种方法之后还报错,就可以再结合这第二种方法。
那么接下来说说我的方法。上面第一种方法,会带来不知何故的错误,所以建议用我这种方法,总的来说就是opencv的问题,所以自己下载opencv并配置就可以了。我下载的是opencv3.10。把自带的opencv卸载干净 ,包括.vcxproj里面的路径。然后在vs上面的菜单栏找到视窗,其他视窗,属性管理器,对应会出来每个工程的属性管理器。然后找到这个属性的Release|x64文件夹,当然如果你是Debug平台就选相应的文件夹就可以,方法是一样的。点击右键,添加新项目属性表。然后把你的opencv的lib文件路径包含在库目录里,把include路径包含在包含目录里。再把.lib文件包含在链接器->输入->附加依赖项里面。如果你刚刚选的是Release|x64,那么你只需要包含opencv名字后面没有d的lib文件就可以。这样配置的好处就是,其他项目需要opencv的话,只需要用相同方法,添加现有项,把刚刚配置好的opencv属性添加进去就好,不用再重新配置,比较方便。
另外如果其他的包出问题,比如glog,boost,这些包出问题,只需要卸载了重新下载就好,如果版本不对更新一下就可以了。这了要说一个细节,重新下包的工程最好右键生成依赖项->自定义依赖项把刚刚重新下过的包前面的勾给去掉,否则,你在下次生成这个工程的 时候,它会重新生成自带的包,你又要再操作一边。还有一点就是生产和重新生成的区别,生成只是把当前的工程生成,重新生成要把所有的依赖项生成,会更稳妥一点。
这里再补充一点,调bug的经历。我的数据集图片大小是1930*1000,没有注意prototxt文件里的resize。默认的尺寸是300*300,所以这样就把原图压缩的严重,最后识别效果自然不好。在训练的时候,虽然设置了GPU训练,但是内存却一直涨,涨满之后,电脑就会死机,为解决这个问题,我下载了不同的版本的caffe-windows-ssd,配置了很多次,花了一星期时间,问题仍然没有解决,所以只好,在内存快满的时候,手动清理内存,后来下了一个按键精灵,写了个脚本,每隔30分钟自动点击一次电脑管家的小火箭清理一次内存。直到有一天,我把resize尺寸设置为接近原图的尺寸,这个bug就消失了,内存也不再涨了。我想,可能是因为原图尺寸太大,resize后的尺寸很小,他们转换占用了太多虚拟内存,生成了一些垃圾。还有一个可能的原因是,我们solver.prototext设置了test_interval次测试一次,测试的时候要迭代test_iter次进行测试,这里test_iter乘测试阶段的batchsize等于测试集的大小。在这个测试过程中,它会使用内存,这也是导致内存一直上涨的原因。