国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深度學習】【Opencv】【CPU】Python/C++調(diào)用onnx模型【基礎(chǔ)】

這篇具有很好參考價值的文章主要介紹了【深度學習】【Opencv】【CPU】Python/C++調(diào)用onnx模型【基礎(chǔ)】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【深度學習】【Opencv】python/C++調(diào)用onnx模型【基礎(chǔ)】

提示:博主取舍了很多大佬的博文并親測有效,分享筆記邀大家共同學習討論


前言

OpenCV是一個基于BSD許可發(fā)行的跨平臺計算機視覺和機器學習軟件庫(開源),可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上??梢詫ytorch中訓練好的模型使用ONNX導出,再使用opencv中的dnn模塊直接進行加載使用。
系列學習目錄:
【CPU】Pytorch模型轉(zhuǎn)ONNX模型流程詳解
【GPU】Pytorch模型轉(zhuǎn)ONNX格式流程詳解
【ONNX模型】快速部署
【ONNX模型】多線程快速部署
【ONNX模型】opencv_cpu調(diào)用onnx
【ONNX模型】opencv_gpu調(diào)用onnx


Python版本OpenCV

Windows平臺安裝OpenCV

博主在win10環(huán)境下裝anaconda環(huán)境,而后搭建onnx模型運行所需的openCV環(huán)境。

# 搭建opencv環(huán)境
conda create -n opencv_onnx_cpu python=3.10 -y
# 激活環(huán)境
activate opencv_onnx_cpu
# 安裝opencv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

查看opencv版本

import cv2
cv2.__version__

opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

opencv調(diào)用onnx模型

現(xiàn)在代碼拋開任何pytorch相關(guān)的依賴,也拋開了onnx相關(guān)的依賴,只使用opencv完成了整個推理流程。

import cv2
import numpy as np

def normalizeImage(image,mean,std):
    normalized = image.astype(np.float32)
    normalized = normalized / 255.0 - mean
    normalized = normalized / std
    return normalized

def main():
    # 讀取圖片
    image = cv2.imread(r"./animal-1.jpg")
    # 將BGR圖像轉(zhuǎn)換為RGB格式
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # 獲取圖像的大小
    ori_w, ori_h, = image.shape[0], image.shape[1]

    # 指定調(diào)整后的大小
    new_width = 416
    new_height = 416
    # 圖片尺寸縮放
    resized_img = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)

    # 定義每個通道的歸一化參數(shù)
    mean = np.array([0.485, 0.456, 0.406]).astype(np.float32)  # 均值
    std = np.array([0.229, 0.224, 0.225]).astype(np.float32)  # 標準差
    # 圖片歸一化
    normalized = normalizeImage(resized_img, mean, std)

    # 加載ONNX模型
    net = cv2.dnn.readNetFromONNX("PFNet.onnx")  # 加載訓練好的識別模型
    # onnx是多輸出,每個輸出都會對應(yīng)一個name,因此需要獲取所有輸出的name
    output_layer_names = net.getUnconnectedOutLayersNames()
    blob = cv2.dnn.blobFromImage(normalized)  # 由圖片加載數(shù)據(jù) 這里還可以進行縮放、歸一化等預(yù)處理
    # 將Blob設(shè)置為模型的輸入
    net.setInput(blob)
    # 運行前向傳播,將所有輸出name作為參數(shù)傳遞
    out = net.forward(output_layer_names)
    out = np.squeeze(out[3]) * 255.0
    output = cv2.resize(out, (ori_h, ori_w), interpolation=cv2.INTER_AREA)

    # 保存圖像
    cv2.imwrite('saved_opencv_python_image.png', output)

if __name__ == '__main__':
    main()

opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python


C++版本OpenCV

Windows平臺安裝OpenCV

官網(wǎng)下載安裝文件地址,博主使用opencv-4.8.0-windows.exe版本opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

雙擊運行解壓后即可,博主重命名為opencv_cpu:
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python
打開VS 2019:新建新項目---->空項目---->配置項目---->項目路徑以及勾選“將解決方案和項目放在同一目錄中---->點擊創(chuàng)建。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python在解決方案–>源文件–>右鍵添加新建項。這里暫時可以默認空著不做處理。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python
設(shè)置OpenCV路徑:項目---->屬性。假設(shè)沒有新建cpp文件,空項目的屬性頁就不會存在C/C++這一項目。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python
添加附加包含目錄:Release | x64---->C/C+±—>常規(guī)---->附加包含目錄。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

D:\C++_demo\opencv_cpu\build\x64\vc16\bin
D:\C++_demo\opencv_cpu\build\bin
D:\C++_demo\opencv_cpu\build\include
D:\C++_demo\opencv_cpu\build\include\opencv2

鏈接器:Release | x64---->鏈接器---->常規(guī)---->附加包含目錄。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

D:\C++_demo\opencv_cpu\build\x64\vc16\lib

鏈接器:Release | x64---->鏈接器---->輸入---->附加依賴項。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python
在D:\C++_demo\opencv_cpu\build\x64\vc16\lib下找到附加依賴項的文件。

opencv_world480.lib

在Release x64模式下測試,將opencv_world480.dll文件復(fù)制到自己項目的Release下。

沒有Release目錄時,需要在Release | x64模式下運行一遍代碼,代碼部分在下一節(jié)提供,讀者可以先行新建文件復(fù)制代碼。

D:\C++_demo\opencv_cpu\build\x64\vc16\bin
===>
D:\C++_demo\opencv_onnx_cpu\x64\Releas

opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python
這里博主為了方便安裝的是release版本的,讀者可以安裝debug版本的,流程基本一致,只需要將屬性的Release | x64變成Debug | x64,然后附加依賴項由opencv_world480.lib變成opencv_world480d.lib,再將opencv_world480d.dll文件復(fù)制到自己項目的Release下。

opencv調(diào)用onnx模型

將PFNet.onnx拷貝到項目路徑下。
opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

簡單使用

這里簡單驗證一下opencv是否安裝成功,適用于包括博主在內(nèi)的許多對c++不熟悉的人來說,代碼完成了簡單的圖像的讀取與顯示。

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
	Mat src = imread("./animal-1.jpg");
	//沒有圖像輸入
	if (src.empty()) {
		printf("....\n");
		return -1;
	}
	//namedWindow("輸入窗口", WINDOW_FREERATIO);
	imshow("輸入窗口", src);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python

調(diào)用onnx模型

將python版本的opencv轉(zhuǎn)化成對應(yīng)的c++版本的,發(fā)現(xiàn)輸出的效果完全一致,onnx模型可以作為c++的接口來供其他應(yīng)用調(diào)用。

#include <iostream>
#include <string>
#include <vector>
#include<opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace std;
cv::Mat normalizeImage(const cv::Mat& image, const cv::Scalar& mean, const cv::Scalar& std) {
    cv::Mat normalized;
    image.convertTo(normalized, CV_32F);
    cv::subtract(normalized / 255.0, mean, normalized);
    cv::divide(normalized, std, normalized);
    return normalized;
}
int main()
{   
    // 讀取圖片
    cv::Mat bgrImage = cv::imread("./animal-1.jpg", cv::IMREAD_COLOR);
    // 圖片格式轉(zhuǎn)化bgr-->rgb
    cv::Mat rgbImage;
    cv::cvtColor(bgrImage, rgbImage, cv::COLOR_BGR2RGB);
    // 獲取圖像的大小
    cv::Size originalSize(rgbImage.cols, rgbImage.rows);
    cv::Mat resizedImage;

    // 定義目標圖像大小
    cv::Size targetSize(416, 416);
    //圖片尺寸縮放
    cv::resize(rgbImage, resizedImage, targetSize, 0, 0, cv::INTER_AREA);

    // 定義每個通道的歸一化參數(shù)
    cv::Scalar mean(0.485, 0.456, 0.406); // 均值
    cv::Scalar std(0.229, 0.224, 0.225);  // 標準差
    // 圖片歸一化
    cv::Mat normalized = normalizeImage(resizedImage, mean, std);
    
    // 加載ONNX模型
    cv::dnn::Net net = cv::dnn::readNetFromONNX("D:/C++_demo/opencv_onnx_cpu/PFNet.onnx");
    cv::Mat blob = cv::dnn::blobFromImage(normalized);
    // 將Blob設(shè)置為模型的輸入
    net.setInput(blob);
    // 運行前向傳播
    std::vector<cv::Mat> output_probs;
    // 獲取多輸出對應(yīng)的名稱
    std::vector<cv::String> output_layer_names = net.getUnconnectedOutLayersNames();
    net.forward(output_probs, output_layer_names);
    cv::Mat prediction = output_probs[3];
    cv::Mat mask;
    cv::resize(prediction.reshape(1, 416) * 255.0, mask, originalSize, 0, 0, cv::INTER_AREA);
    cv::imwrite("saved_opencv_c++_image.png", mask);
    return 0;
}

opencv加載onnx,深度學習,opencv,onnx,深度學習,opencv,python


總結(jié)

盡可能簡單、詳細的介紹Python和C++下Opencv_CPU調(diào)用ONNX模型的流程。文章來源地址http://www.zghlxwxcb.cn/news/detail-767599.html

到了這里,關(guān)于【深度學習】【Opencv】【CPU】Python/C++調(diào)用onnx模型【基礎(chǔ)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包