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中整体派生类的情况如下:
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 IE中的整个网络管理做个介绍。