Windows:Caffe 编译训练(图像分类)部署工作流

本文详细介绍了在Windows上编译Caffe(包括GPU环境配置、VS2013设置、Python接口安装),接着阐述了Caffe的图像分类训练流程,最后讲解了如何将模型部署为DLL文件并使用API。涉及到CUDA、CUDNN的版本匹配,以及在编译和训练过程中可能遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

一、Caffe编译

Step0:注意事项:从step1开始,出错了来此处找解决方案

  1. MSB4062 error:opencvtask.dll读取错误,详见step4中第五步,即可完美解决
  2. 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
  1. 编译caffe
    (1)运行报错 CUDA_POST_KERNEL_CHECK check failed
    在caffe所有项目中搜索此代码,注释掉重新编译即可
    (2)需要特别为目标显卡计算能力编译版本,注意开发环境,生产环境CC对应关系,预处理保持一致
    (3)通常变更代码重新编译后,仅需要重新编译和替换 caffe.lib 和 libcaffe.lib文件即可,偶尔也需要替换其他相关库文件

Step1:确认GPU环境

  1. Nvidia Driver newest version + CUDA10.1 + cudnn7.6.5 for CUDA10.1
  2. 注意CUDA中visual studio integration的要装上

Step2:安装VS2013

Step3:下载Caffe源码 (microsoft版本)

下载地址1
下载地址2

Step4:VS2013中配置Caffe

  1. 进入caffe-master\windows文件夹,直接复制粘贴CommonSettings.props.example文件,并将其重命名为CommonSettings.props
  2. 使用vs2013打开caffe.sln
  3. 依次点击解决方案栏中的 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)
  1. 关闭vs2013,并用其重新打开caffe.sln

Step5:VS中重中之重的设置

1. 在vs顶端依次点击【工具】——【选项】——【项目和解决方案】——【生成并运行】,将最大并行项目生成数设置为1,设置数量过大,会因为多线程同时访问一个资源而导致各种问题

  1. 调整Debug模式为Release模式
  2. 依次:右键单击libcaffe—属性—C/C+±–将警告视为错误—是变更为否
  3. 对每个解决方案中的其他15个项目也进行(3)中的操作
  4. 右键点击解决方案----生成解决方案,等待完成
  5. 如果出现了 “too few arguements in fuction call” 错误,双击错误进入相应代码行,在CUDNN_CROSS_CORRELATION后面添加 CUDNN_DATA_FLOAT参数,重新编译即可通过
    此错误是由于CUDA版本9.0变更为10.0以上导致

Step6:Python接口后续

  1. 将caffe-master\Build\x64\Release\pycaffe中的caffe文件夹复制粘贴到python路径中的Lib\site-packages中,如:C:\Anaconda3\envs\caffe\Lib\site-packages
  2. anaconda prompt 进入到此python环境中,输入import caffe,根据错误提示安装相应包,直到无错误为止,python接口完成
  3. 将C:\Anaconda3\envs\caffe中python27.dll拷入caffe-master\Build\x64\Release中

Step7:补充编译opencv3.0.0.1版本caffe

  1. 通过vs nuget package管理器(推荐)
    (1)从每个项目中卸载opencv2.4.10
    (2)安装opencv3 redis和opencv3.0.0.1
  2. 手动安装
    (1)从每个项目中卸载opencv2.4.10,然后去nuget网站下载相应的包
    (2)通过vs nuget package管理器导入安装到项目配置
    (3)卸载每个项目,并修改其中opencv相关的版本号2.4.10 变更为 3.0.0
  3. 个人修改好的源码地址

二、Caffe训练

Step1:数据集准备(图像10分类为例)

  1. 数据源准备
    随意组织,仅需要后续的 train.txt中【文件路径名】——【标签】对应即可
  2. 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
  1. 数据集转换
    在CMD中依次输入以下命令
cd ../caffe-master/Build/x64/Release
convert_imageset --resize_height=224 --resize_width=224 --shuffle=true  --gray=true  .../train/ .../train.txt .../train_lmdb
  1. 计算均值保存文件
    继续输入以下命令
compute_image_mean .../train_lmdb .../mean.binaryproto 

Step2:获取修改网络结构相关文件

  1. 获取相关文件
    (1)利用搜索引擎获取即可,主要是以下三个文件
    【net.prototxt】【solver.prototxt】【deploy.prototxt】
  2. net.prototxt文件修改
    (1)transfer-learning,Fine-tune学习率设置为0即为freeze
  3. solver.prototxt文件修改
    (1)Adam: 不建议用,推荐Adadelta
    (2)test_iter:test_iter * batch_size >=测试数据总数量
    (3)test_interval:test_interval * batch_size >=训练数据数量
    (4)display,snapshot根据个人需求设置即可

Step3:训练分类模型

  1. 回到【Step1-3步骤】目录的CMD中,输入以下命令
 caffe train --solver=.../solver.prototxt --weights=.../pretrained.caffemodel --gpu 0

其中,【gpu】参数设置为all可以使用所有的GPU,输入0,1,2,3等可以使用相应的GPU

三、Caffe部署

Step0:注意事项

  1. 如果需要修改项目的CUDA版本,则卸载项目并修改vsproj文件中的CUDA版本号即可

Step1:VS2013中配置Caffe相关文件

  1. 新建一个项目
  2. 包含目录-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
  1. 库目录-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
  1. 动态链接库-dll
    (1)将lib文件夹中的dll拷出
    (2)参考路径C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x64\Microsoft.VC120.CRT 拷出msvcr120.dll 和 msvcp120.dll
  2. 链接器输入
    【项目】-【属性】-【链接器】-【输入】加入以下内容
    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文件

  1. 基本设置,整理好库文件放在VS项目根目录下然后进行相应基础设置
    (1)包含文件目录 【.\include】
    (2)库文件目录 【.\lib】
    (3)step1-4中的lib添加到链接器中
  2. 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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值