我正在阅读以下问题:
How to read MNIST data in C++?
并且有一些用于读取MNIST数据库的C ++代码。在尝试它时,我发现它工作正常,直到它开始读取数据的地方。
以下代码:
for(int i=0;i<number_of_images;++i)
{
for(int r=0;r<n_rows;++r)
{
for(int c=0;c<n_cols;++c)
{
unsigned char temp=0;
file.read((char*)&temp,sizeof(temp));
//cout<<(int)temp<<" "; //printing the pixel in integer format
}
}
}
我尝试打印出变量“temp”的整数值但是我没有得到像素的正确数字(所有这些都是零)。 我不确定那里有什么问题,每个像素占用一个字节空间然后我将它转换为int并且它不起作用。为什么会这样?提前谢谢你
答案 0 :(得分:5)
我有同样的问题,数据的前几个字节很好,然后其余的用0填充。事实证明,文件流在第一次遇到字节0x01A时失败了。对此的修复正在改变:
ifstream file ("data");
到
ifstream file ("data", std::ios::binary);
答案 1 :(得分:2)
使用MNIST数据集时,我遇到了同样的问题。我可以阅读标签,但培训和测试集图像大多是虚假的;训练集几乎全部用175填充,测试集几乎完全填满0(除了前6张图像)。重新启动没有解决问题,我无法确定文件读取无法正常工作的原因。
对于遇到同样问题的人,我建议改为使用位于http://cis.jhu.edu/~sachin/digit/digit.html的数据文件。数据已按编号组织(无需标签/图像关联),并且像素值数组一个接一个地简单编码。知道每个数组是28x28并且每个数字有1000个图像,您可以轻松编写代码来输入像素值的各个图像数组。
答案 2 :(得分:0)
下面是读取mnist并将其转换为cv Mat
的完整代码:
uint32_t swap_endian(uint32_t val) {
val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
return (val << 16) | (val >> 16);
}
void read_mnist_cv(const char* image_filename, const char* label_filename){
// Open files
std::ifstream image_file(image_filename, std::ios::in | std::ios::binary);
std::ifstream label_file(label_filename, std::ios::in | std::ios::binary);
// Read the magic and the meta data
uint32_t magic;
uint32_t num_items;
uint32_t num_labels;
uint32_t rows;
uint32_t cols;
image_file.read(reinterpret_cast<char*>(&magic), 4);
magic = swap_endian(magic);
if(magic != 2051){
cout<<"Incorrect image file magic: "<<magic<<endl;
return;
}
label_file.read(reinterpret_cast<char*>(&magic), 4);
magic = swap_endian(magic);
if(magic != 2049){
cout<<"Incorrect image file magic: "<<magic<<endl;
return;
}
image_file.read(reinterpret_cast<char*>(&num_items), 4);
num_items = swap_endian(num_items);
label_file.read(reinterpret_cast<char*>(&num_labels), 4);
num_labels = swap_endian(num_labels);
if(num_items != num_labels){
cout<<"image file nums should equal to label num"<<endl;
return;
}
image_file.read(reinterpret_cast<char*>(&rows), 4);
rows = swap_endian(rows);
image_file.read(reinterpret_cast<char*>(&cols), 4);
cols = swap_endian(cols);
cout<<"image and label num is: "<<num_items<<endl;
cout<<"image rows: "<<rows<<", cols: "<<cols<<endl;
char label;
char* pixels = new char[rows * cols];
for (int item_id = 0; item_id < num_items; ++item_id) {
// read image pixel
image_file.read(pixels, rows * cols);
// read label
label_file.read(&label, 1);
string sLabel = std::to_string(int(label));
cout<<"lable is: "<<sLabel<<endl;
// convert it to cv Mat, and show it
cv::Mat image_tmp(rows,cols,CV_8UC1,pixels);
// resize bigger for showing
cv::resize(image_tmp, image_tmp, cv::Size(100, 100));
cv::imshow(sLabel, image_tmp);
cv::waitKey(0);
}
delete[] pixels;
}
用法:
string base_dir = "/home/xy/caffe-master/data/mnist/";
string img_path = base_dir + "train-images-idx3-ubyte";
string label_path = base_dir + "train-labels-idx1-ubyte";
read_mnist_cv(img_path.c_str(), label_path.c_str());
输出如下: