赞
踩
将原始图像转换为可以直接输入网络的格式,在进行深度学习时,blobFromImage主要是用来对图片进行预处理。
- 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)
参数:
返回:
函数返回4D矩阵(没有定义行/列值,因此这些值为-1)
注意:
1. 当同时进行scalefactor,size,mean,swapRB操作时,优先按swapRB交换通道,其次按scalefactor比例缩放,然后按mean求减,最后按size进行resize操作。
2. 当进行减均值操作时,ddepth不能选取CV_8U
3. 当crop=True时,调整输入图像的大小,使调整大小后的一侧等于相应的尺寸,另一侧等于或大于,然后从中心进行裁剪。
4、cv2.dnn.blobFromImages有更少的函数调用开销,能够更快批处理图像或帧。
- #include <opencv2/opencv.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/imgproc.hpp>
-
- using namespace std;
- using namespace cv;
- using namespace cv::dnn;
-
- string path = "img.png"
- // 读入原始图片
- Mat input_image = readimg(path);
- // 归一化+resize+COLOR_BGR2RGB
- blobFromImage(input_image, blob, 1. / 255., Size(512, 512), Scalar(), true, false);
1、读取模型文件
- readNet(const String& model,
- const String& config = "",
- const String& framework = "");
参数:
`*.caffemodel` (Caffe, http://caffe.berkeleyvision.org/)
`*.pb` (TensorFlow, https://www.tensorflow.org/)
`*.t7` | `*.net` (Torch, http://torch.ch/)
`*.weights` (Darknet, https://pjreddie.com/darknet/)
`*.bin` (DLDT, https://software.intel.com/openvino-toolkit)
`*.onnx` (ONNX, https://onnx.ai/)
`*.prototxt` (Caffe, http://caffe.berkeleyvision.org/)
`*.pbtxt` (TensorFlow, https://www.tensorflow.org/)
`*.cfg` (Darknet, https://pjreddie.com/darknet/)
`*.xml` (DLDT, https://software.intel.com/openvino-toolkit)
2、将图片输入到DNN网络中
- setInput(InputArray blob, const String& name = "",
- double scalefactor = 1.0, const Scalar& mean = Scalar());
3、指定计算后台与设备
- setPreferableBackend(int backendId);
- setPreferableTarget(int targetId);
参数:
DNN_BACKEND_DEFAULT
DNN_BACKEND_INFERENCE_ENGINE
DNN_BACKEND_OPENCV
DNN_TARGET_CPU // 使用CPU推理
DNN_TARGET_OPENCL
DNN_TARGET_OPENCL_FP16
DNN_TARGET_MYRIAD
DNN_TARGET_FPGA
DNN_TARGET_CUDA // 使用GPU推理
DNN_TARGET_CUDA_FP16
支持的后台与设备组合如下:
4、运行前向推理
- forward(OutputArrayOfArrays outputBlobs,
- const std::vector<String>& outBlobNames);
参数:
注意:
1、forward的函数原型有4个,分别提供了不同的功能,这里暂举了个典型的例子。
2、输出层名称可通过netron查看,或net.getUnconnectedOutLayersNames()获取。
- Net net;
- net = readNet("./models/XXX.onnx");
- // 输入blob格式图片
- net.setInput(blob);
- // 使用cpu推理
- net.setPreferableBackend(DNN_BACKEND_OPENCV);
- net.setPreferableTarget(DNN_TARGET_CPU);
- // 前向推理
- vector<Mat> outputs;
- net.forward(outputs, net.getUnconnectedOutLayersNames());
参考链接:
https://blog.csdn.net/a1111111111ss/article/details/106070631
https://blog.csdn.net/weixin_42216109/article/details/103010206
https://blog.csdn.net/weixin_51244852/article/details/119214295
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。