1、模型和数据加载
// 加载 Darknet
Net readNetFromDarknet(const String &cfgFile, const String &darknetModel = String());
Net readNetFromDarknet(const std::vector<uchar>& bufferCfg,
const std::vector<uchar>& bufferModel = std::vector<uchar>())
Net readNetFromDarknet(const char *bufferCfg, size_t lenCfg,
const char *bufferModel = NULL, size_t lenModel = 0)
// 加载 Caffe
Net readNetFromCaffe(const String &prototxt, const String &caffeModel = String());
Net readNetFromCaffe(const std::vector<uchar>& bufferProto,
const std::vector<uchar>& bufferModel = std::vector<uchar>())
Net readNetFromCaffe(const char *bufferProto, size_t lenProto,
const char *bufferModel = NULL, size_t lenModel = 0)
// 加载TensorFlow
Net readNetFromTensorflow(const String &model, const String &config = String())
Net readNetFromTensorflow(const std::vector<uchar>& bufferModel,
const std::vector<uchar>& bufferConfig = std::vector<uchar>())
Net readNetFromTensorflow(const char *bufferModel, size_t lenModel,
const char *bufferConfig = NULL, size_t lenConfig = 0)
// 加载 Torch
Net readNetFromTorch(const String &model, bool isBinary = true);
Mat readTorchBlob(const String &filename, bool isBinary = true);
// 加载 Intel
Net readNetFromModelOptimizer(const String &xml, const String &bin);
// 加载 ONNX
Net readNetFromONNX(const String &onnxFile);
Mat readTensorFromONNX(const String& path);
// 通用
Net readNet(const String& model, const String& config = "",
const String& framework = "")
Net readNet(const String& framework, const std::vector<uchar>& bufferModel,
const std::vector<uchar>& bufferConfig = std::vector<uchar>())
2、通用函数
// 图像或图像集合转换成Blob
Mat blobFromImage(InputArray image, double scalefactor=1.0, const Size& size = Size(),
const Scalar& mean = Scalar(), bool swapRB=false, bool crop=false,
int ddepth=CV_32F)
void blobFromImage(InputArray image, OutputArray blob, double scalefactor=1.0,
const Size& size = Size(), const Scalar& mean = Scalar(),
bool swapRB=false, bool crop=false, int ddepth=CV_32F);
Mat blobFromImages(InputArrayOfArrays images, double scalefactor=1.0,
Size size = Size(), const Scalar& mean = Scalar(), bool swapRB=false,
bool crop=false, int ddepth=CV_32F)
void blobFromImages(InputArrayOfArrays images, OutputArray blob,
double scalefactor=1.0, Size size = Size(),
const Scalar& mean = Scalar(), bool swapRB=false, bool crop=false,
int ddepth=CV_32F);
// Blob转图像集合
void imagesFromBlob(const cv::Mat& blob_, OutputArrayOfArrays images_);
// 模型半精度浮点型保存,不能在原生caffe使用,但可以在NVIDIA/caffe使用
void shrinkCaffeModel(const String& src, const String& dst,
const std::vector<String>& layersTypes = std::vector<String>())
// 以protocol buffer format的文本描述网络模型
void writeTextGraph(const String& model, const String& output);
// NMS
CV_EXPORTS_W void NMSBoxes(const std::vector<Rect>& bboxes, const std::vector<float>& scores,
const float score_threshold, const float nms_threshold,
CV_OUT std::vector<int>& indices, const float eta = 1.f, const int top_k = 0);
CV_EXPORTS_W void NMSBoxes(const std::vector<Rect2d>& bboxes, const std::vector<float>& scores,
const float score_threshold, const float nms_threshold,
CV_OUT std::vector<int>& indices, const float eta = 1.f, const int top_k = 0);
CV_EXPORTS_AS(NMSBoxesRotated) void NMSBoxes(const std::vector<RotatedRect>& bboxes, const std::vector<float>& scores,
const float score_threshold, const float nms_threshold,
CV_OUT std::vector<int>& indices, const float eta = 1.f, const int top_k = 0);
3、常用类Net函数
bool empty()
判断网络中是否已加载层。有,true;没有,false。
std::vector
获取所有层的名字,不包含类型为Input的层。
void getLayerTypes(CV_OUT std::vector& layersTypes)
获取Net中加载层的类型,不重复。
int getLayersCount(const String& layerType)
获取指定类型的层的数量。
int getLayerId(const String &layer)
根据层的名字,获取该层对应的序号id.
注意 这里可以获取Input层名字若为“data”的id,该id=0, getLayerId(“data”) == 0。因此,getLayerNames()返回vector的index和这里计算的id相差1。
例如, std::vector
假设 layerNames[10] = “my_layer”;
那么 getLayerId(“my_layer”) 为 11;
即 getLayerId(layerNames[i]) == i+1。
Ptr
根据layerId获取改层的指针。
void getLayerShapes(const MatShape& netInputShape,
const int layerId,
CV_OUT std::vector
CV_OUT std::vector
在给定输入的尺寸下,获取某一层的所有输入层、输出层的尺寸。例如,当网络输入matShape = { 1,3,300,300 }时,计算后fc7_mbox_loc_flat层的输入层和输出层的尺寸分别shp1、shp2。
std::vector<int> matShape = { 1,3,300,300 };
std::vector<cv::dnn::MatShape> shp1, shp2;
net.getLayerShapes(matShape, net.getLayerId("fc7_mbox_loc_flat"), shp1, shp2);
void getLayerShapes(const std::vector& netInputShapes,
CV_OUT std::vector& layersIds,
CV_OUT std::vector
CV_OUT std::vector
void getLayerShapes(const MatShape& netInputShape,
CV_OUT std::vector& layersIds,
CV_OUT std::vector
CV_OUT std::vector
给定所有输入的尺寸,获取所有层的输入、输出尺寸。
Mat getParam(LayerId layer, int numParam = 0)
获取指定层的参数Layer::blobs中索引为numParam的array参数。
std::vector
获取所有输出无连接的层的id
std::vector
获取所有输出无连接的层的名字
int64 getPerfProfile(CV_OUT std::vector
获取网络inference的时间,秒。
std::vector<double> layersTimes;
double freq = getTickFrequency() / 1000;
double t = net.getPerfProfile(layersTimes) / freq; // 毫秒