win8+opencv+caffe 的手写数字检测之hello minist

1. 假设你的Caffe已经配置好了,如果没配置好,可以参考我之前写的文章caffe+vs15

    找到你的Caffe根目录,   在Caffe根目录下,你可以找到 . /data/minist ,打开你发现这里空空如也。

    而要让程序运行,必须要有数据。所以下一步就是往里面下载数据。

2.下载好minist数据集,官网地址:http://yann.lecun.com/exdb/mnist/index.html

   或https://download.csdn.net/download/qq_32791307/10396401

   把文件放到. /data/minist 里,如图

  刚下载完的数据集在Caffe里并不能用,所以我们需要把它转换成lmdb 的格式,并将其放入根目录下的./examples/minist里

 转换格式需建立bat文件。

  a.在Caffe根目录下新建txt文件,在里面写入:

.\Build\x64\Release\convert_mnist_data.exe .\data\mnist\train-images.idx3-ubyte .\data\mnist\train-labels.idx1-ubyte .\examples\mnist\mnist_train_lmdb   
echo.   
.\Build\x64\Release\convert_mnist_data.exe .\data\mnist\t10k-images.idx3-ubyte   .\data\mnist\t10k-labels.idx1-ubyte .\examples\mnist\mnist_test_lmdb  

pause

b. 把刚才写好的TXT文件重命名,并把后缀改成.bat,然后双击运行即可。文件自动转换好格式并放入 .\examples\mnist\mnist_train_lmdb    中,如图。


3.有了数据,我们需要网络结构,并且对数据进行训练。

 仍然在 .\examples\mnist 这个目录下,我们找到  lenet_train_test.prototxt 这个文件,用note++打开,更改图中画圈位置,查看这个数据路径是否如图所示(如果按本教程来,数据路径应该就是这个),或者是否和你的数据源地址相同。如果不同,则需要更改。


 另外,还需要打开 lenet_solver.prototxt ,如果你是用CPU,就需将最后一行改为CPU,如果不是,则默认GPU


4.更改完成后,需要在Caffe根目录下建立一个.bat 文件,文件里写入:

.\Build\x64\Release\caffe.exe train --solver=.\examples\mnist\lenet_solver.prototxt  
pause  

双击运行这个.bat文件吧,你会发现ministe训练开始了!等待 30-60min(具体时间看机器),你会得到训练好的模型:


5.有了这个模型,我们就可以在opencv里面使用,并且测试你自己的手写数字。

当然,在使用模型前,我们需要改动lenet_train_test.prototxt 这个文件,我自己是复制一份,重命名为lenet_deploy.prototxt。我们需要的改动的是:将第一个图里长长的输入层内容全部删掉,并替换成图2里简短的内容。


接下来,我们需要把lenet_train_test.prototxt 这个文件最底下两个输出层内容那个改掉,将图中内容替换掉:

替换成以下即可:

layer {

name: "prob"
type: "Softmax"
bottom: "ip2"
top: "prob"
}

6.直接上代码,搭建好opencv+VS的环境即可使用

记得要先把训练好的 .caffemodal 和刚才改动好的 .prototxt 文件放入建好的解决方案的源目录下。并在源目录下放好测试图片。


代码如下:

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utils/trace.hpp>
#include <fstream>
#include <sstream> //识别单图克省略
#include <iostream>
#include <cstdlib>

using namespace cv;
using namespace cv::dnn;
using namespace std;


/* Find best class for the blob (i. e. class with maximal probability) */
static void getMaxClass(const Mat &probBlob, int *classId, double *classProb)
{
Mat probMat = probBlob.reshape(1, 1);
Point classNumber;
minMaxLoc(probMat, NULL, classProb, NULL, &classNumber);
*classId = classNumber.x;
}


int main(int argc, char *argv[])
{
string modelTxt = "lenet_deploy.prototxt";     //放置自己更改的文件。
string modelBin = "lenet_iter_10000.caffemodel";



//string imgFileName = argc > 1 ? argv[1] : "..\\test_image/test_3.jpg";
string imgFileName =  "..\\test_image/test_3.jpg";  // 图片地址可以更改。 
Mat imgSrc = imread(imgFileName);
if (imgSrc.empty()) {
cout << "Failed to read image " << imgFileName << endl;
exit(-1);
}
Mat img;
cvtColor(imgSrc, img, COLOR_BGR2GRAY);  //BGR转灰度图
resize(img, img, Size(28, 28));
img /= 255;
Mat inputBlob = dnn::blobFromImage(img);

dnn::Net net;
try {
net = dnn::readNetFromCaffe(modelTxt, modelBin);
}
catch (cv::Exception &ee) {
cerr << "Exception: " << ee.what() << endl;
if (net.empty()) {
cout << "Can't load the network by using the flowing files:" << endl;
cout << "modelTxt: " << modelTxt << endl;
cout << "modelBin: " << modelBin << endl; exit(-1);
}
}
Mat pred;
net.setInput(inputBlob, "data");//set the network input, "data" is the name of the input layer   
pred = net.forward("prob");//compute output, "prob" is the name of the output layer   
cout << pred << endl; int classId; double classProb; getMaxClass(pred, &classId, &classProb);
cout << "Best Class: " << classId << endl;  

cout << "Probability: " << classProb * 100 << "%" << endl;

}

7.如果想一次测试大量图片怎么办?那么同样有代码

 读取多图的代码部分如下:或者你也可以下载我的工程文件,包换3400多张测试图,可直接运行。

Mat inputBlob;

vector<Mat> imgVec;
ifstream  inImages("test_label.txt");
string line, name;
int label;

while (getline(inImages, line))
{
istringstream iss(line);
iss >> name >> label;
//cout << name << endl << label << endl;
// Mat src = imread("..\\" + name, 0);有 0 出错
Mat imgSrc = imread("..\\" + name);
//imshow("test", imgSrc);

if (imgSrc.empty()) {
cout << "Failed to read image " << name << endl;
exit(-1);
}

Mat img;
cv::cvtColor(imgSrc, img, COLOR_BGR2GRAY);
//imshow("test1", img);
resize(img, img, Size(28, 28));
//imshow("test2", img);
img /= 255;
imgVec.push_back(img);
}
inImages.close();
inputBlob = dnn::blobFromImages(imgVec);

运行结果如图:

本文所讲程序源码下载地址:

https://download.csdn.net/download/qq_32791307/10396393

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值