windows Caffe 动态库 静态库 编译教程

2023-11-08

博主所在的教研室要使用Caffe实现机械臂的控制环节中的预测部分,其中涉及到了Caffe的编译以及LSTM层的添加到最终的caffe的动态库和静态库的编译及使用,整个过程一言难尽,特写此博客纪念。

首先是caffe的编译,网上的教程都是大同小异,我只配置了CPU版本的caffe,这里参考的是这位大神的博客,附上链接https://blog.csdn.net/zb1165048017/article/details/51355143万分感谢!

接下来由于我的工程中是用训练好的网络模型进行预测,需要在caffe里添加LSTM层,这也是非常麻烦且耗费时间的事情,这里参考的是另一位大神的博客,链接附上https://blog.csdn.net/zb1165048017/article/details/59112034感谢万分!

实际上将添加了LSTMcaffe编译好只是万里长征第一步,最重要的还是真正把caffe用起来,caffeWindows版本自带了一个分类网络工程给大家练手,具体教程可以看这位大神https://blog.csdn.net/qq_14845119/article/details/52541622,其中需要训练好的模型以及网络结构文件,这里给大家我的百度云:链接:https://pan.baidu.com/s/1wuCmeMsDMwuk8Rya21xBow 
提取码:gxq0 

但是我写这篇博客的主要目的还是记录一下libcaffe.lib以及libcaffe.dll的编译,我在网上搜索到的资料很少,所以写下这篇博客希望大家看完之后可以少走一些弯路。

这里再提醒大家一次,无论是动态库还是静态库的编译都是在你已经将caffe编译好的基础上进行的!

动态库编译!

其实下载下来的caffe已经为dll的创建铺垫了前95%的工作,我们需要的是将caffe中定义的函数接口导出,供客户端程序调用。c++编写dll的方法是在定义class的头文件中先添加宏定义,如下:

#ifdef  DLL_TEST_API
#else
#define DLL_TEST_API _declspec(dllimport)
#endif

Class DLL_TEST_API  CDLLTest
{

         Public:
                  CDLLTest();

                  ~CDLLTest();

                  int Add(int a, int b);

};

打开编译好的caffe中的include目录,找出文件Blob.hpp net.hpp caffe.pb.h(需要修改文件名)common.hpp io.hpp db.hpp benchmark.hpp upgrade.hpp signal_handler.hpp solver.hpp parallel.hpp math_functions.hpp syncedmem.hpp,按上述方法添加代码,这里举一个例子:

#ifndef CAFFE_UTIL_DB_HPP
#define CAFFE_UTIL_DB_HPP

#ifdef BUILD_DLL
#define OS_API __declspec(dllexport)
#else
#define OS_API __declspec(dllimport)
#endif
#include <string>

#include "caffe/common.hpp"
#include "caffe/proto/caffe_pb.h"

namespace caffe { namespace db {

enum Mode { READ, WRITE, NEW };

class OS_API Cursor {
 public:
  Cursor() { }
  virtual ~Cursor() { }
  virtual void SeekToFirst() = 0;
  virtual void Next() = 0;
  virtual string key() = 0;
  virtual string value() = 0;
  virtual bool valid() = 0;

  DISABLE_COPY_AND_ASSIGN(Cursor);
};

class Transaction {
 public:
  Transaction() { }
  virtual ~Transaction() { }
  virtual void Put(const string& key, const string& value) = 0;
  virtual void Commit() = 0;

  DISABLE_COPY_AND_ASSIGN(Transaction);
};

class OS_API DB {
 public:
  DB() { }
  virtual ~DB() { }
  virtual void Open(const string& source, Mode mode) = 0;
  virtual void Close() = 0;
  virtual Cursor* NewCursor() = 0;
  virtual Transaction* NewTransaction() = 0;

  DISABLE_COPY_AND_ASSIGN(DB);
};

OS_API DB* GetDB(DataParameter::DB backend);
OS_API DB* GetDB(const string& backend);

}  // namespace db
}  // namespace caffe

#endif  // CAFFE_UTIL_DB_HPP

 

这些加完代码还是远远不够的!你的网络中用到了哪些layer,就要在include/layers目录下找到相应的头文件,同样在其中添加上述宏定义。我修改了以下头文件input_layer.hpp embed_layer.hpp dropout_layer.hpp lstm_layer.hpp inner_product_layer.hpp softmax_layer.hpp slice_layer.hpp split_layer.hpp scale_layer.hpp eltwise_layer.hpp reducation_layer.hpp concat_layer.hpp recurrent.hpp。这里再举一个例子

#ifndef CAFFE_ELTWISE_LAYER_HPP_
#define CAFFE_ELTWISE_LAYER_HPP_
#ifdef BUILD_DLL
#define OS_API __declspec(dllexport)
#else
#define OS_API __declspec(dllimport)
#endif
#include <vector>

#include "caffe/blob.hpp"
#include "caffe/layer.hpp"
#include "caffe/proto/caffe.pb.h"

namespace caffe {

/**
 * @brief Compute elementwise operations, such as product and sum,
 *        along multiple input Blobs.
 *
 * TODO(dox): thorough documentation for Forward, Backward, and proto params.
 */
template <typename Dtype>
class OS_API EltwiseLayer : public Layer<Dtype> {
 public:
  explicit EltwiseLayer(const LayerParameter& param)
      : Layer<Dtype>(param) {}
  virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top);
  virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top);

  virtual inline const char* type() const { return "Eltwise"; }
  virtual inline int MinBottomBlobs() const { return 2; }
  virtual inline int ExactNumTopBlobs() const { return 1; }

 protected:
  virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top);
  virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top);
  virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
      const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
  virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
      const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

  EltwiseParameter_EltwiseOp op_;
  vector<Dtype> coeffs_;
  Blob<int> max_idx_;

  bool stable_prod_grad_;
};

}  // namespace caffe

#endif  // CAFFE_ELTWISE_LAYER_HPP_

这里有一个问题,caffe.pb.h是根据src\caffe\proto\caffe.proto自动生成的,所以编译的时候还要把这个文件改名字,否则就把修改后的caffe.pb.h覆盖,我改成了caffe_pb.h.但是,只做这些改动还是不够,在caffe目录下的src\caffe\proto中的caffe.pb.cc文件也需要修改,因为其中定义了一些函数会在前面提到的一些层的头文件中使用,同样将上述宏定义加入caffe.pb.cc.

一定要记得在预处理器定义中添加BUILD_DLL.

最后再提醒大家不要忘了在配置属性中将配置类型改为dll.

现在右键libcaffe点击重新生成即可!生成的libcaffe.dll在build\x64\Debug/Release中。生成dll的同时还会生成一个libcaffe.lib,这与接下来要编译的静态库不同,它一般是一些索引信息,记录了dll中函数的入口和位置。

静态库编译!

有了动态库编译的经验,静态库编译起来就非常easy了。我们不需要在前面提到的头文件加那些接口定义,只需要在编译好的caffe基础上把设置中的配置属性——常规——配置类型中改为静态库编译即可。

现在右键libcaffe点击重新生成即可!可以发现现在生成的libcaffe.lib与动态库编译生成的lib大小差距悬殊,因为它的索引和实现都在其中。
 

有问题的铁汁可以在评论区一起分享,我会尽我所能为大家解答!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows Caffe 动态库 静态库 编译教程 的相关文章

  • 在哪里可以找到“Microsoft.VisualStudio.TestTools.UnitTesting”缺失的 dll?

    我的 C Visual Studio 项目中出现以下错误 命名空间 Microsoft 中不存在类型或命名空间名称 VisualStudio 是否缺少程序集引用 我还尝试查找 microsoft dll 文件 但找不到任何参考 我是否搜索了
  • ASP.NET MVC 中需要两个不同版本的 Newtonsoft.Json.dll

    我开发了一个 MVC 应用程序 它依赖于使用 Newtonsoft Json dll v6 0 0 0 的 Connectwise SDK 和使用 Newtonsoft Json dll v7 0 0 0 的 Dropbox SDK 我需要
  • 使用两个具有相同命名空间的 .NET 库

    我目前正在为一家公司维护一些旧代码 正如所发生的那样 我正在修改的当前应用程序使用旧版本的内部库 我们将其称为 Lib1 dll 他们还有一个名为 Lib2 dll 的新版本库 它在许多方面对以前的库进行了改进 不幸的是 Lib2 不向后兼
  • 获取DLL函数的内存地址

    我想知道是否有可能 使用 C 和 WindowsAPI 是否有一个函数可以让我获得 dll 中函数的 32 位 我认为 内存地址 例如 如何获取 kernel32 dll 中 Beep 的 32 位 xxxxxxxx 地址 其次 如果我在汇
  • 在 DLL 中,函数表的结构如何?

    我一直在研究不明确支持我的操作系统的设备库的实现 特别是 我有一个反汇编的 DLL 以及大量的支持源代码 现在 功能表 导出表是如何构造的 我的理解是 第一个结构 data部分是 RVA 表 接下来是通过索引链接到第一个地址表的字符串表 这
  • android可以在本机模式下从sd卡加载dll吗

    我想把我写的程序移植到android上 该程序是在 Windows 和 Linux 上用 C 编写的 该程序使用 dll 作为插件架构 通过下载程序从特定文件夹加载的 dll 可以将新插件添加到程序中 我的问题是 是否可以将为 androi
  • 根据环境选择目标 32 位或 64 位本机 DLL

    我有一个本机 DLL 有 32 位和 64 位版本 x86 我想创建一个适用于两种体系结构 任何 CPU 的包装器 并根据当前环境 32 位或 64 位 在运行时 加载 DLL 的正确版本 这个过程应该自动发生 这样我的 DLL 的用户就不
  • Visual Studio 2013 设计器尝试加载错误版本的项目 DLL

    我的解决方案中有一个 Visual Studio 项目 它引用同一解决方案中的类库项目 该项目编译并执行得很好 但是 当我尝试在设计器中打开一个表单时 我收到一条消息 无法加载文件或程序集 MyLibName Version 1 0 547
  • 没有名为“_pywrap_tensorflow_internal”的模块

    在尝试验证tensorflow gpu的安装时 在尝试执行 import tensorflow as tf 时出现ImportError 我在 Windows 7 上使用 Quadro K620 Tensorflow 是使用 pip 安装的
  • 如何从DLL中提取字符串资源

    我正在制作管理系统文件扩展名的应用程序 但遇到问题 系统扩展如 jpg exe dll png txt等有一个名为FriendlyTypeName 例如 FriendlyTypeNamejpeg 文件的内容是 SystemRoot Syst
  • AutoCAD 插件开发示例

    我对开发 AutoCAD 插件感兴趣 并试图了解几种不同类型的 AutoCAD 插件文件之间的关系 随 AutoCAD 插件一起提供的托管 DLL ARX 文件 https fileinfo com extension arx附带 Auto
  • 在 HP Load Runner 的 VuGen 中加载 javai.dll 时出现错误

    当我尝试在 HP load runner 的 VuGen 中编译一个简单的脚本时 无法启动 JVM 并出现以下错误 Java VM Internal Error Getting Error Loading javai dll 我在用着 HP
  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • dependency walker 在正确运行的系统上给我错误

    我的系统上缺少 dll 我有以下消息 无法加载文件或程序集 mydll dll 或其依赖项之一 当然 mydll 存在于此 它很可能是它所依赖的另一个 dll 我下载了 dependency walker 来检查它可能是什么 我首先在另一个
  • C# - “资源”DLL 无法加载,因为它不存在 - 我如何找到引用以便将其删除?

    我有一个 C 解决方案 它在编译时生成可执行二进制文件 该二进制文件依赖于一个库 该库是我编写的另一个解决方案的产品 所有相关代码都是我创建的 最近 我以相当随意的方式尝试了一些项目设置 试图了解 CLR 构建链接的工作原理 不幸的是 可以
  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • 如何隐藏 dll 导出类中的成员变量

    我想在 dll 文件中导出一个 1024 字节的类 class declspec dllexport ExportedClass private char Data 1024 Holding 1024 bytes public void F
  • 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

    我使用 VB6 创建了一个 ActiveX dll 并使用打包和部署向导将其打包 生成了一个 cab 文件和一个演示 HTML 页面 此 ActiveX dll 包含一个 simgle 方法 该方法返回字符串且不接受任何参数 我遇到的麻烦是
  • 需要哈希表和数组列表

    我正在尝试在我的 Windows 7 Phone 应用程序中使用其他人的 C 类 这些类使用 Hashtable 类型的对象 有问题的文件有 using System Collections 在顶部 所以我假设这就是它想要的 Hashtab
  • 最佳 DLL 符号转储实用程序

    我有数百个 DLL 属于一个巨大的意大利面条代码项目 需要查看它们导出或导入哪些调用 如果我能够获得 DLL 之间的依赖关系图 那就太好了 有人可以推荐我免费且可靠的实用程序吗 编辑 依赖遍历器似乎还不够 我不仅需要获取所需 DLL 的列表

随机推荐

  • Unity StrangeIOC傻瓜式使用教程(dispatch用法)

    公司用的框架是StrangeIOC 开始完全不知道怎么用 打断点也跟踪不到代码 后来网上各种寻找详解 但是说的都过于高大上 全是专业名词 依赖注入等 完全不适合我这种新人小白理解 最后在自己的各种实践下 总算摸透了其中dispatch用法
  • all query identities do not appear in gallery

    问题描述 在reid strong baslline使用Market 1501数据集训练reid模型后 使用自己的数据集仿照Market 1501制作相同格式的数据集 训练时报如下错误 查看原因 Martet 1501中Query和gall
  • python中安装完virtualenv,创建虚拟环境时报错'virtualenv' 不是内部或外部命令,也不是可运行的程序

    创建虚拟环境包时会报 virtualenv 不是内部或外部命令 也不是可运行的程序 错误 首先排除是否是单词拼写错误 在网上查了好久都没有自己出现的那种情况 可以成功安装 通过pip list 查询时显示安装成功 但会有两行黄色字 大致意思
  • gradle各版本下载地址

    http blog csdn net wangqjpp article details 52218314 gradle各版本下载地址 http services gradle org distributions 以前都是手动下载gradle
  • C语言的整型溢出问题

    整型溢出有点老生常谈了 bla bla bla 但似乎没有引起多少人的重视 整型溢出会有可能导致缓冲区溢出 缓冲区溢出会导致各种黑客攻击 比如最近OpenSSL的heartbleed事件 就是一个buffer overread的事件 在这里
  • wx.getUserProfile使用方法

    1 单独使用 wx getUserProfile desc 展示用户信息 声明获取用户个人信息后的用途 后续会展示在弹窗中 请谨慎填写 success res gt console log res this setData userInfo
  • SymPy Tutorial(译)

    小记 2020 2 26 本文是翻译 官方SymPy手册指南 只是为了方便而自己翻译 前言 本教程假设读者已经了解Python编程语言的基础知识 如果您还没有掌握 建议学习官方的Python教程 本教程假设您具有良好的数学背景 大多数例子需
  • 学习pyqt (二)————信号/槽&主次界面&主次线程编程经验总结

    今天准备总结一下pyqt编写界面的经验 这样以后遇到同样问题就可以查看并且很快回忆起来 环境搭建 经过一周的研究 我发现使用pyqt编写界面最快的方式还是eric pycharm 使用eric6和pycharm同时打开你正在编写的程序 需要
  • Python数据分析(Pandas)

    pandas基础数据结构 有以下两种 Series 与array很像也和list相同 Series能保存不同的种数据类型 包括字符串 bool值 数字等等 DataFrame 二维的表格型数组结构 以下内容以DataFrame为主 Seri
  • 介绍 TensorFlow 的基本概念和使用场景

    TensorFlow 是一个开源的机器学习框架 由 Google 开发 它的核心是张量 tensor 计算 用于构建神经网络等深度学习模型 以下是 TensorFlow 的基本概念和使用场景 张量 Tensor TensorFlow 中的计
  • 随机产生六位数密码

    function randStr len 6 format ALL switch format case ALL chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234
  • jquery ajax无刷新跳转,jQuery+Ajax实现无刷新操作

    使用jQuery实现Ajax操作 想要实现Ajax页面无刷新效果 但是直接利用Ajax代码实在有些麻烦 所以就想用jQuery实现 jQuery很好的封装了Ajax的核心对象XMLHTTPRequest 所以用起来非常方便 首先 创建服务器
  • MIPI D-PHY TX 一致性测试实例解析 Part 01

    序言 MIPI D PHY TX端的一致性测试内容如下 总共分为6组 因产品应用场景的需求限制 小编在日常工作中 更多地关注红色所标识的测试内容 接下来 小编将分为三个章节 具体解析下Group3 5的测试内容 Group 1 1 1 x
  • 用 Python 批量下载百度图片

    为了做一个图像分类的小项目 需要制作自己的数据集 要想制作数据集 就得从网上下载大量的图片 再统一处理 这时 一张张的保存下载 就显得很繁琐 那么 有没有一种方法可以把搜索到的图片直接下载到本地电脑中呢 有啊 用python吧 我以 泰迪
  • 掌优和合作伙伴一起做智慧生活场景

    青蛙智能设备是微信推出的刷脸支付智能硬件产品 微信团队并不会下场亲自做硬件 而是只负责产品设计 制造和铺设工作由第三方服务商进行 线下便利店对于这类体积小 支付便捷的设备有很大兴趣 对于这类硬件产品来说 量产能力以及铺设数量是决定性因素 去
  • Vuforia⭐二、动态修改识别目标和3D物体

    目录 本节的目标 动态识别的实现方法 本节的目标 本章目标为不设置ImageTarget Unity完成动态识别识别图 动态识别的实现方法 1 Vuforia官网上传识别目标 下载unitypackage并导入Unity 2 导入Vufor
  • Spring 事务详解

    目录 一 概述 二 事务的特性 ACID 三 Spring 的事务管理 3 1 编程式事务管理 3 2 编程式事务管理 四 Spring 事务管理接口及其定义的属性 4 1 PlatformTransactionManager 事务管理接口
  • c++入门笔记-list链表

    list基本概念 功能 将数据进行链式存储 链表是一种物理存储单元上非连续的存储结构 数据元素的逻辑顺序是通过链表中的指针链接实现 链表的组成 由一系列结点组成 结点的组成 一个是存储元素的数据域 另一个是存储下一个结点地址的指针域 stl
  • SQL练习题之求平均分低于80分的班级学生各科成绩并合计学生总分

    是对是错也好 不必说了 是怨是爱也好 不须揭晓 何事更重要 比两心的需要 柔情蜜意怎么可缺少 说不出再见 谭咏麟 文章目录 前言 一 练习题题目 二 创建测试数据 一 创建测试表 二 插入测试数据 三 思路 四 解答 一 详细代码 二 结果
  • windows Caffe 动态库 静态库 编译教程

    博主所在的教研室要使用Caffe实现机械臂的控制环节中的预测部分 其中涉及到了Caffe的编译以及LSTM层的添加到最终的caffe的动态库和静态库的编译及使用 整个过程一言难尽 特写此博客纪念 首先是caffe的编译 网上的教程都是大同小