OpenVINO InferenceEngine之CNNNet、CNNLayer、Blob介绍

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

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

ICNNNetwork

ICNNNetwork 类接口

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

主要接口如下:

Method Descript
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/Variable Descript
using  Ptr = std::shared_ptr<CNNLayer> 指向一个CNNLayer指针
std::string name Layer name
std::string type Layer type
Precision precision Layer基本数据操作精度
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> params Layer 参数记录
std::map<std::string, Blob::Ptr> blobs 参数与权重记录

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

Layers

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

OpenVINO InferenceEngine之CNNNet、CNNLayer、Blob介绍

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

Blob

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

Blob 类

Method/Variable Description
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 InferenceEngine之CNNNet、CNNLayer、Blob介绍

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