OpenCV-DNN使用CaffeModel实现手写数字识别

开发环境

    VS2013 + OpenCV3.4.1 + Qt5.8.0 + Caffe

实验准备

    lenet_iter_5000.caffemodel    // Caffe使用LeNet网络结构迭代训练5000次的model

    lenet_iter_10000.caffemodel  // Caffe使用LeNet网络结构迭代训练10000次的model

    lenet_train_test.prototxt        // LeNet的网络结构配置

    以上数据可以由《Caffe初体验之Caffe-Windows的配置(CPU/GPU)与Mnist数据集测试》这篇文章的实验得到,在这篇文章的最后训练MNIST数据集成功后会得到lenet_iter_5000.caffemodel和lenet_iter_10000.caffemodel,如下图:

lenet_train_test.prototxt(开头和结尾)的内容需要修改,备份一个lenet_train_test.prototxt后进行修改,修改过程如下图:



主要代码

// Start```
string modelTxt = "caffe_mnist_model/lenet_train_test.prototxt";
string modelBin = "caffe_mnist_model/lenet_iter_10000.caffemodel";
	
if (frame.empty()){

	ui.textBrowser->append("Image is empty.");
	return;
}

Mat inputBlob = dnn::blobFromImage(frame, 0.00390625f/*1*/, Size(28, 28), Scalar(), false); //Convert Mat to batch of images  
dnn::Net net;
try{

	net = dnn::readNetFromCaffe(modelTxt, modelBin);
		
}catch (cv::Exception &ee){

	ui.textBrowser->append("Exception:");
	ui.textBrowser->append(ee.what());
	if (net.empty()){

		ui.textBrowser->append("Can't load the network by using the flowing files.");
		return;
	}
}
Mat pred;
net.setInput(inputBlob, "data");// data为lenet_train_test.prototxt下的input: "data"  
// pred 为一个10*1的一维数组,其值为分类的概率
pred = net.forward("prob");		// 前向传播  prob为lenet_train_test.prototxt下的最后一个layer的name: "prob"    

int classId; 
double classProb; 
getMaxClass(pred, &classId, &classProb);
// End```
	
ui.textBrowser->append(QString::fromLocal8Bit("识别结果: ") + QString::number(classId));
ui.textBrowser->append(QString::fromLocal8Bit("匹配概率: ") + QString::number(classProb * 100) + "%");

pred的数据结构如下图:


实验效果

    只要写的数字不是太坑爹,基本可以正确识别,来两张截图如下:



总结

    效果比我之前基于KNN《KNN实现手写数字识别》和基于SVM《SVM实现手写数字识别》的效果好非常多。可见传统的分类器逊色于deeplearning。

附件

    源代码工程戳这里(注:release下的可执行程序可以直接运行)。

参考

    https://www.cnblogs.com/messier/p/7997951.html


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,关于人脸识别的问题,以下是使用OpenCV-Java实现人脸识别的代码示例: 1. 引入OpenCV-Java库 在项目中引入OpenCV-Java库,可以从官网下载对应的版本,引入后,我们就可以调用OpenCV-Java提供的API来实现人脸识别。 2. 加载人脸识别器 在使用OpenCV-Java实现人脸识别前,我们需要加载一个训练好的分类器,可以使用官方提供的人脸识别模型,或自己训练。加载过程如下: ``` CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_alt.xml"); ``` 3. 读取图片并识别人脸 加载分类器后,我们可以读取一张图片并进行人脸识别,具体实现代码如下: ``` Mat image = Imgcodecs.imread("test.jpg"); // 读取图片 Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY); // 转为灰度图 Imgproc.equalizeHist(image, image); // 直方图均衡化,提高图像质量 Rect[] faces = faceDetector.detectMultiScale(image); // 识别人脸 for (Rect rect : faces) { Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0)); // 绘制人脸框 } Imgcodecs.imwrite("result.jpg", image); // 保存结果 ``` 其中,`detectMultiScale` 方法用于检测出图像中的人脸,返回一个`Rect`类型的数组,每个元素代表一个人脸的位置和大小。 4. 运行程序 将以上代码放入一个Java类中,运行程序即可实现人脸识别。注意,需要引入`org.opencv.core.Mat`、`org.opencv.core.Rect`、`org.opencv.core.Point`、`org.opencv.core.Scalar`、`org.opencv.imgcodecs.Imgcodecs`、`org.opencv.imgproc.Imgproc`等OpenCV-Java的类。 希望能够对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值