YOLO的Python實現以及 OpenCV

YOLOPython實現以及 OpenCV

Darknet 實現 YOLO

從頭開始開發 YOLO模型不容易,所以我們要使用預訓練模型在項目里進行目 標檢測。你可以在 https://pjreddie.com里到所有可用的預訓練模型。這是 Joseph C. Redmon的主頁,他是 Darknet的維護者。

注意????? DarknetCCUDA開發的開源神經網絡框架,它很快,很容易安裝,支持 CpU GpU計算。

在子頁 ?(https://pjreddie.com/darknet/yolo/), ?你可以找到 YOLO算法的所有信息。你可以從這個網頁下載多個預訓練模型的權重。對于每一個模型,你需要二個文件 :

  • 一個 .cfg文件,它包含網絡結構.

  • 一個 .weights文件,它包含訓練后的權重

為了給你這些文件的內容, .cfg文件包含使用的層的信息等,示例如:

[convolutional] batch_normalize=1 filters=64

size=3

stride=1 pad=1

activation=leaky

這告 訴你有特殊的卷積層。最重要的信息是:

  • Network architecture

  • Anchor boxes

  • Number of classes

  • Learning rate and other parameters used

  • Batch size

其它文件(.weights)包含預訓練權重以進行推斷。注意它們不能保存為Keras兼容的格式 ( .h5文件),所以它們不能加載到 Keras模型,除非你先轉換。

有一些非標準的工具可以轉換這些文件,因為格式不是固定的 ( YOLOv2 YOLOv3有些不同)。如果你感興趣以 YOLO v2,你可以使用 YAD2K (另一個是 Darknet 2 Keras),可以在 https://github.com/allanzelener/YAD2K里找到。

注意這不能處理 YOLOv3 .cfg文件。相信我,我試過。但是如果你滿意 YOLOv2, 你可以用這個目錄的代碼轉換 .weight文件到Keras友好的格式。有個目錄實現了 YOLOv3 的轉換,在https://github.com/qqwweee/keras-yolo3。它有些局限,但是它是轉換的很好的起點。 但是有便好的方法,使用預訓練模型,那就是使用 OpenCV, 后面我們會看到。

Darknet檢測對象

如果你只是想對圖像進行分類,最容易的辦法是按 darknet網站的指示。我們看一下如何做。如果你使用Linux MacOS X系統,這些指令有用。 Windows里,你要安裝 gcc和別的工具。如網站所述,安裝只需要幾行代碼:

git ?clone ?https://github.com/pjreddie/darknet cd darknet

make

wget??? ?https://pjreddie.com/media/files/yolov3.weights

這里你就可以進行目標檢測了:

./darknet detect cfg/yolov3.cfg yolov3.weights table.jpg

注意,權重文件很大,下載時要注意這一點,使用CPU這很慢,MacBook Pro 2018需要18秒來下載。見圖 7-2

7-2. YOLOv3使用 darknet進行圖像檢測

黙認使用0.25的閾值。但是你可以使用不同的參數。你必須改變XYZ到你想要的值。

黙認使用0.25的閾值。但是你可以使用不同的參數。你必須改變XYZ到你想要的值。.

這個方法于于目標檢測 很好,但是很難在python項目里使用。要這樣做,你需要在你的代碼里使用預訓練的模型。有幾個方法,最容易的是使用opencv庫。如果你處理圖像,你很可能已經使用過這個庫。如果你沒有聽說過,建議你試一下,因為它是處理圖像很有名的庫。你可以看官網 https:// opencv.org.

你可以在網上下載本章的完整代碼,但是我們只簡單的討論重要的部分。

你需要安裝最新的opencv庫。 用下面的代碼檢測版本:

import cv2

print (cv2. ?version ?)

我們需要從https:// pjreddie.com 下載三個文件:

  • coco.names

  • yolov3.cfg

  • yolov3.weights

coco.names 包含了預訓練模型能分類的標簽。yolov3.cfg yolov3.weights是模型配置參數 ?(前面已討論過)且我們需要使用 權重。為了你方便,yolov3.weights大約 240MB容量,你可以下載 ZIP 文件自 http://toe.lt/r。在代碼里我們需要指明文件在哪里。例如,你使用下面的代碼:

weightsPath ?= ?"yolo-coco/yolov3.weights" configPath? ?=? ?"yolo-coco/yolov3.cfg"

你要改變文件的位置。 OpenCV提供了函數來加載權重而不需要轉換它們:

net ?= ?cv2.dnn.readNetFromDarknet(configPath, ?weightsPath)

這很舒服,因為你不需要分析和寫加載函數。它返回模型對象供你后面推斷。如果你記得本章開始的討論,你要得到輸出層來得到所有需要的信息,像邊框和預測分類。我們用下面的代碼很容易做到:

ln ?= ?net.getLayerNames()

ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

?getUnconnectedOutLayers()函數返回帶用unconnected輸出的層, 正是我們想要的。ln這量含有下面的層:

['yolo_82', 'yolo_94', 'yolo_106']

然后我們要改變圖像大小到 416x416并歸一化它:

blob? =? cv2.dnn.blobFromImage(image,? 1? / 255.0,? (416,? 416), swapRB=True, crop=False)

然后用它作為模型的輸入:

net.setInput(blob)

然后我們用 forward()函數向前傳遞給訓練模型:

layerOutputs? ?=? ?net.forward(ln)

我們還沒有完成,不要休息。我們要提取邊框,我們保存在列表里,然后是置信,然后是預測分類.

我們初始化列表:

boxes = [] confidences = [] classIDs = []

然后我們遍歷各層并提取我們要的信息。

for output in layerOutputs: for ?detection ?in ?output:

現在分 數保存在第5個檢測變量的元素里,我們提取分類用np. argmax(scores):

scores? ?=? ?detection[5:] classID ?= ?np.argmax(scores)

置信度是預測分類的分值:

confidence? ?=? ?scores[classID]

我們想要預測置信度大于0的。我們選擇限度為0.15。預測邊框包含于檢測變量的前4個里:

box =? detection[0:4] *? np.array([W, H,? W,? H]) (centerX,? ?centerY,? ?width,? ?height)? ?=? ?box.astype("int")

如果你記得,YOLO預測邊框的中心點,所在我們要的提取左上角位置:

x = int(centerX - (width / 2)) y = int(centerY - (height / 2))

然后我們將發現的值添加到列表

boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID)

然后我們使用 non-maxima 抑制 (上一節討論過) OpenCV 也提供了函數:

idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.6,0.2)

函數需要下面的參數:

  • 邊框集合 (保存于 boxes變量)

  • 置信度集合 (保存于confidences變量)

  • 按分值過濾邊框的閾值 ?(前面代碼是0.6)

  • ?non-maximum抑制的閾值 (前面的代碼是0.2)

然我們得到準確的位置:

for i in idxs.flatten():

# extract the bounding box coordinates (x, ?y) ?= ?(boxes[i][0], ?boxes[i][1])

(w, ?h) ?= ?(boxes[i][2], ?boxes[i][3])

你可以在圖 7-3看到結果。

?7-3. YOLOv3 OpenCV獲得的結果

這正是它應有的與圖7-2一樣的結果。另外,我們有預測邊框的概率。你可以看到這是多么的容易。你只需要添加幾行代碼到你的項目。

這正是它應有的與圖7-2一樣的結果。另外,我們有預測邊框的概率。你可以看到這是多么的容易。你只需要添加幾行代碼到你的項目。

記住我們使用預訓練模型只能檢測數據集里的對象。如果你要用不同的對象,你要微調模型,或重新訓練模型。從頭訓練模型超出了本書的范圍。但是下一節我會給你一些提示。

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

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

相關文章

譯|Netflix 數據平臺運營中基于機器學習自動修復系統

來自上傳文件中的文章《Evolving from Rule-based Classifier: Machine Learning Powered Auto Remediation in Netflix Data Platform》 本文介紹了Netflix如何將基于規則的錯誤分類器與機器學習服務集成,實現Spark作業失敗的自動修復。技術亮點包括結合規則和ML智…

PAES算法求解 ZDT1 雙目標優化問題

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

邏輯回歸的應用

一參數邏輯回歸參數及多分類策略等完整解析LogisticRegression 初始參數聲明LogisticRegression(penaltyl2, dualFalse, tol0.0001, C1.0, fit_interceptTrue, intercept_scaling1, class_weightNone, random_stateNone, solverliblinear, max_iter100, multi_classovr, verbos…

C語言(長期更新)第7講:VS實用調試技巧

C語言(長期更新) 第7講 VS實用調試技巧 跟著潼心走,輕松拿捏C語言,困惑通通走,一去不回頭~歡迎開始今天的學習內容,你的支持就是博主最大的動力。 目錄 C語言(長期更新) 第7講 …

CONTRASTIVE-KAN:一種用于稀缺標記數據的網絡安全半監督入侵檢測框架

研究背景與挑戰? ?工業環境需求?: 第四次工業革命中,物聯網(IoT)和工業物聯網(IIoT)的普及使網絡安全成為關鍵挑戰。 入侵檢測系統需實時性高,尤其對關鍵基礎設施(如燃氣管道)的快速攻擊檢測至關重要。 ?核心問題?: ?標簽數據稀缺?:工業系統多數時間處于正常…

綜合:單臂路由+三層交換技術+telnet配置+DHCP

技術考核1 實驗拓撲:實驗需求 1.按照圖示配置IP地址設備名 2.在SW1和SW2之間配置鏈路聚合增加鏈路帶寬,提高可靠性 3.PC5和PC6屬于VLAN10, PC7和PC8屬于VLAN20 4.SW1和SW2屬于二層交換機,SW3為三層交換機(VLAN100用于對…

工業火焰識別漏報率↓78%!陌訊多模態融合算法實戰解析

原創聲明:本文技術方案解析基于陌訊技術白皮書2025版 標簽:#陌訊視覺算法 #火焰識別優化 #工業安全監控 #邊緣計算優化一、行業痛點:工業火災監控的漏檢危機據《2025工業安全白皮書》統計,化工場景傳統火焰識別系統漏報率高達35%&…

C++引用:高效安全的別名機制詳解

目錄 一、引用的概念 二、引用的特性 1、定義時必須初始化 2、一個變量可以有多個引用 3、引用一旦綁定實體就不能更改 三、const引用(常引用) 1、const引用的基本特性 2、臨時對象與const引用 3、臨時對象的特性 4、const 引用作為函數形參 …

大語言模型API付費?

下面是目前主流 大語言模型 API 的付費情況總覽: 🧠 一、主要大語言模型 API:是否付費對比 提供方模型是否免費限制 / 說明OpenAIGPT-3.5 / GPT-4 / GPT-4o? 付費為主有免費額度(如 ChatGPT 免費版),API …

巧用Wisdom SSH:容器化運維與傳統運維的抉擇

巧用Wisdom SSH:容器化運維與傳統運維的抉擇 在當下的技術領域,容器化運維與傳統運維是運維人員面臨的兩大主要方向,對于從業者來說,如何抉擇至關重要,而Wisdom SSH在其中能發揮顯著作用。 傳統運維:基石…

API征服者:Python抓取星鏈衛星實時軌跡

API征服者:Python抓取星鏈衛星實時軌跡從基礎調用到工業級衛星追蹤系統實戰指南一、太空數據時代:星鏈衛星的全球覆蓋??星鏈衛星網絡規模??:已發射衛星數量:4,000目標衛星總數:42,000軌道高度:340km - …

《深潛React列表渲染:調和算法與虛擬DOM Diff的優化深解》

當用戶在內容平臺無限滑動,或是在管理系統中處理成百上千條數據時,每一次無卡頓的交互,都是調和算法與虛擬DOM Diff機制協同工作的成果。理解這兩者的底層邏輯,不僅是性能優化的鑰匙,更是從“使用框架”到“理解框架”…

自動化與配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款開源的自動化運維工具,采用無代理(Agentless)架構,通過 SSH 協議實現對遠程節點的管理。其核心特性包括:無代理架構:被管理節點無需安裝代理軟件,降…

Effective C++ 條款18:讓接口容易被正確使用,不易被誤用

Effective C 條款18:讓接口容易被正確使用,不易被誤用核心思想:設計接口時,應使正確使用方式直觀自然,同時通過類型系統、行為約束等手段主動預防常見錯誤,減少用戶犯錯的可能性。 ?? 1. 接口誤用的常見陷…

nodejs讀寫文件

1.讀文件 node有很多模塊,可在node模塊查看相應模塊; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果發生錯誤,data是undefined 如果成功 err為null console.log(err); console.log(data); }) 2.寫文件 var…

ConcurrentHashMapRedis實現二級緩存

1. 為什么使用ConcurrentHashMap?在Java中,ConcurrentHashMap 是一個線程安全且高效的哈希表實現,廣泛用于高并發場景。將其用作一級緩存的原因主要包括以下幾點:1.1. 線程安全性ConcurrentHashMap 是線程安全的,支持多…

Mysql集群技術

實驗在RHEL7中做,因為9中缺少了一個關鍵的高可用組件環境:兩臺數據庫,內存和CPU要多一點主流是MYSQL(開源),Oracle收費較貴RHEL7中直接用make編譯是有問題的,所以需要要gcc工具做好前置準備&…

自動駕駛嵌入式軟件工程師面試題【持續更新】

文章目錄前言請描述 CAN 幀的基本結構(包括標識符、數據字段、CRC 等)描述 WebSocket 協議的基本工作流程(包括握手、數據幀結構)請說明如何實現 WebSocket 連接的心跳機制以檢測連接狀態,并描述在斷開后如何通過重連策…

vue(5)-組件

一.組件三大組成部分(結構/樣式/邏輯)(1)組件樣式沖突用scoped全局樣式在組件中起全局作用,局部樣式可以加scoped屬性來只作用于當前組件圖中只給baseone加這個樣式,就在baseone中style加scoped&#xff08…

【機器學習】兩大線性分類算法:邏輯回歸與線性判別分析:找到分界線的藝術

文章目錄一、核心概念:數據分類的"切分線"二、工作原理:從"找分界線"理解二、常見算法1、邏輯回歸:二分類2、線性判別分析(LDA):分類與降維3、兩種算法對比分析三、實際應用&#xff1…