OpenVINO InferenceEngine之CNNNet、CNNLayer、Blob介绍

Movidius 专栏收录该内容
22 篇文章 2 订阅

OpenVINO IE模块对整个网络拓扑结构的管理主要是通过Net 和Layer,Data(Blob)进行管理的,看起来和caffe中的Net,Layer,Blob是一样的层次结构,是不是有点惊奇,技术总是相同的,只是每个框架具体的实现方式不一样,历史总是惊人的相似。

废话不多说,看下OpenVINO的管理框架。

ICNNNetwork

ICNNNetwork 类接口

OpenVINO对整个网络的管理是通过ICNNNetwork来实现, 该类头文件位于inference-engine\include\ie_icnn_network.hpp

主要接口如下:

MethodDescript
virtual Precision getPrecision()获取到网络操作数据精度
 virtual void getOutputsInfo(OutputsDataMap& out) 获取到网络的输出数据节点信息
 virtual void getInputsInfo(InputsDataMap& inputs)获取网络的输入数据节点信息
virtual InputInfo::Ptr getInput(const std::string& inputName)根据输入层的输入input name获取到其相关信息
virtual void getName(char* pName, size_t len)获取网络的名称
 virtual const std::string& getName() 获取网络的名称
 virtual size_t layerCount()获取网络的层数
 virtual DataPtr& getData(const char* dname)根据数据节点的名称 返回其对应的数节点指针
virtual void addLayer(const CNNLayerPtr& layer)添加一个层到网络中
virtual StatusCode
    addOutput(const std::string& layerName, size_t outputIndex = 0, ResponseDesc* resp = nullptr
添加输出到一个层中
 virtual StatusCode getLayerByName(const char* layerName, CNNLayerPtr& out, ResponseDesc* resp) 根据Layer name获取到CNNLayerPtr
virtual void setTargetDevice(TargetDevice device)指定网络在具体的设备Target上运行
virtual TargetDevice getTargetDevice()指定网络在具体的设备Target上运行
virtual StatusCode setBatchSize(const size_t size)设置网络的Batch size
 virtual StatusCode setBatchSize(size_t size, ResponseDesc* responseDesc) 设置网络的Batch size
virtual size_t getBatchSize() 设置网络的Batch size
using InputShapes = std::map<std::string, SizeVector>记录网络中所有的输出output
virtual StatusCode reshape(const InputShapes& /*inputShapes*/, ResponseDesc* /*resp*/) 重新计算网络的输入input shape
 virtual StatusCode
    AddExtension(const IShapeInferExtensionPtr& /*extension*/, ResponseDesc* /*resp*/)
注册extension 到具体的plugin中
 virtual StatusCode getStats(ICNNNetworkStats** /*stats*/, ResponseDesc* /*resp*/) 获取其网络状态
 virtual StatusCode serialize(const std::string &xmlPath, const std::string &binPath, ResponseDesc* resp将网络与IR(xml)和权重(bin)文件连接起来

该类的接口也可以查看官方说明:

https://docs.openvinotoolkit.org/latest/classInferenceEngine_1_1CNNNetwork.html

该类的接口大部分都是虚函数,该类只是定义了一个接口类,为网络的管理的基类,其具体的实现是在CNNNetworkImpl类中.

CNNNetworkImpl类

该类头文件在\inference-engine\src\inference_engine\cnn_network_impl.hpp ,

具体实现在CPP文件中inference-engine\src\inference_engine\cnn_network_impl.cpp文件中,具体的实现是和IR(.xml)相关联后面章节中在具体介绍。

CNNLayer

CNNLayer是OpenVINO的Layer管理基本单元,提供了对Layer基本管理功能,是整个Layer一个基类,大部分Layer通用操作都封装到类该中进行了实现

CNNLayer类接口

Method/VariableDescript
using  Ptr = std::shared_ptr<CNNLayer>指向一个CNNLayer指针
std::string nameLayer name
std::string typeLayer type
Precision precisionLayer基本数据操作精度
std::vector<DataPtr> outData该层Layer输出的数据指针vector
std::vector<DataWeakPtr> insData该层Layer输入的数据指针vector
 Ptr _fusedWith记录的fuse指针
 UserValue userValue卷积所需的用户数据
std::string affinity用户对该层设置所喜欢的标志
explicit CNNLayer(const LayerParams &prms) : name(prms.name), type(prms.type)CNNLayer构造函数
virtual ~CNNLayer() CNNLayer析构函数
 void fuse(Ptr &layer)设置fused
virtual const DataPtr input()返回Layer的输入input data数据的第一个input data指针
validateLayer()验证Layer是否合理
static float ie_parse_float(const std::string &str)float类型的字符串数值转换成float 值
tatic std::string ie_serialize_float(float value)将float类型的值转换字符串
float GetParamAsFloat(const char* param, float def) 根据给定的字符串参数,转成float类值
float GetParamAsFloat(const char *param)根据给定的字符串参数,转成float类值
std::vector<float> GetParamAsFloats(const char *param, std::vector<float> def)根据给定的字符串参数,转成float类值得vector, 该字符串可能包含多个float值
std::vector<float> GetParamAsFloats(const char *param)根据给定的字符串参数,转成float类值得vector, 该字符串可能包含多个float值
int GetParamAsInt(const char *param, int def)根据给定字符串参数,转成int 类型值
int GetParamAsInt(const char *param)根据给定字符串参数,转成int 类型值
std::vector<int> GetParamAsInts(const char *param, std::vector<int> def) 根据给定字符串参数,转成int 类型值 vector, 该字符串可能包含多个vector值
std::vector<int> GetParamAsInts(const char *param) 根据给定字符串参数,转成int 类型值 vector, 该字符串可能包含多个vector值
unsigned int GetParamAsUInt(const char *param, unsigned int def)根据给定字符串参数,转成unsigned int 类型值
unsigned int GetParamAsUInt(const char *param) 根据给定字符串参数,转成unsigned int 类型值
std::vector<unsigned int> GetParamAsUInts(const char *param, std::vector<unsigned int> def)根据给定字符串参数,转成unsigned int 类型值 vector
std::vector<unsigned int> GetParamAsUInts(const char *param)根据给定字符串参数,转成unsigned int 类型值 vector
bool GetParamAsBool(const char *param, bool def) 根据给定字符串参数,转成bool类型值
bool GetParamAsBool(const char *param)根据给定字符串参数,转成bool类型值
bool GetParamsAsBool(const char *param, bool def)根据给定字符串参数,转成bool类型值
std::string GetParamAsString(const char *param, const char *def)根据给定字符串参数,转成string类型值
bool CheckParamPresence(const char *param)是否可以在Layer找到param
std::string GetParamAsString(const char *param)根据给定字符串参数,转成string类型值
std::vector<std::string> GetParamAsStrings(const char *param, std::vector<std::string> def)根据给定字符串参数,转成string类型值 vector
std::map<std::string, std::string> paramsLayer 参数记录
std::map<std::string, Blob::Ptr> blobs参数与权重记录

可以看到CNNLayer整体功能比较简单,就是记录每层的参数以及各种数据类型转换,并不涉及具体计算,Layer的具体的计算是在具体的plugin中,例如CPU、GPU、VPU、Movidius等。

Layers

CNNLayer只是提供最基本的参数基类,相关的其他的层,由此派生出其他的类,在R3中整体派生类的情况如下:

CNNLayer类与caffe 中的Layer相比较,功能相对单一,没有reshape,反向传播,正向传播等这些复杂操作,这是OpenVINO不能做训练 只能做推理的原因,只根据跑出来的模型参数直接做推理运算。 

Blob

OpenVINO的Blob主要是记录训练好的模型中的weights/biases,和caffe中的Blob有很大差别。

Blob 类

Method/VariableDescription
using Ptr = std::shared_ptr<Blob>Blob指针
using CPtr = std::shared_ptr<const Blob>指向一个const Blob指针
Precision type() 返回Blob精度
Precision precision()返回Blob精度
Layout layout()返回Layout
static Ptr CreateFromData(const DataPtr &data)根据DataPtr 创建一个Blob
bool is()检查是否可以转成所需要的T 类型
Blob构造析构函数Blob构造析构函数
 size_t Resize(const SizeVector &dims, Layout layout = Layout::ANY)创建一个新的Blob并修改size
size_t Reshape(const SizeVector &dims, Layout layout = Layout::ANY)Blob reshape
const SizeVector dims()Blob 维度
 virtual const TensorDesc &getTensorDesc()返回tensor description
virtual size_t size()返回元素总的数量
virtual size_t byteSize()返回Blob的大小 单位bytes
static size_t product(const SizeVector &dims迅速修改the dimension vector's values

Blob相关类

整个Blob相关类:

并没有涉及到源码部分,只是对OpenVINO IE中的整个网络管理做个介绍。

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值