OpenCV部署深度学习模型
前言
OpenCV是一个流行的计算机视觉库,它提供了很多方便的功能,包括部署深度学习模型。
你可以使用Opencv与已经训练好的深度学习模型进行目标检测、图像分类、图像生成等任务。
一、DNN是什么?
OpenCV的深度学习模块DNN,只提供预测的功能,不能使用DNN进行模型训练,但是它支持多种深度学习框架。OpenCV从版本3.3开始支持深度神经网络推理运算的支持模块-DNN模块,它支持多种深度学习框架的模型,如Tensorflow、Caffe、Torch、Darknet,以及ONNX格式的模型。4.1.2版本加入了dnn::Model类以及针对不同任务的类,dnn::ClassificationModel,dnn::DetectionModel,dnn::SegmentationModel,可以进行网络的自动预处理和后处理,更加简化了流程。
DNN的优点:
轻量级:DNN只实现模型预测,推理的功能,代码量和编译运行开销时间小于其他深度学习模型框架
使用方便:无需其他依赖第三方库,只需要下载好对应不同深度学习框架下已经训练好的模型,或者是模型的配置文件,模型参数
通用性:DNN支持网络结构涵盖多种计算机视觉应用,目标分类,目标检测和图像分割的类别
二、模型导出
Pytorch已经原生支持导出ONNX模型,具体可以参见官方教程和文档。
一个最简化的导出Demo如下。
import torch
import torchvision
model = torchvision.models.mobilenet_v2(pretrained=True)
x = torch.rand(1, 3, 224, 224)
save_path = "./model_file/mobilenetv2.onnx"
torch.onnx.export(model, x, save_path,
input_names=["input"], output_names=["output"], opset_version=11)
三、部署示例
本例程使用转换得到的ONNX模型进行部署边缘检测网络DexiNed,分为单图预测和批量预测。
代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <chrono>
#include <fstream>
using namespace std;
using namespace cv;
using namespace cv::dnn;
std::string onnxPath = "D:/Vs2017_Solution/OpenCV_dnn/Datas/1824.onnx";
std::string imagePath = "./Datas/imgs";
cv::dnn::Net net;
void ModelInit(string onnxPath)
{
net = cv::dnn::readNetFromONNX(onnxPath);
// 设置计算后台和计算设备
// CPU(默认)
/* net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);*/
// CUDA
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
}
// 单图推理
bool ModelInference(const cv::Mat& srcImage)
{
auto start = chrono::high_resolution_clock::now();
cv::Mat image = srcImage.clone();
//预处理(尺寸变换、通道变换、归一化)
image.convertTo(image, CV_32FC3);
auto end1