自3.3版本开始,OpenCV加入了对深度神经网络推理运算的支持模块-DNN模块,它支持多种深度学习框架的模型,如Tensorflow、Caffe、Torch、Darknet,以及ONNX格式的模型。
使用DNN模块部署模型非常简单,4.1.2版本加入了dnn::Model类以及针对不同任务的类dnn::ClassificationModel,dnn::DetectionModel,dnn::SegmentationModel,可以进行网络的自动预处理和后处理,更加简化了流程。
以目标检测为例,4.1.2之前的版本部署方式为:
int main()
{
float model = "ssdlite_mobilenet_v2.pb";
float config = "ssdlite_mobilenet_v2.pbtxt";
float scale = 1.0;
int inpWidth = 300;
int inpHeight = 300;
Scalar mean(103.939, 116.779, 123.68);
float confThreshold = 0.5f;
float nmsThreshold = 0.4f;
// 1. 装载模型,设置参数
Net net = readNet(model, config);
net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_CPU);
std::vector<String> outNames = net.getUnconnectedOutLayersNames();
// 读入图像
Mat image = imread("picture.jpg");
Mat blob;
// 2. 由输入图像生成blob,设置blob为模型输入
blobFromImage(image, blob, scale, inpSize, mean, true, false);
net.setInput(blob);
std::vector<Mat> outs;
// 3. 前向计算,检测结果存入outs
net.forward(outs, outNames);
// 4. 对检测结果进行非极大值抑制等后处理,结果存入outs
postprocess(frame, outs, net);
}
4.1.2版本的部署方式为:
int main()
{
float model = "ssdlite_mobilenet_v2.pb";
float config = "ssdlite_mobilenet_v2.pbtxt";
float scale = 1.0;
int inpWidth = 300;
int inpHeight = 300;
Scalar mean(103.939, 116.779, 123.68);
float confThreshold = 0.5f;
float nmsThreshold = 0.4f;
// 1. 装载模型,设置参数
DetectionModel dnn_model(model, config);
dnn_model.setPreferableBackend(DNN_BACKEND_OPENCV);
dnn_model.setPreferableTarget(DNN_TARGET_CPU);
dnn_model.setInputParams(scale, Size(inpWidth, inpHeight), mean, true, false);
// 读入图像
Mat image = imread("picture.jpg");
std::vector<int> classIds;
std::vector<float> confs;
std::vector<Rect> boxes;
// 2. 前向计算,检测结果矩形框存入boxes(已经过后处理)
dnn_model.detect(image, classIds, confs, boxes, confThreshold, nmsThreshold);
}
OpenCV 4.1.2下载地址:
https://opencv.org/releases/