win10 GPU 下caffe faster-rcnn C++版训练自己的图片
概述与效果展示:
说明: 记录一下caffe faster-rcnn学习和使用过程,部分图片和描述直接用网上的,如有雷同,不用怀疑,哪就是我抄的(手动滑稽)
效果图: 1表示长螺丝 2表示短螺丝
参考文档
下面是主要参考文档:
- https://blog.csdn.net/maltliquor/article/details/78261339 caffe 的编译
- https://blog.csdn.net/Angela_qin/article/details/79443115 caffe faster-rcnn编译和使用
- https://github.com/huaze555/windows-caffe-faster-rcnn C++ 版提供者的github
- https://blog.csdn.net/zxj942405301/article/details/78602671 C++ 版提供者的博客 底下有一些问题和解决方式(出了问题可以看下)
系统环境以及资源链接
环境以及相关连接 :
- 系统版本:win10 x64
- 显卡配置: NVIDIA GeForce GTX745 4GB
- CUDA 7.5 ————官网下载链接:https://developer.nvidia.com/cuda-75-downloads-archive
- Cudnn:6.0 ————官网下载链接:https://developer.nvidia.com/search/site/cudnn-7.5-windows10-x64-v6.0
- Anacanda2 ————官网下载链接:https://www.anaconda.com
- Visual Studio 2013 ————别人的网盘链接: https://pan.baidu.com/s/1o8aDsVK密码: 8fc9
- windows-caffe-faster-rcnn-master ———github链接:https://github.com/huaze555/windows-caffe-faster-rcnn
caffe配置环境
流程
- 安装Anacanda2
- 安装CUDA 7.5
- 下载Cudnn:6.0 并配置(这个是lib库caffe框架调用GPU会用得到)
- 安装Visual Studio 2013(最好使用2013,亲测其他版本编译问题挺多的)
- 下载windows-caffe-faster-rcnn-master
- 用Visual Studio 2013编译windows-caffe-faster-rcnn-master
具体步骤:
1 安装Anacanda2 下载然后直接安装 记得不要有中文路径
(顺便提一句,如果你老是安装不上Anacanda(装不全),不要想了,直接重装系统吧,我下了各个版本,用不同方法装了20几遍,最后还是重装系统了)
2. 安装CUDA 7.5
你的显卡要是英伟达的, CUDA版本要和你的显卡版本对应(通常高板的cuda会向下兼容)
使用默认路径
检测兼容性时如果有什么问题可以直接忽略
选择精简安装
3. 下载Cudnn:6.0 并配置
安装cudnn,将cudnn解压后,cudnn中的cuda文件夹下有bin、include、lib文件夹,要把文件夹中的东西提取出来,放进cuda中C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5路径下对应的 bin、include、lib文件夹中
我的解压目录
将cuda下的三个文件夹下的文件放入 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5 下对应目录下
4. 安装Visual Studio 2013
这个没什么好说的,直接跳过
5. 下载windows-caffe-faster-rcnn-master
windows-caffe-faster-rcnn-master --github链接:https://github.com/huaze555/windows-caffe-faster-rcnn
在F盘建一个文件夹Caffe_FCNN_GPU(自己可在其他盘建文件夹,名字可以随意,不要有中文)将下载的windows-caffe-faster-rcnn-master 解压进去(这里其他文件请先忽略)
将前面解压的cudnn 文件夹中的cuda文件夹整个拷贝到Caffe_FCNN_GPU下
6. 用Visual Studio 2013编译windows-caffe-faster-rcnn-master
进入windows-caffe-faster-rcnn-master文件夹下的Windows文件夹
打开CommonSettings.props,更改参数
打开windows-caffe-faster-rcnn-master\windows\Caffe.sln 对libcaffe和caffe项目做如下设置:项目→属性→C/C++→常规→将警告视为错误
选择编译环境为Release,x64
编译工程:先编译libcaffe项目 再编译整个工程 (其他工程需要libcaffe的支持)
可以参考https://blog.csdn.net/nk_wavelet/article/details/78935511
编译很慢,最好在有网络的情况下编译(会自动下载一些依赖文件)
可能遇到的问题(大部分问题网上基本都有解决方案):
- Caffe.sln工程打开的时候加载不全(例如libcaffe等工程加载不上),一般是CommonSettings.props
配置没搞好比如:配置的路径不对 或CommonSettings.props文件没有加载
解决:打开CommonSettings.props修改配置再重新打开工程 - 编译报错 如
解决:
进入错误代码中
将:
template <typename Dtype>
inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv,
cudnnTensorDescriptor_t bottom, cudnnFilterDescriptor_t filter,
int pad_h, int pad_w, int stride_h, int stride_w) {
CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION));
}
修改为:
template <typename Dtype>
inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv,
cudnnTensorDescriptor_t bottom, cudnnFilterDescriptor_t filter,
int pad_h, int pad_w, int stride_h, int stride_w) {
//CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
//pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION));
#if CUDNN_VERSION_MIN(6, 0, 0)
CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION,
dataType<Dtype>::type));
#else
CUDNN_CHECK(cudnnSetConvolution2dDescriptor(*conv,
pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION));
#endif
}
编译成功截图
编译生成的可执行文件
--------------------------------------------编译caffe完成-------------------------------------------------------------------
训练自己的模型:
流程(以vgg16为例)
- 准备以及处理图片(人工标注),生成相应格式的文档
- 修改配置文件voc_config.json
- 修改训练和测试参数 (包括solver.prototxt test.prototxt train_val.prototxt)
- 进行训练
- 测试
1. 准备以及处理图片
网络需要的文件有
.trainval 文件解析(windows-caffe-faster-rcnn-master\examples\FRCNN\dataset 下有个模板)(训练参数配置文件下面用到说):
#序号
图片名
目标个数
标签 左上角横坐标 左上角纵坐标 右下角横坐标 右下角纵坐标 0/1(是否容易识别?)
注意点:
1)必须第一行是# 序号,
2)而且类别数(标签)必须从1开始(非0)
3)如果你用txt打开 对的可能没这么整齐 这个是用notepad++打开的
生成 .trainval 文件 :
思路:用 labelImg 工具对物体进行标注并生成xml, 再把xml转成 .trainval文件
labelImg工具 exe版 下载链接: https://pan.baidu.com/s/1YL6nief3yZw43VUQ33ANog 提取码: q76a
labelImg工具的使用教程网上很多自行观看
将生成的xml转换为 .trainval
转换工具下载链接:https://pan.baidu.com/s/1AwTrVcNRODW8Ya0mZVke4Q 提取码:qgxq(写的比较随意,将就着用吧,你也可以按上面.trainval格式自己写个小程序)
2. 修改配置文件
配置文件在 windows-caffe-faster-rcnn-master\examples\FRCNN\config 路径下可以找到
配置文件解析
修改配置文件voc_config.json
找到 windows-caffe-faster-rcnn-master\examples\FRCNN\config\voc_config.json修改n_classes 为自己的类别数加一 例如 长钉子 和 短钉子 两个类 n_classes 为3 (自己类数+背景类 =n_classes )
3. 修改训练和测试参数 (包括solver.prototxt 和 train_val.prototxt 和test.prototxt(测试用到一并改了))
训练流程解析:
windows-caffe-faster-rcnn-master\examples\FRCNN\vgg16 下有train_frcnn.bat文件
训练的开始train_frcnn.bat (作用:调用超参数文件)——> 超参数文件 solver.prototxt( 作用:配置和调用训练网络) ——>训练网络train_val.prototxt(作用:执行训练)
修改
1.改windows-caffe-faster-rcnn-master\models\FRCNN\vgg16\solver.prototxt
改windows-caffe-faster-rcnn-master\models\FRCNN\vgg16\ train_val.prototxt
改为自己的路径
改windows-caffe-faster-rcnn-master\models\FRCNN\vgg16\ test.prototxt
4. 进行训练
打开 windows-caffe-faster-rcnn-master\examples\FRCNN\vgg16\train_frcnn.bat
修改文件路径为自己的路径
VGG16.v2.caffemodel下载 http://www.oubear.com/yun/1jInm5KE.html (非必须)
convert_model.py 需要依赖文件 把 windows-caffe-faster-rcnn-master\Build\x64\Release\pycaffe
下的caffe文件夹 复制到 Anaconda2\Lib\site-packages 下 如图:
运行train_frcnn.bat 等待结果
save new model into … 表示成功
测试
新建一个工程 新建caffe工程可参照 https://blog.csdn.net/auto1993/article/details/70198435](https://blog.csdn.net/auto1993/article/details/70198435)
代码如下:
#include "stdafx.h"
//Detect head file
#include "C:\Users\Administrator\Documents\Visual Studio 2013\Projects\testImage\include\Register.h" //This file is necessary used to register the relevant caffe layer
using namespace std;
using namespace cv;
using namespace caffe::Frcnn;
int main(){
Mat frame = imread("test.jpg"); //image
/* Initiaze the detector, the four parameters were:
1. network file
2. trained model file
3. config file
4. whether to open the GPU mode, default true
5. whether to ignore print log, default true
*/
FRCNN_API::Detector detect("test.prototxt", "vgg16.caffemodel", "voc_config.json", true, false);
std::vector<caffe::Frcnn::BBox<float> > boxes = detect.predict(frame);
// forward, detect results saved here
for (int i = 0; i < boxes.size(); i++) //draw rects
{
cout << boxes[i].id << "\n";
cout << boxes[i].confidence << "\n";
rectangle(frame, cv::Point(boxes[i][0], boxes[i][1]), cv::Point(boxes[i][2], boxes[i][3]), Scalar(0, 0, 255));
}
imshow("demo", frame);
waitKey(0);
return 0;
}
完工!