Как я могу прочитать набор данных MNIST с C ++?

Я читал следующий вопрос:

Как читать данные MNIST в C ++?

и был некоторый код C ++ для чтения базы данных MNIST. Попробовав это, я обнаружил, что он работал нормально, пока не начал читать данные.

это следующий код:

 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, и он не работает. Почему это происходит? заранее спасибо

2

Решение

При работе с набором данных MNIST у меня была та же проблема, что и у вас. Я мог читать этикетки, но изображения тренировочного и тестового набора были в основном поддельными; тренировочный набор был заполнен почти полностью 175, а тестовый набор был почти полностью заполнен нулями (за исключением первых 6 изображений). Перезагрузка не устранила проблему, и я не смог определить, почему чтение файла не работает правильно.

Для тех, у кого такая же проблема, я бы предложил вместо этого использовать файлы данных, расположенные по адресу http://cis.jhu.edu/~sachin/digit/digit.html. Данные уже упорядочены по номерам (не требуется привязка метка / изображение), а массивы значений пикселей просто кодируются один за другим. Зная, что каждый массив имеет размер 28×28 и что для каждого числа имеется 1000 изображений, вы можете легко написать код для ввода отдельных массивов изображений со значениями пикселей.

2

Другие решения

У меня была та же проблема: первые несколько байтов данных были в порядке, а остальные были заполнены нулями. Оказывается, что поток файла был сбой, когда он впервые столкнулся с байтом 0x01A. Исправление для этого менялось:

ifstream file ("data");

в

ifstream file ("data", std::ios::binary);
5

Ниже приведен полный код для чтения 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());

Вывод, как показано ниже:

введите описание изображения здесь

0
По вопросам рекламы [email protected]