MNIST字符识别(C++)

构建网络

采用官方示例的的lenet网络

训练

相关文件都已编译好,下载后执行命令即可

.\caffe-bin.exe  train --solver .\lenet_solver.prototxt

识别

#include <caffe/caffe.hpp>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>#include <string>
#include <vector>using namespace caffe;
using std::string;int main(int argc, char** argv)
{fLI::FLAGS_minloglevel = 2;string model_file   = "lenet_deploy.prototxt";string trained_file = "lenet_iter_10000.caffemodel"; //for visualizationstring img_file = "Fmnist_images/test/test_0_7.jpg";Caffe::set_mode(Caffe::CPU);shared_ptr<Net<float> > net;/* Load the network. */net.reset(new Net<float>(model_file, caffe::TEST));net->CopyTrainedLayersFrom(trained_file);CHECK_EQ(net->num_inputs(), 1) << "Network should have exactly one input.";CHECK_EQ(net->num_outputs(), 1) << "Network should have exactly one output.";//net->set_debug_info(true);Blob<float>* input_layer = net->input_blobs()[0];int num_channels = input_layer->channels();int input_height = input_layer->height();int input_width = input_layer->width();CHECK(num_channels == 3 || num_channels == 1) << "Input layer should have 1 or 3 channels.";input_layer->Reshape(1, num_channels, input_height, input_width);/* Forward dimension change to all layers. */net->Reshape();std::vector<cv::Mat> input_channels;float* input_data = input_layer->mutable_cpu_data();for (int i = 0; i < input_layer->channels(); ++i) {cv::Mat channel(input_height, input_width, CV_32FC1, input_data);input_channels.push_back(channel);input_data += input_height * input_width;}// Input Datacv::Mat img = cv::imread(img_file, 1);CHECK(!img.empty()) << "Unable to decode image " << img_file;cv::Mat sample_resized;cv::resize(img, sample_resized, cv::Size(input_width, input_height));cv::Mat sample_float;if (num_channels == 3)sample_resized.convertTo(sample_float, CV_32FC3);elsesample_resized.convertTo(sample_float, CV_32FC1);sample_float *= 0.00390625;/* This operation will write the separate BGR planes directly to the* input layer of the network because it is wrapped by the cv::Mat* objects in input_channels. */cv::split(sample_float, input_channels);CHECK(reinterpret_cast<float*>(input_channels.at(0).data) == net->input_blobs()[0]->cpu_data())<< "Input channels are not wrapping the input layer of the network.";// predictnet->Forward();/* Copy the output layer to a std::vector */Blob<float>* output_layer = net->output_blobs()[0];std::cout << "output_blob(n,c,h,w) = " << output_layer->num() << ", " << output_layer->channels() << ", "<< output_layer->height() << ", " << output_layer->width() << std::endl;for (int n = 0; n<output_layer->num(); n++) {for (int c = 0; c < output_layer->channels(); c++) {for (int h = 0; h<output_layer->height(); h++) {for (int w = 0; w<output_layer->width(); w++) {				  std::cout << "output_blob(n,c,h,w) = " << n << ", " << c << ", "<< h << ", " << w<<":"<< output_layer->data_at(n, c, h, w) << std::endl;}}}}}

下载地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts画电压线

ChartLibhttp://chartlib.datains.cn/detail?idx0R9f3tOqMExamples - Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。https://echarts.ap…

对验证码的识别爆破

声明&#xff1a;该系列文章首发于公众号&#xff1a;Y1X1n安全&#xff0c;转载请注明出处&#xff01;本公众号所分享内容仅用于每一个爱好者之间的技术讨论及教育目的&#xff0c;所有渗透及工具的使用都需获取授权&#xff0c;禁止用于违法途径&#xff0c;否则需自行承担&…

BN体系理解——类封装复现

from pathlib import Path from typing import Optionalimport torch import torch.nn as nn from torch import Tensorclass BN(nn.Module):def __init__(self,num_features,momentum0.1,eps1e-8):##num_features是通道数"""初始化方法:param num_features:特征…

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

LeetCode416 分割等和子集

题目&#xff1a; 、 分析&#xff1a; 因为分割的子数组&#xff0c;不连续&#xff1b;所以双指针、栈&#xff0c;一般不适用&#xff0c;分析起来很像是DP问题。 思路&#xff1a; https://www.imooc.com/article/300277 代码&#xff1a; //TODO 这题有难度

如何在C++项目中用C#运行程序调试C++ DLL

问题描述 在C#项目中调用C DLL时报错或者运行结果不符&#xff0c;此时需要运行C#项目并在C中加入断点进行调试 项目准备 项目一&#xff1a;C#项目&#xff08;该项目调用C DLL&#xff09;项目二&#xff1a;C项目&#xff08;生成C DLL&#xff09; 这两个项目不需要在同…

【web实现右侧弹窗】JS+CSS如何实现右侧缓慢弹窗动态效果『附完整源码下载』

文章目录 写在前面涉及知识点页面效果1、页面DOM创建1.1创建底层操作dom节点1.2 创建存放弹窗dom节点 2、页面联动功能实现&#xff08;关闭与弹出&#xff09;2.1 点击非右侧区域实现关闭2.2 点击叉叉及关闭按钮实现关闭功能 3、完整源码包下载3.1百度网盘3.2 123云盘3.3邮箱留…

基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前讲了自定义业务表单&#xff0c;现在讲如何与流程进行关联 1、后端部分 WfCustomFormMapper.xml &…

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

数据挖掘实战(3):如何对比特币走势进行预测?

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

203、RabbitMQ 之 使用 direct 类型的 Exchange 实现 消息路由 (RoutingKey)

目录 ★ 使用direct实现消息路由代码演示这个情况二ConstantUtil 常量工具类ConnectionUtil 连接RabbitMQ的工具类Publisher 消息生产者测试消息生产者 Consumer01 消息消费者01测试消费者结果&#xff1a; Consumer02 消息消费者02测试消费者结果&#xff1a; 完整代码&#x…

机器学习(22)---信息熵、纯度、条件熵、信息增益

文章目录 1、信息熵2、信息增益3、例题分析 1、信息熵 1. 信息熵(information entropy)是度量样本集合纯度最常用的一种指标。信息的混乱程度越大&#xff0c;不确定性越大&#xff0c;信息熵越大&#xff1b;对于纯度&#xff0c;就是信息熵越大&#xff0c;纯度越低。 2. 纯度…