opencv C++ dnn网络参数的相关的API

   

目录

1,blobFormImage

2,NMSBoxes:

3,setInput

4,forward

5,readNet

6,getUnconnectedOutLayersNames

7,加速处理


        OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。

OpenCV那为什么要实现深度学习模块?

  •  轻量型。DNN模块只实现了推理功能,代码量及编译运行开销远小于其他深度学习模型框架。
  • 使用方便。DNN模块提供了内建的CPU和GPU加速,无需依赖第三方库,若项目中之前使用了OpenCV,那么通过DNN模块可以很方便的为原项目添加深度学习的能力。
  •  通用性。DNN模块支持多种网络模型格式,用户无需额外的进行网络模型的转换就可以直接使用,支持的网络结构涵盖了常用的目标分类,目标检测和图像分割的类别,如下图所示

1,blobFormImage

        其主要的根据输入的图像,创建维度N(图片的个数),通道数C,高度H和宽次序的BLOBS,同时可以对输入的图像的进行的归一化处理。

blobFromImage(image, 
                  scalefactor=None, 
                  size=None, 
                  mean=None, 
                  swapRB=None, 
                  crop=None, 
                  ddepth=None):

具体的参数:

        image:cv2.imread读取的图像数据;

        mean:需要将图片整体减去的平均值,如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,

        scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,它的默认值是1,如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为1/2,一般像素会进行像素值的灰度归一化处理。

        size:这个参数是我们神经网络在训练的时候要求输入的图片尺寸

        swapRB:OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就要使swapRB=true

2,NMSBoxes:

        根据给定的检测boxes和对应的scores进行NMS

::NMSBoxes(bboxes, 
             scores, 
             score_threshold, 
             nms_threshold, 
             eta=None, 
             top_k=None)

        boxes: 待处理的边界框 bounding boxes
        scores: 对于于待处理边界框的 scores
        score_threshold: 用于过滤 boxes 的 score 阈值
        nms_threshold: NMS 用到的阈值
        indices: NMS 处理后所保留的边界框的索引值
        eta: 自适应阈值公式中的相关系数:

        top_k: 如果 top_k>0,则保留最多 top_k 个边界框索引值.

3,setInput

        设置模型的输入

Net::setInput	(	InputArray 	blob,
    const String & 	name = "",
    double 	scalefactor = 1.0,
    const Scalar & 	mean = Scalar() 
)	

blob

A new blob. Should have CV_32F or CV_8U depth.
nameA name of input layer.
scalefactorAn optional normalization scale.
meanAn optional mean subtraction values.

4,forward

        从网络开始层进行计算,前向传播到输出层

Mat cv::dnn::Net::forward(const String& outputName = String())
	// 这个函数只需要提供layer的name即可;
	// 函数返回一个Mat变量,返回值是指输入的layername  首次出现  的输出。

	// 	// 默认输出整个网络的运行结果
	layer { // layer层的例子	(googleNet输出层)
	  name: "prob"	//层名称
	  type: "Softmax"	//
	  bottom: "loss3/classifier"
	  top: "prob"
	}

void cv::dnn::Net::forward(OutputArrayOfArrays outputBlobs,
							const String & outputName = String())	
	// 该函数的返回值是void,通过OutputArrayOfArrays类型提供计算结果,类型为blob
	// 这个outputName依然是layer的name,
	// outputBlobs不是  首次   layer的输出了,而是layername指定的layer的全部输出

void cv::dnn::Net::forward(OutputArrayOfArrays outputBlobs,
						const std::vector<String> & outBlobNames)
	// 该函数返回值为void,
	// outBlobNames是需要提供输出的layer的name,类型为vector,也就是说可以提供多个layer的那么;
	// 它会将每个layer的   首次计算输出    放入outputBlobs。

void cv::dnn::Net::forward(std::vector<std::vector<Mat>> & outputBlobs, 
							const std::vector<String> & outBlobNames )	
	// 返回值为void;
	// 输入outBlobNames是vector类型,
	// outputBlobs是vector<std::vector<Mat>>类型;
	// 该函数可以输入多个layer的name;
	// 它会输出每个layer的全部输出到outputBlobs中。

5,readNet

        读取网络模型


Net cv::dnn::readNet(const String & 	model,
                const String & 	config = "",
                const String & 	framework = "" 
)		

        model:二进制文件包含网络的训练的权重参数;包含以下内容

        config:文本文件办事网络结构的配置文件的

        framework :网络框架的显视的名称

opencv的dnn模块支持各种类型的模型,其对应的API如下所示:

Net 
cv::dnn::readNet (const String &model, const String &config="", const String &framework="")
Net 
cv::dnn::readNetFromCaffe (const String &prototxt, const String &caffeModel=String())
Net 
cv::dnn::readNetFromTensorflow (const String &model, const String &config=String())
Net 
cv::dnn::readNetFromTorch (const String &model, bool isBinary=true, bool evaluate=true)
Net 
cv::dnn::readNetFromDarknet (const String &cfgFile, const String &darknetModel=String())

Net cv::dnn::readNetFromTorch	(	const String & 	model,
                                    bool 	isBinary = true,
                                    bool 	evaluate = true 
)		

Net cv::dnn::readNetFromTensorflow	(	const String & 	model,
                                        const String & 	config = String() 
)		

6,getUnconnectedOutLayersNames

        获得末端连接神经网络名字,用于指定forward输出层的名字

 getUnconnectedOutLayersNames(void)

7,加速处理

        利用opencv加速主要涉及两个函数的调用,使用opencv设置参数使用不同的运行后台程序,例如使用GPU,CPU。

dnnnet.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
dnnnet.setPreferableTarget(cv::dnn::DNN_BACKEND_CUDA);

setPreferableTarget()设置相应的参数如下所示

DNN_TARGET_CPU 

Python: cv.dnn.DNN_TARGET_CPU

DNN_TARGET_OPENCL 

Python: cv.dnn.DNN_TARGET_OPENCL

DNN_TARGET_OPENCL_FP16 

Python: cv.dnn.DNN_TARGET_OPENCL_FP16

DNN_TARGET_MYRIAD 

Python: cv.dnn.DNN_TARGET_MYRIAD

DNN_TARGET_VULKAN 

Python: cv.dnn.DNN_TARGET_VULKAN

DNN_TARGET_FPGA 

Python: cv.dnn.DNN_TARGET_FPGA

FPGA device with CPU fallbacks using Inference Engine's Heterogeneous plugin.

DNN_TARGET_CUDA 

Python: cv.dnn.DNN_TARGET_CUDA

DNN_TARGET_CUDA_FP16 

Python: cv.dnn.DNN_TARGET_CUDA_FP16

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值