Caffe源码(十一):io.cpp 分析

2023-11-17

目录

简单介绍

io.cpp 主要定义了一些读取图像或者文件,以及它们之间的一些转化的函数。

主要函数

1.ReadProtoFromTextFile 函数:

从prototxt文件中读取message参数

bool ReadProtoFromTextFile(const char* filename, Message* proto) {
  int fd = open(filename, O_RDONLY);//打开文件
  CHECK_NE(fd, -1) << "File not found: " << filename;
  FileInputStream* input = new FileInputStream(fd);//新建一个FileInputStream对象 input
  bool success = google::protobuf::TextFormat::Parse(input, proto);
  //解析input文件中的Message, 即使文件中参数定义顺序与Message中的参数定义顺序不一致,也可以解析。
  delete input;
  close(fd);
  return success;
}

2.WriteProtoToTextFile 函数:

void WriteProtoToTextFile(const Message& proto, const char* filename) {
  int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
  FileOutputStream* output = new FileOutputStream(fd);
  CHECK(google::protobuf::TextFormat::Print(proto, output));
  delete output;
  close(fd);// 和ReadProtoFromTextFile功能相反
}

3.ReadProtoFromBinaryFile 函数:

从二进制文件中读取message 参数

bool ReadProtoFromBinaryFile(const char* filename, Message* proto) {//读取二进制文件
  int fd = open(filename, O_RDONLY);
  CHECK_NE(fd, -1) << "File not found: " << filename;
  ZeroCopyInputStream* raw_input = new FileInputStream(fd);
  CodedInputStream* coded_input = new CodedInputStream(raw_input);
  // 建立CodedInputStream类的对象coded_input
  coded_input->SetTotalBytesLimit(kProtoReadBytesLimit, 536870912);
  //折设置最大字节限制
  bool success = proto->ParseFromCodedStream(coded_input);//解析message

  delete coded_input;
  delete raw_input;
  close(fd);
  return success;
}

4.WriteProtoToBinaryFile 函数 :

void WriteProtoToBinaryFile(const Message& proto, const char* filename) {
  fstream output(filename, ios::out | ios::trunc | ios::binary);
  CHECK(proto.SerializeToOstream(&output));
}//和ReadProtoFromBinaryFile功能相反

5.ReadImageToCVMat 函数:

以cvMat格式读入图像

cv::Mat ReadImageToCVMat(const string& filename,//is_color 为1读入彩色图像,0灰度图
    const int height, const int width, const bool is_color) {
    //height,width都不为0则把图像resize 到height*width
  cv::Mat cv_img;
  int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
    CV_LOAD_IMAGE_GRAYSCALE);
  cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag);//读入图像
  if (!cv_img_origin.data) {
    LOG(ERROR) << "Could not open or find file " << filename;
    return cv_img_origin;
  }
  if (height > 0 && width > 0) {
    cv::resize(cv_img_origin, cv_img, cv::Size(width, height));
  } else {
    cv_img = cv_img_origin;
  }
  return cv_img;
}

重载函数,提供各种不同的功能

cv::Mat ReadImageToCVMat(const string& filename,
    const int height, const int width) {
  return ReadImageToCVMat(filename, height, width, true);
}//重载函数,读入彩色图
cv::Mat ReadImageToCVMat(const string& filename,
    const bool is_color) {
  return ReadImageToCVMat(filename, 0, 0, is_color);
}//重载函数,读入图像但不resize
cv::Mat ReadImageToCVMat(const string& filename) {
  return ReadImageToCVMat(filename, 0, 0, true);
}//重载函数,读入彩色图像且不resize

6.matchExt 函数:

匹配文件后缀名

static bool matchExt(const std::string & fn,
                     std::string en) {
  size_t p = fn.rfind('.');//p 为文件名中“.”所在位置的索引
  std::string ext = p != fn.npos ? fn.substr(p) : fn;//ext为文件后缀名".xxx"
  std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
  //把ext中的大写字母转化小写字母
  std::transform(en.begin(), en.end(), en.begin(), ::tolower);
  if ( ext == en )
    return true;
  if ( en == "jpg" && ext == "jpeg" )
    return true;
  return false;
}

7.CVMatToDatum 函数:

cvMat 格式数据转化为Datum格式

void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) {
  CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte";
  datum->set_channels(cv_img.channels());
  datum->set_height(cv_img.rows);
  datum->set_width(cv_img.cols);//分别设置channel, height,width
  datum->clear_data();
  datum->clear_float_data();
  datum->set_encoded(false);
  int datum_channels = datum->channels();
  int datum_height = datum->height();
  int datum_width = datum->width();
  int datum_size = datum_channels * datum_height * datum_width;
  std::string buffer(datum_size, ' ');//将buffer初始化为字符''的datum_size个副本 
  for (int h = 0; h < datum_height; ++h) {
    const uchar* ptr = cv_img.ptr<uchar>(h);//指向图像第h行的指针
    int img_index = 0;
    for (int w = 0; w < datum_width; ++w) {
      for (int c = 0; c < datum_channels; ++c) {
        int datum_index = (c * datum_height + h) * datum_width + w;
        buffer[datum_index] = static_cast<char>(ptr[img_index++]);
      }
    }
  }
  datum->set_data(buffer);
}

8.ReadFileToDatum 函数:

bool ReadFileToDatum(const string& filename, const int label,
    Datum* datum) {
  std::streampos size;//获取文件指针位置 size

  fstream file(filename.c_str(), ios::in|ios::binary|ios::ate);
  if (file.is_open()) {
    size = file.tellg();//代表当前get 流指针的位置
    std::string buffer(size, ' ');
    file.seekg(0, ios::beg);//设置0输入文件流的起始位置
    file.read(&buffer[0], size);
    file.close();
    datum->set_data(buffer);//data_->assign(buffer)
    datum->set_label(label);//label_ = label
    datum->set_encoded(true);
    return true;
  } else {
    return false;
  }
}

9.ReadImageToDatum 函数:

读入图像到Datum

bool ReadImageToDatum(const string& filename, const int label,
    const int height, const int width, const bool is_color,
    const std::string & encoding, Datum* datum) {
  cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color);
  if (cv_img.data) {
    if (encoding.size()) {
      if ( (cv_img.channels() == 3) == is_color && !height && !width &&
          matchExt(filename, encoding) )
        return ReadFileToDatum(filename, label, datum);
      std::vector<uchar> buf;
      cv::imencode("."+encoding, cv_img, buf);
      datum->set_data(std::string(reinterpret_cast<char*>(&buf[0]),
                      buf.size()));
      datum->set_label(label);
      datum->set_encoded(true);
      return true;
    }
    CVMatToDatum(cv_img, datum);//cvmat转为Datum格式
    datum->set_label(label);
    return true;
  } else {
    return false;
  }
}

10.DecodeDatumToCVMat 函数:

cv::Mat DecodeDatumToCVMat(const Datum& datum, bool is_color) {
  cv::Mat cv_img;
  CHECK(datum.encoded()) << "Datum not encoded";
  const string& data = datum.data();
  std::vector<char> vec_data(data.c_str(), data.c_str() + data.size());
  int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
    CV_LOAD_IMAGE_GRAYSCALE);
  cv_img = cv::imdecode(vec_data, cv_read_flag);//从内存都入图片
  if (!cv_img.data) {
    LOG(ERROR) << "Could not decode datum ";
  }
  return cv_img;//将encode 的Datum转化为cvMat
}

11.DecodeDatum 函数:

bool DecodeDatum(Datum* datum, bool is_color) {
  if (datum->encoded()) {
    cv::Mat cv_img = DecodeDatumToCVMat((*datum), is_color);
    CVMatToDatum(cv_img, datum);
    return true;
  } else {
    return false;
  }
}//将encodedDatum转化为没有encode的Datum
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Caffe源码(十一):io.cpp 分析 的相关文章

  • 使用 System.IO.File 辅助方法的“顺序”文件 I/O 安全吗?

    我刚刚看到这个问题 在 C 中的 File 类上使用静态方法安全吗 https stackoverflow com q 32413634 1207195 总结一下OP有一个IOException因为该 ASP NET 代码片段中正在使用文件
  • 在 Java 中获取输入最有效的方式是什么?

    我正在解决这个问题question http www codechef com problems INTEST 这是我的代码 import java io IOException import java util Scanner publi
  • 如何在 Perl 6 中追加到文件?

    我正在尝试这个和其他一些事情 但它每次都会截断文件 my file primes txt sub MAIN Int D low Int D high where gt low unless my fh open file w append
  • 如何判断一个文件是否可以删除?

    我怎么能够check我可以用Java删除文件吗 例如 如果一个文件test txt在另一个程序中打开我无法删除它 我必须在实际删除之前知道它 所以我不能这样做 if file delete And srcFile canWrite 也不工作
  • 如何从 Vec 或 Slice 读取 (std::io::Read)?

    Vec支持std io Write 因此可以编写需要File or Vec 例如 从 API 参考来看 两者都不是Vec也不支持切片std io Read 有没有方便的方法来实现这一目标 是否需要编写包装结构 这是一个工作代码的示例 它读取
  • 在 Swift 中,如何将现有的二进制文件读入数组?

    作为我的项目的一部分 我有一个二进制数据文件 其中包含大量 32 位整数 我的一个类在初始化时读入该文件 在我的 C 库中 我使用以下初始化程序读入它 Evaluator Evaluator m HandNumbers resize 324
  • Socket IO 涉及磁盘 IO 吗?

    如果一个进程通过套接字向同一台机器上的另一个进程发送数据 传输过程中发生磁盘读 写的可能性有多大 似乎有一个套接字文件类型 如果有空闲内存 这些文件是否保证在内存中 不直接 TCP UDP 网络套接字 本地主机或 UNIX 域套接字将在内存
  • 从字符串中删除所有“不可见”字符?

    我正在编写一个小类来从文件中读取键值对列表并写入Dictionary
  • 使用 C++ 删除文本文件中重复行的内存有效方法

    使用 C 删除大型文本文件中的重复行的最有效内存方法是什么 让我澄清一下 我不是要求代码 只是最好的方法 不保证重复的行是相邻的 我意识到针对最小内存使用进行优化的方法会导致速度变慢 但这是我的限制 因为文件太大 我会对每一行进行散列 然后
  • 二进制文件 I/O

    如何用D语言读写二进制文件 在 C 语言中是 FILE fp fopen home peu Desktop bla bin wb char x 4 RIFF fwrite x sizeof char 4 fp 我在 D 找到了 rawWri
  • 检查lua中是否存在目录?

    如何检查 lua 中是否存在目录 如果可能的话最好不使用 LuaFileSystem 模块 尝试做类似以下 python 行的事情 os path isdir path 这是一种在 Unix 和 Windows 上都适用的方式 无需任何外部
  • 如何在 android studio 中监听 shell 命令的响应?

    在 Android 终端模拟器中 我可以输入以下命令 gt su gt echo class power supply battery charge rate 根据手机的充电方式 输出将为 无 正常 或 涡轮 我希望能够检索此输出并存储它作
  • Python 3:资源警告:未关闭的文件 <_io.TextIOWrapper name='PATH_OF_FILE'

    当我在 python 中运行测试用例时 python 规范化器 setup py 测试 我收到以下异常 ResourceWarning unclosed file lt io TextIOWrapper name Users workspa
  • 按广度优先顺序列出目录所有内容导致效率低下

    我编写了一个 Haskell 模块来按广度优先顺序列出目录的所有内容 下面是源代码 module DirElements dirElem where import System Directory getDirectoryContents
  • 有没有办法从 IO monad 中解开类型?

    我有这个非常简单的功能 import qualified Data ByteString Lazy as B getJson IO B ByteString getJson B readFile jsonFile readJFile IO
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • Caffe,在层中设置自定义权重

    I have a network In one place I want to use concat As on this picture 不幸的是 该网络无法训练 为了理解为什么我想连续改变权重 这意味着 FC4096 中的所有值一开始都
  • 在Python中修改大型文本文件最后一行的最有效方法

    我需要更新几个超过 2GB 的文件的最后一行 这些文件由无法读取的文本行组成readlines 目前 它可以通过逐行循环来正常工作 但是 我想知道是否有任何编译库可以更有效地实现这一点 谢谢 目前的方法 myfile open large
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na

随机推荐

  • Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用

    首先看一下Openwrt系统中关于按键功能的使用和修改 以18 06版本为例 按键功能实现在脚本中 比如18 06 package base files files etc rc button reset bin sh lib functi
  • 【闲趣】软链接:拯救你的C盘

    转载 本文主要解决电脑系统盘空间问题 虽然有一些软件我们修改了安装路径 但是无可避免的是还是有一些文件装在了C盘里 有没有什么办法可以把它们全部放到非系统盘呢 自从上次重装系统之后 电脑上的3dsmax也用不了了 今天想重新下载回来 但是之
  • Unity Frame Debugger和Profiler连接Android真机调试

    当用Profiler分析到不是代码导致的性能问题 当前场景最大的性能瓶颈是渲染时 或者自己写的Shader要调试时 都可以用Frame Debugger进行调试 按下列步骤设置打包 既可以用Profiler又可以用Frame Debugge
  • 【转载】爬虫篇——urllib3的基础知识(总结)

    一 快速入门 1 提出请求 导入urllib3模块 import urllib3 创建一个PoolManager对象 用于处理连接池和线程安全的所有详细信息 http urllib3 PoolManager 提出请求 请使用request
  • 7.27作业

    实现一个对数组求和的函数 数组通过实参传递给函数 bin bash read p 请输入数组 a arr sum 0 function fun for i in arr do sum i done fun echo sum
  • 浅谈矩阵分解在推荐系统中的应用

    推荐系统是当下越来越热的一个研究问题 无论在学术界还是在工业界都有很多优秀的人才参与其中 近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮 比如几年前的Neflix百万大奖赛 KDD CUP 2011的音乐推荐比赛 去年的
  • LeetCode 27. Remove Element(删除元素)

    原题网址 https leetcode com problems remove element Given an array and a value remove all instances of that value in place a
  • spring quartz 1.6配置方法

    该配置文件针对quartz 1 6 0 jar 较为常见 配置文件如下 启动时引入加载即可
  • 查看java编程环境是否配置成功

    验证Java编程环境是否配置成功 点击键盘Windows r键 打开运行提示框输入cmd按回车键打开命令框 输入javac 点击回车 查看java编译环境是否正常 输入 java 点击回车 查看java运行环境是否正常 输入java ver
  • 一起聊聊等保测评

    现在好多企业里面好像都在搞这个等保测评 这个等保测评终究是个什么东西呢 那企业为什么要做这个等保测评呢 做完之后对企业又有什么帮助呢 然后就是哪些企业需要做等保测呢 甚至很多企业做了很多次等保测评最后都不太了解这个等保测评 那今天就让我们一
  • QFramelessWidget 中多个组件添加滚动条

    QFramelessWidget 无边框窗口 QFramelessWidget是一个无框架的窗口小部件 它提供了一种在主窗口外绘制自定义窗口小部件的方法 在QFramelessWidget中添加多个组件时 有时候需要在这些组件中添加滚动条
  • echarts仪表盘进度条、指针动态渐变色显示

    1 echarts仪表盘实现效果如下 2 配置项代码 const option 鼠标悬浮的提示 tooltip formatter b c series type gauge min 0 最大值 max 100 最小值 startAngle
  • shiro简介以及基本框架搭建

    Shiro框架是一个基于java实现认证登录的安全框架 它是由Apache推出的 目前最新的版本是1 3 2版本 Shiro主要的功能有 Authentication 身份认证 登录 Authorization 授权 Session Man
  • ftp虚拟服务器登录,ftp虚拟服务器登录

    ftp虚拟服务器登录 内容精选 换一换 默认部署在VPC下的应用可以调用API 如果域名解析失败 则参考配置内网DNS 在当前终端节点上配置DNS服务器 配置完成后 部署在VPC下的应用可以调用API 配置DNS需要配置 etc 目录下的r
  • c++---优先队列(priority_queue)

    C 中的优先队列是STL中的派生容器 它仅考虑最高优先级元素 队列遵循FIFO策略 而优先队列根据优先级弹出元素 即 优先级最高的元素首先弹出 与普通队列区别 在优先队列中 队列中的每个元素都与某个优先级相关联 但是优先级在队列数据结构中不
  • postman做接口测试时一些实用的操作

    Postman 之前是作为Chrome 的一个插件 现在要下载应用才能使用 以下是postman 的界面 各个功能区的使用如下 快捷区 快捷区提供常用的操作入口 包括运行收藏夹的一组测试数据 导入别人共享的收藏夹测试数据 Import fr
  • flutter1.12版本android适配

    1 修改MainActivity public class MainActivity extends io flutter embedding android FlutterActivity 如果与flutter有通信 则覆盖下面方法 pr
  • Makefile的$@、$%、$?、$^ 、$+、$*自动化变量说明

    自动变量 含义 表示规则中的目标文件集 在模式规则中 如果有多个目标 那么 就是匹配于目标中模式定义的集合 仅当目标是函数库文件时 表示规则中的目标成员名 例如 如果一个目标是 foo a bar o 那么 就是 bar o 就是 foo
  • 项目五:智慧家庭

    目录 1 项目功能演示 2 总体框架 3 WIFI连接模块 4 智能门禁模块 5 数据采集模块 6 智能检测模块
  • Caffe源码(十一):io.cpp 分析

    目录 目录 简单介绍 主要函数 ReadProtoFromTextFile 函数 WriteProtoToTextFile 函数 ReadProtoFromBinaryFile 函数 WriteProtoToBinaryFile 函数 Re