目录
1,blobFormImage
2,NMSBoxes:
3,setInput
4,forward
5,readNet
6,getUnconnectedOutLayersNames
7,加速处理
OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。
OpenCV那为什么要实现深度学习模块?
其主要的根据输入的图像,创建维度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
根据给定的检测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 个边界框索引值.
设置模型的输入
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. |
name | A name of input layer. |
scalefactor | An optional normalization scale. |
mean | An optional mean subtraction values. |
从网络开始层进行计算,前向传播到输出层
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 & outBlobNames)
// 该函数返回值为void,
// outBlobNames是需要提供输出的layer的name,类型为vector,也就是说可以提供多个layer的那么;
// 它会将每个layer的 首次计算输出 放入outputBlobs。
void cv::dnn::Net::forward(std::vector> & outputBlobs,
const std::vector & outBlobNames )
// 返回值为void;
// 输入outBlobNames是vector类型,
// outputBlobs是vector>类型;
// 该函数可以输入多个layer的name;
// 它会输出每个layer的全部输出到outputBlobs中。
读取网络模型
Net cv::dnn::readNet(const String & model,
const String & config = "",
const String & framework = ""
)
model:二进制文件包含网络的训练的权重参数;包含以下内容
*.caffemodel
(Caffe, Caffe | Deep Learning Framework)*.pb
(TensorFlow, https://www.tensorflow.org/)*.t7
| *.net
(Torch, Torch | Scientific computing for LuaJIT.)*.weights
(Darknet, Darknet: Open Source Neural Networks in C)*.bin
(DLDT, Intel® Distribution of OpenVINO™ Toolkit)*.onnx
(ONNX, ONNX | Home)config:文本文件办事网络结构的配置文件的
*.prototxt
(Caffe, Caffe | Deep Learning Framework)*.pbtxt
(TensorFlow, https://www.tensorflow.org/)*.cfg
(Darknet, Darknet: Open Source Neural Networks in C)*.xml
(DLDT, Intel® Distribution of OpenVINO™ Toolkit)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()
)
获得末端连接神经网络名字,用于指定forward输出层的名字
getUnconnectedOutLayersNames(void)
利用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 |