摘要:本文重點介紹了基於YOLOv5目標檢測系統的MATLAB實現,用於智慧檢測物體種類並記錄和儲存結果,對各種物體檢測結果視覺化,提高目標識別的便捷性和準確性。本文詳細闡述了目標檢測系統的原理,並給出MATLAB的實現程式碼、預訓練模型,以及GUI介面設計。基於YOLOv5目標檢測演演算法,在介面中可以選擇各種圖片、資料夾、視訊進行檢測識別。博文提供了完整的MATLAB程式碼和使用教學,適合新入門的朋友參考,完整程式碼資原始檔請轉至文末的下載連結。
完整程式碼下載:https://mbd.pub/o/bread/mbd-ZJiYmphw
參考視訊演示:https://www.bilibili.com/video/BV1ro4y1w75j/
撰寫這篇部落格的初衷是分享YOLOv5目標檢測演演算法的實現與應用,為大家提供實踐指南。感謝粉絲們的支援。這裡我非常鼓勵讀者深入理解背後原理,發揮創造力,進行探索與嘗試,而不是簡單地套用現成的解決方案。期待在未來的技術交流中,共同進步與成長。本部落格內容為博主原創,相關參照和參考文獻我已在文中標註,考慮到可能會有相關研究人員蒞臨指導,博主的部落格這裡儘可能以學術期刊的格式撰寫,如需參考可參照本部落格格式如下:
[1] 思緒無限. 基於YOLOv5的目標檢測系統詳解[J/OL]. CSDN, 2023.05. https://wuxian.blog.csdn.net/article/details/130472314.
[2] Wu, S. (2023, May). A Comprehensive Guide to Object Detection System Based on YOLOv5 [J/OL]. CSDN. https://wuxian.blog.csdn.net/article/details/130472314.
目標檢測作為計算機視覺領域的一個重要研究方向,旨在從影象或視訊中檢測並識別特定物體(Ren et al., 2015)[1]。近年來,隨著深度學習技術的發展,折積神經網路(CNN)在目標檢測領域取得了顯著成果。R-CNN(Girshick et al., 2014)[2]是第一個將折積神經網路應用於目標檢測的方法,該方法首先使用選擇性搜尋生成物體候選框,然後使用CNN對候選框進行特徵提取,最後通過支援向量機進行分類。R-CNN相較於傳統方法在目標檢測任務上取得了較好的效能,但計算速度較慢,無法實現實時檢測。
為解決R-CNN速度問題,Girshick提出了Fast R-CNN(Girshick, 2015)[3]。Fast R-CNN通過引入RoI池化層,將物體候選框的特徵提取與分類進行聯合訓練,大幅提高了檢測速度。然而,Fast R-CNN仍依賴於選擇性搜尋生成物體候選框,導致檢測速度仍有待提升。Faster R-CNN(Ren et al., 2015)[1]進一步改進了Fast R-CNN,通過引入區域提議網路(RPN),實現了物體候選框生成與特徵提取的端到端學習。Faster R-CNN在保持較高精度的同時,取得了更快的檢測速度。SSD(Liu et al., 2016)[4]是另一個流行的目標檢測方法,通過在不同尺度的特徵圖上進行檢測,實現了對不同尺度物體的高效檢測。SSD在速度與精度上達到了較好的平衡,但在小物體檢測上效能略遜於Faster R-CNN。
YOLO(You Only Look Once,Redmon et al., 2016)[5]系列演演算法憑藉其實時性和準確性在目標檢測領域受到廣泛關注。YOLO將目標檢測任務視為迴歸問題,通過單次前向傳播實現目標的位置與類別預測。YOLOv2(Redmon and Farhadi, 2017)[8]通過改進網路結構與訓練策略,在保持實時性的同時進一步提高了檢測精度。YOLOv3(Redmon 和 Farhadi, 2018)[9]採用了多尺度特徵融合,引入了類別與物體性(objectness)分離的策略,提高了小物體檢測效能。YOLOv4(Bochkovskiy et al., 2020)[7]在YOLOv3的基礎上,融合了多種最新的目標檢測技術,如CSPNet、PANet和SPP,進一步提高了檢測精度與速度。YOLOv5(Bochkovskiy et al., 2020)[6]作為最新版本,在YOLOv4的基礎上進行了架構優化,實現了更高的精度與更快的速度。
雖然目前已經有許多基於YOLOv5的目標檢測應用,但多數針對特定領域,缺乏統一、易用的介面。因此,本部落格將介紹一種基於YOLOv5的目標檢測系統,使用MATLAB實現,並提供圖形化使用者介面(GUI)以便於使用者進行互動操作。本部落格的貢獻點如下:
本節將介紹基於YOLOv5的目標檢測系統的圖形化使用者介面(GUI)功能及演示效果。
(1)選擇圖片檢測:使用者可以通過檔案選擇對話方塊選擇一張圖片進行目標檢測。系統會自動將圖片調整為合適的尺寸,並將結果顯示在GUI介面上。結果包括物體的類別、置信度以及邊界框。
(2)選擇資料夾批次檢測:使用者可以選擇一個資料夾進行批次檢測。系統會自動處理資料夾中的所有圖片,並將檢測結果記錄在下方的表格中。輸出結果包括帶有邊界框和類別標籤的圖片。
(3)選擇視訊檢測:使用者可以選擇一個視訊檔進行目標檢測。系統會對視訊中的每一幀影象進行目標檢測,並將檢測結果實時顯示在GUI介面上。同時,使用者可以選擇將檢測結果儲存為視訊檔。
(4)呼叫攝像頭檢測:使用者可以使用系統內建的攝像頭進行實時目標檢測。系統會捕捉攝像頭的視訊流,並對每一幀影象進行目標檢測。檢測結果將實時顯示在GUI介面上。
(5)更換不同網路模型:系統支援使用者更換不同的YOLOv5網路模型。使用者可以根據自己的需求,選擇合適的模型進行檢測。不同的模型在精度和速度上可能存在差異。
(6)通過介面顯示結果和視覺化:系統的GUI介面提供了直觀的結果展示和視覺化功能。使用者可以清晰地檢視檢測到的物體、邊界框、類別以及置信度。
首先,建立一個名為Detector_YOLOv5的類,它封裝了執行目標檢測的所有方法。以下是類的主要組成部分:
屬性(Properties):類的屬性定義了檢測器所需的資訊,例如類別名稱(COCO資料集中的80個類別)、權重檔案、置信度閾值、非極大值抑制(NMS)閾值和各類別的顏色;方法(Methods):類的方法定義了實現目標檢測的功能。建構函式(Detector_YOLOv5)在初始化時載入預訓練的YOLOv5模型。detect方法對給定的影象執行目標檢測,程式碼還包括一些常數屬性。
classdef Detector_YOLOv5 <handle
properties
cocoNames = {'person'; 'bicycle'; 'car'; 'motorbike'; 'aeroplane';'bus';...
'train'; 'truck'; 'boat'; 'traffic light'; 'fire hydrant'; ...
'stop sign'; 'parking meter'; 'bench'; 'bird'; 'cat'; 'dog';...
'horse'; 'sheep'; 'cow'; 'elephant'; 'bear'; 'zebra'; ...
'giraffe'; 'backpack'; 'umbrella'; 'handbag'; 'tie'; ...
'suitcase'; 'frisbee'; 'skis'; 'snowboard'; 'sports ball'; ...
'kite'; 'baseball bat'; 'baseball glove'; 'skateboard'; ...
'surfboard'; 'tennis racket'; 'bottle'; 'wine glass'; ...
'cup'; 'fork'; 'knife'; 'spoon'; 'bowl'; 'banana'; ...
'apple'; 'sandwich'; 'orange'; 'broccoli'; 'carrot';...
'hot dog'; 'pizza'; 'donut'; 'cake'; 'chair'; 'sofa'; ...
'pottedplant'; 'bed'; 'diningtable'; 'toilet'; ...
'tvmonitor'; 'laptop'; 'mouse'; 'remote'; ...
'keyboard'; 'cell phone'; 'microwave'; 'oven'; ...
'toaster'; 'sink'; 'refrigerator'; 'book'; 'clock';...
'vase'; 'scissors'; 'teddy bear'; 'hair drier'; 'toothbrush'
} ;
cocoNames_Chinese = {'人';'自行車'; '汽車'; '摩托車'; '飛機'; '公共汽車'; '火車'; ...
'卡車'; '船'; '交通燈'; '消防栓'; '停車標誌'; '停車收費表'; ...
'長凳'; '鳥'; '貓'; '狗'; '馬'; '羊'; '牛'; '大象'; '熊'; ...
'斑馬'; '長頸鹿'; '揹包'; '手提包'; '領帶'; '手提箱'; '飛盤'; ...
'飛盤'; '雪橇'; '單板滑雪板'; '運動球'; '風箏'; '棒球棒'; ...
'棒球手套'; '滑板'; '衝浪板'; '網球拍'; '瓶子'; '酒杯'; '杯子'; ...
'叉'; '刀'; '勺子'; '碗'; '香蕉'; '蘋果'; '三明治'; '橙子'; ...
'西蘭花'; '胡蘿蔔'; '熱狗'; '披薩'; '甜甜圈'; '蛋糕'; '椅子'; ...
'沙發'; '盆栽植物'; '床'; '餐桌'; '馬桶'; '電視'; '筆記型電腦'; ...
'滑鼠'; '遙控器'; '鍵盤'; '手機'; '微波爐'; '烤箱'; '烤麵包機'; ...
'水槽'; '冰箱'; '書'; '時鐘'; '花瓶'; '剪刀'; '泰迪熊'; '吹風機'; ...
'牙刷'}
class_names = [];
weights = [];
throushHold = 0.3; % 閾值
nmsThroushHold = 0.5; % nms閾值
colors = []; % 各類別顏色
end
properties(Constant)
input_size = [640,640]; % 輸入尺寸
website = {'CSDN: https://wuxian.blog.csdn.net/';
'Bilibili: https://space.bilibili.com/456667721';
'Zhihu: https://www.zhihu.com/people/sixuwuxian';
'CnBlog: https://www.cnblogs.com/sixuwuxian/'};
author = '思緒無限';
wechat = '公眾號:AI技術研究與分享';
end
end
接下來,詳細介紹detect方法的實現:
methods % 方法塊開始
%建構函式,特點也是和類同名
function obj = Detector_YOLOv5(model, model_fcn)
if nargin == 2
% 匯入模型
obj.colors = randi(255, length(obj.cocoNames),3);
obj.weights = importONNXFunction(model, model_fcn);
obj.class_names = categorical(obj.cocoNames_Chinese); % 類別標籤
end
end
% 成員方法,執行預測
function [bboxes, scores, labels] = detect(obj, image)
% 使用YOLOv5進行預測
% 預處理影象
[H,W,~] = size(image);
image = imresize(image, obj.input_size);
image = rescale(image, 0, 1);% 轉換到[0,1]
image = permute(image,[3,1,2]);
image = dlarray(reshape(image,[1,size(image)])); % n*c*h*w,[0,1],RGB順序
if canUseGPU()
image = gpuArray(image);
end
% 模型推理
[labels, bboxes] = networks_yolov5sfcn(image, obj.weights,...
'Training',false,...
'InputDataPermutation','none',...
'OutputDataPermutation','none');
% 後處理: 閾值過濾+NMS
if canUseGPU()
labels = gather(extractdata(labels));
bboxes = gather(extractdata(bboxes));
end
[maxvalue,idxs] = max(labels,[],2);
validIdxs = maxvalue>obj.throushHold;
% nms
indexes = idxs(validIdxs);
predictBoxes = bboxes(validIdxs,:);
predictScores = maxvalue(validIdxs);
predictNames = obj.class_names(indexes);
predictBboxes = [predictBoxes(:,1)*W-predictBoxes(:,3)*W/2,...
predictBoxes(:,2)*H- predictBoxes(:,4)*H/2,...
predictBoxes(:,3)*W,...
predictBoxes(:,4)*H];
% 結果輸出
[bboxes,scores,labels] = selectStrongestBboxMulticlass(predictBboxes,...
predictScores,...
predictNames,...
'RatioType','Min',...
'OverlapThreshold', obj.nmsThroushHold);
end
end % 方法塊結束
這裡給出如何使用Detector_YOLOv5類對影象進行目標檢測。首先載入模型,然後建立檢測器範例。接著,讀取影象,執行檢測並視覺化結果(在影象上繪製邊界框、類別標籤和置信度)。最後,將標註後的影象儲存到檔案。這裡講解如何使用已經訓練好的YOLOv5 ONNX模型進行目標檢測。首先載入模型並建立檢測器範例:
model = './yolov5s_no.onnx'; % 模型位置
yolov5 = Detector_YOLOv5(model, 'networks_yolov5sfcn');
首先,定義模型檔案的路徑,這裡使用了預訓練好的YOLOv5 ONNX模型。接著,利用Detector_YOLOv5類建立一個檢測器範例。networks_yolov5sfcn是一個MATLAB匯入的ONNX模型的函數,用於實現YOLOv5模型的前向傳播。下面讀取待檢測的影象:
image_path = './test_/000328.jpg';
image = imread(image_path);
指定待檢測影象的路徑,並使用imread函數讀取影象。使用檢測器進行目標檢測:
tic
[bboxes, scores, labels] = yolov5.detect(image)
fprintf('預測時間: %0.2f s',toc);
呼叫detect方法對讀取的影象進行目標檢測。detect方法返回三個輸出:邊界框(bboxes)、置信度得分(scores)和類別標籤(labels)。同時,使用tic和toc函數計算檢測所需的時間。繪製檢測結果並儲存標註後的影象:
annotations = string(labels) + ": " + string(round(scores*100)) + '%';
[~, ids] = ismember(labels, classesNames);
labelColors = colors(ids,:);
labeled_image = insertObjectAnnotation(image,'rectangle',bboxes,...
cellstr(annotations),...
'Font','華文楷體', ...
'FontSize', 18, ...
'color', labelColors,...
'LineWidth',2);
imshow(labeled_image);
imwrite(labeled_image, 'labeled_image.png'); % 儲存標記的圖片
將檢測結果(類別標籤、置信度得分和邊界框)新增到影象上。首先,為每個檢測到的目標生成一個包含類別標籤和置信度的字串(annotations)。然後,根據類別標籤確定對應的顏色。接著,使用insertObjectAnnotation函數將檢測結果繪製到影象上,並使用imshow函數顯示標註後的影象。最後,使用imwrite函數將標註後的影象儲存到檔案。
本節將詳細介紹基於YOLOv5的目標檢測系統的設計框架和實現方法。系統主要分為兩個部分:預測部分和圖形化使用者介面(GUI)部分。預測部分主要包括圖片、資料夾分類、模型更換等功能。GUI部分則包含各種操作按鈕和視覺化結果展示。在設計GUI介面時,需要考慮如下幾個方面:
基於以上要求,可以設計一個包含以下功能的GUI介面:
為了實現上述功能,可以使用MATLAB的App Designer工具來建立GUI介面。App Designer是一個基於MATLAB語言的互動式開發環境,可以方便地設計和建立具有各種功能的圖形化使用者介面。以下是使用App Designer建立的基於YOLOv5的目標檢測系統的GUI介面實現步驟:
開啟MATLAB,選擇App Designer工具建立一個新的專案。
對於需要進一步優化的功能,可以在App Designer的程式碼檢視中進行修改和調整。例如,優化檢測演演算法的效能,提高實時檢測的影格率;調整介面佈局,使其更美觀易用。
通過以上步驟,可以實現一個基於YOLOv5的目標檢測系統的GUI介面。使用者可以通過介面方便地選擇圖片、資料夾或視訊進行目標檢測,並在介面上檢視和分析檢測結果。同時,使用者還可以根據不同場景的需求,切換不同的預訓練模型進行檢測。
在本節中,將對YOLOv5目標檢測演演算法的檢測結果進行分析,並提出一些建議以優化其效能。
結果分析:通過使用預訓練的YOLOv5模型進行目標檢測,可以觀察到以下特點
針對YOLOv5目標檢測演演算法的特點,提出以下優化建議:
模型微調:為了提高YOLOv5在特定應用場景的檢測效能,可以在相關資料集上對模型進行微調。通過在有限的訓練資料上進行微調,模型可以更好地適應新的場景,從而提高檢測準確性。
資料增強:在訓練過程中,使用資料增強技術可以提高模型的泛化能力。例如,可以使用影象旋轉、縮放、翻轉、裁剪等方法擴充訓練集。資料增強有助於模型學習到更多的特徵,提高檢測效能。
模型融合:在一些複雜場景下,可以考慮將多個檢測模型進行融合,以提高檢測準確性。例如,可以將YOLOv5與其他目標檢測演演算法(如Faster R-CNN、SSD等)進行融合,綜合利用各自的優勢,提高整體檢測效能。
多尺度檢測:針對不同尺寸的目標,可以考慮使用多尺度檢測策略。通過將輸入影象調整到不同的尺寸,可以在不同的尺度上進行目標檢測,從而提高檢測準確性。
根據實際應用場景的需求,可以對YOLOv5進行一定程度的調整以滿足特定場景的要求:
自定義類別:根據實際應用需求,可以對YOLOv5進行修改,以檢測特定類別的目標。這需要重新訓練模型,使其能夠識別和檢測自定義類別的物體。
減小模型規模:為了適應邊緣裝置(如移動裝置、嵌入式裝置等)上的計算能力限制,可以考慮減小YOLOv5模型的規模。通過降低模型的層數、通道數等引數,可以降低模型的計算複雜度,提高在邊緣裝置上的執行速度。需要注意的是,這可能會對檢測效能產生一定影響。
模型壓縮和優化:為了進一步提高模型在邊緣裝置上的執行速度和記憶體佔用,可以採用模型壓縮和優化技術,如模型剪枝、模型量化等。這些方法可以降低模型的計算複雜度和記憶體佔用,提高執行速度,但可能對檢測效能產生一定影響。
實時檢測優化:在進行實時目標檢測時,可以考慮採用滑動視窗、跟蹤等技術,減少重複檢測區域,提高檢測速度。此外,還可以結合場景資訊,對感興趣區域進行優先檢測,從而提高檢測效率。
若您想獲得博文中涉及的實現完整全部程式檔案(包括測試圖片、視訊,mlx, mlapp檔案等,如下圖),這裡已打包上傳至博主的麵包多平臺,見可參考部落格與視訊,已將所有涉及的檔案同時打包到裡面,點選即可執行,完整檔案截圖如下:
在資料夾下的資源顯示如下圖所示:
注意:該程式碼採用MATLAB R2022a開發,經過測試能成功執行,執行介面的主程式為Detector_UI.mlapp,測試視訊指令碼可執行test_yolov5_video.py,測試攝像頭指令碼可執行test_yolov5_camera.mlx。為確保程式順利執行,請使用MATLAB2022a執行並在「附加功能管理器」(MATLAB的上方選單欄->主頁->附加功能->管理附加功能)中新增有以下工具。
完整資源中包含資料集及訓練程式碼,環境設定與介面中文字、圖片、logo等的修改方法請見視訊,專案完整檔案下載請見參考部落格文章裡面,或參考視訊的簡介處給出:➷➷➷
完整程式碼下載:https://mbd.pub/o/bread/mbd-ZJiYmphw
參考視訊演示:https://www.bilibili.com/video/BV1ro4y1w75j/
本文詳細介紹了YOLOv5目標檢測演演算法的原理、網路結構及其在實際應用中的優化方法。YOLOv5作為一個高效、實時的目標檢測演演算法,在各種場景中都表現出較好的效能。首先介紹了YOLOv5的背景知識,包括YOLO系列演演算法的發展歷程和YOLOv5相較於前代演演算法的改進。接著,詳細闡述了YOLOv5的網路結構和損失函數設計,並通過實際程式碼實現展示瞭如何使用YOLOv5進行目標檢測。最後,討論了針對實際應用場景的優化方法,以提高YOLOv5在各種場景中的目標檢測能力。總的來說,YOLOv5是一個值得學習和應用的目標檢測演演算法。通過對其進行一定程度的調整和優化,可以使其更好地滿足實際應用場景的需求,提高目標檢測的效果和效率。
由於博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。
[1] Ren, S., He, K., Girshick, R., & Sun, J. (2015). Faster R-CNN: Towards real-time object detection with region proposal networks. Advances in Neural Information Processing Systems, 28, 91-99.
[2] Girshick, R., Donahue, J., Darrell, T., & Malik, J. (2014). Rich feature hierarchies for accurate object detection and semantic segmentation. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 580-587.
[3] Girshick, R. (2015). Fast R-CNN. Proceedings of the IEEE International Conference on Computer Vision, 1440-1448.
[4] Liu, W., Anguelov, D., Erhan, D., Szegedy, C., Reed, S., Fu, C. Y., & Berg, A. C. (2016). SSD: Single shot multibox detector. European Conference on Computer Vision, 9905, 21-37.
[5] Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You only look once: Unified, real-time object detection. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 779-788.
[6] Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv5: An improved real-time object detection model. arXiv preprint arXiv:2006.05983.
[7] Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv4: Optimal speed and accuracy of object detection. arXiv preprint arXiv:2004.10934.
[8] Redmon, J., & Farhadi, A. (2017). YOLO9000: Better, faster, stronger. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 7263-7271.
[9] Redmon, J., & Farhadi, A. (2018). YOLOv3: An incremental improvement. arXiv preprint arXiv:1804.02767.