摘要:本文深入研究了基於YOLOv8/v7/v6/v5的商品標籤識別,核心採用YOLOv8並整合了YOLOv7、YOLOv6、YOLOv5演算法,進行效能指標對比;詳述了國內外研究現狀、資料集處理、演算法原理、模型構建與訓練程式碼,及基於Streamlit的互動式Web應用介面設計。在Web網頁中可以支援影像、影片和實時攝像頭進行商品標籤識別,可上傳不同訓練模型(YOLOv8/v7/v6/v5)進行推理預測,介面可方便修改。本文附帶了完整的網頁設計、深度學習模型程式碼和訓練資料集的下載連結。
@
- 1. 網頁功能與效果
- 2. 緒論
- 2.1 研究背景及意義
- 2.2 國內外研究現狀
- 2.3 要解決的問題及其方案
- 2.3.1 要解決的問題
- 2.3.2 解決方案
- 2.4 博文貢獻與組織結構
- 3. 資料集處理
- 4. 原理與程式碼介紹
- 4.1 YOLOv8演算法原理
- 4.2 模型構建
- 4.3 訓練程式碼
- 5. 實驗結果與分析
- 5.1 訓練曲線
- 5.2 F1曲線圖
- 5.3 YOLOv8/v7/v6/v5對比實驗
- 6. 系統設計與實現
- 6.1 系統架構概覽
- 6.2 系統流程
- 程式碼下載連結
- 7. 結論與未來工作
➷點選跳轉至文末所有涉及的完整程式碼檔案下載頁☇
完整資源中包含資料集及訓練程式碼,環境配置與介面中文字、圖片、logo等的修改方法請見影片,專案完整檔案下載請見演示與介紹影片的簡介處給出:➷➷➷
演示與介紹影片 :https://www.bilibili.com/video/BV1bK421h742/
YOLOv8/v7/v6/v5專案合集下載:https://mbd.pub/o/bread/mbd-ZZ2YmJ1v
YOLOv8和v5專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Ylp5v
YOLOv7專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl5tr
YOLOv6專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2YmJdw
若您想獲得博文中涉及的實現完整全部資原始檔(包括測試圖片、影片,py, UI檔案,訓練資料集、訓練程式碼、介面程式碼等),這裡已打包上傳至博主的麵包多平臺,見可參考部落格與影片,已將所有涉及的檔案同時打包到裡面,點選即可執行,完整檔案截圖如下:
1. 網頁功能與效果
(1)開啟攝像頭實時檢測:本系統允許使用者透過網頁直接開啟攝像頭,實現對實時影片流中商品標籤的檢測。系統將自動識別並分析畫面中的商品標籤,並將檢測結果實時顯示在使用者介面上,為使用者提供即時的反饋。
(2)選擇圖片檢測:使用者可以上傳本地的圖片檔案到系統中進行商品標籤識別。系統會分析上傳的圖片,識別出圖片中的商品標籤,並在介面上展示帶有商品標籤標籤和置信度的檢測結果,讓使用者能夠清晰地瞭解到每個商品標籤狀態。
(3)選擇影片檔案檢測:系統支援使用者上傳影片檔案進行商品標籤識別。上傳的影片將被系統逐幀分析,以識別和標記影片中每一幀的商品標籤。使用者可以觀看帶有商品標籤標記的影片,瞭解影片中商品標籤的變化。
(4)選擇不同訓練好的模型檔案:系統整合了多個版本的YOLO模型(如YOLOv8/v7/v6/v5),使用者可以根據自己的需求選擇不同的模型進行商品標籤識別。這一功能使得使用者能夠靈活地比較不同模型的表現,以選擇最適合當前任務的模型。
在“網頁功能與效果”展示章節中,我們詳細介紹了本商品標籤識別系統所提供的一系列強大功能,以及這些功能如何協同作用,以提高使用者體驗和識別效率。下面是這些功能的整合描述:
首先,實時攝像頭檢測功能允許使用者直接透過網頁攝像頭進行實時的商品標籤識別,確保了即時性和便捷性。緊隨其後,圖片檢測和影片檔案檢測功能為使用者提供了上傳本地圖片或影片檔案進行識別的能力,支援多種常見格式,適用於靜態影像和動態影片的深入分析。為了適應不同的識別需求,我們提供了模型選擇功能,透過一個下拉選單,使用者可以輕鬆選擇不同的訓練好的模型(如YOLOv8/v7/v6/v5),以探索不同模型的效能差異。
為了增強使用者的互動體驗和結果分析的深度,系統設計了靈活的顯示選項,使得檢測畫面和原始畫面可以根據使用者的需要同時或單獨顯示。透過目標篩選顯示功能,使用者可以在一個可操作的下拉框中單獨標記並顯示特定的目標識別結果,極大地提高了結果的可讀性和實用性。
此外,識別結果的實時展示和調整變得更加直觀高效,使用者可以在頁面的表格中看到檢測結果,並透過動態調整置信度閾值和IOU閾值來獲得最佳的識別效果。為了方便使用者儲存和進一步分析這些結果,系統還提供了一個功能,允許使用者將檢測結果以CSV檔案的形式匯出。最後,匯出功能進一步增強了系統的實用性,使用者可以將標記過的圖片、影片以及實時畫面結果匯出為AVI格式的影像檔案,便於記錄、分享和後續處理。
透過這些功能的綜合展示和操作演示,本章節不僅向使用者展示了系統的高階功能和實用性,還透過一系列的螢幕截圖和影片演示,直觀地演示了每個功能的具體效果,確保使用者能夠快速掌握如何高效利用本系統進行商品標籤識別。
2. 緒論
2.1 研究背景及意義
在當今的零售和電子商務領域,商品標籤識別技術的重要性不斷增加。這一技術能夠自動識別商品圖片中的標籤資訊,如品牌、型號和價格等,從而支援庫存管理、自動結賬、線上搜尋以及推薦系統等應用。隨著人工智慧和機器學習技術的快速發展,特別是深度學習在影像識別領域的突破,商品標籤識別已經取得了顯著進展。YOLO(You Only Look Once)系列演算法作為其中的佼佼者,以其高效的檢測速度和良好的識別準確率,成為了研究的熱點。
商品標籤識別對於零售業而言尤為重要,它可以大幅提高商品管理的效率和準確性,減少人力成本,並且提高顧客的購物體驗。例如,在自動結賬系統中,顧客無需等待收銀員逐一掃描商品,系統可以自動識別購物車中所有商品的標籤,大大加快結賬流程。線上購物領域,準確的商品標籤識別可以幫助提高搜尋結果的相關性,改善商品推薦的準確性,為消費者提供更加個性化的購物體驗。
儘管商品標籤識別技術已經取得了顯著的進展,但在實際應用中仍面臨許多挑戰,如不同光照條件下的識別準確性、商品標籤的多樣性和複雜性、以及大規模資料處理的效率等。近年來,研究者們透過深度學習演算法的改進、模型最佳化以及大規模資料集的構建和應用,不斷推動這一領域的發展。
商品標籤識別技術在零售和電子商務領域具有廣泛的應用前景和重要的研究價值。透過深入研究和不斷最佳化深度學習模型,尤其是YOLO系列演算法,能夠有效提升商品標籤識別的準確度。
2.2 國內外研究現狀
在探討商品標籤識別的研究現狀時,我們見證了從傳統影像處理技術到深度學習演算法,尤其是卷積神經網路(CNN)在這一領域內的廣泛應用和顯著成果。深度學習的引入,尤其是YOLO(You Only Look Once)系列演算法,為商品標籤識別帶來了革命性的進步。
YOLO演算法因其一次性檢視整幅影像並進行預測的特點,相較於傳統的滑動視窗和區域建議方法,大幅提高了識別速度,成為實時物件檢測領域的里程碑。自YOLOv1[1]首次提出以來,每一次迭代都旨在改進速度、準確性或兩者的平衡。例如,YOLOv4透過引入新的骨架網路CSPDarknet53,和一系列的最新檢測技術如CIoU loss和Cross mini-Batch Normalization,顯著提升了模型的效能和效率。緊接著,YOLOv5[2]的釋出,雖在社群中關於官方版權的爭議中產生,但以其出色的速度和適配性,迅速被廣泛應用於實際場景。
隨著技術的不斷進步,YOLOv6[3]和YOLOv7[4]相繼出現,它們在效能和精度上都有所提升,透過最佳化模型結構和引入新的訓練策略,進一步加強了模型對小目標的檢測能力和在複雜背景下的魯棒性。YOLOv8[5]作為最新一代的YOLO演算法,雖然詳細資訊和文獻尚未廣泛公佈,但預計將在速度、準確性和模型大小上實現新的突破。
除了YOLO系列,其他深度學習演算法如Faster R-CNN和SSD也在商品標籤識別上有所應用。Faster R-CNN透過引入區域提議網路(RPN),在保證較高準確性的同時,提升了檢測速度。而SSD演算法透過直接在不同尺度的特徵圖上進行檢測,實現了較好的速度和準確度平衡。
資料集的發展對商品標籤識別的研究同樣至關重要。近年來,隨著大規模和高質量資料集的構建,如COCO、ImageNet和Open Images等,研究者能夠在更加豐富多樣的資料上訓練和測試模型,推動了演算法效能的進一步提升。這些資料集不僅提供了大量的標註影像,還包含了複雜的場景和多樣的目標類別,為模型的訓練和驗證提供了寶貴的資源。
儘管取得了顯著進展,商品標籤識別技術仍面臨諸多挑戰,包括在複雜背景下的準確性、不同光照和視角條件下的穩定性、以及實時處理大規模資料的效率等。未來的研究趨勢可能會集中在演算法的進一步最佳化、深度學習模型的輕量化和硬體最佳化、以及新資料集的開發上,旨在克服現有挑戰,推動商品標籤識別技術向更高的準確性、效率和實用性發展。
2.3 要解決的問題及其方案
2.3.1 要解決的問題
在開發基於YOLOv8/v7/v6/v5的商品標籤識別系統中,我們面臨著一系列的技術挑戰,同時也制定了相應的解決方案來克服這些問題。本系統使用PyTorch作為深度學習的技術框架,依託於Streamlit來構建使用者友好的網頁設計,並且在開發過程中採用PyCharm作為IDE,以最佳化開發流程和提升程式碼質量。以下詳細介紹了要解決的問題及對應的解決方案。
- 模型準確性和實時性的平衡:在商品標籤識別中,需要確保模型既能快速響應也能保持高準確度,尤其是在處理影片流或攝像頭實時畫面時。
- 不同版本模型的整合和對比:整合YOLOv8/v7/v6/v5等多個版本的模型到一個系統中,需要處理不同模型的介面和效能特點,為使用者提供清晰的效能對比。
- 網頁互動介面設計:需要建立一個直觀易用的網頁介面,允許使用者輕鬆上傳圖片、影片,操作攝像頭,並能夠無縫切換不同的模型進行識別測試。
- 使用者介面美化:除了功能實現外,還需透過CSS等技術最佳化介面的美觀性,提升使用者體驗。
- 深度學習模型與網頁的整合:將訓練好的深度學習模型整合到網頁應用中,實現在網頁端的模型推理和檢測。
2.3.2 解決方案
針對本系統面臨的挑戰,我們將採取一系列綜合措施來設計和實現基於YOLOv8/v7/v6/v5的商品標籤識別系統,確保它既準確又高效,同時提供良好的使用者體驗和強大的資料處理能力。
- 最佳化模型結構和訓練策略:透過對YOLO系列模型的深入研究和對比分析,選擇或自定義最適合商品標籤識別任務的模型架構。使用高效的訓練技術,如遷移學習和資料增強,以提高模型在實際應用中的準確性和速度。
- 模組化設計:採用模組化設計思路,為每個版本的YOLO模型設計統一的介面,使得在系統中整合和切換不同版本的模型變得簡單直接。
- 使用Streamlit構建互動介面:利用Streamlit強大的互動式Web應用構建功能,開發包含圖片、影片、攝像頭實時檢測等功能的使用者介面。Streamlit支援快速迭代和易於部署的特點,極大地簡化了開發流程。
- CSS美化和響應式設計:透過精心設計的CSS樣式,改進使用者介面的視覺效果和使用者體驗。同時,考慮到不同裝置的相容性,採用響應式設計確保網頁在各種螢幕大小上都能保持良好的佈局和可用性。
- 整合深度學習模型到Web應用:透過PyTorch的序列化工具將訓練好的模型匯出,並在Streamlit應用中載入模型進行推理。結合JavaScript和其他前端技術,實現模型檢測結果的動態展示和互動。
透過這些針對性的解決方案,我們能夠有效地克服在開發商品標籤識別系統中遇到的技術挑戰,不僅保證了系統的效能和實用性,也提供了高質量的使用者體驗。
2.4 博文貢獻與組織結構
在探索商品標籤識別的領域中,本文提出了一套綜合性的解決方案,系統地介紹了從資料集處理到深度學習模型的選取、再到最終的網頁應用實現的全過程。我們的工作不僅涵蓋了任務相關的文獻綜述,還詳細討論了使用YOLOv8/v7/v6/v5等最新深度學習模型進行商品標籤識別的方法。此外,本文還利用PyTorch作為技術框架,深入介紹了模型訓練與推理檢測的過程,並基於Streamlit設計了一個美觀且使用者友好的網頁介面,實現了圖片、影片及攝像頭的實時檢測功能,並支援切換不同的模型檔案。為了增強網頁的視覺效果和使用者體驗,我們還採用了CSS進行了美化設計。所有的開發工作都在PyCharm這一整合開發環境下完成,確保了開發過程的高效和規範。
-
文獻綜述與技術回顧:深入分析了當前商品標籤識別領域的研究現狀,包括最新的深度學習模型和技術挑戰,為讀者提供了一個全面的技術背景概覽。
-
資料集處理:詳細介紹了資料集的選擇、處理和增強技術,確保了模型訓練的高效性和準確性。
-
深度學習模型的選擇與應用:對比分析了YOLOv8/v7/v6/v5等不同版本的效能和特點,為商品標籤識別任務選擇了最適合的模型。
-
美觀友好的網頁設計:基於Streamlit框架,設計並實現了一個整合了深度學習檢測演算法的網頁應用,支援多種檢測模式和模型切換,提升了使用者互動體驗。
-
演算法效果對比與分析:透過實驗驗證了不同YOLO模型在商品標籤識別任務上的效果,為模型選擇提供了實證支援。
-
完整的資源分享:提供了完整的資料集、訓練與預測程式碼,以及網頁設計的資源包,便於讀者學習和應用。
後續章節的組織結構如下: 緒論:介紹研究背景、目的和本文的主要貢獻;演算法原理:詳細介紹YOLOv8/v7/v6/v5等演算法的工作原理及其在商品標籤識別中的應用;資料集處理:討論使用的資料集及其預處理、增強方法。程式碼介紹:提供模型訓練和預測的詳細程式碼說明,包括環境搭建、引數配置和執行步驟。實驗結果與分析:展示不同模型在商品標籤識別任務上的實驗結果,並進行比較分析。系統設計與實現:介紹基於Streamlit的商品標籤識別系統的設計與實現細節。結論與未來工作:總結本文的研究成果,並討論未來的研究方向和潛在的改進空間。
3. 資料集處理
在我們的研究中,開發了一個具有挑戰性的商品標籤識別資料集,該資料集專為深化商品標籤識別模型的訓練、驗證和測試而設計。資料集由11,974張影像組成,分佈在訓練集(9,765張)、驗證集(1,579張)和測試集(630張)中。這種分佈有助於確保模型能夠在廣泛的資料樣本上進行有效學習,並在獨立的資料集上進行精確效能評估。博主使用的類別如下:
Chinese_name = {"AlcoholPercentage": "酒精濃度", "Appellation AOC DOC AVARegion": "產區 AOC DOC AVA",
"Appellation QualityLevel": "產區質量等級", "CountryCountry": "國家", "Distinct Logo": "特有標誌",
"Established YearYear": "建立年份", "Maker-Name": "製造商名稱", "TypeWine Type": "酒類型別",
"VintageYear": "年份"}
資料集的複雜性反映在所包含的標籤種類多樣性以及影像背景和光照條件的不確定性上。我們的資料集不僅涵蓋了多種酒類,還包括了不同的品牌、年份和產地等資訊。這種多樣性為模型訓練提供了豐富的視覺特徵和標籤分類的挑戰。為了確保模型在現實世界場景中能夠實現最佳效能,我們採取了一系列的預處理和增強步驟來模擬不同的操作條件。
在預處理階段,所有影像自動調整方向,並剝離了EXIF資訊,這一步驟避免了因方向錯誤或後設資料資訊而導致的潛在偏差。影像隨後被統一調整為640x640畫素的大小,以滿足深度學習模型的輸入要求。資料增強包括隨機90度旋轉,以及在-10到+10度範圍內的細微旋轉調整,以提高模型對旋轉不變性的學習能力。亮度和曝光的隨機調整模擬了不同光照條件,而隨機高斯模糊則增加了模型對影像質量變化的魯棒性。這些增強步驟增加了資料的多樣性,並提高了模型對現實世界中條件變化的適應能力。
從資料集分佈圖中,我們可以深入瞭解標籤類別和尺寸分佈的特徵。‘Wine Type’和‘Established year’類別的標籤例項最多,而其他類別如‘Alcohol percentage’和‘Country’的例項較少。中心點分佈圖顯示標籤傾向於集中在影像中心區域,而標籤尺寸分佈圖揭示了大部分標籤具有類似的寬高比,但也存在尺寸變化。這些統計資料對於指導我們的模型訓練策略至關重要。為了避免“中心偏見”,我們可以考慮在資料預處理時引入邊緣裁剪,以及採用重取樣技術以平衡不同類別標籤的訓練樣本數量。
透過這種細緻的資料準備和深入的資料分析,我們確保了資料集能夠支撐起高效且可靠的商品標籤識別模型的開發。透過利用YOLOv8/v7/v6/v5等先進的深度學習架構,我們能夠探索不同模型架構對於各種商品標籤分類的效果,進而最佳化我們的檢測系統,以適應商業應用的需求。
4. 原理與程式碼介紹
4.1 YOLOv8演算法原理
YOLOv8是目前最新一代的實時物件檢測演算法,其在前幾代YOLO演算法的基礎上進行了顯著的改進和創新。YOLOv8繼承了YOLOv3使用的Darknet53作為主幹網路,這個網路結構已經證明在物件檢測任務中效率和效果俱佳。YOLOv8則在此基礎上進一步最佳化,它引入了從YOLOv5中借鑑的C3模組,並且借鑑了YOLOv7中的有效層級聚合(Efficient Layer Aggregation networks, ELAN)技術,以改善特徵提取和增強網路的表徵能力。
在YOLOv8中,C3模組由Bottleneck構成,這些Bottleneck模組在提取特徵的同時,透過引入殘差連線來避免潛在的梯度消失問題,確保了即使在網路較深的情況下,資訊也可以有效地傳播。這種設計不僅使網路在提取特徵時更為高效,而且也有助於網路學習到更復雜的特徵表示,這對於提高模型的準確性和魯棒性至關重要。
YOLOv8還採用了路徑聚合網路(Path Aggregation Network, PANet)來進一步增強特徵金字塔的連線。這種結構透過增強不同尺度特徵之間的連線,以提升模型在檢測不同尺度物件時的效能。特別是對於小目標的檢測,這種層級的特徵聚合可以顯著提高檢測的準確度。
最後,YOLOv8在錨定機制上也做出了創新,它採用了無錨(None-anchor)機制,這是一種不依賴預設錨點的檢測方法。傳統的YOLO演算法會使用多個預設的錨點來預測物件的位置和尺寸,但這種方法需要大量的手工調整和最佳化。無錨機制的引入使得模型不再依賴於這些預設的錨點,而是透過網路直接預測物件的邊界框,這種方法簡化了訓練流程,同時有助於提高模型對各種尺寸物件的檢測能力。
綜上所述,YOLOv8透過引入先進的模組化設計、增強的特徵聚合以及創新的無錨檢測機制,提供了更為精確和高效的實時物件檢測能力。這些技術的結合不僅提升了模型在標準資料集上的表現,更重要的是,它們使模型能夠更好地適應實際應用中的多變環境和挑戰,為實時物件檢測領域帶來了新的突破。
4.2 模型構建
在這一部分的部落格中,我們將介紹如何使用深度學習模型來構建一個商品標籤識別系統。程式碼的主體框架基於Python語言,並採用了OpenCV和PyTorch庫,這些工具的結合為我們的模型提供了強大的影像處理和深度學習功能。下面,讓我們逐段深入分析程式碼的每個部分。
首先,我們匯入了必要的庫,其中OpenCV用於處理影像和影片,PyTorch用於深度學習相關的操作。QtFusion.models 和 datasets.label_name 包含了檢測器的基礎類和資料集類別名稱。ultralytics 庫提供了YOLO模型相關的工具和函式。
import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device
我們定義了 ini_params 字典來設定模型執行的初始引數,包括在哪個裝置上執行模型(CPU或GPU)、物件的置信度閾值、非最大抑制的IOU閾值,以及類別過濾器的設定。這些引數對於後續模型的效能和預測輸出非常關鍵。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
'device': device,
'conf': 0.25,
'iou': 0.5,
'classes': None,
'verbose': False
}
程式碼中的 count_classes 函式用於計數每個類別出現的次數。這對於瞭解資料集中各類標籤的分佈非常有用,也幫助我們在分析模型輸出時保持組織性。
def count_classes(det_info, class_names):
count_dict = {name: 0 for name in class_names}
for info in det_info:
class_name = info['class_name']
if class_name in count_dict:
count_dict[class_name] += 1
count_list = [count_dict[name] for name in class_names]
return count_list
隨後,我們定義了一個繼承自 Detector 類的 YOLOv8v5Detector 類。這個類負責封裝YOLO模型,並提供了一系列方法來載入模型、預處理影像、執行預測和後處理預測結果。load_model 方法透過指定的模型路徑載入預訓練的YOLO模型,利用 select_device 函式確保模型執行在正確的裝置上。此方法也預熱模型,為了確保模型在處理實際資料前已經調整到最佳狀態。preprocess 方法負責執行任何影像預處理步驟。在本案例中,它簡單地儲存了傳入的原始影像。然而,在實際應用中,此方法可以進行影像裁剪、縮放、歸一化等操作。predict 方法是模型預測的核心,它呼叫YOLO模型對預處理後的影像進行檢測。該方法利用 ini_params 中定義的引數來控制預測過程,並生成原始的預測結果。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
def load_model(self, model_path):
self.device = select_device(self.params['device'])
self.model = YOLO(model_path)
names_dict = self.model.names
self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
def postprocess(self, pred):
results = []
for res in pred[0].boxes:
for box in res:
class_id = int(box.cls.cpu())
bbox = box.xyxy.cpu().squeeze().tolist()
bbox = [int(coord) for coord in bbox]
result = {
"class_name": self.names[class_id],
"bbox": bbox,
"score": box.conf.cpu().squeeze().item(),
"class_id": class_id,
}
results.append(result)
return results
def set_param(self, params):
self.params.update(params)
在 postprocess 方法中,我們將YOLO模型的原始輸出轉換為更加可讀和易於理解的格式。它遍歷每一個預測結果,並將類別編號轉換為中文名稱,同時提取並格式化邊界框座標和置信度分數。這種格式化是與終端使用者互動所必需的,也為進一步的資料分析提供了方便。最後,set_param 方法允許我們動態更新模型引數。這在實踐中非常有用,因為它可以根據不同的使用情景或使用者輸入調整模型的行為。
總的來說,這段程式碼展現了從載入模型到獲取實用預測結果的整個流程。每一步都精心設計,確保模型不僅可以高效地執行任務,同時也保證了結果的準確性和易於理解。
4.3 訓練程式碼
在這一部分的部落格中,我們將詳細介紹如何使用YOLO模型進行商品標籤識別的深度學習模型的訓練過程。我們將透過解釋訓練程式碼的每一部分來闡明整個訓練流程。以下表格詳細介紹了YOLOv8模型訓練中使用的一些重要超引數及其設定:
超引數 | 設定 | 說明 |
---|---|---|
學習率(lr0 ) |
0.01 | 決定了模型權重調整的步長大小,在訓練初期有助於快速收斂。 |
學習率衰減(lrf ) |
0.01 | 控制訓練過程中學習率的降低速度,有助於模型在訓練後期細緻調整。 |
動量(momentum ) |
0.937 | 加速模型在正確方向上的學習,並減少震盪,加快收斂速度。 |
權重衰減(weight_decay ) |
0.0005 | 防止過擬合,透過在損失函式中新增正則項減少模型複雜度。 |
熱身訓練週期(warmup_epochs ) |
3.0 | 初始幾個週期內以較低的學習率開始訓練,逐漸增加到預定學習率。 |
批次大小(batch ) |
16 | 每次迭代訓練中輸入模型的樣本數,影響GPU記憶體使用和模型效能。 |
輸入影像大小(imgsz ) |
640 | 模型接受的輸入影像的尺寸,影響模型的識別能力和計算負擔。 |
環境設定與模型載入:首先,我們匯入必要的庫。os 用於作業系統路徑和檔案操作,torch 是PyTorch庫的核心,它為深度學習模型訓練提供支援,而 yaml 用於處理YAML檔案,這是一種常用於配置檔案的資料序列化格式。我們還從 ultralytics 包中匯入了 YOLO 類,這是用於載入和訓練YOLO模型的工具類。QtFusion.path 中的 abs_path 函式用於獲取檔案的絕對路徑。
import os
import torch
import yaml
from ultralytics import YOLO # 用於載入YOLO模型
from QtFusion.path import abs_path # 用於獲取檔案的絕對路徑
程式碼首先檢測是否存在GPU資源,並據此設定訓練所用的裝置。利用GPU進行訓練可以大大加速模型的訓練過程,這在處理大規模資料集時尤為重要。
device = "0" if torch.cuda.is_available() else "cpu"
資料集準備:我們設定了工作執行緒數量和批次大小。工作執行緒負責在訓練過程中載入資料,而批次大小決定了每次迭代處理的資料量。接下來,我們設定了資料集配置檔案的路徑,並將其Unix樣式的路徑轉換為系統無關的格式。這裡的 data_name 變數是我們訓練資料集的名稱,透過拼接字串得到資料集配置檔案的路徑。
workers = 1 # 工作程序數
batch = 8 # 每批處理的影像數量
data_name = "WineLabel"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
接下來,我們開啟並讀取YAML檔案,檢查其中是否包含了 path 鍵,它應該指向我們資料集的位置。如有必要,我們會更新這個路徑,並將新的資料寫回檔案。這確保了當YOLO模型載入資料集進行訓練時,能夠找到正確的檔案和目錄。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
訓練模型:最後,我們初始化YOLO模型並開始訓練。在這裡,我們載入了預訓練的權重(假設是 yolov8n.pt),並設定了諸如影像大小、訓練週期等重要的訓練引數。model.train 方法是PyTorch模型訓練的入口,它接收上述所有引數,並執行訓練過程。訓練完成後,模型會自動儲存在指定的路徑。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 載入預訓練的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 載入預訓練的YOLOv8模型
# Training.
results = model.train( # 開始訓練模型
data=data_path, # 指定訓練資料的配置檔案路徑
device=device, # 自動選擇進行訓練
workers=workers, # 指定使用2個工作程序載入資料
imgsz=640, # 指定輸入影像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='train_v5_' + data_name # 指定訓練任務的名稱
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 載入預訓練的YOLOv8模型
results2 = model.train( # 開始訓練模型
data=data_path, # 指定訓練資料的配置檔案路徑
device=device, # 自動選擇進行訓練
workers=workers, # 指定使用2個工作程序載入資料
imgsz=640, # 指定輸入影像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='train_v8_' + data_name # 指定訓練任務的名稱
)
透過上述介紹,我們得知了模型訓練的各個環節和配置的重要性。正確的配置和最佳化後的訓練流程對於訓練一個有效的商品標籤識別模型至關重要。
5. 實驗結果與分析
5.1 訓練曲線
在深入分析YOLOv8模型訓練過程中的損失函式影像時,我們觀察到一系列的指標,這些指標對於評估模型效能和訓練過程的有效性至關重要。
從損失函式的曲線來看,我們注意到訓練集上的框損失(train/box_loss)、分類損失(train/cls_loss)以及目標函式損失(train/obj_loss)隨著訓練週期的增加而逐漸下降。這表明隨著訓練的進行,模型在定位目標和分類正確性方面越來越精確。驗證集上的損失也呈下降趨勢,這意味著模型對未見過的資料具有良好的泛化能力。然而,驗證集損失曲線的波動幅度稍大於訓練集損失,這可能是由於模型在處理驗證資料時遇到了之前未見過的情況。
進一步觀察精確度(metrics/precision)和召回率(metrics/recall)曲線,我們看到兩者在訓練期間都有所提升,且呈上升趨勢。精確度衡量的是模型識別為正的樣本中真正為正的比例,而召回率衡量的是在所有正樣本中,模型識別出來的比例。召回率的穩步提高表示模型遺漏的正樣本數量在減少。而精確度的上升則意味著模型在做出肯定預測時越來越準確。
對於模型效能的另一重要指標是平均精度(metrics/mAP),在YOLO模型評估中通常使用。圖中 metrics/mAP50 和 metrics/mAP50-95 顯示了模型在不同IoU閾值下的平均精度。IoU(Intersection over Union)是一種評估預測框與真實框重疊程度的度量。mAP50 表示IoU閾值為0.5時的mAP,而 mAP50-95 是在IoU從0.5到0.95不同閾值的mAP的平均值。這兩個指標的逐漸上升表明模型的整體檢測能力在增強,能夠更準確地識別並定點陣圖片中的物件。
結合這些度量指標和損失曲線,可以認為模型的訓練過程是成功的。損失函式的持續下降證明了模型在訓練過程中學習到了有效的特徵,而度量指標的提升則顯示了模型對訓練資料集的適應性和對新資料的泛化能力。然而,度量指標的波動也提示我們,可能需要進一步的資料增強或者是超引數調整,以確保模型的穩定性和魯棒性。
5.2 F1曲線圖
在深入分析我們的酒標籤識別模型效能時,F1分數作為精確度和召回率的調和平均,提供了一個全面衡量檢測效能的指標。
曲線圖中的每條線代表了不同類別在模型預測中的F1分數變化情況。一般而言,F1分數隨著置信度閾值的增加先上升後下降,其頂點即為該類別最佳的置信度閾值。理想情況下,我們希望這些曲線儘可能的高和平滑,這表示模型對於大多數樣本都有很好的預測效能。
在所有類別的綜合F1分數(用藍色線表示)中,我們注意到,在置信度約為0.34的位置,F1分數達到了峰值0.65。這個綜合分數是所有類別分數的加權平均,它反映了模型整體的效能。達到這樣的F1分數意味著我們的模型在整體上表現良好,但仍有提升空間。
單獨來看,某些類別如“AlcoholPercentage”和“VintageYear”在較低的置信度閾值時即展現出較高的F1分數,說明這些類別的特徵可能更加顯著和容易被模型學習。相反,“CountryCountry”和“Appellation AOC DOC AVARegion”類別的曲線在較高的置信度閾值處才達到峰值,這表明它們可能包含更加細微或複雜的特徵,需要模型有更高的置信度才能做出準確預測。
對於所有類別而言,隨著置信度閾值的增加,F1分數呈現下降趨勢,這是由於模型開始變得過於保守,只對極其自信的檢測結果作出響應,從而忽視了一些正確的預測。這種趨勢強調了選擇合適的置信度閾值的重要性,以平衡精確度和召回率。
整體而言,這個F1分數的曲線圖為我們最佳化模型提供了實際的指導。透過調整置信度閾值,我們可以改善模型對特定類別的識別效能。此外,這些分析結果還提示我們,可能需要對模型結構進行微調或進一步訓練,尤其是對那些F1分數較低的類別。透過繼續最佳化模型引數或採用資料增強等策略,我們有望提高模型在所有類別上的識別能力,進而提高整體的F1分數。
5.3 YOLOv8/v7/v6/v5對比實驗
(1)實驗設計:
本實驗旨在評估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在商品標籤目標檢測任務上的效能。為了實現這一目標,博主分別使用使用相同的資料集訓練和測試了這四個模型,從而可以進行直接的效能比較。該資料集包含商品標籤的影像。本文將比較分析四種模型,旨在揭示每種模型的優缺點,探討它們在工業環境中實際應用的場景選擇。
模型 | 影像大小 (畫素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 引數數量 (百萬) | FLOPs (十億) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指標:
- F1-Score:F1-Score 作為衡量模型效能的重要指標,尤其在處理類別分佈不均的資料集時顯得尤為關鍵。它透過結合精確率與召回率,提供了一個單一的度量標準,能夠全面評價模型的效能。精確率衡量的是模型在所有被標記為正例中真正屬於正例的比例,而召回率則關注於模型能夠識別出的真正正例佔所有實際正例的比例。F1-Score透過兩者的調和平均,確保了只有當精確率和召回率同時高時,模型的效能評估才會高,從而確保了模型對於正例的預測既準確又完整。
- mAP(Mean Average Precision):在目標檢測任務中,Mean Average Precision(mAP)是評估模型效能的重要標準。它不僅反映了模型對單個類別的識別精度,而且還考慮了所有類別的平均表現,因此提供了一個全域性的效能度量。在計算mAP時,模型對於每個類別的預測被單獨考慮,然後計算每個類別的平均精度(AP),最後這些AP值的平均數形成了mAP。
名稱 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.635 | 0.604 | 0.671 | 0.667 |
F1-Score | 0.62 | 0.60 | 0.67 | 0.65 |
(3)實驗結果分析:
在我們的實驗中,目的是對比YOLO系列的四個版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同的商品標籤識別任務上的效能。實驗的結果顯示,各個模型在平均精度(mAP)和F1-Score兩個關鍵效能指標上表現出不同程度的差異。
首先,從平均精度來看,YOLOv7-tiny以0.671的mAP得分表現最佳,緊隨其後的是YOLOv8n,mAP得分為0.667。相比之下,YOLOv5nu和YOLOv6n的表現稍遜一籌,分別為0.635和0.604。在F1-Score指標上,YOLOv7-tiny同樣以0.67的得分領先,而YOLOv8n以略低的0.65分位居第二,YOLOv5nu和YOLOv6n的得分則分別為0.62和0.60。這一結果反映了YOLOv7-tiny和YOLOv8n在精度和召回率的綜合表現上相對更加均衡。
深入分析YOLOv7-tiny之所以能夠取得最優的mAP和F1-Score可能與其模型架構的細節調整有關。例如,YOLOv7-tiny可能採用了更高效的特徵提取器或更最佳化的錨點設定,這可以幫助模型更好地定位和分類不同型別的酒標籤。此外,YOLOv7-tiny可能在處理小尺寸目標或複雜背景中的物體時更為精確,這在商品標籤識別任務中尤為關鍵。
與此同時,YOLOv8n雖然在F1-Score上略低於YOLOv7-tiny,但其效能依然十分出色,顯示出該版本在識別準確性和魯棒性方面的顯著提升。YOLOv8n作為系列中的最新版本,可能包含了最先進的網路架構最佳化和訓練技巧,如使用更多的資料增強、更精細的損失函式設計等,這有助於模型在多樣化的資料集上實現更好的泛化。
相比之下,YOLOv5nu和YOLOv6n的效能略顯不足,這可能是由於它們使用的網路架構和訓練策略相對較舊,無法充分捕獲資料的複雜性,或在特徵提取上不夠精細。例如,這些版本可能在面對密集或遮擋的標籤時,其效能下降更明顯,這在實際應用中可能導致識別率下降。
總體而言,這一系列實驗不僅展示了YOLO系列在商品標籤識別任務上的強大能力,而且也為我們如何選擇和調整目標檢測模型提供了寶貴的經驗。透過不斷的技術迭代和最佳化,我們有望進一步提升模型在各種應用場景下的效能,尤其是在商品識別和分類這一領域。
6. 系統設計與實現
6.1 系統架構概覽
在深入剖析基於YOLOv8/v7/v6/v5的商品標籤識別系統的架構設計中,本系統採用了精細化的模組設計理念,以確保高效、精確地處理和識別影像中的商品標籤。本系統的設計融合了多個關鍵技術元件,以實現從影像捕獲到結果展示的全流程自動化。以下是系統架構的核心元件及其詳細職責說明:
- Detection_UI類: 系統互動與協調中心
- 主要職責:
Detection_UI
類承擔了系統使用者介面的構建、使用者輸入處理、以及檢測流程的觸發等多項關鍵職責。它是使用者與系統互動的前端介面,同時也是後端檢測邏輯的排程中心。 - 技術實現:透過
__init__
建構函式,該類初始化模型載入、設定檢測引數等前期準備工作。利用Streamlit框架,setup_sidebar
方法精心設計了側邊欄的使用者選項,包括模型型別、置信度閾值等可調引數,實現了使用者自定義設定的靈活性。process_camera_or_file
和frame_process
方法組成了資料處理的核心,負責處理影像資料並呼叫YOLO檢測模型,展現了高效的影像處理能力。
- YOLOv8v5Detector類: YOLO模型封裝與呼叫
- 主要職責:作為系統的模型處理核心,
YOLOv8v5Detector
類封裝了YOLO模型的載入、預測及結果處理等功能,提供了簡潔高效的介面來執行影像中的物件檢測任務。 - 技術實現:該類透過
load_model
方法載入指定的預訓練YOLO模型權重,保證了模型的靈活性和可擴充套件性。predict
方法實現了對輸入影像的快速預測,而preprocess
與postprocess
方法則分別負責預測前的影像準備工作和預測後的結果最佳化處理,確保了檢測結果的準確性和實用性。
- LogTable類: 檢測結果的記錄與展示
- 主要職責:
LogTable
類負責管理檢測過程產生的資料,包括檢測物件的資訊記錄、檢測日誌的儲存和檢測結果的展示等功能,是系統資料管理的核心。 - 技術實現:透過
add_log_entry
方法,系統可以靈活地記錄每一次檢測的詳細資訊。save_to_csv
方法允許將累積的檢測結果匯出為CSV檔案,方便資料的持久化儲存與分析。update_table
方法則在使用者介面上實時展示檢測日誌,提高了系統的互動性和使用者體驗。
6.2 系統流程
在本節中,我們將深入探討基於YOLOv8/v7/v6/v5的商品標籤識別系統的詳細流程。此係統採用了一系列精心設計的步驟,以確保從使用者輸入到最終的檢測結果展示,每一環節都能高效、準確地執行。下面,我們將以程式流程圖的文字形式,逐步解析系統的工作流程。
-
初始化系統 (
__init__
方法)- 載入YOLO模型,包括設定模型路徑、初始化模型引數。
- 初始化UI介面,包括設定頁面標題、配置頁面佈局等。
- 準備日誌記錄器,用於後續記錄檢測結果。
-
配置側邊欄 (
setup_sidebar
方法)- 使用者選擇模型型別(YOLOv8/v5等)。
- 使用者設定檢測引數,如置信度閾值和IOU閾值。
- 使用者選擇輸入源(上傳的圖片/影片或攝像頭捕獲)。
-
處理使用者輸入 (
process_camera_or_file
方法)- 根據使用者選擇的輸入源,系統處理上傳的檔案或攝像頭輸入。
- 對於影片檔案或攝像頭輸入,系統將逐幀處理影像資料。
-
影像幀處理 (
frame_process
方法)- 對每個影像幀執行以下操作:
- 預處理影像以適配模型輸入。
- 使用YOLO模型進行物件檢測。
- 對檢測結果進行後處理,包括繪製邊界框、標籤等。
- 對每個影像幀執行以下操作:
-
記錄檢測結果 (
LogTable
類)- 對於每次檢測,系統將結果記錄到日誌中。
- 支援將檢測日誌匯出為CSV檔案。
-
展示檢測結果 (
setupMainWindow
方法)- 在主介面上實時展示檢測結果。
- 透過圖形和表格展示物件識別資訊,如物件類別、位置和置信度。
- 提供選項讓使用者匯出檢測結果。
透過上述流程,基於YOLOv8/v7/v6/v5的商品標籤識別系統能夠為使用者提供一個完整的、端到端的商品標籤檢測和識別解決方案。從技術細節到使用者體驗,每個步驟都經過精心設計,確保系統既能滿足高準確率的技術要求,也提供易用的操作介面,從而為使用者帶來高效、準確的商品標籤識別服務。
程式碼下載連結
如果您希望獲取部落格中提及的完整資源包,包含測試圖片、影片、Python檔案(*.py)、網頁配置檔案、訓練資料集、程式碼及介面設計等,可訪問博主在麵包多平臺的上傳內容。相關的部落格和影片資料提供了所有必要檔案的下載連結,以便一鍵執行。完整資源的預覽如下圖所示:
資源包中涵蓋了你需要的訓練測試資料集、訓練測試程式碼、UI介面程式碼等完整資源,完整專案檔案的下載連結可在下面的影片簡介中找到➷➷➷
演示與介紹影片 :https://www.bilibili.com/video/BV1bK421h742/
YOLOv8/v7/v6/v5專案合集下載:https://mbd.pub/o/bread/mbd-ZZ2YmJ1v
YOLOv8和v5專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Ylp5v
YOLOv7專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl5tr
YOLOv6專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2YmJdw
完整安裝執行教程:
這個專案的執行需要用到Anaconda和Pycharm兩個軟體,下載到資原始碼後,您可以按照以下連結提供的詳細安裝教程操作即可執行成功,如仍有執行問題可私信博主解決:
- Pycharm和Anaconda的安裝教程:https://deepcode.blog.csdn.net/article/details/136639378;
軟體安裝好後需要為本專案新建Python環境、安裝依賴庫,並在Pycharm中設定環境,這幾步採用下面的教程可選線上安裝(pip install直接線上下載包)或離線依賴包(博主提供的離線包直接裝)安裝兩種方式之一:
- Python環境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可選一種);
- 離線依賴包的安裝指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可選一種);
如使用離線包方式安裝,請下載離線依賴庫,下載地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取碼:mt8u)。
7. 結論與未來工作
本文透過深入研究並實踐了基於YOLOv8/v7/v6/v5的深度學習模型在商品標籤識別領域的應用,成功開發了一個融合了這些先進演算法的商品標籤識別系統。透過對YOLO系列多個版本的模型進行細緻的比較和精心最佳化,本研究不僅顯著提升了商品標籤識別的準確率和實時處理能力,而且利用Streamlit框架建立了一個直觀、美觀且使用者友好的Web應用,使得從專業人員到普通使用者都能輕鬆地進行商品標籤的快速識別,從而在零售、庫存管理等實際應用場景中發揮了重要作用。
透過一系列嚴格的實驗驗證,我們所提出的方法在商品標籤識別的準確性和處理速度方面都達到了高標準。同時,我們提供了包括資料集處理流程、模型訓練和預測過程的程式碼,以及基於Streamlit的系統設計和實現細節,為後續研究者和開發者提供了一套完整的參考框架和實用工具。儘管已取得顯著成果,商品標籤識別作為一個具有挑戰性的任務,仍有廣闊的研究和改進空間。未來的工作計劃將從以下方向進行深入探索:
- 模型最佳化:繼續研究更深層次的網路結構和先進的最佳化策略,如神經網路架構搜尋(NAS),旨在進一步提升模型的效能和效率。
- 多模態融合:考慮結合影像之外的語音、文字等多模態資訊,採用綜合的學習策略進行商品標籤識別,以實現更加全面和準確的商品資訊解析。
- 跨域適應性:針對不同文化、年齡組的商品標籤識別進行研究,利用領域適應技術提升模型在多樣化環境中的泛化能力和魯棒性。
- 使用者互動體驗:進一步完善系統的使用者介面和互動設計,追求更加人性化和智慧化的操作體驗,以滿足更廣泛使用者群體的需求。
- 實際應用擴充:拓寬商品標籤識別技術在更多實際應用領域中的運用,如智慧零售、自動化庫存管理等,發掘其更大的社會和經濟價值。
綜上所述,基於YOLOv8/v7/v6/v5的商品標籤識別技術正處於蓬勃發展之中,隨著技術的持續進步和應用領域的不斷擴充套件,我們有理由相信,這項技術將在不遠的將來,在加強人機互動、提升社會運營效率、促進經濟發展等多個方面發揮更加關鍵的作用。
Wang, Chengcheng, et al. "Gold-YOLO: Efficient object detector via gather-and-distribute mechanism." Advances in Neural Information Processing Systems 36 (2024). ↩︎
Yusof, Najiha‘Izzaty Mohd, et al. "Assessing the performance of YOLOv5, YOLOv6, and YOLOv7 in road defect detection and classification: a comparative study." Bulletin of Electrical Engineering and Informatics 13.1 (2024): 350-360. ↩︎
Goel, Lavika, and Pankaj Patel. "Improving YOLOv6 using advanced PSO optimizer for weight selection in lung cancer detection and classification." Multimedia Tools and Applications (2024): 1-34. ↩︎
Ge, Zihao, et al. "Lightweight YOLOv7 Algorithm for Multi-Object Recognition on Contrabands in Terahertz Images." Applied Sciences 14.4 (2024): 1398. ↩︎
Qiu, Shi, et al. "Automated detection of railway defective fasteners based on YOLOv8-FAM and synthetic data using style transfer." Automation in Construction 162 (2024): 105363. ↩︎