caffe RGB转gay存储为Leveldb 格式(CIFAR10)示例

来源:互联网 发布:cf黑武士对比无影数据 编辑:程序博客网 时间:2024/04/23 19:43

不多说,放源码:

// Copyright 2014 BVLC and contributors.//// This script converts the CIFAR dataset to the leveldb format used// by caffe to perform classification.// Usage://    convert_cifar_data input_folder output_db_file// The CIFAR dataset could be downloaded at//    http://www.cs.toronto.edu/~kriz/cifar.html// Modify by Jamin  SCU  AI Lab#include <google/protobuf/text_format.h>#include <glog/logging.h>#include <leveldb/db.h>#include <stdint.h>#include <fstream>  // NOLINT(readability/streams)#include <string>#include "caffe/proto/caffe.pb.h"//  /home/jamin/Downloads/caffe-master/data/cifar10 /home/jamin/Downloadsusing std::string;const int kCIFARSize = 32;const int kCIFARImageNBytes = 3072;const int kGrayCIFARImageNBytes = 1024;const int kCIFARBatchSize = 10000;const int kCIFARTrainBatches = 5;void read_image(std::ifstream* file, int* label, char* buffer) {  char label_char;  file->read(&label_char, 1);  *label = label_char;  file->read(buffer, kCIFARImageNBytes);  return;}void gray_convert(char* rgbdata,char* graydata){return;}void convert_dataset(const string& input_folder, const string& output_folder) {  // Leveldb options  leveldb::Options options;  options.create_if_missing = true;  options.error_if_exists = true;  // Data buffer  int label;  char str_buffer[kCIFARImageNBytes];  char str_graybuffer[kGrayCIFARImageNBytes];  // -by jamin  string value;  caffe::Datum datum;  datum.set_channels(1);  datum.set_height(kCIFARSize);  datum.set_width(kCIFARSize);  LOG(INFO) << "Writing Training data";  leveldb::DB* train_db;  leveldb::Status status;  status = leveldb::DB::Open(options, output_folder + "/cifar-train-leveldb",      &train_db);  CHECK(status.ok()) << "Failed to open leveldb.";  for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) {    // Open files    LOG(INFO) << "Training Batch " << fileid + 1;    snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1);    std::ifstream data_file((input_folder + str_buffer).c_str(),        std::ios::in | std::ios::binary);    CHECK(data_file) << "Unable to open train file #" << fileid + 1;    for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {      read_image(&data_file, &label, str_buffer);      // gray convert  gray = 0.299*R+0.587*g+0.14*b  --by Jamin      for(int j=0;j<kGrayCIFARImageNBytes;j++){      str_graybuffer[j] = (int)(0.299*(float)str_buffer[j]+0.587*(float)str_buffer[j+kGrayCIFARImageNBytes]+0.114*(float)str_buffer[j+kGrayCIFARImageNBytes*2]);      }      datum.set_label(label);      datum.set_data(str_graybuffer, kGrayCIFARImageNBytes);      datum.SerializeToString(&value);      snprintf(str_buffer, kCIFARImageNBytes, "%05d",          fileid * kCIFARBatchSize + itemid);         // str_buffer stored the key of db: 0,1,3....,10000*1+0....      train_db->Put(leveldb::WriteOptions(), string(str_buffer), value);    }  }  LOG(INFO) << "Writing Testing data";  leveldb::DB* test_db;  CHECK(leveldb::DB::Open(options, output_folder + "/cifar-test-leveldb",      &test_db).ok()) << "Failed to open leveldb.";  // Open files  std::ifstream data_file((input_folder + "/test_batch.bin").c_str(),      std::ios::in | std::ios::binary);  CHECK(data_file) << "Unable to open test file.";  for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {    read_image(&data_file, &label, str_buffer);    // gray convert  gray = 0.299*R+0.587*g+0.14*b  --by Jamin    for(int j=0;j<kGrayCIFARImageNBytes;j++){    str_graybuffer[j] = (int)(0.299*(float)str_buffer[j]+0.587*(float)str_buffer[j+kGrayCIFARImageNBytes]+0.114*(float)str_buffer[j+kGrayCIFARImageNBytes*2]);    }    datum.set_label(label);    datum.set_data(str_graybuffer, kGrayCIFARImageNBytes);    datum.SerializeToString(&value);    snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid);    test_db->Put(leveldb::WriteOptions(), string(str_buffer), value);  }  delete train_db;  delete test_db;}int main(int argc, char** argv) {  if (argc != 3) {    printf("This script converts the CIFAR dataset to the leveldb format used\n"           "by caffe to perform classification.\n"           "Usage:\n"           "    convert_cifar_data input_folder output_folder\n"           "Where the input folder should contain the binary batch files.\n"           "The CIFAR dataset could be downloaded at\n"           "    http://www.cs.toronto.edu/~kriz/cifar.html\n"           "You should gunzip them after downloading.\n");  } else {    google::InitGoogleLogging(argv[0]);    convert_dataset(string(argv[1]), string(argv[2]));  }  return 0;}

希望大家编译一下,传个参数就可以了,linux下是bin文件,win下是exe 命令行下执行就ok

0 0
原创粉丝点击