Opencv---深度學習開發

在OpenCV中進行深度學習開發,主要圍繞其dnn模塊展開,該模塊支持加載預訓練模型、預處理輸入數據、執行推理計算以及解析輸出結果。本文講解基于OpenCV進行深度學習開發的基本流程。

一、準備工作

在開始開發前,需完成環境配置和資源準備,確保基礎條件滿足:

  1. 安裝OpenCV
    需安裝包含dnn模塊的OpenCV版本(建議4.0以上),可通過源碼編譯(支持更多模型格式)或直接安裝預編譯包(如pip install opencv-python)。
  2. 獲取預訓練模型
    OpenCV的dnn模塊支持多種深度學習框架的模型,需提前準備模型文件,常見來源包括:
    • 公開數據集預訓練模型(如ImageNet上的ResNet、VGG等);
    • 自定義訓練的模型(需導出為dnn支持的格式,如TensorFlow的.pb、PyTorch的.onnx、Caffe的.caffemodel等)。
    • 模型需包含網絡結構文件(如Caffe的.prototxt、TensorFlow的.pbtxt)和權重文件(如.caffemodel.pb)。
  3. 了解模型輸入輸出要求
    不同模型對輸入數據的格式(尺寸、通道順序、歸一化方式等)和輸出的解析方式不同,需提前查閱模型文檔(如輸入尺寸為224x224,通道順序為BGR,均值和方差等)。

二、基本開發流程

步驟1:加載深度學習模型

使用cv::dnn::readNet函數加載模型,該函數支持多種格式,自動根據文件后綴識別框架類型:

// 示例:加載Caffe模型(需.prototxt和.caffemodel文件)
cv::dnn::Net net = cv::dnn::readNetFromCaffe("deploy.prototxt", "model.caffemodel");// 其他格式示例:
// TensorFlow模型:readNetFromTensorflow("model.pb", "graph.pbtxt")
// ONNX模型(支持PyTorch導出):readNetFromONNX("model.onnx")
// Darknet模型(YOLO):readNetFromDarknet("yolov3.cfg", "yolov3.weights")
  • 關鍵說明cv::dnn::Net是OpenCV中表示神經網絡的類,封裝了模型的加載、推理等功能。
步驟2:讀取輸入數據

輸入數據可以是圖像、視頻幀或攝像頭實時流,使用OpenCV的常規函數讀取:

// 讀取單張圖像
cv::Mat image = cv::imread("input.jpg");
if (image.empty()) {// 處理讀取失敗的情況
}// 讀取視頻或攝像頭(循環讀取幀)
cv::VideoCapture cap("video.mp4"); // 或 cap(0) 表示攝像頭
cv::Mat frame;
while (cap.read(frame)) {// 對每一幀執行后續處理
}
步驟3:預處理輸入數據

深度學習模型對輸入格式有嚴格要求,需將原始圖像轉換為模型可接受的“ blob ”(二進制大對象,即網絡輸入的4D張量:[batch_size, channels, height, width])。
核心函數:cv::dnn::blobFromImage,用于完成圖像到blob的轉換,包含多種預處理操作:

// 示例:將圖像轉換為模型輸入blob
cv::Mat blob;
// 參數說明:
// image:輸入圖像(OpenCV默認BGR通道)
// scalefactor:縮放因子(如1/255.0將像素值歸一化到0~1)
// size:模型要求的輸入尺寸(如(224, 224))
// mean:均值減法(如(104.0, 117.0, 123.0),對應BGR通道)
// swapRB:是否交換R和B通道(OpenCV讀入為BGR,若模型要求RGB則設為true)
// crop:是否裁剪圖像(超出尺寸部分裁剪,否則拉伸)
cv::dnn::blobFromImage(image, blob, 1.0/255.0, cv::Size(224, 224), cv::Scalar(0, 0, 0), true, false);
  • 關鍵預處理操作
    • 尺寸調整:將圖像縮放或裁剪到模型要求的輸入尺寸(如224x224、320x320);
    • 通道轉換:OpenCV默認圖像為BGR通道,若模型要求RGB(如TensorFlow模型),需通過swapRB=true轉換;
    • 歸一化:通過scalefactor(縮放)和mean(均值減法)將像素值調整到模型訓練時的范圍(如1/255.0將0255轉為01,或減去ImageNet均值(103.939, 116.779, 123.68));
    • 批處理blobFromImage默認生成單張圖像的blob(batch_size=1),若需多圖批量推理,可使用blobFromImages
步驟4:設置網絡輸入

將預處理后的blob設置為神經網絡的輸入層,需指定輸入層名稱(可通過模型結構文件查看,如Caffe模型通常為data,TensorFlow可能為input):

// 設置輸入blob到網絡的輸入層(輸入層名稱需與模型結構一致)
net.setInput(blob, "data"); // "data"為輸入層名稱,需根據模型修改
步驟5:執行模型推理

調用forward方法執行推理,獲取輸出結果。根據模型類型,輸出可能是單一層的結果或多個層的結果:

// 方法1:獲取指定輸出層的結果(推薦,效率更高)
cv::Mat output;
// 需指定輸出層名稱(可通過模型結構文件查看,如"prob"、"detection_out")
output = net.forward("prob"); // 方法2:獲取所有輸出層的結果(返回vector<Mat>)
std::vector<cv::Mat> outputs;
net.forward(outputs);
  • 關鍵說明
    輸出結果output是一個cv::Mat對象,維度根據模型而定(如分類模型可能為[1, N, 1, 1],其中N為類別數;目標檢測模型可能包含邊界框、類別、置信度等信息)。
步驟6:解析輸出結果

根據模型任務類型(分類、檢測、分割等),解析輸出的cv::Mat數據,提取有意義的結果:

  1. 圖像分類任務
    輸出通常是每個類別的概率,需找到概率最大的類別索引,對應類別名稱:

    // 假設output為[1, 1000, 1, 1](1000類分類)
    cv::Mat probMat = output.reshape(1, 1); // 轉換為1x1000的矩陣
    cv::Point classIdPoint;
    double confidence;
    // 找到最大概率的位置和值
    cv::minMaxLoc(probMat, nullptr, &confidence, nullptr, &classIdPoint);
    int classId = classIdPoint.x; // 類別索引
    
  2. 目標檢測任務(如SSD、YOLO)
    輸出包含邊界框坐標(x1, y1, x2, y2)、類別ID、置信度等,需過濾低置信度結果并繪制邊界框:

    // 以SSD為例,輸出格式為[N, 1, M, 7],其中M為檢測框數量,7個值分別為:
    // [batch_id, class_id, confidence, x1, y1, x2, y2](坐標為歸一化值,需映射回原圖)
    float* data = (float*)output.data;
    for (int i = 0; i < output.total() / 7; ++i) {float confidence = data[i * 7 + 2];if (confidence > 0.5) { // 過濾置信度>0.5的框int classId = static_cast<int>(data[i * 7 + 1]);// 邊界框坐標(歸一化到0~1,需乘以原圖寬高)int x1 = static_cast<int>(data[i * 7 + 3] * image.cols);int y1 = static_cast<int>(data[i * 7 + 4] * image.rows);int x2 = static_cast<int>(data[i * 7 + 5] * image.cols);int y2 = static_cast<int>(data[i * 7 + 6] * image.rows);// 繪制邊界框和類別信息cv::rectangle(image, cv::Rect(x1, y1, x2-x1, y2-y1), cv::Scalar(0, 255, 0), 2);}
    }
    
  3. 其他任務(如語義分割、姿態估計)
    需根據具體模型的輸出格式解析(如分割模型輸出每個像素的類別,需轉換為彩色掩碼)。

步驟7:可視化或后處理結果

將解析后的結果(如分類標簽、檢測框、分割掩碼)疊加到原始圖像上,或保存為文件、輸出到控制臺:

// 顯示結果圖像
cv::imshow("Result", image);
cv::waitKey(0);
// 保存結果
cv::imwrite("result.jpg", image);

三、高級優化(可選)

為提升推理效率,可利用硬件加速(需OpenCV編譯時支持對應后端):

// 設置推理后端(如OpenVINO、CUDA、DNN_TARGET_CPU等)
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV); // 或DNN_BACKEND_CUDA
// 設置目標設備(CPU、GPU等)
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU); // 或DNN_TARGET_CUDA

總結

OpenCV深度學習開發的核心流程可概括為:
加載模型 → 讀取并預處理輸入 → 設置輸入 → 執行推理 → 解析輸出 → 可視化結果
該流程適用于分類、檢測、分割等多種任務,關鍵在于根據模型類型正確預處理輸入和解析輸出,同時可通過硬件加速優化推理速度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88742.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++11】右值引用詳解

文章目錄前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的價值和使用場景2.1 左值引用的價值和缺陷2.2 右值引用的價值和使用場景2.3 小結3. 完美轉發4. 類的移動構造和移動賦值前言 在C11之前&#xff0c;面對C11之前出現的臨時對象的傳參構造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述關聯到了自己&#xff0c;典型例子是“這句話是假話”這個悖論。人類對自指的研究由來已久&#xff0c;很多概念、定理都與之相關&#xff0c;由于它的巧妙性&#xff0c;很多學者對其展開了深入研究&#xff0c;并且認為自指是理解宇宙…

Next.js 實戰筆記 2.0:深入 App Router 高階特性與布局解構

Next.js 實戰筆記 2.0&#xff1a;深入 App Router 高階特性與布局解構 上一篇筆記&#xff1a; Next.js 實戰筆記 1.0&#xff1a;架構重構與 App Router 核心機制詳解 上篇筆記主要回顧了一些 Next12 到 Next15 的一些變化&#xff0c;這里繼續學習/復習一些已有或者是新的…

TCP 傳輸時 sk_buff 的 clone 和 unclone

周一有位朋友咨詢個問題&#xff0c;問題本身不重要&#xff0c;但牽扯出的細節卻是非常有趣。 Linux 內核協議棧的 skb 設計非常高效和精巧&#xff0c;多個 skb 可以指向同一塊 data&#xff0c;這就是 clone&#xff0c;當 data 不止一個 skb 指示時&#xff0c;任何一個 s…

【51單片機】51單片機學習筆記-課程簡介

00. 目錄 文章目錄00. 目錄01. 學習哪種類型的單片機02. 學習單片機方法03. 學習單片機硬件設備04. 學習單片機軟件設備05. 學完單片機能做什么06. 附錄01. 學習哪種類型的單片機 單片機的型號那么多&#xff0c;該如何選擇一款合適的進行學習呢&#xff1f;這里給讀者首推的當…

【Docker基礎】Docker端口映射(-p參數)深度解析與實踐指南

目錄 前言 1 Docker網絡基礎 1.1 Docker網絡模型概述 1.2 容器網絡隔離性 2 端口映射基礎 2.1 端口映射概念 2.2 為什么需要端口映射 3 -p參數詳解 3.1 基本語法 3.2 四種映射格式 3.2.1 完整格式 3.2.2 省略宿主機IP 3.2.3 隨機宿主機端口 3.2.4 指定協議類型 …

2、鴻蒙Harmony Next開發:ArkTS語言

目錄 什么是ArkTS&#xff1f; ArkTS的發展趨勢 ArkTS的定位及約束 ArkTS的對UI的拓展 1、UI描述 2、狀態管理&#xff1a; ArkTS語法基礎 基本知識&#xff1a;聲明 基本知識&#xff1a;類型 基本知識&#xff1a;空安全 基本知識&#xff1a;類型安全與類型推斷 …

【Elasticsearch】function_score

如果你希望在 Elasticsearch 查詢中降低某些特定 `id` 的文檔評分,可以通過 `function_score` 查詢結合 `script_score` 函數來實現。`script_score` 允許你使用自定義腳本對文檔的評分進行調整。 以下是一個示例,展示如何降低某些特定 `id` 的文檔評分: 示例場景 假設我們…

vscode打開stm32CubeIDE的項目的注釋問題

文章目錄 目的是為消除紅色底線打開命令面板&#xff1a;CtrlShiftP 搜索并打開&#xff1a;C/C: Edit Configurations (JSON) 修改并添加。&#xff08;注意里面的版本號&#xff09; {"configurations": [{"name": "Win32","includePath&…

ESP32使用freertos更新lvgl控件內容

LVGL不是線程安全&#xff0c;所有 lv_xxx方法只能在GUI主線程調用。 freertos都是線程池&#xff0c;子線程&#xff0c;不能直接更新lvgl&#xff0c;不然看門狗被觸發&#xff0c;死機。 推薦方法案例&#xff1a; 假如搜索wifi列表得到參數是wifi_options&#xff0c;需要通…

OBOO鷗柏丨滿天星(MTSTAR)多媒體信息發布系統技術解析

初次啟動歡迎您使用鷗柏(OBOO)滿天星(MTSTAR)多媒體信息發布系統&#xff0c;在使用本系統的獨立服務器模式前&#xff0c;我們需要完成設備的一些必須設置教程技術說明。其總體流程分為兩步&#xff1a;錄入本地服務器IP地址->連接網絡您獲取到的OBOO鷗柏滿天星(MTSTAR)液晶…

數據結構:棧、隊列、鏈表

目錄 棧 ?隊列 鏈表 棧 棧數據結構特點&#xff1a;先入棧的數據后出&#xff0c;此數據結構常用的方法有&#xff1a;入棧push、出棧pop、查看棧頂元素peek等&#xff0c;下方示例以數組實現棧結構。 package com.ginko.datastructure; import lombok.extern.slf4j.Slf4j…

Python-難點-uinttest

1 需求要求&#xff1a;unittest.TestCase放在列表中&#xff0c;列表存儲的是腳本文件名import使用動態加載方式&#xff1a;importlib.import_module()unittest.TestLoader使用loadTestsFromModule()2 接口3 示例4 參考資料

開源 python 應用 開發(五)python opencv之目標檢測

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

ABP VNext + OpenTelemetry + Jaeger:分布式追蹤與調用鏈可視化

ABP VNext OpenTelemetry Jaeger&#xff1a;分布式追蹤與調用鏈可視化 &#x1f680; &#x1f4da; 目錄ABP VNext OpenTelemetry Jaeger&#xff1a;分布式追蹤與調用鏈可視化 &#x1f680;背景與動機 &#x1f31f;環境與依賴 &#x1f4e6;必裝 NuGet 包系統架構概覽…

C語言中整數編碼方式(原碼、反碼、補碼)

在 C 語言中&#xff0c;原碼、反碼、補碼的運算規則與其編碼特性密切相關&#xff0c;核心差異體現在符號位是否參與運算、進位如何處理以及減法是否能轉化為加法等方面。以下是三者的運算規則及特點分析&#xff08;以 8 位整數為例&#xff0c;符號位為最高位&#xff09;&a…

js二維數組如何變為一維數組

在 JavaScript 中&#xff0c;將二維數組轉換為一維數組&#xff08;扁平化&#xff09;有多種方法&#xff0c;可根據數組結構復雜度、性能需求和兼容性選擇。以下是最常用的實現方式&#xff1a; 1. 使用 flat() 方法&#xff08;ES2019&#xff09; MDN釋義&#xff1a;flat…

Claude code在Windows上的配置流程

前言 昨天在服務器上配置好了 Claude code&#xff0c;發現其編碼性能和效率都非常不錯。 然而&#xff0c;嘗試用它修改帶 UI 界面的客戶端程序時頗為不便&#xff0c;因為服務器沒有圖形化界面&#xff0c;無法直接將應用界面直接顯示到開發機上&#xff0c;調試起來頗為不…

手把手教你用YOLOv10打造智能垃圾檢測系統

無需編程基礎&#xff01;手把手教你用YOLOv10打造智能垃圾檢測系統 垃圾分類不再難&#xff0c;AI助手秒識別 你是否曾站在分類垃圾桶前猶豫不決&#xff1f;塑料瓶是可回收還是其他垃圾&#xff1f;外賣餐盒到底該丟哪里&#xff1f;隨著垃圾分類政策推廣&#xff0c;這樣的困…

batchnorm類

1. 偽代碼&#xff1a;2. python代碼&#xff1a;3. 測試&#xff1a;4. 加深理解&#xff1a;以 為例&#xff0c;x3&#xff0c;可見輸出的batchnorm后y0.2627.查看模型記錄的均值及方差&#xff0c;計算y0.286799&#xff0c;理解是大致這樣的計算過程。&#xff08;為什么數…