Windows Caffe中MNIST数据格式转换实现
Caffe源码中src/caffe/caffe/examples/mnist/convert_mnist_data.cpp提供的实现代码并不能直接在Windows下运行,这里在源码的基础上进行了改写,使其可以直接在Windows 64位上直接运行,改写代码如下:
#include "stdafx.h"
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <google/protobuf/text_format.h>
#include <leveldb/db.h>
#include <leveldb/write_batch.h>
#include <lmdb.h>
#include <stdint.h>
#include <sys/stat.h>#include <fstream> // NOLINT(readability/streams)
#include <string>
#include <iostream>#include "caffe/proto/caffe.pb.h"using namespace caffe; // NOLINT(build/namespaces)
using std::string;// gflags中的数据类型,c++ string,在这里指定转换到lmdb还是leveldb
DEFINE_string(backend, "lmdb", "The backend for storing the result");uint32_t swap_endian(uint32_t val) {val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);return (val << 16) | (val >> 16);
}void convert_dataset(const char* image_filename, const char* label_filename,const char* db_path, const string& db_backend) {// Open filesstd::ifstream image_file(image_filename, std::ios::in | std::ios::binary);std::ifstream label_file(label_filename, std::ios::in | std::ios::binary);CHECK(image_file) << "Unable to open file " << image_filename;CHECK(label_file) << "Unable to open file " << label_filename;// Read the magic and the meta datauint32_t magic;uint32_t num_items;uint32_t num_labels;uint32_t rows;uint32_t cols;// 读取文件前n个字节,获取图像数量、图像宽、图像高image_file.read(reinterpret_cast<char*>(&magic), 4);magic = swap_endian(magic);CHECK_EQ(magic, 2051) << "Incorrect image file magic.";label_file.read(reinterpret_cast<char*>(&magic), 4);magic = swap_endian(magic);CHECK_EQ(magic, 2049) << "Incorrect label file magic.";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);CHECK_EQ(num_items, num_labels);image_file.read(reinterpret_cast<char*>(&rows), 4);rows = swap_endian(rows);image_file.read(reinterpret_cast<char*>(&cols), 4);cols = swap_endian(cols);// lmdbMDB_env *mdb_env;MDB_dbi mdb_dbi;MDB_val mdb_key, mdb_data;MDB_txn *mdb_txn;// leveldbleveldb::DB* db = NULL;leveldb::Options options;options.error_if_exists = true;options.create_if_missing = true;options.write_buffer_size = 268435456;leveldb::WriteBatch* batch = NULL;// Open dbif (db_backend == "leveldb") { // leveldbLOG(INFO) << "Opening leveldb " << db_path;leveldb::Status status = leveldb::DB::Open(options, db_path, &db);CHECK(status.ok()) << "Failed to open leveldb " << db_path<< ". Is it already existing?";batch = new leveldb::WriteBatch();}else if (db_backend == "lmdb") { // lmdbint rc;LOG(INFO) << "Opening lmdb " << db_path;// 创建指定的存放目录//CHECK_EQ(mkdir(db_path, 0744), 0)std::string strPath = std::string(db_path);std::string delPath = "rmdir /s/q " + strPath;system(delPath.c_str());strPath = "mkdir " + strPath;system(strPath.c_str());//CHECK_EQ(system(strPath.c_str()), 0) << "mkdir " << db_path << "failed";// 创建lmdb数据库CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed";//CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) << "mdb_env_set_mapsize failed";//1TBCHECK_EQ(mdb_env_set_mapsize(mdb_env, 107374182), MDB_SUCCESS) << "mdb_env_set_mapsize failed";//100MBCHECK_EQ(mdb_env_open(mdb_env, db_path, 0, 0664), MDB_SUCCESS) << "mdb_env_open failed";CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) << "mdb_txn_begin failed";CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) << "mdb_open failed. Does the lmdb already exist? ";}else {LOG(FATAL) << "Unknown db backend " << db_backend;}// Storing to dbchar label;char* pixels = new char[rows * cols];int count = 0;const int kMaxKeyLength = 10;char key_cstr[kMaxKeyLength];string value;Datum datum; // Caffe数据类datum.set_channels(1);datum.set_height(rows);datum.set_width(cols);LOG(INFO) << "A total of " << num_items << " items.";LOG(INFO) << "Rows: " << rows << " Cols: " << cols;// 将数据写入lmdb或leveldb数据库for (int item_id = 0; item_id < num_items; ++item_id) {image_file.read(pixels, rows * cols);label_file.read(&label, 1);datum.set_data(pixels, rows*cols);datum.set_label(label);//snprintf(key_cstr, kMaxKeyLength, "%08d", item_id);int ret = _snprintf(key_cstr, kMaxKeyLength, "%08d", item_id);if (ret == kMaxKeyLength || ret < 0) {printf("warning ");key_cstr[kMaxKeyLength - 1] = 0;}datum.SerializeToString(&value);string keystr(key_cstr);// Put in dbif (db_backend == "leveldb") { // leveldbbatch->Put(keystr, value);}else if (db_backend == "lmdb") { // lmdbmdb_data.mv_size = value.size();mdb_data.mv_data = reinterpret_cast<void*>(&value[0]);mdb_key.mv_size = keystr.size();mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]);CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS)<< "mdb_put failed";}else {LOG(FATAL) << "Unknown db backend " << db_backend;}if (++count % 1000 == 0) {// Commit txnif (db_backend == "leveldb") { // leveldbdb->Write(leveldb::WriteOptions(), batch);delete batch;batch = new leveldb::WriteBatch();}else if (db_backend == "lmdb") { // lmdbCHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS)<< "mdb_txn_commit failed";CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS)<< "mdb_txn_begin failed";}else {LOG(FATAL) << "Unknown db backend " << db_backend;}}}// write the last batchif (count % 1000 != 0) {if (db_backend == "leveldb") { // leveldbdb->Write(leveldb::WriteOptions(), batch);delete batch;delete db;}else if (db_backend == "lmdb") { // lmdbCHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) << "mdb_txn_commit failed";mdb_close(mdb_env, mdb_dbi);mdb_env_close(mdb_env);}else {LOG(FATAL) << "Unknown db backend " << db_backend;}LOG(ERROR) << "Processed " << count << " files.";}delete[] pixels;
}int main(int argc, char* argv[])
{
#ifndef GFLAGS_GFLAGS_H_namespace gflags = google;
#endifargc = 4;
#ifdef _DEBUGargv[0] = "E:/GitCode/Caffe/lib/dbg/x86_vc12/tools_convert_mnist_data[dbg_x86_vc12].exe";
#elseargv[0] = "E:/GitCode/Caffe/lib/rel/x86_vc12/tools_convert_mnist_data[rel_x86_vc12].exe";
#endif//argv[1] = "E:/GitCode/Caffe/src/caffe/caffe/data/mnist/t10k-images.idx3-ubyte";//argv[2] = "E:/GitCode/Caffe/src/caffe/caffe/data/mnist/t10k-labels.idx1-ubyte";//argv[3] = "E:\\GitCode\\Caffe\\src\\caffe\\caffe\\data\\mnist\\lmdb\\test";argv[1] = "E:/GitCode/Caffe/src/caffe/caffe/data/mnist/train-images.idx3-ubyte";argv[2] = "E:/GitCode/Caffe/src/caffe/caffe/data/mnist/train-labels.idx1-ubyte";argv[3] = "E:\\GitCode\\Caffe\\src\\caffe\\caffe\\data\\mnist\\lmdb\\train";// 用来设定usage说明gflags::SetUsageMessage("This script converts the MNIST dataset to\n""the lmdb/leveldb format used by Caffe to load data.\n""Usage:\n"" convert_mnist_data [FLAGS] input_image_file input_label_file ""output_db_file\n""The MNIST dataset could be downloaded at\n"" http://yann.lecun.com/exdb/mnist/\n""You should gunzip them after downloading,""or directly use data/mnist/get_mnist.sh\n");// 解析命令行参数gflags::ParseCommandLineFlags(&argc, &argv, true);// 获取标志参数backend的值const string& db_backend = FLAGS_backend;if (argc != 4) {// 输出usage说明gflags::ShowUsageWithFlagsRestrict(argv[0],"examples/mnist/convert_mnist_data");}else {// 设置日志文件名中"文件名"字段// 每个进程中至少要执行一次InitGoogleLogging,否则不产生日志文件google::InitGoogleLogging(argv[0]);convert_dataset(argv[1], argv[2], argv[3], db_backend);}std::cout << "ok!" << std::endl;return 0;
}
GitHub: https://github.com/fengbingchun/Caffe_Test
相关文章:

关于less在DW中高亮显示问题
首先, 找到DW 安装目录。 Adobe Dreamweaver CS5.5\configuration\DocumentTypes 中的,MMDocumentTypes.xml 这个文件,然后用记事本打开,查找CSS 把 CSS 后边加上,less 然后到。C:\Users\Administrator\AppData\Roamin…
Windows7 64bit VS2013 Caffe train MNIST操作步骤
1. 使用http://blog.csdn.net/fengbingchun/article/details/47905907中生成的Caffe静态库; 2. 使用http://blog.csdn.net/fengbingchun/article/details/49794453中生成的LMDB数据库文件; 3. 新建一个train_mnist控制台工程&#…

NLP机器翻译深度学习实战课程基础 | 深度应用
作者 | 小宋是呢来源 | CSDN博客0.前言深度学习用的有一年多了,最近开始 NLP 自然处理方面的研发。刚好趁着这个机会写一系列 NLP 机器翻译深度学习实战课程。本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:…

个人站点渲染和跳转过滤功能
核心逻辑:在url里加入正则,匹配分类、标签、年月日和其后面的参数,在视图函数接收这些参数,然后进行过滤。 urls.py # 个人站点的跳转 re_path(r^(?P<username>\w)/(?P<condition>tag|category|archive)/(?P<pa…

三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)
三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本)转载原文,并注明出处!虽无多少技术含量,毕竟是作者心血原创,希望理解。转自 http://blog.csdn.net/claro/article/details/6449824前思后想仍…

jdbc链接数据库
JDBC简介 JDBC全称为:Java Data Base Connectivity (java数据库连接),可以为多种数据库提供填统一的访问。JDBC是sun开发的一套数据库访问编程接口,是一种SQL级的API。它是由java语言编写完成,所以具有很好的跨平台特性…

Google Protocol Buffers介绍
Google Protocol Buffers(简称Protobuf),是Google的一个开源项目,它是一种结构化数据存储格式,是Google公司内部的混合语言数据标准,是一个用来序列化(将对象的状态信息转换为可以存储或传输的形式的过程)结…

打造 AI Beings,和微信合作…第七代微软小冰的成长之路
8月15日, “第七代微软小冰”年度发布会在北京举行。本次发布会上,微软(亚洲)互联网工程院带来了微软小冰在 Dual AI 领域的新进展,全新升级的部分核心技术,最新的人工智能创造成果,以及更多的合作与产品落地。其中&am…
感知机介绍及实现
感知机(perceptron)由Rosenblatt于1957年提出,是神经网络与支持向量机的基础。感知机是最早被设计并被实现的人工神经网络。感知机是一种非常特殊的神经网络,它在人工神经网络的发展史上有着非常重要的地位,尽管它的能力非常有限,…

不甘心只做输入工具,搜狗输入法上线AI助手,提供智能服务
8月19日搜狗输入法上线了新功能——智能汪仔,在输入法中引入了AI助手,这是搜狗输入法继今年5月推出“语音变声功能”后又一个AI落地产品。 有了智能汪仔AI助手的加持后,搜狗输入法能够在不同的聊天场景,提供丰富多样的表达方式从…
可构造样式表 - 通过javascript来生成css的新方式
可构造样式表是一种使用Shadow DOM进行创建和分发可重用样式的新方法。 使用Javascript来创建样式表是可能的。然而,这个过程在历史上一直是使用document.createElement(style)来创建<style>元素,然后通过访问其sheet属性来获得一个基础的CSSStyle…

模板方法模式与策略模式的区别
2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 策略模式:定义一个…

简单明了,一文入门视觉SLAM
作者 | 黄浴转载自知乎【导读】SLAM是“Simultaneous Localization And Mapping”的缩写,可译为同步定位与建图。最早,SLAM 主要用在机器人领域,是为了在没有任何先验知识的情况下,根据传感器数据实时构建周围环境地图,…
大主子表关联的性能优化方法
【摘要】主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款、订单和订单明细、保险保单和保单明细、银行账户和账户流水、电商用户和订单、电信账户和计费清单或流量详单。当主子表的数据量较大时,关联计算的性能将急剧降低,在…

Windows7上配置Python Protobuf 操作步骤
1、 按照http://blog.csdn.net/fengbingchun/article/details/8183468 中步骤,首先安装Python 2.7.10; 2、 按照http://blog.csdn.net/fengbingchun/article/details/47905907 中步骤,配置、编译Protobuf; 3、 将(2)中生成的pr…

鲜为人知的静态、命令式编程语言——Nimrod
Nimrod是一个新型的静态类型、命令式编程语言,支持过程式、函数式、面向对象和泛型编程风格而保持简单和高效。Nimrod从Lisp继承来的一个特殊特性抽象语法树(AST)作为语言规范的一部分,可以用作创建领域特定语言的强大宏系统。它还…

机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个kernel,比如(3, 3),在图像中不断的平移,在这个9…

无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单
作者 | Jason Brownlee译者 | Freesia,Rachel编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)【导读】图像到图像的转换技术一般需要大量的成对数据,然而要收集这些数据异常耗时耗力。因此本文主要介绍了无需成对示例便能实现图…

Git使用常见问题解决方法汇总
1. 在Ubuntu下使用$ git clone时出现server certificate verification failed. CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none 解决方法:在执行$ git clone 之前,在终端输入: export GIT_SSL_NO_VERIFY1 2. 在Windows上更新了…

服务器监控常用命令
在网站性能优化中,我们经常要检查服务器的各种指标,以便快速找到害群之马。大多情况下,我们会使用cacti、nagois或者zabbix之类的监控软件,但是这类软件安装起来比较麻烦,在一个小型服务器,我们想尽快找到问…
Ubuntu下内存泄露检测工具Valgrind的使用
在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检测工具Valgrind的使用。Valgrind目前最新版本是3.11.0, 可以从http://www.valgrind.org/ 通过下载源码…

数据为王的时代,如何用图谱挖掘商业数据背后的宝藏?
这是一个商业时代,一个数据为王的时代,也是一个 AI 迎来黄金发展期的时代。据史料记载,商业在商朝已初具规模。斗转星移,时光流转,到 2019 年,商业形式已发生翻天覆地的变化,但是商业的本质——…

旋转卡壳——模板(对踵点)
这东西学了我大概两天吧。。其实不应该学这么久的,但是这两天有点小困,然后学习时间被削了很多\(QwQ\) 说几个坑点。 - 对于题目不保证有凸包的情况,要选用左下角的点,而非单纯的最下边的点构造凸包。 - 对于凸包中只有\(1/2\)个点…

SNMP 协议 OID的使用
为什么80%的码农都做不了架构师?>>> SNMP 协议 OID的使用 SNMP(Simple Network Management Protocol简单网络管理)协议 是现在网络管理系统(NMS)监控网络设备状态的协议,是现在网管事实上的标准…

颜色空间YUV简介
YUV概念:YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL,Phase Alternation Line),是PAL和SECAM模拟彩色电视制式采用的颜色空间。其中的Y、U、V几个字母不是英文单词的组合词,Y代表亮度,其实Y就是图像的灰度值…

基于RNN的NLP机器翻译深度学习课程 | 附实战代码
作者 | 小宋是呢来源 | CSDN博客深度学习用的有一年多了,最近开始NLP自然处理方面的研发。刚好趁着这个机会写一系列 NLP 机器翻译深度学习实战课程。本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:…

trash-cli设置Linux 回收站
trash-cli 设置 Linux 回收站 trash-cli是一个使用 python 开发的软件包,包含 trash-put、restore-trash、trash-list、trash-empty、trash-rm等命令,我们可以通过这条命令,将文件移动到回收站,或者还原删除了的文件。 trash-cli的…

磁盘有时也不可靠
实验服务器的磁盘是最近买的,当卖家问我要普通的还是高级的, 我选择了普通,现在追悔莫及。今天的分析更加详细。首先发现每次实验,出错的文件都不一样,所以应该不是临界条件的问题。下表总结了出错的位置,原…

从原理到落地,七大维度详解矩阵分解推荐算法
作者 | gongyouliu编辑丨Zandy来源 | 大数据与人工智能 ( ID: ai-big-data)导语:作者在《协同过滤推荐算法》这篇文章中介绍了 user-based 和 item-based 协同过滤算法,这类协同过滤算法是基于邻域的算法(也称为基于内存的协同过…

libyuv库的使用
libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。下面说一下libyuv在Windows7VS2013 x6…