一、Caffe编译
Step0:注意事项:从step1开始,出错了来此处找解决方案
- MSB4062 error:opencvtask.dll读取错误,详见step4中第五步,即可完美解决
- Nuget更新导致无法自动下载nugetpackages
如Nuget基础连接关闭,无法还原nuget,参考Nuget给的解决方案
管理员身份打开CMD,依次输入以下命令即可
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:64
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f /reg:32
- 编译caffe
(1)运行报错 CUDA_POST_KERNEL_CHECK check failed
在caffe所有项目中搜索此代码,注释掉重新编译即可
(2)需要特别为目标显卡计算能力编译版本,注意开发环境,生产环境CC对应关系,预处理保持一致
(3)通常变更代码重新编译后,仅需要重新编译和替换 caffe.lib 和 libcaffe.lib文件即可,偶尔也需要替换其他相关库文件
Step1:确认GPU环境
- Nvidia Driver newest version + CUDA10.1 + cudnn7.6.5 for CUDA10.1
- 注意CUDA中visual studio integration的要装上
Step2:安装VS2013
Step3:下载Caffe源码 (microsoft版本)
Step4:VS2013中配置Caffe
- 进入caffe-master\windows文件夹,直接复制粘贴CommonSettings.props.example文件,并将其重命名为CommonSettings.props
- 使用vs2013打开caffe.sln
- 依次点击解决方案栏中的 props-CommonSettings.props并打开,作如下修改
约第7行,CpuOnlyBuild,只需要CPU版本的设置为true
约第9行,CudaVersion参数改为你的CUDA版本号
约第21行,CudaArchitecture参数删除 compute_35,sm_35; 带最后的分号,根据自己显卡算力填写即可
约第13行,PythonSupport,需要python接口的设置为true
约第48行,PythonDir参数改为你的python2.7路径 (如:C:\Anaconda3\envs\caffe)
- 关闭vs2013,并用其重新打开caffe.sln
Step5:VS中重中之重的设置
1. 在vs顶端依次点击【工具】——【选项】——【项目和解决方案】——【生成并运行】,将最大并行项目生成数设置为1,设置数量过大,会因为多线程同时访问一个资源而导致各种问题
- 调整Debug模式为Release模式
- 依次:右键单击libcaffe—属性—C/C+±–将警告视为错误—是变更为否
- 对每个解决方案中的其他15个项目也进行(3)中的操作
- 右键点击解决方案----生成解决方案,等待完成
- 如果出现了 “too few arguements in fuction call” 错误,双击错误进入相应代码行,在CUDNN_CROSS_CORRELATION后面添加 CUDNN_DATA_FLOAT参数,重新编译即可通过
此错误是由于CUDA版本9.0变更为10.0以上导致
Step6:Python接口后续
- 将caffe-master\Build\x64\Release\pycaffe中的caffe文件夹复制粘贴到python路径中的Lib\site-packages中,如:C:\Anaconda3\envs\caffe\Lib\site-packages
- anaconda prompt 进入到此python环境中,输入import caffe,根据错误提示安装相应包,直到无错误为止,python接口完成
- 将C:\Anaconda3\envs\caffe中python27.dll拷入caffe-master\Build\x64\Release中
Step7:补充编译opencv3.0.0.1版本caffe
- 通过vs nuget package管理器(推荐)
(1)从每个项目中卸载opencv2.4.10
(2)安装opencv3 redis和opencv3.0.0.1 - 手动安装
(1)从每个项目中卸载opencv2.4.10,然后去nuget网站下载相应的包
(2)通过vs nuget package管理器导入安装到项目配置
(3)卸载每个项目,并修改其中opencv相关的版本号2.4.10 变更为 3.0.0 - 个人修改好的源码地址
二、Caffe训练
Step1:数据集准备(图像10分类为例)
- 数据源准备
随意组织,仅需要后续的 train.txt中【文件路径名】——【标签】对应即可 - train.txt和test.txt文件准备
自行写代码或者脚本搞定吧,最终train.txt中的内容应如下格式
【类别文件夹/图片名】+ 【空格】+【类别标签】,空格一定要有
0/0(1).jpg 0
0/0(1).jpg 0
1/1(1).jpg 1
1/1(1).jpg 1
2/2(1).jpg 2
2/2(1).jpg 2
3/3(1).jpg 3
3/3(1).jpg 3
- 数据集转换
在CMD中依次输入以下命令
cd ../caffe-master/Build/x64/Release
convert_imageset --resize_height=224 --resize_width=224 --shuffle=true --gray=true .../train/ .../train.txt .../train_lmdb
- 计算均值保存文件
继续输入以下命令
compute_image_mean .../train_lmdb .../mean.binaryproto
Step2:获取修改网络结构相关文件
- 获取相关文件
(1)利用搜索引擎获取即可,主要是以下三个文件
【net.prototxt】【solver.prototxt】【deploy.prototxt】 - net.prototxt文件修改
(1)transfer-learning,Fine-tune学习率设置为0即为freeze - solver.prototxt文件修改
(1)Adam: 不建议用,推荐Adadelta
(2)test_iter:test_iter * batch_size >=测试数据总数量
(3)test_interval:test_interval * batch_size >=训练数据数量
(4)display,snapshot根据个人需求设置即可
Step3:训练分类模型
- 回到【Step1-3步骤】目录的CMD中,输入以下命令
caffe train --solver=.../solver.prototxt --weights=.../pretrained.caffemodel --gpu 0
其中,【gpu】参数设置为all可以使用所有的GPU,输入0,1,2,3等可以使用相应的GPU
三、Caffe部署
Step0:注意事项
- 如果需要修改项目的CUDA版本,则卸载项目并修改vsproj文件中的CUDA版本号即可
Step1:VS2013中配置Caffe相关文件
- 新建一个项目
- 包含目录-include(自定义头文件包参考以下目录拉取文件即可)
【项目】-【属性】-【VC++】-【包含目录】加入以下相应内容
…/NugetPackages\OpenCV.2.4.10\build\native\include
…/NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
…/NugetPackages\protobuf-v120.2.6.1\build\native\include
…/NugetPackages\glog.0.3.3.0\build\native\include
…/NugetPackages\gflags.2.1.2.1\build\native\include
…/NugetPackages\boost.1.59.0.0\lib\native\include
…/caffe-master\include
…/caffe-master\include\caffe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
- 库目录-lib(自定义库文件参考以下目录拉取文件即可)
【项目】-【属性】-【VC++】-【库目录】加入以下相应内容
…/NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Release
…/NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
…/NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
…/NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
…/NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamic
…/NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Release
…/NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
…/NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
…/NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
…/NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
…/NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
…/caffe-master\Build\x64\Release
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
- 动态链接库-dll
(1)将lib文件夹中的dll拷出
(2)参考路径C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT 拷出msvcr120.dll 和 msvcp120.dll - 链接器输入
【项目】-【属性】-【链接器】-【输入】加入以下内容
libcaffe.lib
libprotobuf.lib
libglog.lib
gflags.lib
libopenblas.dll.a
hdf5.lib
hdf5_hl.lib
cublas.lib
cuda.lib
cudadevrt.lib
cudnn.lib
cudart.lib
cufft.lib
cudart_static.lib
cufftw.lib
cusparse.lib
cusolver.lib
curand.lib
nppc.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
opencv_core300.lib
opencv_highgui300.lib
opencv_imgproc300.lib
opencv_imgcodecs300.lib
有其他需要根据需求添加即可如
opencv_calib3d300.lib
opencv_ml300.lib
opencv_videoio300.lib
Step2:修改classification.cpp,推理过程封装API为dll文件
- 基本设置,整理好库文件放在VS项目根目录下然后进行相应基础设置
(1)包含文件目录 【.\include】
(2)库文件目录 【.\lib】
(3)step1-4中的lib添加到链接器中 - extension.h文件
#ifndef EXTENSION_H
#define EXTENSION_H
#include <iostream>
#include <vector>
using namespace std;
class __declspec(dllexport) RecogDll;
class RecogDll
{
private:
class ExModule;
ExModule* ex_module;
public:
RecogDll(const int mode);
~RecogDll();
vector<float> predict(const string& image_path);
}