Caffe生成的数据分为2种格式:Lmdb 和 Leveldb

  • 它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。
  • 虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。
  • 因此lmdb取代了leveldb成为Caffe默认的数据集生成格式。

create_babyface.sh调用的convertData的源代码如下:

#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include <stdio.h>
#include<string.h> #include <fstream> // NOLINT(readability/streams)
#include <string>
#include <vector> #include "boost/scoped_ptr.hpp"
#include "glog/logging.h"
#include "google/protobuf/text_format.h"
#include "stdint.h" #include "caffe/proto/caffe.pb.h"
#include "caffe/util/db.hpp" #include <opencv/cv.h>
#include <opencv/highgui.h> using caffe::Datum;
using boost::scoped_ptr;
using std::string;
namespace db = caffe::db;
using namespace std; const int kCIFARSize = 32;
const int kCIFARChannelBytes = 1024;
const int kCIFARImageNBytes = 3072;
const int kCIFARBatchSize = 1000;//1000 for a batch!
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;
} //Read IPLimage to the buffer
void read_image(
IplImage* out, char* buffer,
char* RC, char* GC, char* BC)
{
int x,y;
int idx =0;
for(y = 0; y<out->height; y++){
char *ptr= out->imageData + y * out->widthStep;
for( x = 0;x< out->width;x++){
idx =y*out->height + x;
BC[idx]= ptr[3*x];
GC[idx]= ptr[3*x+1];
RC[idx]= ptr[3*x+2]; //这样就可以添加自己的操作,这里我使三通道颜色一样,就彩色图转黑白图了
}
}
memcpy( buffer ,RC, kCIFARChannelBytes*sizeof(char) );
memcpy( buffer+ kCIFARChannelBytes*sizeof(char) , GC,kCIFARChannelBytes*sizeof(char) );
memcpy( buffer+ kCIFARChannelBytes*sizeof(char) *2, BC,kCIFARChannelBytes*sizeof(char) );
return;
} //Travel the folder and load the filelist!
//使用linux dirent遍历目录
 int traveldir(char* path ,int depth, vector<string > &FileList)
{
DIR* d;// a
struct dirent *file; struct stat sb; if( !(d=opendir(path ) ) ){
printf("Read path %s error,wishchin! ", path);
return -1;
} while( (file= readdir(d ) ) != NULL ) {
if(0== strncmp(file->d_name, ".", 1 ) ) continue;
char filename[256];
strcpy( filename , file->d_name ); string Sfilename(filename);string Spath(path);
Spath.append(Sfilename);
FileList.push_back(Spath);
} if( stat(file->d_name, &sb)>=0 && S_ISDIR(sb.st_mode) && depth <=4 )
traveldir(file->d_name,depth+1,FileList); closedir(d);
return 1;
} // convert the data to the lmdb format !
void convert_dataset(
const string& input_folder,
const string& output_folder,
const string& db_type) {  scoped_ptr<db::DB> train_db(db::GetDB(db_type));
train_db->Open(output_folder + "/babyface_train_" + db_type, db::NEW);
scoped_ptr<db::Transaction> txn(train_db->NewTransaction()); char* path=new char[256];
int depth=2;
vector<string > FileList(0); // Data buffer
int label;
IplImage* ImageS;
char str_buffer[kCIFARImageNBytes];
char* RC=new char[kCIFARChannelBytes];
char* GC=new char[kCIFARChannelBytes];
char* BC=new char[kCIFARChannelBytes];
Datum datum;
datum.set_channels(3);
datum.set_height(kCIFARSize);
datum.set_width(kCIFARSize); //"Writing Training data"//载入训练数据
LOG(INFO) << "Writing Training data"; strcpy(path,( input_folder+(string)("train1") ).c_str() );
traveldir( path , depth, FileList); 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);
//CHECK(data_file) << "Unable to open train file #" << fileid + 1; label=1;//The Batch has 10000 pics!
for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
ImageS =cvLoadImage( (FileList[ fileid*kCIFARTrainBatches + itemid] ).c_str() );
read_image( ImageS, str_buffer, RC, GC, BC); datum.set_label(label);//datum.set_label(label);
datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes,
"%05d", fileid * kCIFARBatchSize + itemid);
string out;
CHECK(datum.SerializeToString( &out) ) ;
txn->Put(string(str_buffer, length), out);//The main sentence ,put data to the txn!
}
} strcpy(path,( input_folder+(string)("train0") ).c_str() );
traveldir( path , depth, FileList);
for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) {
LOG(INFO) << "Training Batch " << fileid + 1;
snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1);
//CHECK(data_file) << "Unable to open train file #" << fileid + 1; label=0;//The Batch has 10000 pics!
for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
ImageS =cvLoadImage( (FileList[ fileid*kCIFARTrainBatches + itemid] ).c_str() );
read_image( ImageS, str_buffer, RC, GC, BC); datum.set_label(label);//datum.set_label(label);
datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes,
"%05d", fileid * kCIFARBatchSize + itemid);
string out;
CHECK(datum.SerializeToString( &out) ) ;
txn->Put(string(str_buffer, length), out);//The main sentence ,put data to the txn!
}
} txn->Commit();
train_db->Close(); //写入测试数据!
LOG(INFO) << "Writing Testing data";
scoped_ptr<db::DB> test_db(db::GetDB(db_type));
test_db->Open(output_folder + "/babyface_test_" + db_type, db::NEW);
txn.reset(test_db->NewTransaction()); strcpy(path,( input_folder+(string)("test1") ).c_str() );
traveldir( path , depth, FileList);
for (int fileid = 0; fileid < 2; ++fileid) {
LOG(INFO) << "Training Batch " << fileid + 1;
snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1); label=1;//The Batch has 10000 pics!
for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
ImageS =cvLoadImage( (FileList[ fileid*2 + itemid] ).c_str() );
read_image( ImageS, str_buffer, RC, GC, BC); datum.set_label(label);//datum.set_label(label);
datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes,
"%05d", fileid * kCIFARBatchSize + itemid);
string out;
CHECK(datum.SerializeToString( &out) ) ;
txn->Put(string(str_buffer, length), out);//The main sentence ,put data to the txn!
}
} strcpy(path,( input_folder+(string)("test0") ).c_str() );
traveldir( path , depth, FileList);
for (int fileid = 0; fileid < 2; ++fileid) { LOG(INFO) << "Training Batch " << fileid + 1;
snprintf(str_buffer, kCIFARImageNBytes, "/data_batch_%d.bin", fileid + 1); label=0;//The Batch has 10000 pics!
for (int itemid = 0; itemid < kCIFARBatchSize; ++itemid) {
ImageS =cvLoadImage( (FileList[ fileid*2 + itemid] ).c_str() );
read_image( ImageS, str_buffer, RC, GC, BC); datum.set_label(label);//datum.set_label(label);
datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes,
"%05d", fileid * kCIFARBatchSize + itemid);
string out;
CHECK(datum.SerializeToString( &out) ) ;
txn->Put(string(str_buffer, length), out);//The main sentence ,put data to the txn!
}
} txn->Commit();
test_db->Close(); cvReleaseImage(&ImageS);
delete [] RC;delete [] GC;delete [] BC;
} int main(int argc, char** argv) {
if (argc != 4) {
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 db_type\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]), string(argv[3]));
}
return 0;
}

后记:目的是载入32×32的三通道图像,直接输入3072维的char向量进行训练,至于怎样训练网络,还得仔细查看一下。

后记:代码出现 coredump 问题,利用 gcc path/...bin  -o coredemo -g ,出现caffe.pb.h 包含丢失现象,why???

caffe特征提取/C++数据格式转换的更多相关文章

  1. zw版【转发·台湾nvp系列Delphi例程】Delphi 使用 HALCON库件COM控件数据格式转换

    zw版[转发·台湾nvp系列Delphi例程]Delphi 使用 HALCON库件COM控件数据格式转换 Delphi 使用 HALCON库件COM控件数据格式转换,与IHObjectX接口有关 va ...

  2. Java将其他数据格式转换成json字符串格式

    package com.wangbo.util; import java.beans.IntrospectionException; import java.beans.Introspector; i ...

  3. 完善GDAL与OpenCV间的数据格式转换与影像分块读写

    本博客为原创内容,未经博主允许禁止转载,商用,谢谢. 一.前言 关于GDAL与openCV间的数据格式转换,在我之前的博客中已有简要说明,这里,由于最近工作上经常用到openCV里的函数进行图像处理, ...

  4. 页面输入的数据格式转换类:BaseAction(经常使用于Struts框架中)

    在我们接收页面传来的数据时,这些数据都是以String类型接收的,所以要进行数据格式转换,这时候就能够统一为它们进行转换,并且在处理这些数据的类中能够继承ActionSupport类,然后让每个接收数 ...

  5. SBC数据格式转换软件

    北京博信施科技有限公司是一家专业从事数据格式转换.数据处理领域研发软件产品和解决方案实施的技术型公司.在当今信息时代,PDF文档格式是在Internet上进行电子文档发行和数字化信息传播的理想文档格式 ...

  6. 【C#/WPF】图像数据格式转换时,透明度丢失的问题

    问题:工作中涉及到图像的数据类型转换,经常转着转着发现,到了哪一步图像的透明度丢失了! 例如,Bitmap转BitmapImage的经典代码如下: public static BitmapImage ...

  7. NetworkX系列教程(11)-graph和其他数据格式转换

    小书匠 Graph 图论  学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...

  8. python pandas数据分析基础入门2——(数据格式转换、排序、统计、数据透视表)

    //2019.07.18pyhton中pandas数据分析学习——第二部分2.1 数据格式转换1.查看与转换表格某一列的数据格式:(1)查看数据类型:某一列的数据格式:df["列属性名称&q ...

  9. 【转】在Python的struct模块中进行数据格式转换的方法

    这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...

随机推荐

  1. 【剑指Offer】53、表示数值的字符串

      题目描述:   请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100", "5e2", "-123",&q ...

  2. POJ 3126 Prime Path (BFS + 素数筛)

    链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...

  3. 爬虫框架Scrapy初步使用

    本文转载自: Scrapy 爬取并分析酷安 6000 款 App,找到良心佳软(抓取篇) https://www.makcyun.top/web_scraping_withpython10.html ...

  4. elasticsearch 分布式阅读笔记(二)

    说明 扩展分为 纵向扩展:购买更好的服务器 横向扩展:增加服务器(elasticsearch更适合横向扩展) elasticsearch可以用于构建高可用和可扩展的系统,elasticsearch天生 ...

  5. 百度之星2014复赛 - 1002 - The Query on the Tree

    先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  6. 0802关于mysql数据库的锁机制

    参考网址 http://www.cnblogs.com/yelbosh/p/5813865.html http://www.cnblogs.com/chenpingzhao/p/5065316.htm ...

  7. SCVMM-VMWARE ACE虚拟机管理工具

    SCVMM是微软的虚拟化管理工具 VMWARE ACE是另一套虚拟化的工具 这两套工具都是用来管理虚拟机的,可以直接将物理机虚拟化为虚拟机 企业一旦发展到了一定阶段,并然需要自己的服务器和虚拟化环境, ...

  8. Dockerfile分离构建LNMP环境部署wordpress

    最近忙着写自己的项目,也把一个站点的bbs论坛打算迁移到Docker中,测试没发现啥大问题.在单台上面的架构如下:(往后我们也是要讲到compose和swarm调度的慢慢来) 1.首先我们先安装一下d ...

  9. C++编程-&gt;pair(对组)

    pair 是 一种模版类型.每一个pair 能够存储两个值.这两种值无限制,能够是tuple.vector ,string,struct等等. 首先来看一下pair的函数 初始化.复制等相关操作例如以 ...

  10. 【cl】字符串

    使用单引号(') 你可以用单引号指示字符串,就如同‘How are you’这样.所有的空白,即空格跟制表符都照原样保留 使用双引号(“) 在双引号中的字符串与单引号中的字符串的使用完全相同,例如“W ...