问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

imagenet数据集 有多少类

发布网友 发布时间:2022-04-30 02:38

我来回答

1个回答

热心网友 时间:2022-05-01 14:33

一:程序开始

由于要向imageNet数据集中设置resize和是否乱序等参数,所以本文使用gflags命令行解析工具;在Create.sh文件中,调用convert_imageset.bin语句为:

<pre name="code" class="cpp">GLOG_logtostderr=1$TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \ 图像数据集存放的根目录
$DATA/train.txt \ 图像的ID和对应的分类标签数字
$EXAMPLE/ilsvrc12_train_lmdb lmdb文件保存的路径

由于train.txt文件太大,电脑打不开,故打开val.txt一窥之;val.txt中的某个数据为:

65ILSVRC2012_val_00000002.JPEG ,65应该是对应的标签,后面的是图像的编号id。
二:数据转换流程图

三:convert_imageset.cpp函数分析(caffe-master/tools/)

1引入必要的头文件和命名空间

#include<algorithm>//输出数组的内容、对数组进行升幂排序、反转数组内容、复制数组内容等操作,
#include <fstream> // NOLINT(readability/streams)
#include <string>
#include<utility>//utility头文件定义了一个pair类型,pair类型用于存储一对数据
#include<vector>//会自动扩展容量的数组
#include "boost/scoped_ptr.hpp"//智能指针头文件
#include "gflags/gflags.h"
#include "glog/logging.h"
#include"caffe/proto/caffe.pb.h"
#include "caffe/util/db.hpp" //引入包装好的lmdb操作函数
#include "caffe/util/io.hpp" //引入opencv中的图像操作函数
#include "caffe/util/rng.hpp"
头文件和convert_cifar_data.cpp的区别:

1,引入gflags命令行解析工具;
2,引入utility头文件,里面提供了数组洗牌等操作

using namespace caffe; // NOLINT(build/namespaces)
using std::pair;
using boost::scoped_ptr;
命名空间区别:

1,引入全部caffe命名空间
2,引入pair对命名空间
2 gflags宏定义参数
//通过gflags宏定义一些程序的参数变量

DEFINE_bool(gray, false,"When thisoption is on, treat images as grayscale ones");//是否为灰度图片
DEFINE_bool(shuffle, false,"Randomlyshuffle the order of images and their labels");//定义洗牌变量,是否随机打乱数据集的顺序
DEFINE_string(backend, "lmdb","The backend {lmdb, leveldb} for storing the result");//默认转换的数据类型
DEFINE_int32(resize_width, 0, "Width images areresized to");//定义resize的尺寸,默认为0,不转换尺寸
DEFINE_int32(resize_height, 0, "Height imagesare resized to");
DEFINE_bool(check_size, false,"When this optionis on, check that all the datum have the samesize");
DEFINE_bool(encoded, false,"When this option ison, the encoded image will be save in datum");//用于转换数据格式的
DEFINE_string(encode_type, "","Optional:What type should we encode the image as ('png','jpg',...).");//要转换的数据格式

3 main()函数
没有想cifar和mnist的main函数,通过调用convert_data()函数来转换数据,而是直接在main函数内完成了所有数据转换代码。
3.1 通过gflags宏定义接收命令行中传入的参数

const boolis_color = !FLAGS_gray; //通过gflags把宏定义变量的值,赋值给常值变量
const boolcheck_size = FLAGS_check_size; //检查图像的size
const boolencoded = FLAGS_encoded;//是否编译(转换)图像格式
const stringencode_type = FLAGS_encode_type;//要编译的图像格式
3.2读取源数据

3.2.1创建读取对象变量
std::ifstream infile(argv[2]);//创建指向train.txt文件的文件读入流
std::vector<std::pair<std::string, int> > lines;//定义向量变量,向量中每个元素为一个pair对,pair对有两个成员变量,一个为string类型,一个为int类型;其中string类型用于存储文件名,int类型,感觉用于存数对应类别的id
如val.txt中前几个字符为“ILSVRC2012_val_00000001.JPEG65ILSVRC2012_val_00000002.JPEG”;感觉这个string= ILSVRC2012_val_00000001.JPEG int=65
std::stringfilename;
int label;
3.2.2 读取数据
//下面一条while语句是把train.txt文件中存放的所有文件名和标签,都存放到vextor类型变量lines中;lines中存放图片的名字和对应的标签,不存储真正的图片数据

while (infile>> filename >> label) {
nes.push_back(std::make_pair(filename, label));
//make_pair是pair模板中定义的给pair对象赋值的函数,push_back()函数是vector对象的一个成员函数,用来在末端添加新元素}

3.3判断是否进行洗牌操作

if(FLAGS_shuffle) {
// randomlyshuffle data
LOG(INFO)<< "Shuffling data";
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">//洗牌函数,使用随机生成器g对元素[first,last)容器内部元素进行随机排列</span>

shuffle(lines.begin(), lines.end());//vector.begin() - 回传一个Iterator迭代器,它指向 vector 第一个元素。}
3.4以智能指针的方式创建db::DB类型的对象 db

scoped_ptr<db::DB>db(db::GetDB(FLAGS_backend));
//智能指针的创建方式类似泛型的格式,上面通过db.cpp内定义的命名的子命名空间中db的“成员函数”GetDB函数来初始化db对象
db->Open(argv[3], db::NEW);//argv[3]的文件夹下创建并打开lmdb的操作环境
scoped_ptr<db::Transaction>txn(db->NewTransaction());//创建lmdb文件的操作句柄

3.5 源数据中提取图像数据
3.5.1 通过ReadImageToDatum函数把图像数据读取到datum中
//到源数据位置读取每张图片的数据。(../imagenet/xxx.jpeg,65,256,256,true,jpeg,&datum)

status= ReadImageToDatum(root_folder + lines[line_id].first,lines[line_id].second, resize_height,resize_width, is_color,enc, &datum); //把图像数据读取到datum中
3.5.2 ReadImageToDatum函数说明

ReadImageToDatum函数为io.cpp文件中定义的函数;io.cpp主要实现了3部分功能:
1,从text文件或者二进制文件中读写proto文件;
2,利用opencv的Mat矩阵,把图像数据读到Mat矩阵中;
3,把Mat矩阵中的值放入到datum中
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? imagenet 数据集多少类 怎么看win10是不是正版激活 imagenet是基于什么模型的 如何评价ILSVRC2015 caffe的train val和test有什么区别 电科院代码是多少 电科院沪帐户不能买入 Caffe训练自己的imagenet,ubuntu提示killed 怎么使用caffe实现人脸的识别 人身意外险理赔金额一般是多少 有谁有ILSVRC2012的竞赛数据集 天宏中证基金最近为什么跌这么厉害,现在该不该赎回? 民生保险二百圆买一年人身意外险怎么赔付 有谁有ILSVRC2012的数据集 民生意外险怎么理赔 如何获得imagenet ILSVRC2010 天弘中证的800指数基金稳妥吗 中国民生的意外保险赔偿 买天弘中证的电子基金亏损过吗? 意外险多少钱,赔付是多少 1040是什么意思 如何查看win10是否正版激活 中国选手身上带着虫子出来,看着很吓人,东京湾水到底有多脏? 林洋能源是创业板吗 万分值得深刻思考的广西北部湾经济区现象。?? 1040的家庭会要做什么 中国北部湾对经济有好处吗 中科电气股票代码是什么意思?中科电气牛市股价是多少?中科电气十年来的走势图? 被别人盗用了怎么办? 北部湾传销国家默许吗 珠江口及北部湾盆地 被盗了登不上去怎么办怎么找回来? 今天书店看到一本北部湾畔这本崛起解读鸿雁著是正版书籍吗 朋友被盗了怎么办 “风生水起北部湾”这句话怎么解释? 北部湾资本运作,能赚1040万吗 被盗了怎么办怎么找回来? 被盗了怎么办? 小度小度你能来我家吗 被盗了怎么办?