找到你的Caffe根目录, 在Caffe根目录下,你可以找到 . /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 中,如图。
仍然在 .\examples\mnist 这个目录下,我们找到 lenet_train_test.prototxt 这个文件,用note++打开,更改图中画圈位置,查看这个数据路径是否如图所示(如果按本教程来,数据路径应该就是这个),或者是否和你的数据源地址相同。如果不同,则需要更改。
另外,还需要打开 lenet_solver.prototxt ,如果你是用CPU,就需将最后一行改为CPU,如果不是,则默认GPU
.\Build\x64\Release\caffe.exe train --solver=.\examples\mnist\lenet_solver.prototxt
pause
双击运行这个.bat文件吧,你会发现ministe训练开始了!等待 30-60min(具体时间看机器),你会得到训练好的模型:
当然,在使用模型前,我们需要改动lenet_train_test.prototxt 这个文件,我自己是复制一份,重命名为lenet_deploy.prototxt。我们需要的改动的是:将第一个图里长长的输入层内容全部删掉,并替换成图2里简短的内容。
接下来,我们需要把lenet_train_test.prototxt 这个文件最底下两个输出层内容那个改掉,将图中内容替换掉:
替换成以下即可:
layer {
name: "prob"记得要先把训练好的 .caffemodal 和刚才改动好的 .prototxt 文件放入建好的解决方案的源目录下。并在源目录下放好测试图片。
代码如下:
#include
#include
#include
#include
#include
#include
#include
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;
}
读取多图的代码部分如下:或者你也可以下载我的工程文件,包换3400多张测试图,可直接运行。
Mat inputBlob;
vector本文所讲程序源码下载地址:
https://download.csdn.net/download/qq_32791307/10396393