目錄
Transformer 架構在目標檢測中的應用:YOLO 系列模型解析
一、YOLO 模型概述
二、YOLO 模型的核心架構
(一)主干網絡
(二)頸部結構
(三)頭部結構
三、YOLO 模型的工作原理
(一)輸入圖像預處理
(二)特征提取與融合
(三)邊界框預測與類別分類
(四)損失函數計算與優化
(五)非極大值抑制(NMS)后處理
四、YOLO 模型的版本演進
(一)YOLOv1:開啟實時目標檢測之門
(二)YOLOv2 和 YOLOv3:性能與精度的雙重提升
(三)YOLOv4 和 YOLOv5:融合先進技術與簡化設計
(四)YOLOv6 和 YOLOv7:追求極致的實時性和通用性
(五)YOLOv8:集成創新與全面優化
五、YOLO 模型的實際應用案例
(一)智能安防:實時監控與警情預警
(二)自動駕駛:環境感知與決策輔助
(三)工業檢測:產品質量控制與設備運維
(四)零售行業:顧客行為分析與庫存管理
六、YOLO 模型的實戰代碼實現
(二)加載預訓練 YOLOv5 模型
(三)圖像預處理
(四)數據格式轉換與歸一化
(五)目標檢測預測
(六)非極大值抑制(NMS)后處理
(七)可視化檢測結果
四、模型訓練與優化
一、YOLO 模型概述
YOLO(You Only Look Once)系列模型作為目標檢測領域的佼佼者,自誕生以來不斷推陳出新,以卓越的檢測速度和準確率著稱。從 YOLOv1 到 YOLOv8,每一版本都在性能和效率上實現了跨越式的提升,廣泛應用于智能安防、自動駕駛、工業檢測等領域。本文深入剖析 YOLO 模型的核心架構、工作原理以及實戰應用,揭示其在目標檢測領域的制勝秘訣。
二、YOLO 模型的核心架構
YOLO 系列模型共享一個共同的核心架構,即一個強大的特征提取主干網絡,其后連接著頸部(Neck)結構和頭部(Head)結構。頸部結構通常采用特征金字塔網絡(FPN)或路徑聚合網絡(PAN)等,用以融合多尺度特征,增強模型對不同大小目標的檢測能力。頭部結構則負責最終的邊界框預測和類別分類,輸出檢測結果。
(一)主干網絡
主干網絡負責從輸入圖像中提取豐富的特征信息。早期的 YOLO 版本多采用 Darknet 系列網絡作為主干,如 Darknet-53。Darknet-53 由多個卷積層和池化層堆疊而成,擅長提取圖像的深層語義特征。其卷積層使用 3×3 小尺寸卷積核,配合適當的通道擴展和收縮策略,在減少參數量的同時保證了特征提取的效率和質量。
隨著研究的深入,YOLO 系列也開始探索更先進的主干網絡架構。例如,YOLOv7 引入了 CSPDarknet 作為主干網絡,通過跨階段部分連接(CSP)策略,在幾乎不增加計算成本的情況下,顯著增強了特征提取能力。CSPDarknet 的設計靈感來源于 ResNet 的殘差連接思想,通過將網絡劃分為多個階段,并在各階段之間共享部分特征圖,減少了梯度消失問題,加速了模型的收斂,提升了特征的復用率,從而在目標檢測任務中取得了更高的檢測精度和更快的訓練速度。
(二)頸部結構
頸部結構在 YOLO 模型中扮演著特征融合和多尺度處理的關鍵角色。常見的頸部結構包括特征金字塔網絡(FPN)和路徑聚合網絡(PAN)。FPN 旨在構建一個金字塔式的特征層次結構,將主干網絡不同層級輸出的特征圖進行融合,生成具有多尺度信息的特征金字塔。這使得模型能夠有效檢測不同大小的目標,從小型的行人、車輛到大型的建筑物等都能應對自如。FPN 的融合方式通常是從上到下依次融合,先對高層的語義豐富但空間信息較小的特征圖進行上采樣,然后與低層的空間信息豐富但語義較弱的特征圖進行逐元素相加或拼接操作,最終生成融合后的特征圖。
PAN 結構則在 FPN 的基礎上進一步優化了特征融合路徑。它不僅包含從上到下的特征融合路徑,還引入了從下到上的增強路徑,使得特征信息能夠在不同尺度之間更加高效地傳遞和交換。這種雙向的特征融合機制進一步提升了模型對多尺度目標的檢測性能,尤其在處理復雜場景中的重疊目標和不同尺寸目標混合出現的情況時表現出色。PAN 的設計使得特征在不同尺度上的信息更加完整和豐富,有助于提高模型的魯棒性和準確性。
(三)頭部結構
頭部結構負責將頸部輸出的特征圖轉換為最終的檢測結果,包括邊界框的坐標預測和類別概率預測。YOLO 模型的頭部結構通常包含多個卷積層,用于進一步細化特征并生成最終的預測特征圖。每個預測特征圖上的像素點對應著多個預定義的錨框(Anchor Boxes),這些錨框具有不同的寬高比,用于捕捉不同形狀的目標。在訓練階段,模型通過計算預測邊界框與真實邊界框之間的交并比(IoU)和類別概率損失,利用反向傳播算法優化網絡參數。在推理階段,頭部結構輸出的預測結果經過非極大值抑制(NMS)等后處理步驟,篩選出最優的檢測結果,形成最終的檢測框和類別標簽。
三、YOLO 模型的工作原理
YOLO 模型的工作原理可以概括為以下幾個關鍵步驟:
(一)輸入圖像預處理
輸入圖像首先會被調整至模型要求的尺寸,通常是一個固定的大小(如 416×416 或 608×608)。預處理過程還包括歸一化操作,將像素值縮放到特定的范圍(如 [0, 1] 或 [-1, 1]),以加速網絡的收斂并提高數值穩定性。歸一化可以通過簡單的線性變換實現,例如:
xnorm?=255x?
其中,x 是原始像素值,xnorm? 是歸一化后的像素值。這一步驟確保了輸入數據的一致性,使得模型能夠更好地處理不同來源的圖像數據。
(二)特征提取與融合
經過預處理的圖像輸入到主干網絡中,進行特征提取。主干網絡的卷積層和池化層逐步提取圖像的空間特征和語義信息。隨著網絡深度的增加,特征圖的空間尺寸逐漸減小,而通道數逐漸增加,形成了不同層次的特征表示。提取到的特征隨后被送入頸部結構進行融合。頸部結構中的 FPN 或 PAN 通過多尺度特征融合,將不同層次的特征進行整合,生成富含多尺度信息的特征金字塔。例如,在 FPN 中,高層特征圖經過上采樣后與低層特征圖進行融合,融合方式可以是逐元素相加:
Ffuse?=Upsample(Fhigh?)+Flow?
其中,Fhigh? 是高層特征圖,Flow? 是低層特征圖,Ffuse? 是融合后的特征圖。通過這樣的融合操作,特征金字塔中的每個層次都既包含了高層的語義信息,又保留了低層的空間細節,為后續的目標檢測提供了更加豐富的信息基礎。
(三)邊界框預測與類別分類
融合后的特征金字塔被傳遞到頭部結構,頭部結構中的卷積層進一步處理特征圖,生成預測邊界框和類別概率。對于每個預測特征圖上的像素點,模型會生成多個錨框,每個錨框對應著一組邊界框坐標(x, y, w, h)和類別概率分布。邊界框坐標表示目標在圖像中的位置和大小,類別概率分布表示該錨框屬于各個預定義類別(如人、車、狗等)的概率。邊界框坐標的預測通常通過回歸的方式實現,而類別概率的預測則采用分類的方式,使用 softmax 激活函數將輸出值轉換為概率值:
Pclass?=softmax(z)
其中,z 是分類網絡的輸出,Pclass? 是類別概率分布。通過這種方式,模型能夠同時預測目標的位置和類別,實現端到端的目標檢測。
(四)損失函數計算與優化
YOLO 模型的損失函數綜合考慮了邊界框坐標預測誤差和類別概率預測誤差。邊界框坐標誤差通常采用均方誤差(MSE)或平滑 L1 損失進行衡量,類別概率誤差則采用交叉熵損失。總損失是這兩種誤差的加權和:
L=λcoord?Lcoord?+λclass?Lclass?
其中,λcoord? 和 λclass? 是平衡權重,用于調節邊界框損失和類別損失之間的相對重要性。在訓練過程中,通過反向傳播算法計算梯度,并使用優化算法(如 SGD、Adam 等)更新網絡參數,以最小化總損失函數。這一步驟是模型學習的核心,決定了模型對訓練數據的擬合能力和對新數據的泛化能力。
(五)非極大值抑制(NMS)后處理
由于每個預測特征圖上的像素點都會生成多個錨框,這可能導致同一個目標被多個錨框重復檢測。為了解決這個問題,YOLO 模型在推理階段采用非極大值抑制(NMS)算法對預測結果進行后處理。NMS 的基本思想是保留具有最高置信度的邊界框,同時抑制與其高度重疊的其他邊界框。具體步驟如下:
-
根據類別概率和置信度閾值篩選出候選邊界框,過濾掉低置信度的預測結果。
-
對于每個類別,按照邊界框的置信度從高到低排序。
-
選擇置信度最高的邊界框作為保留結果,刪除與其 IoU 大于預設閾值的其他邊界框。
-
重復步驟 3,直到所有邊界框處理完畢。
NMS 算法有效地去除了冗余的檢測結果,保留了最可靠的檢測框,提高了模型輸出的準確性和可讀性。通過合理設置置信度閾值和 IoU 閾值,可以在檢測精度和召回率之間取得良好的平衡,滿足不同應用場景的需求。
四、YOLO 模型的版本演進
YOLO 模型自誕生以來,經歷了多個版本的迭代和優化,每個版本都在性能、速度和應用場景上取得了顯著的進步。
(一)YOLOv1:開啟實時目標檢測之門
YOLOv1 是目標檢測領域的一次重大突破,它首次將目標檢測任務轉化為一個端到端的回歸問題,實現了實時檢測的速度與精度的初步平衡。YOLOv1 將輸入圖像劃分為多個網格單元,每個網格單元負責預測固定數量的邊界框和類別概率。這種創新的框架設計使得模型能夠直接輸出檢測結果,無需復雜的后處理操作,大大提高了檢測速度。然而,YOLOv1 在處理小目標和多目標重疊的場景時存在一定的局限性,邊界框預測的精度也有待提高。
(二)YOLOv2 和 YOLOv3:性能與精度的雙重提升
YOLOv2 在 YOLOv1 的基礎上進行了多項改進,引入了批歸一化(Batch Normalization)技術,提高了模型的訓練速度和穩定性。同時,YOLOv2 采用了錨框機制和多尺度訓練策略,提升了邊界框預測的精度和模型對不同尺寸輸入圖像的適應能力。YOLOv3 進一步深化了模型結構,使用三個不同尺度的特征圖進行目標檢測,增強了對多尺度目標的檢測性能。YOLOv3 還引入了 Darknet-53 作為主干網絡,通過更深的網絡結構提取更豐富的特征,提高了檢測精度。此外,YOLOv3 改進了損失函數,采用交叉熵損失和均方誤差的結合,優化了邊界框坐標和類別概率的預測。
(三)YOLOv4 和 YOLOv5:融合先進技術與簡化設計
YOLOv4 綜合了多種先進的技術,如加權殘差連接(WRC)、跨小批歸一化(CmBN)、自對抗訓練(SAT)等,進一步提升了模型的性能。YOLOv4 的主干網絡使用 CSPDarknet53,頸部結構采用 PANet,頭部結構則優化了錨框機制和損失函數。這些改進使得 YOLOv4 在速度和精度上達到了新的高度,尤其在處理復雜場景和小目標檢測方面表現出色。YOLOv5 對模型結構進行了簡化和優化,提出了一個更加統一和高效的框架。YOLOv5 的主干網絡采用改進的 CSPDarknet,頸部結構使用 FPN 和 PAN 的結合體,頭部結構則進一步優化了邊界框預測和類別分類的流程。YOLOv5 還引入了自動錨框計算技術,能夠根據訓練數據自動調整錨框的尺寸和數量,提高了模型的適應性和檢測精度。此外,YOLOv5 在模型訓練和推理過程中引入了一系列優化策略,如馬賽克數據增強(Mosaic Data Augmentation)、自適應錨框歸一化(Adaptive Anchor Normalization)等,使得模型在不同數據集和應用場景中都能取得優異的性能。
(四)YOLOv6 和 YOLOv7:追求極致的實時性和通用性
YOLOv6 著重優化模型的實時性和部署效率,提出了一個名為 “Efficient Reparameterization” 的技術,能夠在不損失精度的前提下,將復雜的模型結構轉換為高效的部署形式。YOLOv6 的主干網絡采用 RepVGG 結構,該結構在訓練時使用多分支的 RepBlock,而在推理時將多分支結構重新參數化為一個簡單的 3×3 卷積層,大大減少了推理時的計算量。YOLOv6 還引入了通道注意力機制(Channel Attention Mechanism),通過動態調整不同通道的權重,增強了模型對重要特征的關注能力,提高了檢測精度。YOLOv7 在保持實時性優勢的基礎上,進一步提升了模型的通用性和擴展性。YOLOv7 提出了一個名為 “YOLOv7 - E6” 和 “YOLOv7 - E6e” 的高效模型架構,通過增加模型的深度和寬度,同時采用高效的卷積操作和特征融合策略,在速度和精度上實現了新的平衡。YOLOv7 還引入了多種先進的訓練技巧,如漸進式訓練(Progressive Training)、自監督預訓練(Self - Supervised Pre - training)等,使得模型能夠更好地泛化到不同的目標檢測任務和數據集上。
(五)YOLOv8:集成創新與全面優化
YOLOv8 作為 YOLO 系列的最新力作,融合了前幾代模型的優點,并在此基礎上進行了全面的創新和優化。YOLOv8 的主干網絡進一步改進了 CSPDarknet 的設計,通過增加網絡的深度和寬度,同時優化了卷積層和池化層的布局,提高了特征提取的效率和質量。頸部結構采用更加高效的特征融合策略,結合了 FPN 和 PAN 的優點,能夠更好地平衡多尺度特征的語義信息和空間信息。頭部結構則針對邊界框預測和類別分類進行了深度優化,采用了更加精確的回歸算法和分類方法,提高了檢測結果的準確性和可靠性。此外,YOLOv8 在模型訓練過程中引入了多種先進的優化算法和正則化技術,如 AdamW 優化器、標簽平滑(Label Smoothing)、DropBlock 正則化等,使得模型在大規模數據集上能夠更快地收斂,并具有更強的泛化能力。YOLOv8 還對模型的部署和推理進行了深度優化,支持多種硬件平臺和運行環境,能夠滿足不同用戶在不同場景下的實時目標檢測需求。
五、YOLO 模型的實際應用案例
YOLO 模型憑借其卓越的性能和效率,在眾多領域得到了廣泛的應用,以下是一些典型的應用案例:
(一)智能安防:實時監控與警情預警
在智能安防領域,YOLO 模型被廣泛應用于實時視頻監控系統中,用于檢測和識別視頻中的目標物體,如行人、車輛、武器等。通過在監控視頻流上實時運行 YOLO 模型,系統能夠迅速識別出異常行為和潛在威脅,并及時發出警報。例如,在城市交通監控中,YOLO 模型可以實時檢測道路上的車輛和行人,實現交通流量監測、違章行為識別(如闖紅燈、超速行駛等)以及交通事故檢測等功能。一旦檢測到異常情況,系統會立即通知交通管理部門采取相應的措施,提高道路安全和交通管理效率。此外,在公共場所的安全監控中,YOLO 模型可以用于檢測人群中的可疑物品(如背包、行李箱等)和危險行為(如打架斗毆、持刀傷人等),為維護社會治安和公共安全提供有力的技術支持。
(二)自動駕駛:環境感知與決策輔助
自動駕駛技術的發展離不開高效的目標檢測模型,YOLO 模型在自動駕駛領域的應用主要體現在車輛的環境感知和決策輔助方面。自動駕駛汽車通過車載攝像頭、激光雷達等傳感器采集周圍環境的圖像和點云數據,YOLO 模型能夠快速準確地識別出圖像中的其他車輛、行人、交通標志、交通信號燈等關鍵目標,為自動駕駛汽車的決策系統提供實時的環境信息。基于這些信息,汽車的自動駕駛算法可以做出合理的決策,如加速、減速、轉向、避障等,確保行駛的安全和順暢。例如,當 YOLO 模型檢測到前方有行人橫穿馬路時,自動駕駛系統會及時控制車輛減速并采取避讓措施,避免發生交通事故。同時,YOLO 模型的實時性特點使其能夠適應高速行駛場景下的快速變化,為自動駕駛汽車提供可靠的目標檢測支持,推動自動駕駛技術的商業化和普及。
(三)工業檢測:產品質量控制與設備運維
在工業生產領域,YOLO 模型可用于產品質量檢測和設備運維監控,提高生產效率和產品質量。在產品質量檢測方面,YOLO 模型可以對生產線上的產品圖像進行實時檢測,識別出表面缺陷、尺寸偏差、裝配錯誤等問題。例如,在電子產品制造中,YOLO 模型可以檢測電路板上的元件是否缺失、焊接點是否存在虛焊等問題,及時發現生產過程中的質量問題,降低產品的次品率。在設備運維監控方面,YOLO 模型可以對工業設備的運行狀態進行實時監測,識別設備的關鍵部件(如電機、軸承、傳送帶等)是否出現異常磨損、松動、損壞等情況。通過對設備狀態的實時感知,運維人員可以提前安排設備維修和保養,避免設備故障導致的生產中斷,延長設備的使用壽命,降低企業的運營成本。
(四)零售行業:顧客行為分析與庫存管理
零售企業利用 YOLO 模型對店內顧客的行為進行實時分析,通過安裝在商店內的攝像頭采集視頻數據,YOLO 模型可以檢測顧客在店內的位置、行走軌跡、停留時間等信息。這些數據能夠幫助零售商了解顧客的購物習慣和偏好,優化店內商品的布局和陳列方式,提高顧客的購物體驗和購買轉化率。例如,通過分析顧客在不同商品區域的停留時間,零售商可以將熱門商品放置在更顯眼的位置,或者調整商品的陳列順序,引導顧客瀏覽更多的商品。同時,YOLO 模型還可以用于庫存管理,通過檢測貨架上的商品數量和擺放情況,實時更新庫存信息,實現自動化的庫存預警和補貨提醒功能。這有助于零售商保持合理的庫存水平,減少庫存積壓和缺貨現象,提高庫存管理的效率和準確性。
六、YOLO 模型的實戰代碼實現
為了幫助讀者更好地理解和應用 YOLO 模型,以下提供一個基于 PyTorch 框架的 YOLOv5 實戰代碼實現。該代碼展示了如何加載預訓練的 YOLOv5 模型,進行目標檢測預測以及可視化檢測結果。
import torch
import cv2
import numpy as np
from models.common import DetectMultiBackend
from utils.dataloaders import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams
from utils.general import (check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2,increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh)
from utils.plots import Annotator, colors, save_one_box
from utils.torch_utils import select_device, time_sync# 加載預訓練的 YOLOv5 模型
model_path = 'yolov5s.pt' # 模型文件路徑
device = select_device('0' if torch.cuda.is_available() else 'cpu') # 選擇設備(GPU 或 CPU)
model = DetectMultiBackend(model_path, device=device, dnn=False, data='data/coco128.yaml')
stride, names, pt = model.stride, model.names, model.pt
imgsz = check_img_size((640, 640), s=stride) # 輸入圖像尺寸# 加載圖像
image_path = 'test_image.jpg' # 測試圖像路徑
img = cv2.imread(image_path)
img = cv2.resize(img, imgsz) # 調整圖像尺寸
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR 轉 RGB 并調整維度順序
img = np.ascontiguousarray(img)# 圖像預處理
img = torch.from_numpy(img).to(device)
img = img.half() if model.fp16 else img.float() # 轉換為 PyTorch 張量并調整數據類型
img /= 255.0 # 歸一化
if len(img.shape) == 3:img = img.unsqueeze(0) # 增加批量維度# 目標檢測預測
pred = model(img, augment=False, visualize=False)# 非極大值抑制(NMS)后處理
pred = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)# 可視化檢測結果
for i, det in enumerate(pred): # 遍歷每個圖像的檢測結果annotator = Annotator(img[0].permute(1, 2, 0).cpu().numpy(), line_width=2, example=str(names))if len(det):# 將檢測結果從模型輸出坐標系轉換到原始圖像坐標系det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img.shape[2:]).round()# 繪制檢測框和標簽for *xyxy, conf, cls in reversed(det):c = int(cls)label = f'{names[c]} {conf:.2f}'annotator.box_label(xyxy, label, color=colors(c, True))# 顯示結果圖像result_img = annotator.result()cv2.imshow('YOLOv5 Detection Result', result_img)cv2.waitKey(0)cv2.destroyAllWindows()
(二)加載預訓練 YOLOv5 模型
Python
復制
import torch
from models.common import DetectMultiBackend
from utils.general import check_img_size
from utils.torch_utils import select_devicemodel_path = 'yolov5s.pt' # 模型文件路徑
device = select_device('0' if torch.cuda.is_available() else 'cpu') # 選擇設備(GPU 或 CPU)
model = DetectMultiBackend(model_path, device=device, dnn=False, data='data/coco128.yaml')
stride, names, pt = model.stride, model.names, model.pt
imgsz = check_img_size((640, 640), s=stride) # 輸入圖像尺寸
這段代碼首先定義模型路徑,指向本地存儲的 YOLOv5s 預訓練權重文件。接著,調用 select_device
函數智能選擇設備,默認優先使用 GPU。利用 DetectMultiBackend
類加載模型,同時加載 COCO 數據集的配置文件,以便模型了解類別信息。check_img_size
函數確保輸入圖像尺寸符合模型 stride 要求。
(三)圖像預處理
Python
復制
import cv2
import numpy as npimage_path = 'test_image.jpg' # 測試圖像路徑
img = cv2.imread(image_path)
img = cv2.resize(img, imgsz) # 調整圖像尺寸
img = img[:, :, ::-1].transpose(2, 0, 1) # BGR 轉 RGB 并調整維度順序
img = np.ascontiguousarray(img)
這里使用 OpenCV 的 imread
函數讀取圖像,隨后將其調整至模型要求的輸入尺寸。為適配 PyTorch 張量的格式需求,將圖像從 BGR 格式轉換為 RGB 格式,并將維度從 H×W×C 調整為 C×H×W。np.ascontiguousarray
函數確保數據在內存中連續存儲,提高后續計算效率。
(四)數據格式轉換與歸一化
Python
復制
img = torch.from_numpy(img).to(device)
img = img.half() if model.fp16 else img.float() # 轉換為 PyTorch 張量并調整數據類型
img /= 255.0 # 歸一化
if len(img.shape) == 3:img = img.unsqueeze(0) # 增加批量維度
將 NumPy 數組轉換為 PyTorch 張量并移至目標設備。如果模型支持半精度浮點數(FP16),則將數據類型轉換為 FP16,否則使用 FP32。對圖像數據進行歸一化處理,使其像素值介于 0 到 1 之間。最后,為張量添加批量維度,符合模型輸入格式要求。
(五)目標檢測預測
Python
復制
pred = model(img, augment=False, visualize=False)
將預處理后的圖像輸入 YOLOv5 模型,得到原始預測結果。augment
參數控制是否采用數據增強技術(如多尺度推理)來提升預測精度,此處設置為 False 表示僅進行單尺度推理;visualize
參數用于指定是否可視化模型內部特征圖,一般日常推理時無需開啟。
(六)非極大值抑制(NMS)后處理
Python
復制
from utils.general import non_max_suppressionpred = non_max_suppression(pred, 0.25, 0.45, None, False, max_det=1000)
模型輸出的原始預測結果包含大量冗余的檢測框,需要通過非極大值抑制算法篩選出最優的檢測框。non_max_suppression
函數接收多個參數:預測結果、置信度閾值(0.25)、IoU 閾值(0.45)、是否應用多類 NMS、是否使用 WebGL 可視化以及單幅圖像最大檢測目標數(1000)。經過該步驟,保留下來的檢測框是模型認為最有可能包含目標的候選框。
(七)可視化檢測結果
Python
復制
from utils.plots import Annotator, colorsfor i, det in enumerate(pred): # 遍歷每個圖像的檢測結果annotator = Annotator(img[0].permute(1, 2, 0).cpu().numpy(), line_width=2, example=str(names))if len(det):# 將檢測結果從模型輸出坐標系轉換到原始圖像坐標系det[:, :4] = scale_coords(img.shape[2:], det[:, :4], img.shape[2:]).round()# 繪制檢測框和標簽for *xyxy, conf, cls in reversed(det):c = int(cls)label = f'{names[c]} {conf:.2f}'annotator.box_label(xyxy, label, color=colors(c, True))# 顯示結果圖像result_img = annotator.result()cv2.imshow('YOLOv5 Detection Result', result_img)cv2.waitKey(0)cv2.destroyAllWindows()
創建 Annotator
對象用于在圖像上繪制檢測框和標簽。如果存在檢測結果,先利用 scale_coords
函數將檢測框坐標從模型輸出的特征圖尺寸映射回原始輸入圖像尺寸。接著,對每個檢測框循環操作,獲取類別索引和置信度,構造標簽字符串,并調用 box_label
方法繪制檢測框和標簽。最后,通過 OpenCV 的 imshow
函數顯示帶有檢測結果的圖像,按下任意鍵后關閉窗口。
七、模型訓練與優化
除了直接使用預訓練模型進行推理,你還可以根據自己的數據集對 YOLOv5 模型進行訓練。訓練前需要準備標注好的數據集,一般采用 COCO 或 VOC 格式的標注文件。通過調整學習率、批量大小、訓練周期等超參數,結合數據增強技術(如隨機裁剪、翻轉、顏色擾動等),可以有效提升模型在特定數據集上的檢測性能。此外,針對小目標檢測困難、類別不平衡等問題,可以采用合適的策略加以優化。