opencv dnn模块 Net Layer

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 getLayerNames()
获取所有层的名字,不包含类型为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 = getLayerNames();
假设 layerNames[10] = “my_layer”;
那么 getLayerId(“my_layer”) 为 11;
即 getLayerId(layerNames[i]) == i+1。

Ptr getLayer(LayerId layerId)
根据layerId获取改层的指针。

void getLayerShapes(const MatShape& netInputShape,
const int layerId,
CV_OUT std::vector& inLayerShapes,
CV_OUT std::vector& outLayerShapes)

在给定输入的尺寸下,获取某一层的所有输入层、输出层的尺寸。例如,当网络输入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& inLayersShapes,
CV_OUT std::vector& outLayersShapes) const;
void getLayerShapes(const MatShape& netInputShape,
CV_OUT std::vector& layersIds,
CV_OUT std::vector& inLayersShapes,
CV_OUT std::vector& outLayersShapes) const;

给定所有输入的尺寸,获取所有层的输入、输出尺寸。

Mat getParam(LayerId layer, int numParam = 0)
获取指定层的参数Layer::blobs中索引为numParam的array参数。

std::vector getUnconnectedOutLayers()
获取所有输出无连接的层的id

std::vector getUnconnectedOutLayersNames()
获取所有输出无连接的层的名字

int64 getPerfProfile(CV_OUT std::vector& timings)
获取网络inference的时间,秒。

	std::vector<double> layersTimes;
	double freq = getTickFrequency() / 1000;
	double t = net.getPerfProfile(layersTimes) / freq;   // 毫秒

你可能感兴趣的:(OpenCV,深度神经网络,opencv实例源码演示)