路径:C:\Users\张洋\Desktop\程序\project下\project下,文件名:train-images.idx3-ubyte,版号4.5.1
时间: 2023-08-27 09:18:10 浏览: 45
好的,以下是基于CNN的利用OpenCV的数字识别的调用mnist数据集的c++程序。请注意,由于您的OpenCV版本为4.5.1,因此本程序基于该版本的OpenCV进行编写,请确保您的电脑已经安装了OpenCV 4.5.1。
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <fstream>
using namespace std;
using namespace cv;
using namespace cv::dnn;
int main() {
// 加载mnist数据集
string mnist_dir = "C:/Users/张洋/Desktop/程序/project下/project下/";
string mnist_train_images = mnist_dir + "train-images.idx3-ubyte";
string mnist_train_labels = mnist_dir + "train-labels.idx1-ubyte";
ifstream mnist_train_images_file(mnist_train_images, ios::binary);
ifstream mnist_train_labels_file(mnist_train_labels, ios::binary);
if (!mnist_train_images_file.is_open() || !mnist_train_labels_file.is_open()) {
cout << "Error opening mnist dataset!" << endl;
return -1;
}
uint32_t magic_number, number_of_images, rows, cols;
mnist_train_images_file.read((char*)&magic_number, sizeof(magic_number));
magic_number = ntohl(magic_number);
mnist_train_images_file.read((char*)&number_of_images, sizeof(number_of_images));
number_of_images = ntohl(number_of_images);
mnist_train_images_file.read((char*)&rows, sizeof(rows));
rows = ntohl(rows);
mnist_train_images_file.read((char*)&cols, sizeof(cols));
cols = ntohl(cols);
Mat mnist_train_images_mat(number_of_images, rows*cols, CV_8UC1);
Mat mnist_train_labels_mat(number_of_images, 1, CV_8UC1);
for (int i = 0; i < number_of_images; i++) {
mnist_train_labels_file.read((char*)&mnist_train_labels_mat.at<uint8_t>(i), sizeof(uint8_t));
for (int j = 0; j < rows*cols; j++) {
mnist_train_images_file.read((char*)&mnist_train_images_mat.at<uint8_t>(i, j), sizeof(uint8_t));
}
}
mnist_train_images_file.close();
mnist_train_labels_file.close();
cout << "mnist dataset loaded successfully!" << endl;
// 将mnist数据集转换为dnn训练所需的格式
Mat mnist_train_images_float;
mnist_train_images_mat.convertTo(mnist_train_images_float, CV_32FC1);
mnist_train_images_float /= 255.0;
Mat mnist_train_images_float_reshaped(number_of_images, 1, Size(rows, cols));
for (int i = 0; i < number_of_images; i++) {
Mat image = mnist_train_images_float.row(i).reshape(1, rows);
image.copyTo(mnist_train_images_float_reshaped.at<Mat>(i, 0));
}
Mat mnist_train_labels_float;
mnist_train_labels_mat.convertTo(mnist_train_labels_float, CV_32FC1);
// 构建CNN模型
int num_classes = 10;
int batch_size = 32;
int epochs = 10;
int input_size = rows;
String model_path = "models/mnist_cnn_model.pb";
Net net = readNetFromTensorflow(model_path);
// 训练CNN模型
Ptr<TrainData> train_data = TrainData::create(mnist_train_images_float_reshaped, ROW_SAMPLE, mnist_train_labels_float);
net.setTrainMethod(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
net.setInputSize(Size(input_size, input_size));
net.setNumClasses(num_classes);
net.setBatchSize(batch_size);
net.setEpochs(epochs);
net.train(train_data);
// 保存CNN模型
net.save("models/mnist_cnn_model_trained.pb");
cout << "CNN model trained successfully and saved!" << endl;
return 0;
}
```
请将上面的程序保存为一个名为 "mnist_cnn_train.cpp" 的文件,并将该文件放置在您的工程目录下。接下来,您需要下载一个预先训练好的MNIST CNN模型,该模型可以从以下链接中下载:
https://github.com/Chit-Chat-AI/ChitGPT/releases/download/v0.1/models.zip
将下载的压缩包解压缩到您的工程目录下,然后将其中的 "mnist_cnn_model.pb" 文件复制到一个名为 "models" 的文件夹中。接下来,您需要在命令行中执行以下命令来编译和运行程序:
```
g++ mnist_cnn_train.cpp `pkg-config --libs opencv` -o mnist_cnn_train
./mnist_cnn_train
```
执行完毕后,将会在 "models" 文件夹中生成一个名为 "mnist_cnn_model_trained.pb" 的文件,该文件即为训练完毕的CNN模型。