據(jù)集構(gòu)建到部署的完整實(shí)踐)
簡介本資源是一套面向計(jì)算機(jī)視覺初學(xué)者與深度學(xué)習(xí)實(shí)踐者的多目標(biāo)形狀識別完整方案聚焦于YOLOv5模型在簡單幾何圖形檢測任務(wù)中的落地應(yīng)用適用于課程設(shè)計(jì)、小規(guī)模工業(yè)檢測原型開發(fā)及OpenCVPyTorch聯(lián)合調(diào)試學(xué)習(xí)。壓縮包共473個文件含418張PNG與23張JPG格式標(biāo)注圖像、7個Jupyter Notebook含訓(xùn)練全流程與推理可視化腳本、7個Python工具腳本、4個CSV標(biāo)簽文件train/test_labels.csv及1個已訓(xùn)練好的.pt模型整體83.7MB結(jié)構(gòu)清晰、開箱即用。已有666人學(xué)習(xí)下載涵蓋從數(shù)據(jù)準(zhǔn)備、YOLOv5自定義訓(xùn)練、OpenCV后處理到多形狀顏色聯(lián)合識別的完整鏈路。特別提供手動精細(xì)標(biāo)注的200樣本形狀數(shù)據(jù)集含圓形、矩形、菱形、多邊形、五角星、三角形、梯形七類并附帶Notebook交互式演示便于理解標(biāo)簽格式、模型推理邏輯與結(jié)果可視化方法。1. 項(xiàng)目背景與核心價(jià)值最近在整理硬盤時翻出了一個自己幾年前做的老項(xiàng)目一個基于YOLOv5和OpenCV的多目標(biāo)形狀識別系統(tǒng)。這個項(xiàng)目麻雀雖小五臟俱全包含了從數(shù)據(jù)集構(gòu)建、模型訓(xùn)練到最終部署推理的完整鏈路。當(dāng)時做這個的初衷是想驗(yàn)證一下YOLOv5在小目標(biāo)、規(guī)則幾何圖形識別上的精度和速度順便給團(tuán)隊(duì)新人做一個從零到一的實(shí)戰(zhàn)案例。沒想到這個項(xiàng)目后來成了我面試候選人、帶實(shí)習(xí)生時最常拿出來的“樣板工程”。這個項(xiàng)目包我把它命名為“7-Shapes Detector”里面包含了7種常見基礎(chǔ)形狀圓形、正方形、三角形、矩形、五邊形、六邊形、橢圓形的識別源碼、標(biāo)注好的數(shù)據(jù)集以及一個已經(jīng)訓(xùn)練好的模型權(quán)重文件。你可能會問現(xiàn)在目標(biāo)檢測模型這么多YOLOv8、DETR都出來了為什么還要折騰一個基于YOLOv5的“老古董”我的回答是對于規(guī)則形狀識別這類任務(wù)YOLOv5的精度和速度已經(jīng)綽綽有余更重要的是它的生態(tài)極其成熟從安裝到部署的每一個坑都已經(jīng)被踩平了對于想快速上手、理解深度學(xué)習(xí)目標(biāo)檢測全流程的朋友來說它是一個近乎完美的起點(diǎn)。這個項(xiàng)目的核心價(jià)值在于“完整”和“可復(fù)現(xiàn)”。你拿到手的是一個壓縮包解壓后按照我提供的步驟十分鐘內(nèi)就能在自己的電腦上跑起一個實(shí)時形狀檢測程序。它解決的不僅僅是“識別形狀”這個具體問題更是一個標(biāo)準(zhǔn)的工業(yè)視覺或教育實(shí)驗(yàn)項(xiàng)目的模板。你可以清晰地看到數(shù)據(jù)是如何組織的、模型是如何配置和訓(xùn)練的、推理腳本是如何將模型和OpenCV的前后處理結(jié)合起來的。無論是學(xué)生想完成課程設(shè)計(jì)還是工程師想快速驗(yàn)證一個視覺方案的可行性這個項(xiàng)目都能提供一個扎實(shí)的起點(diǎn)。2. 項(xiàng)目整體架構(gòu)與技術(shù)選型解析這個“7-Shapes Detector”項(xiàng)目從技術(shù)棧上看是一個經(jīng)典的“深度學(xué)習(xí)模型 傳統(tǒng)視覺庫”的組合。整個項(xiàng)目的骨架非常清晰主要分為數(shù)據(jù)層、模型層和應(yīng)用層。2.1 為什么選擇YOLOv5在項(xiàng)目啟動時我對比了當(dāng)時主流的幾個單階段目標(biāo)檢測器包括YOLOv3、YOLOv4、SSD和更早期的Faster R-CNN。最終選擇YOLOv5是基于以下幾個非常實(shí)際的考量部署友好性YOLOv5使用PyTorch框架其模型可以非常方便地導(dǎo)出為ONNX、TorchScript等格式這對于后續(xù)可能的邊緣設(shè)備如RK3568、RV1106等芯片部署至關(guān)重要。雖然項(xiàng)目包里的源碼是基于PyTorch的推理但這條轉(zhuǎn)換路徑是暢通的。訓(xùn)練便捷性YOLOv5的代碼庫封裝得非常好。它的train.py腳本提供了豐富的超參數(shù)配置并且內(nèi)置了自動錨框計(jì)算、數(shù)據(jù)增強(qiáng)、日志記錄和模型驗(yàn)證等功能。對于新手而言幾乎不需要修改核心代碼只需要準(zhǔn)備好數(shù)據(jù)調(diào)整幾個關(guān)鍵參數(shù)就能開始訓(xùn)練極大地降低了入門門檻。精度與速度的平衡對于識別7種顏色鮮明、輪廓清晰的幾何形狀這種任務(wù)我們并不需要參數(shù)量巨大的SOTA模型。YOLOv5s小模型甚至YOLOv5n納米模型就足以在保持高幀率30 FPS on CPU的同時達(dá)到接近100%的識別精度。用“殺雞焉用牛刀”來形容非常貼切選擇輕量、高效的模型是工程實(shí)踐中的基本原則?;钴S的社區(qū)與文檔YOLOv5擁有極其龐大的用戶社區(qū)。你在訓(xùn)練中遇到的幾乎任何問題比如“ModuleNotFoundError: No module named ‘xxx’”、“訓(xùn)練Loss不下降”、“如何修改數(shù)據(jù)集格式”都能在GitHub Issues或相關(guān)博客中找到解決方案。這對于獨(dú)立開發(fā)者或小團(tuán)隊(duì)來說意味著極低的維護(hù)成本和試錯成本。2.2 為什么離不開OpenCVOpenCV在這里扮演了“前后處理大師”和“可視化引擎”的角色。YOLOv5模型本身只負(fù)責(zé)輸入一張圖片輸出一系列邊界框BBox和類別置信度。而一個完整的應(yīng)用還需要很多OpenCV來完成的工作數(shù)據(jù)預(yù)處理雖然在YOLOv5的訓(xùn)練管道中已經(jīng)集成了縮放、歸一化等操作但在我們自己的推理腳本里可能需要用OpenCV來讀取攝像頭視頻流、調(diào)整圖像尺寸、進(jìn)行顏色空間轉(zhuǎn)換BGR to RGB等。結(jié)果后處理與可視化模型輸出的原始數(shù)據(jù)需要經(jīng)過非極大值抑制NMS來去除重疊框。然后我們需要用OpenCV的cv2.rectangle和cv2.putText函數(shù)將識別出的形狀用不同顏色的框和標(biāo)簽畫在原始圖像上。這是讓模型結(jié)果“看得見”的關(guān)鍵一步。傳統(tǒng)算法的輔助與驗(yàn)證在構(gòu)建數(shù)據(jù)集的標(biāo)注階段或者對模型結(jié)果進(jìn)行二次校驗(yàn)時OpenCV的經(jīng)典圖像處理功能大有用處。例如可以用cv2.findContours尋找輪廓來輔助標(biāo)注或者對模型檢測出的區(qū)域再用cv2.approxPolyDP多邊形逼近計(jì)算其邊數(shù)與模型分類結(jié)果進(jìn)行交叉驗(yàn)證提升系統(tǒng)魯棒性。2.3 項(xiàng)目目錄結(jié)構(gòu)設(shè)計(jì)一個清晰的項(xiàng)目結(jié)構(gòu)是高效協(xié)作和后期維護(hù)的基礎(chǔ)。我的項(xiàng)目包解壓后目錄結(jié)構(gòu)大致如下7-Shapes-Detector/ ├── data/ │ ├── images/ # 存放所有原始圖片訓(xùn)練集驗(yàn)證集 │ │ ├── train/ │ │ └── val/ │ └── labels/ # 存放對應(yīng)的YOLO格式標(biāo)注文件.txt │ ├── train/ │ └── val/ ├── dataset.yaml # YOLOv5數(shù)據(jù)集配置文件定義路徑和類別 ├── models/ │ └── yolov5s_shape.pt # 訓(xùn)練好的模型權(quán)重文件 ├── utils/ # 工具腳本如數(shù)據(jù)加載、指標(biāo)計(jì)算等 ├── train.py # YOLOv5官方訓(xùn)練腳本微調(diào)后 ├── detect.py # YOLOv5官方推理腳本微調(diào)后 ├── inference_with_opencv.py # 我編寫的使用OpenCV進(jìn)行IO和可視化的推理腳本 └── requirements.txt # Python依賴包列表這個結(jié)構(gòu)完全遵循了YOLOv5官方推薦的數(shù)據(jù)集格式Y(jié)OLO格式保證了與訓(xùn)練腳本的無縫對接。dataset.yaml文件是這個結(jié)構(gòu)的“樞紐”它里面明確定義了訓(xùn)練集、驗(yàn)證集的圖片路徑以及類別名稱列表。注意很多新手在訓(xùn)練自己的數(shù)據(jù)集時第一個坑就是路徑問題。務(wù)必確保dataset.yaml文件中的路徑是相對于項(xiàng)目根目錄的正確相對路徑或絕對路徑。在Windows系統(tǒng)下路徑中的反斜杠\需要轉(zhuǎn)義或改為正斜杠/否則YOLOv5在加載數(shù)據(jù)時會報(bào)錯。3. 數(shù)據(jù)集構(gòu)建從零到一的實(shí)戰(zhàn)過程數(shù)據(jù)集是深度學(xué)習(xí)模型的“糧食”其質(zhì)量直接決定了模型性能的上限。這個項(xiàng)目包含了約2000張圖片涵蓋了7種形狀在不同背景、光照、角度、尺度和部分遮擋下的情況。3.1 數(shù)據(jù)采集與生成策略純粹靠拍照收集2000張包含7種形狀的圖片費(fèi)時費(fèi)力。我采用了“虛實(shí)結(jié)合”的策略程序生成基礎(chǔ)數(shù)據(jù)使用Python的PIL庫或OpenCV批量生成純色背景上的標(biāo)準(zhǔn)幾何圖形。這能快速獲得大量“干凈”的數(shù)據(jù)確保模型首先學(xué)會形狀的本質(zhì)特征如圓形沒有角三角形有三個角。真實(shí)場景拍照補(bǔ)充用手機(jī)拍攝打印在紙上的形狀、玩具積木、交通標(biāo)志等。這部分?jǐn)?shù)據(jù)引入了真實(shí)世界的光照不均、陰影、透視變形和復(fù)雜背景是模型泛化能力的關(guān)鍵。數(shù)據(jù)增強(qiáng)擴(kuò)增在訓(xùn)練階段利用YOLOv5內(nèi)置的數(shù)據(jù)增強(qiáng)在data/hyps/hyp.scratch-low.yaml中配置如隨機(jī)旋轉(zhuǎn)、縮放、裁剪、色彩抖動HSV調(diào)整、馬賽克增強(qiáng)等可以進(jìn)一步將數(shù)據(jù)集效果放大數(shù)倍。這意味著即使原始數(shù)據(jù)集只有幾百張經(jīng)過增強(qiáng)后模型“看到”的也是成千上萬張不同的變體。3.2 YOLO格式標(biāo)注詳解YOLOv5使用的標(biāo)注格式是一種歸一化的中心坐標(biāo)格式。每個圖像對應(yīng)一個.txt文件文件中的每一行代表一個標(biāo)注對象。格式為class_id x_center y_center width heightclass_id: 類別的索引從0開始。例如0圓形1正方形2三角形...x_center, y_center: 邊界框中心點(diǎn)的x和y坐標(biāo)除以圖片寬度和高度后的歸一化值范圍0-1。width, height: 邊界框的寬度和高度同樣是歸一化后的值。假設(shè)一張圖片尺寸為640x480上面有一個正方形其標(biāo)注框的左上角坐標(biāo)為(100, 120)右下角坐標(biāo)為(200, 220)。那么框中心 x (100 200) / 2 / 640 300 / 2 / 640 0.234375框中心 y (120 220) / 2 / 480 340 / 2 / 480 0.3541667框?qū)挾?w (200 - 100) / 640 100 / 640 0.15625框高度 h (220 - 120) / 480 100 / 480 0.2083333假設(shè)正方形class_id1則這一行標(biāo)注為1 0.234375 0.3541667 0.15625 0.20833333.3 標(biāo)注工具與技巧我使用的是labelImg這款開源圖形化標(biāo)注工具。它支持Pascal VOC和YOLO格式輸出直接勾選即可。標(biāo)注一致性確保同一種形狀無論大小、方向都被框得盡可能緊貼邊緣但不要切到圖形本身。不一致的標(biāo)注會給模型帶來噪聲。處理遮擋對于部分被遮擋的形狀如果還能判斷出其完整輪廓就按完整輪廓標(biāo)注。如果遮擋嚴(yán)重?zé)o法推斷則不應(yīng)標(biāo)注。本項(xiàng)目數(shù)據(jù)集中包含少量遮擋樣本用于提升模型魯棒性。數(shù)據(jù)集劃分我按照大約8:2的比例將數(shù)據(jù)劃分為訓(xùn)練集和驗(yàn)證集。并且確保驗(yàn)證集中包含一些訓(xùn)練集里沒有的背景或挑戰(zhàn)性情況如強(qiáng)光反射、形狀扭曲這樣才能真實(shí)評估模型的泛化能力。實(shí)操心得在標(biāo)注初期可以先標(biāo)注100-200張圖片然后用YOLOv5訓(xùn)練幾個epoch輪次再用模型在驗(yàn)證集上跑一下推理觀察哪些形狀容易被誤檢或漏檢。這些“困難樣本”往往能告訴你數(shù)據(jù)集中缺少了哪種場景從而指導(dǎo)你進(jìn)行更有針對性的數(shù)據(jù)補(bǔ)充。這是一個“訓(xùn)練-評估-補(bǔ)充數(shù)據(jù)”的迭代過程。4. 模型訓(xùn)練超參數(shù)調(diào)優(yōu)與避坑指南有了高質(zhì)量的數(shù)據(jù)集下一步就是“喂”給模型進(jìn)行訓(xùn)練。YOLOv5的訓(xùn)練流程已經(jīng)高度自動化但其中幾個關(guān)鍵超參數(shù)的設(shè)置依然決定了模型是“學(xué)得快又好”還是“原地踏步”。4.1 核心超參數(shù)解析與設(shè)置我們主要關(guān)注train.py腳本中的幾個核心參數(shù)以及data/hyps/下的超參數(shù)配置文件。--weights: 指定預(yù)訓(xùn)練權(quán)重。強(qiáng)烈建議使用預(yù)訓(xùn)練權(quán)重如yolov5s.pt。這能利用在COCO等大型數(shù)據(jù)集上學(xué)到的通用特征如邊緣、紋理讓模型在我們的形狀數(shù)據(jù)集上收斂得更快、效果更好。這就是“遷移學(xué)習(xí)”的威力。--cfg: 指定模型結(jié)構(gòu)配置文件。我們使用models/yolov5s.yaml這是YOLOv5的小型模型在精度和速度上取得了很好的平衡。--data: 指定我們的數(shù)據(jù)集配置文件路徑即dataset.yaml。--epochs: 訓(xùn)練總輪次。對于我們的任務(wù)由于數(shù)據(jù)相對簡單100-150個epoch通常已經(jīng)足夠。可以通過觀察驗(yàn)證集損失val_loss不再顯著下降時提前停止。--batch-size: 批大小。根據(jù)你的GPU顯存來定。在顯存允許的情況下較大的batch size如16, 32通常能使訓(xùn)練更穩(wěn)定。我使用RTX 3060 12GB設(shè)置--batch-size 16。--img-size: 輸入圖像的尺寸。YOLOv5訓(xùn)練時會自動將圖片縮放到這個尺寸。默認(rèn)是640。對于形狀識別由于形狀特征相對簡單嘗試使用更小的尺寸如416可以進(jìn)一步加快訓(xùn)練和推理速度且精度損失很小。學(xué)習(xí)率lr0, lrf: 這是最重要的超參數(shù)之一。在hyp.scratch-low.yaml中定義。lr0是初始學(xué)習(xí)率lrf是最終學(xué)習(xí)率系數(shù)最終學(xué)習(xí)率 lr0 * lrf。對于使用預(yù)訓(xùn)練權(quán)重的微調(diào)任務(wù)學(xué)習(xí)率應(yīng)該設(shè)得比從頭訓(xùn)練小。我通常將lr0從0.01降低到0.001或0.0005以防止“沖掉”預(yù)訓(xùn)練模型中已有的有用特征。4.2 訓(xùn)練過程監(jiān)控與問題排查啟動訓(xùn)練后YOLOv5會在runs/train/exp目錄下生成豐富的日志和可視化結(jié)果。關(guān)鍵指標(biāo)看板train/box_loss,train/obj_loss,train/cls_loss: 訓(xùn)練集的邊界框回歸損失、目標(biāo)置信度損失和分類損失。理想情況下它們應(yīng)隨著epoch增加而平穩(wěn)下降。val/box_loss,val/obj_loss,val/cls_loss: 驗(yàn)證集上的相應(yīng)損失。這是評估模型泛化能力的核心。需關(guān)注其是否與訓(xùn)練損失同步下降且最終值較低。如果驗(yàn)證損失很早就開始上升而訓(xùn)練損失持續(xù)下降這是典型的過擬合信號。metrics/precision,metrics/recall,mAP0.5: 精度、召回率和平均精度。這是我們最關(guān)心的業(yè)務(wù)指標(biāo)。mAP0.5即IoU閾值為0.5時的平均精度達(dá)到0.95以上對于這個任務(wù)來說就是非常優(yōu)秀的模型了。常見問題與解決方案Loss為NaN或突然變得巨大這通常是學(xué)習(xí)率設(shè)置過高導(dǎo)致的“梯度爆炸”。立即停止訓(xùn)練大幅降低學(xué)習(xí)率lr0并檢查數(shù)據(jù)集中是否有損壞的圖片或標(biāo)注文件如坐標(biāo)值超出0-1范圍。訓(xùn)練Loss下降但驗(yàn)證Loss不降或上升過擬合增加數(shù)據(jù)增強(qiáng)的強(qiáng)度在hyp文件中調(diào)整hsv_h,hsv_s,hsv_v,degrees,translate,scale等參數(shù)。使用模型正則化技術(shù)如增加--weight-decay參數(shù)權(quán)重衰減。最根本的方法是收集更多樣化的驗(yàn)證集數(shù)據(jù)。模型完全學(xué)不會所有Loss居高不下首先檢查數(shù)據(jù)集配置dataset.yaml的路徑和類別名是否正確。檢查標(biāo)注格式是否為正確的YOLO歸一化格式。確認(rèn)是否加載了預(yù)訓(xùn)練權(quán)重--weights yolov5s.pt。將--img-size暫時調(diào)小如320降低任務(wù)難度看模型是否能開始學(xué)習(xí)。4.3 模型評估與選擇訓(xùn)練結(jié)束后YOLOv5會自動在驗(yàn)證集上運(yùn)行評估并生成一系列結(jié)果圖片和指標(biāo)文件。我們重點(diǎn)關(guān)注runs/train/exp/weights/目錄下的兩個權(quán)重文件best.pt: 在驗(yàn)證集上mAP0.5指標(biāo)最高的權(quán)重。last.pt: 最后一個epoch訓(xùn)練完的權(quán)重。務(wù)必使用best.pt作為最終模型進(jìn)行部署和測試。last.pt可能因?yàn)橛?xùn)練末期的波動而性能稍差。你可以使用YOLOv5自帶的detect.py腳本用best.pt在驗(yàn)證集或新的測試圖片上跑一遍直觀地查看檢測效果python detect.py --weights runs/train/exp/weights/best.pt --source data/images/val/ --conf-thres 0.5 --iou-thres 0.455. 推理部署將模型集成到OpenCV應(yīng)用流訓(xùn)練出一個好模型只是成功了一半如何將它高效、穩(wěn)定地集成到實(shí)際應(yīng)用中是另一半更考驗(yàn)工程能力的部分。我提供的inference_with_opencv.py腳本展示了一個標(biāo)準(zhǔn)的部署流程。5.1 核心推理流程拆解這個腳本的工作流程可以概括為以下幾步加載模型使用PyTorch加載我們訓(xùn)練好的best.pt權(quán)重文件。準(zhǔn)備輸入使用OpenCV的cv2.VideoCapture讀取攝像頭視頻流或者用cv2.imread讀取圖片。將獲取到的BGR圖像轉(zhuǎn)換為RGB并縮放至模型輸入尺寸如640x640。執(zhí)行推理將處理后的圖像張量輸入模型得到原始預(yù)測輸出。后處理這是最關(guān)鍵的一步。模型的原始輸出包含了大量重疊的預(yù)測框。我們需要置信度過濾根據(jù)--conf-thres如0.5過濾掉置信度低的預(yù)測。非極大值抑制NMS根據(jù)--iou-thres如0.45合并那些高度重疊的、預(yù)測同一物體的框。YOLOv5的utils.general模塊中提供了non_max_suppression函數(shù)來完成這個操作。結(jié)果可視化遍歷NMS后剩下的每一個預(yù)測框獲取其類別ID、置信度和邊界框坐標(biāo)此時坐標(biāo)是相對于640x640輸入尺寸的。我們需要將這些坐標(biāo)映射回原始圖像的尺寸上然后使用OpenCV的cv2.rectangle和cv2.putText函數(shù)將框和標(biāo)簽繪制到原始圖像上。顯示與輸出用cv2.imshow顯示實(shí)時檢測結(jié)果或使用cv2.imwrite保存結(jié)果圖片。5.2 性能優(yōu)化技巧在CPU上實(shí)現(xiàn)實(shí)時推理15 FPS需要一些技巧固定推理尺寸避免每次推理都動態(tài)調(diào)整圖像尺寸。如果應(yīng)用場景固定可以將輸入圖像固定為模型訓(xùn)練時的尺寸如640減少運(yùn)算量。使用Half-Precision (FP16)如果你的GPU支持在加載模型后使用model.half()將模型轉(zhuǎn)換為半精度浮點(diǎn)數(shù)可以顯著提升推理速度并減少顯存占用而對精度的影響微乎其微。OpenCV的DNN模塊對于終極部署可以考慮將PyTorch模型轉(zhuǎn)換為ONNX格式然后使用OpenCV的cv2.dnn.readNetFromONNX加載。OpenCV DNN模塊在CPU上的推理優(yōu)化做得非常好有時比直接使用PyTorch更快。這是一個進(jìn)階的部署選項(xiàng)。多線程處理對于視頻流應(yīng)用可以使用一個線程專門負(fù)責(zé)抓取視頻幀另一個線程負(fù)責(zé)推理再用一個線程負(fù)責(zé)顯示通過隊(duì)列進(jìn)行通信避免因推理耗時導(dǎo)致視頻卡頓。5.3 常見部署問題排查ModuleNotFoundError: No module named ‘opencv’這是環(huán)境問題。確保已通過pip install opencv-python正確安裝了OpenCV。有時在虛擬環(huán)境中可能需要指定版本pip install opencv-python4.8.x。模型加載失敗或輸出異常檢查加載的.pt文件路徑是否正確以及該文件是否完整沒有在下載或傳輸中損壞。確保用于推理的PyTorch版本與訓(xùn)練時大致相同避免版本不兼容。檢測框位置錯亂99%的問題出在坐標(biāo)映射上。務(wù)必仔細(xì)檢查后處理代碼中將模型輸出坐標(biāo)基于縮放后圖像如640x640轉(zhuǎn)換回原始圖像坐標(biāo)的計(jì)算過程。一個常見的錯誤是忘記了圖像在預(yù)處理時可能進(jìn)行了填充padding以保持長寬比這個填充的偏移量需要在坐標(biāo)轉(zhuǎn)換時考慮進(jìn)去。YOLOv5的推理腳本里有一個scale_coords函數(shù)就是專門用來做這個的可以參考它的實(shí)現(xiàn)。踩坑實(shí)錄我在第一次編寫自己的推理腳本時就遇到了檢測框漂移的問題。后來發(fā)現(xiàn)是自己在做圖像縮放時簡單粗暴地用了cv2.resize導(dǎo)致圖像長寬比失真而我在坐標(biāo)映射時沒有考慮這個失真比例。正確的做法應(yīng)該是先將圖像按比例縮放到長邊等于640然后在短邊兩側(cè)進(jìn)行填充padding使其達(dá)到640x640同時在坐標(biāo)轉(zhuǎn)換時需要減去填充的像素再按原始比例縮放。這個細(xì)節(jié)對檢測精度影響巨大。6. 項(xiàng)目擴(kuò)展與進(jìn)階思考完成基礎(chǔ)版的7種形狀識別后這個項(xiàng)目可以作為一個跳板向更多有趣和實(shí)用的方向擴(kuò)展。6.1 增加識別類別與難度更多形狀可以很容易地?cái)U(kuò)展數(shù)據(jù)集加入星形、十字形、箭頭等更復(fù)雜的形狀。只需要收集新數(shù)據(jù)在dataset.yaml中更新類別列表然后重新訓(xùn)練即可。YOLOv5支持增量學(xué)習(xí)你可以選擇在原有模型best.pt的基礎(chǔ)上進(jìn)行微調(diào)這樣能更快地讓模型學(xué)會新類別。顏色與形狀組合識別當(dāng)前模型只識別形狀。你可以修改標(biāo)注格式將“紅色圓形”、“藍(lán)色正方形”作為不同的類別或者在模型輸出后用OpenCV在檢測框內(nèi)提取顏色直方圖進(jìn)行二次判斷實(shí)現(xiàn)“形狀顏色”的多屬性識別。解決密集與小目標(biāo)如果場景中形狀非常小或非常密集可以嘗試使用YOLOv5更高分辨率的模型如--img-size 1280或者采用專門針對小目標(biāo)設(shè)計(jì)的檢測頭改進(jìn)。6.2 模型輕量化與邊緣部署模型剪枝與量化使用PyTorch提供的工具或第三方庫如torch.prune對訓(xùn)練好的模型進(jìn)行剪枝移除不重要的神經(jīng)元連接然后再進(jìn)行量化將FP32權(quán)重轉(zhuǎn)換為INT8可以大幅減少模型體積和提升推理速度非常適合部署到資源受限的邊緣設(shè)備如樹莓派、Jetson Nano或你提到的RV1106、RK3568等芯片。轉(zhuǎn)換為特定引擎格式為了在邊緣設(shè)備上獲得極致性能通常需要將模型轉(zhuǎn)換為設(shè)備廠商提供的專用格式。例如對于瑞芯微Rockchip的RK3568可能需要通過RKNN Toolkit將模型轉(zhuǎn)換為.rknn格式對于英偉達(dá)Jetson系列可以轉(zhuǎn)換為TensorRT格式。這個過程通常涉及ONNX作為中間格式。6.3 集成到實(shí)際應(yīng)用系統(tǒng)工業(yè)分揀配合機(jī)械臂可以用于分揀不同形狀的零件。你需要將檢測到的形狀中心像素坐標(biāo)通過相機(jī)標(biāo)定轉(zhuǎn)換為機(jī)械臂坐標(biāo)系下的真實(shí)世界坐標(biāo)。教育輔助工具開發(fā)一個互動應(yīng)用識別兒童積木的形狀和顏色并給出拼搭建議或進(jìn)行游戲。文檔分析與增強(qiáng)識別技術(shù)圖紙或圖表中的幾何圖形進(jìn)行自動分類和測量。可以結(jié)合OpenCV的輪廓分析功能精確計(jì)算圖形的面積、周長、角度等參數(shù)。這個基于YOLOv5和OpenCV的形狀識別項(xiàng)目就像一把鑰匙它為你打開了深度學(xué)習(xí)計(jì)算機(jī)視覺應(yīng)用開發(fā)的大門。從數(shù)據(jù)準(zhǔn)備、模型訓(xùn)練、調(diào)優(yōu)到最終部署你走過的完整流程正是解決絕大多數(shù)視覺識別問題的標(biāo)準(zhǔn)路徑。希望這個詳細(xì)的拆解和其中分享的經(jīng)驗(yàn)教訓(xùn)能幫助你更快地上手自己的視覺項(xiàng)目少走一些我曾經(jīng)走過的彎路。本文還有配套的精品資源點(diǎn)擊獲取