為公益組織做網(wǎng)站bing搜索引擎入口
摘要:在零售行業(yè)的技術(shù)進(jìn)步中,開(kāi)發(fā)商品識(shí)別系統(tǒng)扮演著關(guān)鍵角色。本博文詳細(xì)闡述了如何利用深度學(xué)習(xí)技術(shù)搭建一個(gè)高效的商品識(shí)別系統(tǒng),并分享了一套完整的代碼實(shí)現(xiàn)。系統(tǒng)采用了性能強(qiáng)勁的YOLOv8算法,同時(shí)對(duì)YOLOv7、YOLOv6、YOLOv5等早期版本進(jìn)行了性能比較,著重分析了它們?cè)?strong>mAP、F1 Score等關(guān)鍵性能指標(biāo)上的表現(xiàn)。文章深度剖析了YOLOv8算法的核心原理,并提供了相應(yīng)的Python實(shí)現(xiàn)代碼和訓(xùn)練所需數(shù)據(jù)集,還集成了一個(gè)基于PySide6的用戶友好界面。
該系統(tǒng)能夠準(zhǔn)確地識(shí)別各種商品,支持通過(guò)圖像、圖片文件夾、視頻文件以及攝像頭捕獲進(jìn)行檢測(cè)。它還提供了柱狀圖分析、識(shí)別框類別顯示、類型統(tǒng)計(jì)等多種功能,并允許用戶調(diào)整置信度(Conf)和交并比(IOU)參數(shù)以優(yōu)化識(shí)別結(jié)果的可視化。此外,系統(tǒng)還設(shè)計(jì)了一個(gè)基于SQLite的用戶管理界面,便于進(jìn)行模型切換和界面?zhèn)€性化定制。本文旨在為剛?cè)腴T(mén)深度學(xué)習(xí)的讀者提供一份實(shí)踐指南,完整的代碼和數(shù)據(jù)集可在文章末尾獲取。本文結(jié)構(gòu)如下:
文章目錄
- 前言
- 1. 數(shù)據(jù)集介紹
- 2. 系統(tǒng)界面效果
- 3. YOLOv8算法原理
- 4. 代碼簡(jiǎn)介
- 4.1 模型預(yù)測(cè)
- 4.2 模型訓(xùn)練
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對(duì)比
- 4.4 代碼實(shí)現(xiàn)
- 5. 商品識(shí)別系統(tǒng)實(shí)現(xiàn)
- 5.1 系統(tǒng)設(shè)計(jì)思路
- 5.2 登錄與賬戶管理
- 下載鏈接
- 6. 總結(jié)與展望
- 結(jié)束語(yǔ)
?點(diǎn)擊跳轉(zhuǎn)至文末所有涉及的完整代碼文件下載頁(yè)?
基于YOLOv8/v7/v6/v5的商品識(shí)別系統(tǒng)演示與介紹(深度學(xué)習(xí)模型+PySide6界面+訓(xùn)練數(shù)據(jù)集)
前言
????????在當(dāng)今的零售業(yè),隨著信息技術(shù)的飛速發(fā)展和消費(fèi)者購(gòu)物習(xí)慣的轉(zhuǎn)變,商品識(shí)別系統(tǒng)作為連接線上線下購(gòu)物體驗(yàn)的關(guān)鍵技術(shù),已經(jīng)成為零售業(yè)技術(shù)革新的重要方向。這一系統(tǒng)能夠?qū)崿F(xiàn)對(duì)商品的快速、準(zhǔn)確識(shí)別,極大提高了庫(kù)存管理的效率,優(yōu)化了顧客的購(gòu)物體驗(yàn),并為零售商提供了豐富的消費(fèi)者行為數(shù)據(jù),從而幫助他們更好地理解市場(chǎng)需求和消費(fèi)者偏好。
????????商品識(shí)別系統(tǒng)不僅關(guān)乎于提升零售業(yè)的運(yùn)營(yíng)效率和顧客滿意度,也是人工智能技術(shù)在實(shí)際應(yīng)用場(chǎng)景中的重要體現(xiàn)。尤其是在當(dāng)前全球零售環(huán)境競(jìng)爭(zhēng)加劇的背景下,通過(guò)技術(shù)創(chuàng)新來(lái)尋求業(yè)務(wù)增長(zhǎng)點(diǎn)已經(jīng)成為零售企業(yè)的共識(shí)。此外,隨著大數(shù)據(jù)和人工智能技術(shù)的不斷進(jìn)步,商品識(shí)別系統(tǒng)的研究和應(yīng)用將為零售業(yè)帶來(lái)革命性的變革,為消費(fèi)者提供更加個(gè)性化、便捷的購(gòu)物體驗(yàn)。
????????近年來(lái),基于深度學(xué)習(xí)的視覺(jué)識(shí)別技術(shù),尤其是YOLO1(You Only Look Once)系列算法的不斷發(fā)展和優(yōu)化,為商品識(shí)別系統(tǒng)的研究和實(shí)踐提供了強(qiáng)大的技術(shù)支持。從YOLOv5到最新的YOLOv8,每一次迭代都在檢測(cè)速度、準(zhǔn)確率以及模型的魯棒性上取得了顯著的進(jìn)步。這些技術(shù)的進(jìn)步不僅提高了商品識(shí)別的效率和準(zhǔn)確性,也使得系統(tǒng)能夠更好地適應(yīng)不同的應(yīng)用場(chǎng)景和需求,為零售業(yè)的智能化轉(zhuǎn)型提供了堅(jiān)實(shí)的技術(shù)基礎(chǔ)。
????????YOLOv52由于其輕量化設(shè)計(jì)和高效性能,在商品識(shí)別任務(wù)中得到了廣泛應(yīng)用。YOLOv5的模型結(jié)構(gòu)優(yōu)化,特別是在小物體檢測(cè)上的改進(jìn),使其在零售環(huán)境中表現(xiàn)出色。隨后,YOLOv63引入了一系列創(chuàng)新,包括使用更高效的backbone和改進(jìn)的注意力機(jī)制,進(jìn)一步提升了模型的識(shí)別能力和速度,特別適用于處理大規(guī)模的零售商品數(shù)據(jù)庫(kù)。YOLOv74則專注于提高模型的泛化能力和在多種場(chǎng)景下的穩(wěn)定性,通過(guò)引入新的數(shù)據(jù)增強(qiáng)技術(shù)和自適應(yīng)學(xué)習(xí)率調(diào)整策略,顯著提高了模型在復(fù)雜零售環(huán)境中的表現(xiàn)。YOLOv85的推出,標(biāo)志著商品識(shí)別技術(shù)的一個(gè)新的高度。它不僅在算法層面進(jìn)行了優(yōu)化,還在模型壓縮和硬件適配方面做出了創(chuàng)新,使得YOLOv8能夠在資源受限的設(shè)備上運(yùn)行,極大地?cái)U(kuò)展了其在實(shí)際應(yīng)用中的適用性。
????????在數(shù)據(jù)集方面,傳統(tǒng)的商品識(shí)別研究往往依賴于較為有限的數(shù)據(jù)集,如COCO和ImageNet,這些數(shù)據(jù)集雖然廣泛應(yīng)用于計(jì)算機(jī)視覺(jué)的多個(gè)領(lǐng)域,但在商品識(shí)別特定場(chǎng)景下可能不足以覆蓋所有的商品類別和環(huán)境。近年來(lái),隨著零售行業(yè)對(duì)商品識(shí)別技術(shù)需求的增加,出現(xiàn)了更多專注于零售商品的數(shù)據(jù)集,如Open Images Dataset、Grozi-120和SKU-110K等,這些數(shù)據(jù)集提供了更多樣化和具有挑戰(zhàn)性的零售商品圖片,為商品識(shí)別算法的訓(xùn)練和測(cè)試提供了更為豐富的資源。
????????盡管商品識(shí)別技術(shù)已取得了顯著進(jìn)步,但仍面臨一些挑戰(zhàn),包括但不限于商品外觀多樣性、識(shí)別環(huán)境復(fù)雜性以及實(shí)時(shí)性能要求等。商品的包裝、大小、形狀和顏色可能千差萬(wàn)別,且在不同的光照、背景和擺放位置下,識(shí)別難度會(huì)大幅增加。此外,為了滿足實(shí)際應(yīng)用中的實(shí)時(shí)性要求,如何在保證高識(shí)別準(zhǔn)確率的同時(shí)提高算法的處理速度,也是當(dāng)前研究中的一個(gè)重要挑戰(zhàn)。
????????隨著計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)技術(shù)的不斷進(jìn)步,商品識(shí)別系統(tǒng)預(yù)計(jì)將向著更高的準(zhǔn)確性、更快的處理速度以及更強(qiáng)的泛化能力方向發(fā)展。深度學(xué)習(xí)模型的優(yōu)化、新型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的探索,以及算法的硬件加速都是未來(lái)可能的發(fā)展方向。同時(shí),隨著零售行業(yè)數(shù)字化轉(zhuǎn)型的加速,商品識(shí)別技術(shù)在智能零售、無(wú)人商店和在線購(gòu)物等新興應(yīng)用場(chǎng)景中的作用將越來(lái)越重要,這也為商品識(shí)別技術(shù)的研究和應(yīng)用提供了廣闊的發(fā)展空間。
????????本博客所做的工作是基于YOLOv8算法構(gòu)建一個(gè)商品識(shí)別系統(tǒng),展示系統(tǒng)的界面效果,詳細(xì)闡述其算法原理,提供代碼實(shí)現(xiàn),以及分享該系統(tǒng)的實(shí)現(xiàn)過(guò)程。希望本博客的分享能給予讀者一定的啟示,推動(dòng)更多的相關(guān)研究。本文的主要貢獻(xiàn)如下:
- 采用最新的YOLOv8算法進(jìn)行商品識(shí)別:我們采用了業(yè)界領(lǐng)先的YOLOv8算法作為商品識(shí)別系統(tǒng)的核心,相較于之前的版本如YOLOv7、YOLOv6、YOLOv5等,YOLOv8在效率和準(zhǔn)確性上都有顯著提升。本文不僅詳細(xì)闡述了YOLOv8算法的原理和優(yōu)勢(shì),還通過(guò)實(shí)驗(yàn)對(duì)比展示了其與早期版本在商品識(shí)別任務(wù)上的性能差異。這一部分的深入探討不僅為研究者提供了寶貴的實(shí)驗(yàn)數(shù)據(jù)和分析,也為從業(yè)者在選擇適合的商品識(shí)別技術(shù)時(shí)提供了參考。
- 開(kāi)發(fā)友好的用戶界面:我們利用PySide6庫(kù)成功設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)美觀且用戶友好的商品識(shí)別系統(tǒng)界面。該界面不僅易于操作,還大大增強(qiáng)了用戶體驗(yàn),有助于推動(dòng)YOLOv8算法及商品識(shí)別技術(shù)的廣泛應(yīng)用。
- 設(shè)計(jì)登錄管理功能:系統(tǒng)中加入的登錄管理功能,進(jìn)一步提升了使用的安全性和可管理性,為將來(lái)添加更多個(gè)性化功能或進(jìn)行用戶數(shù)據(jù)分析留出了空間。
- 對(duì)YOLOv8算法進(jìn)行深入研究:通過(guò)對(duì)YOLOv8模型的深入研究,本博客不僅關(guān)注于算法的應(yīng)用,更進(jìn)一步地評(píng)估了模型在各種環(huán)境和條件下的表現(xiàn),如精準(zhǔn)度、召回率等關(guān)鍵性能指標(biāo)的分析。
- 提供完整的數(shù)據(jù)集和代碼資源包:為了幫助讀者更好地理解和應(yīng)用YOLOv8及其前幾代算法在商品識(shí)別系統(tǒng)中的實(shí)踐,本文提供了詳細(xì)的數(shù)據(jù)集和完整的代碼資源包。這些資源不僅允許讀者直接復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果,還為進(jìn)一步的研究和開(kāi)發(fā)奠定了基礎(chǔ)。
1. 數(shù)據(jù)集介紹
????????在商品識(shí)別系統(tǒng)的開(kāi)發(fā)過(guò)程中,構(gòu)建一個(gè)高質(zhì)量的數(shù)據(jù)集是實(shí)現(xiàn)高效檢測(cè)模型的基石。本研究采用了一套包含8834張圖片的數(shù)據(jù)集,旨在通過(guò)實(shí)際零售環(huán)境中的商品圖像,精確訓(xùn)練出能夠準(zhǔn)確識(shí)別各類商品的深度學(xué)習(xí)模型。數(shù)據(jù)集被細(xì)致地劃分為7690張訓(xùn)練圖像、1004張測(cè)試圖像以及140張驗(yàn)證圖像,以保障模型在不同階段的評(píng)估與優(yōu)化可以有針對(duì)性地進(jìn)行。
????????每張圖像經(jīng)歷了徹底的預(yù)處理,以保證數(shù)據(jù)輸入的一致性和質(zhì)量。通過(guò)自動(dòng)定向處理和EXIF信息的清除,每張圖片被標(biāo)準(zhǔn)化至統(tǒng)一的方向,避免因?yàn)閳D片朝向不同而產(chǎn)生的識(shí)別誤差。接著,為了適應(yīng)神經(jīng)網(wǎng)絡(luò)的輸入需求,所有圖片都被調(diào)整至640x640像素的分辨率,盡管這一過(guò)程可能引入了一定的形狀失真,但也為模型提供了一定的形狀變化容忍性,從而增強(qiáng)其在實(shí)際應(yīng)用中的魯棒性。
????????進(jìn)一步地,我們對(duì)數(shù)據(jù)集的標(biāo)注進(jìn)行了深入分析。從所提供的分布圖中可見(jiàn),數(shù)據(jù)集包含50個(gè)不同的類別,各類別間的實(shí)例數(shù)量分布呈現(xiàn)多樣化特征。有些類別的實(shí)例數(shù)量眾多,而有些則相對(duì)較少,這種不平衡性是在實(shí)際商業(yè)環(huán)境中經(jīng)常會(huì)遇到的情況,因此模型必須能夠處理類別不平衡的數(shù)據(jù)。此外,標(biāo)注的邊界框集中度圖表明,大部分商品在圖像中的位置趨于集中,這可能是由于商品在商店的貨架上排列有序造成的。同時(shí),商品的高度和寬度的分布情況顯示了商品在尺寸上的多樣性,這對(duì)模型的尺度不變性提出了要求。
????????通過(guò)對(duì)數(shù)據(jù)集的這種詳盡分析,我們確保了模型能夠在不同情況下保持高性能。在接下來(lái)的實(shí)驗(yàn)中,這些分析結(jié)果將被用于指導(dǎo)模型訓(xùn)練的過(guò)程,如通過(guò)過(guò)采樣或權(quán)重調(diào)整來(lái)處理類別不平衡問(wèn)題,以及通過(guò)數(shù)據(jù)增強(qiáng)來(lái)提高模型對(duì)不同商品尺寸的適應(yīng)性。博主使用的類別代碼如下:
Chinese_name = {"Complan Classic Creme": "經(jīng)典奶油","Complan Kesar Badam": "藏紅花杏仁","Complan Nutrigro Badam Kheer": "杏仁布丁","Complan Pista Badam": "開(kāi)心果杏仁","Complan Royal Chocolate": "皇家巧克力","EY AAAM TULSI TURMERIC FACEWASH50G": "芒果洗面奶","EY ADVANCED GOLDEN GLOW PEEL OFF M. 50G": "金色面膜50G","EY ADVANCED GOLDEN GLOW PEEL OFF M. 90G": "金色面膜90G","EY EXF WALNUT SCRUB AYR 200G": "核桃磨砂200G","EY HALDICHANDAN FP HF POWDER 25G": "檀香粉25G","EY HYD-EXF WALNT APR SCRUB AYR100G": "核桃杏仁磨砂100G","EY HYDR - EXF WALNUT APRICOT SCRUB 50G": "核桃杏仁磨砂50G","EY NAT GLOW ORANGE PEEL OFF AY 90G": "橙子面膜90G","EY NATURALS NEEM FACE WASH AY 50G": "印楝洗面奶","EY RJ CUCUMBER ALOEVERA FACEPAK50G": "黃瓜面膜","EY TAN CHOCO CHERRY PACK 50G": "巧克力櫻桃面膜","EY_SCR_PURIFYING_EXFOLTNG_NEEM_PAPAYA_50G": "印楝木瓜面膜","Everyuth Naturals Body Lotion Nourishing Cocoa 200ml": "可可乳液","Everyuth Naturals Body Lotion Rejuvenating Flora 200ml": "植物乳液","Everyuth Naturals Body Lotion Soothing Citrus 200ml": "柑橘乳液","Everyuth Naturals Body Lotion Sun Care Berries SPF 15 200ml": "防曬漿果乳液","Glucon D Nimbu Pani 1.KG": "檸檬水","Glucon D Regular 1.KG": "常規(guī)","Glucon D Regular 2.KG": "常規(guī)2KG","Glucon D Tangy orange 1.KG": "濃橙","Nutralite ACHARI MAYO 300g-275g-25g-": "泡菜蛋黃醬","Nutralite ACHARI MAYO 30g": "泡菜蛋黃醬小","Nutralite CHEESY GARLIC MAYO 300g-275g-25g-": "芝士蒜蛋黃醬","Nutralite CHEESY GARLIC MAYO 30g": "芝士蒜蛋黃醬小","Nutralite CHOCO SPREAD CALCIUM 275g": "巧克力涂醬","Nutralite DOODHSHAKTHI PURE GHEE 1L": "純酥油","Nutralite TANDOORI MAYO 300g-275g-25g-": "炭烤蛋黃醬","Nutralite TANDOORI MAYO 30g": "炭烤蛋黃醬小","Nutralite VEG MAYO 300g-275g-25g-": "素蛋黃醬","Nycil Prickly Heat Powder": "痱子粉","SUGAR FREE GOLD 500 PELLET": "無(wú)糖金500粒","SUGAR FREE GOLD POWDER 100GM": "無(wú)糖金粉100G","SUGAR FREE GOLD SACHET 50 SUGAR FREE GOLD SACHET 50": "無(wú)糖金小包","SUGAR FREE GOLD SACHET 50": "無(wú)糖金小包50","SUGAR FREE GRN 300 PELLET": "無(wú)糖綠300粒","SUGAR FREE NATURA 500 PELLET": "無(wú)糖自然500粒","SUGAR FREE NATURA DIET SUGAR 80GM": "無(wú)糖自然瘦糖80G","SUGAR FREE NATURA DIET SUGAR": "無(wú)糖自然瘦糖","SUGAR FREE NATURA SACHET 50": "無(wú)糖自然小包","SUGAR FREE NATURA SWEET DROPS": "無(wú)糖自然甜滴","SUGAR FREE NATURAL DIET SUGAR 80GM": "無(wú)糖自然瘦糖80G","SUGAR FREE NATURA_ POWDER_CONC_100G": "無(wú)糖自然粉100G","SUGAR FREE_GRN_ POWDER_CONC_100G": "無(wú)糖綠粉100G","SUGARLITE POUCH 500G": "糖精袋500G"}
????????總的來(lái)說(shuō),這個(gè)經(jīng)過(guò)精心準(zhǔn)備和詳細(xì)標(biāo)注的數(shù)據(jù)集,不僅為開(kāi)發(fā)高效商品識(shí)別模型提供了良好的基礎(chǔ),也為后續(xù)的研究提供了豐富的實(shí)驗(yàn)資源。通過(guò)細(xì)致的預(yù)處理步驟和深入的數(shù)據(jù)分析,我們?yōu)樯唐纷R(shí)別技術(shù)的發(fā)展做出了堅(jiān)實(shí)的貢獻(xiàn),并期待在實(shí)際應(yīng)用中取得顯著的性能表現(xiàn)。
2. 系統(tǒng)界面效果
????????系統(tǒng)以PySide6作為GUI庫(kù),提供了一套直觀且友好的用戶界面。下面,我將詳細(xì)介紹各個(gè)主要界面的功能和設(shè)計(jì)。
(1)系統(tǒng)提供了基于SQLite的注冊(cè)登錄管理功能。用戶在首次使用時(shí)需要通過(guò)注冊(cè)界面進(jìn)行注冊(cè),輸入用戶名和密碼后,系統(tǒng)會(huì)將這些信息存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)中。注冊(cè)成功后,用戶可以通過(guò)登錄界面輸入用戶名和密碼進(jìn)行登錄。這個(gè)設(shè)計(jì)可以確保系統(tǒng)的安全性,也為后續(xù)添加更多個(gè)性化功能提供了可能性。
(2)在主界面上,系統(tǒng)提供了支持圖片、視頻、實(shí)時(shí)攝像頭和批量文件輸入的功能。用戶可以通過(guò)點(diǎn)擊相應(yīng)的按鈕,選擇要進(jìn)行商品識(shí)別的圖片或視頻,或者啟動(dòng)攝像頭進(jìn)行實(shí)時(shí)檢測(cè)。在進(jìn)行檢測(cè)時(shí),系統(tǒng)會(huì)實(shí)時(shí)顯示檢測(cè)結(jié)果,并將檢測(cè)記錄存儲(chǔ)在數(shù)據(jù)庫(kù)中。
(3)此外,系統(tǒng)還提供了一鍵更換YOLOv8/v5模型的功能。用戶可以通過(guò)點(diǎn)擊界面上的"更換模型"按鈕,選擇不同的YOLOv8模型進(jìn)行檢測(cè)。與此同時(shí),系統(tǒng)附帶的數(shù)據(jù)集也可以用于重新訓(xùn)練模型,以滿足用戶在不同場(chǎng)景下的檢測(cè)需求。
(4)為了提供更個(gè)性化的使用體驗(yàn),這里系統(tǒng)支持界面修改,用戶可以自定義圖標(biāo)、文字等界面元素。例如,用戶可以根據(jù)自己的喜好,選擇不同風(fēng)格的圖標(biāo),也可以修改界面的文字描述。
3. YOLOv8算法原理
????????YOLOv8模型作為目前最新一代的目標(biāo)檢測(cè)模型,繼承了YOLO系列的核心設(shè)計(jì)理念,同時(shí)引入了創(chuàng)新的架構(gòu)和技術(shù)以提高性能和效率。YOLO(You Only Look Once)系列自從推出以來(lái),就以其高速的檢測(cè)速度和良好的實(shí)時(shí)性能贏得了廣泛的認(rèn)可。
????????YOLOv8作為當(dāng)今最先進(jìn)的目標(biāo)檢測(cè)算法之一,在設(shè)計(jì)和實(shí)現(xiàn)上都顯示出了顯著的創(chuàng)新。其核心在于如何快速且準(zhǔn)確地對(duì)輸入圖像中的物體進(jìn)行檢測(cè),其架構(gòu)可分為三個(gè)主要組成部分:Backbone、Neck和Head。
????????在Backbone部分,YOLOv8繼承并改進(jìn)了前代YOLO系列算法中的Darknet架構(gòu)。它使用了CSPDarknet53作為基礎(chǔ)網(wǎng)絡(luò)架構(gòu),通過(guò)引入CSPNet(Cross Stage Partial Networks)的設(shè)計(jì),即在傳統(tǒng)的Darknet53結(jié)構(gòu)中,將每個(gè)卷積層的特征分為兩部分,一部分直接穿過(guò)網(wǎng)絡(luò),另一部分則進(jìn)入后續(xù)的層進(jìn)行處理。這種設(shè)計(jì)可以有效地減少計(jì)算量,同時(shí)保持或提高網(wǎng)絡(luò)的性能。而YOLOv8在此基礎(chǔ)上做出了進(jìn)一步的優(yōu)化,提高了特征提取的效率和精度。
????????Neck部分負(fù)責(zé)提取不同尺度的特征,并進(jìn)行特征融合。YOLOv8沿用并改進(jìn)了YOLOv5引入的PAN(Path Aggregation Network)結(jié)構(gòu),該結(jié)構(gòu)與FPN(Feature Pyramid Networks)相結(jié)合,旨在聚合不同層級(jí)的特征,以提高檢測(cè)的精度。YOLOv8通過(guò)SPPF(Spatial Pyramid Pooling Fusion)增強(qiáng)了對(duì)不同尺度特征的聚合能力,通過(guò)多尺度特征的融合,大大提高了模型對(duì)于不同尺寸物體的檢測(cè)能力。
????????在Head部分,YOLOv8進(jìn)行了顯著的改進(jìn),尤其是在Anchor設(shè)計(jì)方面。不同于YOLOv5的Anchor-based設(shè)計(jì),YOLOv8采用了Anchor-free的設(shè)計(jì)理念,摒棄了傳統(tǒng)的固定大小的Anchor,減少了模型在訓(xùn)練過(guò)程中對(duì)于Anchor大小調(diào)整的依賴。這一設(shè)計(jì)的優(yōu)點(diǎn)在于簡(jiǎn)化了模型,并減少了預(yù)設(shè)的復(fù)雜性。此外,YOLOv8引入了新的損失函數(shù),即DFL(Distribution Focal Loss),這種損失函數(shù)專注于處理不同類別間的分布失衡,從而提高模型在多分類任務(wù)中的表現(xiàn)。
????????總體而言,YOLOv8的創(chuàng)新不僅在于其結(jié)構(gòu)的改進(jìn),還體現(xiàn)在其對(duì)于目標(biāo)檢測(cè)中的類別不平衡、尺寸多樣性、檢測(cè)精度和速度等方面的全面考量。通過(guò)上述的技術(shù)創(chuàng)新,YOLOv8實(shí)現(xiàn)了在實(shí)時(shí)性與檢測(cè)精度之間的良好平衡,為實(shí)際應(yīng)用中的商品識(shí)別系統(tǒng)提供了強(qiáng)有力的技術(shù)支持。
4. 代碼簡(jiǎn)介
????????在本節(jié)中,我們將詳細(xì)介紹如何使用YOLOv8進(jìn)行商品識(shí)別的代碼實(shí)現(xiàn)。代碼主要分為兩部分:模型預(yù)測(cè)和模型訓(xùn)練。
4.1 模型預(yù)測(cè)
????????在模型預(yù)測(cè)部分,首先導(dǎo)入了OpenCV庫(kù)和YOLO模型。OpenCV庫(kù)是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù),包含了眾多的視覺(jué)處理函數(shù),使用它來(lái)讀取和處理圖像。YOLO模型則是要用到的目標(biāo)檢測(cè)模型。
import cv2
from ultralytics import YOLO
????????接著,加載自行訓(xùn)練好的YOLO模型。這個(gè)模型是在大量的圖像上預(yù)訓(xùn)練得到的,可以直接用于目標(biāo)檢測(cè)任務(wù)。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
????????然后,使用OpenCV讀取了一個(gè)圖像文件,這個(gè)圖像文件作為要進(jìn)行目標(biāo)檢測(cè)的圖像輸入。
img_path = abs_path("test_media/1.jpg")
image = cv_imread(img_path)
????????在讀取了圖像文件之后,將圖像大小調(diào)整為850x500,并對(duì)圖像進(jìn)行預(yù)處理,就可以使用模型進(jìn)行預(yù)測(cè)了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型訓(xùn)練
????????在本博客中,我們將深入探索使用YOLOv8構(gòu)建高效的商品識(shí)別系統(tǒng)。本節(jié)將分步介紹如何通過(guò)代碼來(lái)實(shí)現(xiàn)這一目標(biāo),講解每一段代碼的功能與它在整個(gè)訓(xùn)練過(guò)程中的作用。
????????首先,為了處理數(shù)據(jù)和模型,我們引入必要的庫(kù)。os和yaml用于操作文件系統(tǒng)和處理配置文件,而YOLO類從ultralytics庫(kù)中引入,作為構(gòu)建和訓(xùn)練模型的基礎(chǔ)。
import os
import yaml
from ultralytics import YOLO # 導(dǎo)入YOLO模型
from QtFusion.path import abs_path
????????接著,我們定義了數(shù)據(jù)集的名稱,并通過(guò)自定義的abs_path函數(shù)計(jì)算出了數(shù)據(jù)集配置文件的絕對(duì)路徑。為了確保路徑的一致性和跨平臺(tái)兼容性,我們將路徑轉(zhuǎn)換為UNIX風(fēng)格。
workers = 1
batch = 8data_name = "ProductSorting"
data_path = abs_path('datasets/ProductSorting/product.yaml', path_type='current') # 數(shù)據(jù)集的yaml的絕對(duì)路徑
unix_style_path = data_path.replace(os.sep, '/')# 獲取目錄路徑
directory_path = os.path.dirname(unix_style_path)')
????????為了使用這些配置信息,我們打開(kāi)并讀取YAML文件,它包含了訓(xùn)練所需的數(shù)據(jù)集配置,如類別標(biāo)簽和圖像路徑。代碼確保了path項(xiàng)更新為當(dāng)前數(shù)據(jù)集的目錄路徑,這是為了讓模型知道在哪里可以找到訓(xùn)練和驗(yàn)證圖像。
# 讀取YAML文件,保持原有順序
with open(data_path, 'r') as file:data = yaml.load(file, Loader=yaml.FullLoader)
# 修改path項(xiàng)
if 'path' in data:data['path'] = directory_path# 將修改后的數(shù)據(jù)寫(xiě)回YAML文件with open(data_path, 'w') as file:yaml.safe_dump(data, file, sort_keys=False)
????????現(xiàn)在,我們準(zhǔn)備加載模型并開(kāi)始訓(xùn)練。我們創(chuàng)建了一個(gè)YOLO類的實(shí)例,其中包含預(yù)訓(xùn)練的權(quán)重。通過(guò)train方法,我們傳遞了一系列參數(shù)來(lái)指導(dǎo)訓(xùn)練過(guò)程,如數(shù)據(jù)配置文件的路徑、計(jì)算資源設(shè)備、工作進(jìn)程數(shù)、輸入圖像的大小、訓(xùn)練周期(epochs)和批次大小。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加載預(yù)訓(xùn)練的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加載預(yù)訓(xùn)練的YOLOv8模型
# Training.
results = model.train( # 開(kāi)始訓(xùn)練模型data=data_path, # 指定訓(xùn)練數(shù)據(jù)的配置文件路徑device=device, # 自動(dòng)選擇進(jìn)行訓(xùn)練workers=workers, # 指定使用2個(gè)工作進(jìn)程加載數(shù)據(jù)imgsz=640, # 指定輸入圖像的大小為640x640epochs=100, # 指定訓(xùn)練100個(gè)epochbatch=batch, # 指定每個(gè)批次的大小為8name='train_v5_' + data_name # 指定訓(xùn)練任務(wù)的名稱
)model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加載預(yù)訓(xùn)練的YOLOv8模型
results2 = model.train( # 開(kāi)始訓(xùn)練模型data=data_path, # 指定訓(xùn)練數(shù)據(jù)的配置文件路徑device=device, # 自動(dòng)選擇進(jìn)行訓(xùn)練workers=workers, # 指定使用2個(gè)工作進(jìn)程加載數(shù)據(jù)imgsz=640, # 指定輸入圖像的大小為640x640epochs=100, # 指定訓(xùn)練100個(gè)epochbatch=batch, # 指定每個(gè)批次的大小為8name='train_v8_' + data_name # 指定訓(xùn)練任務(wù)的名稱
)
????????在深度學(xué)習(xí)模型的訓(xùn)練過(guò)程中,損失函數(shù)的變化趨勢(shì)是評(píng)估模型性能的重要指標(biāo)之一。從提供的圖像中,我們可以對(duì)YOLOv8模型在商品識(shí)別任務(wù)上的訓(xùn)練過(guò)程進(jìn)行詳細(xì)的分析。
????????首先觀察到的是,訓(xùn)練過(guò)程中的邊界框損失(train/box_loss)、分類損失(train/cls_loss)和置信度損失(train/df1_loss)隨著訓(xùn)練周期的增加而穩(wěn)定下降。這說(shuō)明模型在對(duì)目標(biāo)的位置、所屬類別以及存在的置信度進(jìn)行預(yù)測(cè)時(shí)越來(lái)越準(zhǔn)確。損失函數(shù)的下降趨勢(shì)表明模型正在學(xué)習(xí)到有效的特征,并在逐步優(yōu)化參數(shù)。
????????在驗(yàn)證集上的損失(val/box_loss、val/cls_loss、val/df1_loss)顯示了更多的波動(dòng),這是模型在遇到未見(jiàn)過(guò)的數(shù)據(jù)時(shí)表現(xiàn)的不確定性。盡管如此,損失的整體趨勢(shì)依然是下降的,表明模型具有一定的泛化能力。特別是驗(yàn)證集的分類損失稍高,這可能是由于類別不平衡或某些類別相比其他類別更難學(xué)習(xí)造成的。
????????在性能指標(biāo)方面,精度(precision)和召回率(recall)保持在較高水平,顯示了模型在識(shí)別商品方面的可靠性。在目標(biāo)檢測(cè)中,精度是指模型正確識(shí)別目標(biāo)的能力,而召回率是指模型識(shí)別出所有正類樣本的能力。這兩個(gè)指標(biāo)的高值表明,模型不僅能夠正確識(shí)別大多數(shù)正類樣本,而且誤識(shí)別為負(fù)類樣本的情況很少。mAP(mean Average Precision)指標(biāo),特別是mAP@0.5和mAP@0.5-0.95,穩(wěn)定在較高水平,進(jìn)一步證明了模型對(duì)于不同置信度閾值下的魯棒性。
????????F1分?jǐn)?shù)是衡量模型精確度和召回率的綜合指標(biāo),它在機(jī)器學(xué)習(xí)領(lǐng)域被廣泛用于評(píng)價(jià)分類模型的表現(xiàn)。F1分?jǐn)?shù)的最大值為1,表示完美的精確度和召回率,而最小值為0,則表示模型性能極差。
????????從曲線圖中可以看到,大部分類別的F1分?jǐn)?shù)隨著置信度閾值的增加而先增后減,而在某個(gè)置信度點(diǎn)達(dá)到最高峰值。這種現(xiàn)象指出,模型對(duì)于大多數(shù)類別的商品具有較高的識(shí)別能力,但同時(shí)也揭示出選擇最優(yōu)置信度閾值的重要性。如果閾值過(guò)低,雖然模型能識(shí)別出更多的正樣本(即召回率高),但也會(huì)導(dǎo)致較多誤報(bào)(即精確度低)。相反,如果閾值過(guò)高,則會(huì)錯(cuò)過(guò)一些正樣本(即召回率低),即使精確度較高。
????????曲線中標(biāo)注的“all classes 0.85 at 0.563”指出,在0.563的置信度閾值時(shí),所有類別的平均F1分?jǐn)?shù)達(dá)到了0.85,這是一個(gè)非常高的分?jǐn)?shù),表明模型整體上能夠達(dá)到優(yōu)秀的平衡點(diǎn),即在精確度和召回率之間取得了良好的折中。
???????? 然而,我們也注意到一些曲線的波動(dòng)比較大,這可能表明模型在某些類別上的性能不夠穩(wěn)定。這種不穩(wěn)定性可能源于樣本數(shù)量不足、類內(nèi)變異性大或者這些類別在數(shù)據(jù)集中的表現(xiàn)差異性。此外,某些商品類別的F1分?jǐn)?shù)曲線在高置信度區(qū)間下急劇下降,這可能是由于這些類別的樣本在訓(xùn)練集中較為稀缺或者模型對(duì)這些類別的特征學(xué)習(xí)不夠充分。
???????? 綜上所述,通過(guò)F1分?jǐn)?shù)的深入分析,我們可以對(duì)模型的性能有一個(gè)全面的了解。這樣的分析對(duì)于進(jìn)一步優(yōu)化模型參數(shù),提升模型在具體類別上的識(shí)別能力至關(guān)重要。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8對(duì)比
(1)實(shí)驗(yàn)設(shè)計(jì):
????????本實(shí)驗(yàn)旨在評(píng)估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在商品識(shí)別任務(wù)上的性能。為了實(shí)現(xiàn)這一目標(biāo),博主分別使用使用相同的數(shù)據(jù)集訓(xùn)練和測(cè)試了這四個(gè)模型,從而可以進(jìn)行直接的性能比較。本文將比較分析四種模型,旨在揭示每種模型的優(yōu)缺點(diǎn),探討它們?cè)诠I(yè)環(huán)境中實(shí)際應(yīng)用的場(chǎng)景選擇。
模型 | 圖像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 參數(shù)數(shù)量 (百萬(wàn)) | 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)度量指標(biāo):
- F1-Score:F1-Score是精確率(Precision)和召回率(Recall)的調(diào)和平均值。精確率是指模型正確識(shí)別的正例與所有識(shí)別為正例的案例之比,而召回率是指模型正確識(shí)別的正例與所有實(shí)際正例之比。F1-Score對(duì)于不平衡的數(shù)據(jù)集或者需要同時(shí)考慮精確率和召回率的任務(wù)特別重要。
- mAP(Mean Average Precision):mAP是衡量模型在多個(gè)類別上平均檢測(cè)準(zhǔn)確度的指標(biāo)。它計(jì)算了模型在所有類別上的平均精度,是目標(biāo)檢測(cè)領(lǐng)域中常用的性能度量。
名稱 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.911 | 0.874 | 0.885 | 0.882 |
F1-Score | 0.77 | 0.82 | 0.84 | 0.85 |
(3)實(shí)驗(yàn)結(jié)果分析:
??????? 在深度學(xué)習(xí)領(lǐng)域,持續(xù)的算法迭代和更新是提升模型性能的關(guān)鍵途徑。我們通過(guò)在相同的數(shù)據(jù)集上實(shí)施一系列實(shí)驗(yàn),旨在比較和評(píng)估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在商品識(shí)別任務(wù)上的性能。實(shí)驗(yàn)的設(shè)計(jì)和目的是為了明確各版本模型在準(zhǔn)確性和檢測(cè)效率上的差異,以便為實(shí)際應(yīng)用提供更具指導(dǎo)性的見(jiàn)解。
??????? 首先,我們來(lái)看mAP,這是衡量目標(biāo)檢測(cè)模型準(zhǔn)確性的重要指標(biāo),它考慮了檢測(cè)準(zhǔn)確度與召回率。在我們的實(shí)驗(yàn)中,YOLOv5nu以0.911的mAP分?jǐn)?shù)領(lǐng)先,顯示出它在識(shí)別商品上具有非常高的準(zhǔn)確性。然而,這并不意味著YOLOv5nu在所有方面都是最優(yōu)的。YOLOv6n的mAP略低,為0.874,這表明它在準(zhǔn)確性方面略遜一籌。YOLOv7-tiny和YOLOv8n的mAP分?jǐn)?shù)分別為0.885和0.882,這兩者非常接近,但都沒(méi)有超過(guò)YOLOv5nu。
??????? 然后,我們觀察F1-Score,它是精確度和召回率的調(diào)和平均,是衡量模型整體性能的指標(biāo)。在F1-Score上,我們看到了不同的排名情況。YOLOv8n以0.85的得分位居首位,其次是YOLOv7-tiny的0.84和YOLOv6n的0.82,而YOLOv5nu的得分最低,為0.77。YOLOv8n在這個(gè)指標(biāo)上的領(lǐng)先表明,盡管在mAP上略低于YOLOv5nu,它卻能在召回率上取得更好的表現(xiàn),也就是說(shuō),在沒(méi)有增加過(guò)多誤檢的情況下,YOLOv8n能識(shí)別出更多的正類樣本。
??????? 通過(guò)對(duì)比這些數(shù)據(jù),我們可以得出幾個(gè)結(jié)論。首先,YOLOv5nu在準(zhǔn)確性上表現(xiàn)最好,但它在F1-Score上的表現(xiàn)卻是最差的,這可能是因?yàn)閅OLOv5nu在某些類別上有較多的誤檢,從而影響了其F1-Score。其次,雖然YOLOv6n和YOLOv7-tiny在mAP上有所差距,但它們?cè)贔1-Score上的表現(xiàn)卻相對(duì)較好,這意味著它們?cè)谡倩芈噬献龅帽容^好。最后,YOLOv8n雖然在mAP上不是最優(yōu)的,但它在F1-Score上的最高得分說(shuō)明了它在平衡精確度和召回率方面的優(yōu)勢(shì)。
???????總的來(lái)說(shuō),沒(méi)有哪一個(gè)模型在所有指標(biāo)上都是最優(yōu)的。每種版本的YOLO算法都有其獨(dú)特的優(yōu)點(diǎn)和不足。因此,在選擇算法時(shí),我們應(yīng)根據(jù)實(shí)際的應(yīng)用場(chǎng)景和需求來(lái)決定。例如,如果我們更重視準(zhǔn)確性以避免誤檢,那么YOLOv5nu可能是更好的選擇;而如果我們需要盡可能地識(shí)別出所有可能的商品,即使可能包含一些誤檢,那么YOLOv8n可能是更適合的。
4.4 代碼實(shí)現(xiàn)
????????在本篇博客中,我們致力于將復(fù)雜的深度學(xué)習(xí)模型應(yīng)用于實(shí)際的零售環(huán)境中,以便于用戶能夠輕松、高效地識(shí)別商品。這一系統(tǒng)不僅嵌入了最新的YOLOv8模型,還集成了用戶友好的圖形界面,使得商品識(shí)別變得直觀且便捷。
(1)引入必要的庫(kù)
????????首先,我們導(dǎo)入必要的Python模塊,這是為了確保系統(tǒng)具備處理視頻流、圖像處理、用戶界面交互以及文件路徑管理等多方面的能力。引入sys和time模塊允許我們與Python運(yùn)行時(shí)環(huán)境交互,并進(jìn)行時(shí)間相關(guān)的操作,而cv2庫(kù)提供了豐富的圖像處理功能。QtFusion和PySide6則是構(gòu)建我們圖形界面的基礎(chǔ)。
import sys # 導(dǎo)入sys模塊,用于處理Python運(yùn)行時(shí)環(huán)境的一些操作
import time # 導(dǎo)入time模塊,用于處理時(shí)間相關(guān)的操作
import cv2 # 導(dǎo)入OpenCV庫(kù),用于處理圖像和視頻
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 從QtFusion庫(kù)中導(dǎo)入FBaseWindow類,用于創(chuàng)建主窗口
from QtFusion.handlers import MediaHandler # 從QtFusion庫(kù)中導(dǎo)入MediaHandler類,用于處理媒體數(shù)據(jù)
from QtFusion.utils import drawRectBox # 從QtFusion庫(kù)中導(dǎo)入drawRectBox函數(shù),用于在圖像上繪制矩形框
from QtFusion.utils import get_cls_color # 從QtFusion庫(kù)中導(dǎo)入get_cls_color函數(shù),用于獲取類別顏色
from PySide6 import QtWidgets, QtCore # 導(dǎo)入PySide6庫(kù)的QtWidgets和QtCore模塊,用于創(chuàng)建GUI和處理Qt的核心功能
from YOLOv8Model import YOLOv8Detector # 從YOLOv8Model模塊中導(dǎo)入YOLOv8Detector類,用于進(jìn)行YOLOv8物體檢測(cè)QF_Config.set_verbose(False)
(2)設(shè)置主窗口
????????MainWindow類是我們系統(tǒng)用戶交互界面的核心,它繼承自Qt的QMainWindow類。在這個(gè)類中,我們初始化了GUI窗口,并設(shè)置了相應(yīng)的界面元素,例如用于顯示圖像的標(biāo)簽。我們還定義了鍵盤(pán)事件處理,以便用戶可以通過(guò)按鍵操作來(lái)控制程序,比如按下’Q’鍵以退出應(yīng)用程序。
class MainWindow(QMainWindow): # 定義MainWindow類,繼承自FBaseWindow類def __init__(self): # 定義構(gòu)造函數(shù)super().__init__() # 調(diào)用父類的構(gòu)造函數(shù)self.resize(640, 640) # 設(shè)置窗口的大小為850x500self.label = QtWidgets.QLabel(self) # 創(chuàng)建一個(gè)QLabel對(duì)象,用于顯示圖像self.label.setGeometry(0, 0, 640, 640) # 設(shè)置QLabel的位置和大小def keyPressEvent(self, event): # 定義鍵盤(pán)按鍵事件處理函數(shù)if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q鍵self.close() # 關(guān)閉窗口
(3)圖像幀處理
????????為了處理視頻中的每一幀圖像并應(yīng)用YOLOv8模型進(jìn)行商品檢測(cè),我們定義了frame_process函數(shù)。該函數(shù)首先對(duì)圖像進(jìn)行大小調(diào)整,以適應(yīng)模型輸入的要求。接著,使用模型對(duì)圖像進(jìn)行預(yù)測(cè),并計(jì)算處理時(shí)間,最終將檢測(cè)結(jié)果繪制在圖像上展示。通過(guò)繪制不同的顏色邊界框和標(biāo)簽,我們可以在圖像上清晰地標(biāo)示出不同類別的商品。
def frame_process(image): # 定義幀處理函數(shù),用于處理每一幀圖像image = cv2.resize(image, (850, 500)) # 將圖像的大小調(diào)整為850x500pre_img = model.preprocess(image) # 對(duì)圖像進(jìn)行預(yù)處理t1 = time.time() # 獲取當(dāng)前時(shí)間pred = model.predict(pre_img) # 使用模型進(jìn)行預(yù)測(cè)t2 = time.time() # 獲取當(dāng)前時(shí)間use_time = t2 - t1 # 計(jì)算預(yù)測(cè)所花費(fèi)的時(shí)間print("推理時(shí)間: %.2f" % use_time) # 打印預(yù)測(cè)所花費(fèi)的時(shí)間det = pred[0] # 獲取預(yù)測(cè)結(jié)果# 如果有檢測(cè)信息則進(jìn)入if det is not None and len(det):det_info = model.postprocess(pred) # 對(duì)預(yù)測(cè)結(jié)果進(jìn)行后處理for info in det_info: # 遍歷檢測(cè)信息name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id'] # 獲取類別名稱、邊界框、置信度和類別IDlabel = '%s %.0f%%' % (name, conf * 100) # 創(chuàng)建標(biāo)簽,包含類別名稱和置信度# 畫(huà)出檢測(cè)到的目標(biāo)物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在圖像上繪制邊界框和標(biāo)簽window.dispImage(window.label, image) # 在窗口的label上顯示圖像
(4)初始化檢測(cè)模型和設(shè)備
????????模型加載和類別顏色分配是通過(guò)創(chuàng)建YOLOv8Detector對(duì)象并加載預(yù)訓(xùn)練權(quán)重來(lái)完成的。此外,定義了一個(gè)類別名稱列表,這有助于在后續(xù)處理中正確標(biāo)注各個(gè)檢測(cè)到的商品。整個(gè)應(yīng)用程序是通過(guò)QApplication實(shí)例來(lái)運(yùn)行的,我們創(chuàng)建了MainWindow的一個(gè)實(shí)例來(lái)作為應(yīng)用程序的主窗口。使用MediaHandler對(duì)象來(lái)處理視頻流,當(dāng)新的圖像幀準(zhǔn)備好時(shí),通過(guò)信號(hào)連接機(jī)制調(diào)用frame_process函數(shù)進(jìn)行處理,從而實(shí)現(xiàn)了實(shí)時(shí)視頻流的商品檢測(cè)。
cls_name = ["經(jīng)典奶油", "藏紅花杏仁", "杏仁布丁", "開(kāi)心果杏仁", "皇家巧克力", "芒果洗面奶", "金色面膜50G","金色面膜90G", "核桃磨砂200G", "檀香粉25G", "核桃杏仁磨砂100G", "核桃杏仁磨砂50G", "橙子面膜90G","印楝洗面奶", "黃瓜面膜", "巧克力櫻桃面膜", "印楝木瓜面膜", "可可乳液", "植物乳液", "柑橘乳液","防曬漿果乳液", "檸檬水", "常規(guī)", "常規(guī)2KG", "濃橙", "泡菜蛋黃醬", "泡菜蛋黃醬小", "芝士蒜蛋黃醬","芝士蒜蛋黃醬小", "巧克力涂醬", "純酥油", "炭烤蛋黃醬", "炭烤蛋黃醬小", "素蛋黃醬", "痱子粉","無(wú)糖金500粒", "無(wú)糖金粉100G", "無(wú)糖金小包", "無(wú)糖金小包50", "無(wú)糖綠300粒", "無(wú)糖自然500粒","無(wú)糖自然瘦糖80G", "無(wú)糖自然瘦糖", "無(wú)糖自然小包", "無(wú)糖自然甜滴", "無(wú)糖自然瘦糖80G","無(wú)糖自然粉100G", "無(wú)糖綠粉100G", "糖精袋500G"] # 定義類名列表model = YOLOv8Detector() # 創(chuàng)建YOLOv8Detector對(duì)象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加載預(yù)訓(xùn)練的YOLOv8模型
colors = get_cls_color(model.names) # 獲取類別顏色app = QtWidgets.QApplication(sys.argv) # 創(chuàng)建QApplication對(duì)象
window = MainWindow() # 創(chuàng)建MainWindow對(duì)象filename = abs_path("test_media/20-商品識(shí)別.mp4", path_type="current") # 定義視頻文件的路徑
videoHandler = MediaHandler(fps=30) # 創(chuàng)建MediaHandler對(duì)象,設(shè)置幀率為30fps
videoHandler.frameReady.connect(frame_process) # 當(dāng)有新的幀準(zhǔn)備好時(shí),調(diào)用frame_process函數(shù)進(jìn)行處理
videoHandler.setDevice(filename) # 設(shè)置視頻源
videoHandler.startMedia() # 開(kāi)始處理媒體# 顯示窗口
window.show()
# 進(jìn)入 Qt 應(yīng)用程序的主循環(huán)
sys.exit(app.exec())
????????我們通過(guò)設(shè)置視頻文件作為輸入源,并開(kāi)始媒體流的處理,將檢測(cè)結(jié)果實(shí)時(shí)顯示在主窗口上。這樣,用戶就可以通過(guò)交互式窗口實(shí)時(shí)觀察并分析模型的商品識(shí)別效果,從而直觀地評(píng)估模型性能。通過(guò)這種方式,我們不僅展示了如何將深度學(xué)習(xí)模型與圖形用戶界面結(jié)合,還演示了如何在實(shí)際應(yīng)用中實(shí)時(shí)處理和展示模型的預(yù)測(cè)結(jié)果。
5. 商品識(shí)別系統(tǒng)實(shí)現(xiàn)
????????在實(shí)現(xiàn)一款實(shí)時(shí)商品識(shí)別系統(tǒng)時(shí),系統(tǒng)設(shè)計(jì)思路的核心在于創(chuàng)造一個(gè)高效、直觀且用戶友好的交互平臺(tái),以實(shí)現(xiàn)實(shí)時(shí)的商品識(shí)別。為此,我們采用了面向?qū)ο蟮木幊谭妒?#xff0c;將復(fù)雜的問(wèn)題簡(jiǎn)化為對(duì)象之間的交互。這種方法不僅提升了代碼的模塊化程度,還使得后續(xù)的維護(hù)和升級(jí)變得更加容易。
5.1 系統(tǒng)設(shè)計(jì)思路
????????我們的設(shè)計(jì)初衷是創(chuàng)建一個(gè)既直觀又高效的工具,用于加強(qiáng)工作場(chǎng)所的安全監(jiān)督。為此,我們?cè)O(shè)計(jì)了一個(gè)MainWindow類,它是整個(gè)應(yīng)用的核心,將用戶界面(UI)、媒體處理和目標(biāo)檢測(cè)模型緊密集成。在設(shè)計(jì)過(guò)程中,我們確保了各個(gè)功能模塊能夠獨(dú)立運(yùn)行,并且相互協(xié)作,提供一個(gè)無(wú)縫的用戶體驗(yàn)。
架構(gòu)設(shè)計(jì)
????????我們構(gòu)建的架構(gòu)體現(xiàn)了模塊化設(shè)計(jì),其中包括處理層、界面層和控制層,每層都有其獨(dú)立的職責(zé)。
- 處理層(Processing Layer):處理層承擔(dān)了系統(tǒng)的數(shù)據(jù)處理和分析工作。通過(guò)集成了YOLOv8Detector,一個(gè)強(qiáng)大的預(yù)訓(xùn)練模型,我們能夠?qū)斎氲膱D像進(jìn)行快速且精準(zhǔn)的物體檢測(cè),這是整個(gè)商品識(shí)別系統(tǒng)的核心。
- 界面層(UI Layer):界面層作為用戶與系統(tǒng)互動(dòng)的直接接口,我們使用Qt框架構(gòu)建了一套直觀的用戶界面。這個(gè)界面包含了豐富的交互元素,允許用戶方便地加載視頻流,并實(shí)時(shí)查看模型的識(shí)別結(jié)果。界面的設(shè)計(jì)考慮到了用戶體驗(yàn),確保操作的簡(jiǎn)潔性和直觀性,降低了用戶的學(xué)習(xí)成本。
- 控制層(Control Layer):控制層則是溝通處理層和界面層的橋梁。它通過(guò)MainWindow類實(shí)現(xiàn)的槽函數(shù)和控制方法,響應(yīng)用戶的指令,控制數(shù)據(jù)流向和處理邏輯。此外,我們利用了Qt強(qiáng)大的信號(hào)和槽機(jī)制,實(shí)現(xiàn)了異步處理和模塊間的緊密協(xié)作,這樣確保了系統(tǒng)的高響應(yīng)性和良好的用戶體驗(yàn)。
????????整個(gè)設(shè)計(jì)旨在實(shí)現(xiàn)一個(gè)模塊化的系統(tǒng),各個(gè)組件可以獨(dú)立工作,同時(shí)又能無(wú)縫協(xié)作。這種設(shè)計(jì)不僅使得系統(tǒng)的擴(kuò)展性和維護(hù)性大大提升,也為用戶提供了一個(gè)功能全面、操作便捷的商品識(shí)別工具。
系統(tǒng)流程
????????本篇文章專注于介紹一個(gè)交互式商品識(shí)別系統(tǒng)的流程設(shè)計(jì)。該系統(tǒng)通過(guò)集成最先進(jìn)的目標(biāo)檢測(cè)算法YOLOv8,為用戶提供了一個(gè)高效且直觀的工具,以增強(qiáng)對(duì)工作場(chǎng)所安全的監(jiān)控。
- 整個(gè)設(shè)計(jì)旨在實(shí)現(xiàn)一個(gè)模塊化的系統(tǒng),各個(gè)組件可以獨(dú)立工作,同時(shí)又能無(wú)縫協(xié)作。這種設(shè)計(jì)不僅使得系統(tǒng)的擴(kuò)展性和維護(hù)性大大提升,也為用戶提供了一個(gè)功能全面、操作便捷的商品識(shí)別工具。
- 應(yīng)用程序的界面設(shè)計(jì)直觀而清晰,它允許用戶輕松選擇他們希望分析的媒體類型——無(wú)論是攝像頭捕獲的實(shí)時(shí)圖像,還是預(yù)錄制的視頻文件,甚至是靜態(tài)圖片。這種設(shè)計(jì)使得系統(tǒng)能夠靈活應(yīng)對(duì)各種應(yīng)用場(chǎng)景,無(wú)論是零售店內(nèi)的實(shí)時(shí)監(jiān)控還是離線的商品庫(kù)存分析。
- 選擇了輸入源后,系統(tǒng)將調(diào)用一個(gè)專門(mén)的媒體處理器來(lái)讀取和配置數(shù)據(jù)流。對(duì)于攝像頭,這可能包括調(diào)整分辨率和幀率;對(duì)于視頻文件,則涉及解碼和緩沖技術(shù);而對(duì)于靜態(tài)圖片,則需要確保正確的格式和大小。這一處理過(guò)程是自動(dòng)的,確保了用戶在這一階段的操作盡可能簡(jiǎn)單。
- 一旦媒體輸入源準(zhǔn)備好,系統(tǒng)就會(huì)進(jìn)入一個(gè)連續(xù)的幀處理循環(huán)。在預(yù)處理階段,每幀圖像都會(huì)被調(diào)整和轉(zhuǎn)換以滿足YOLOv8模型的輸入要求。隨后,這些圖像被送入我們精心訓(xùn)練的YOLOv8模型中,模型將利用其深度學(xué)習(xí)能力進(jìn)行快速而準(zhǔn)確的商品檢測(cè)和識(shí)別。
- 檢測(cè)和識(shí)別結(jié)果產(chǎn)生后,界面會(huì)實(shí)時(shí)更新以反映最新的信息。檢測(cè)框、商品類別標(biāo)注以及相關(guān)的統(tǒng)計(jì)數(shù)據(jù)都會(huì)即時(shí)展現(xiàn)在用戶面前,使得用戶可以直觀地理解當(dāng)前場(chǎng)景下商品的分布和狀態(tài)。此外,用戶還可以通過(guò)界面的按鈕來(lái)保存結(jié)果、獲取幫助信息,或使用下拉菜單來(lái)篩選和深入分析特定類別的商品。
- 最后,系統(tǒng)提供了豐富的媒體控制選項(xiàng)。用戶可以根據(jù)需要,隨時(shí)開(kāi)始或暫停視頻分析,或是控制攝像頭的捕獲狀態(tài)。這一環(huán)節(jié)的設(shè)計(jì)充分考慮了實(shí)際操作中的靈活性需求,讓用戶能夠根據(jù)實(shí)時(shí)場(chǎng)景變化做出響應(yīng)。
????????整體而言,商品識(shí)別系統(tǒng)通過(guò)其人性化的設(shè)計(jì)、強(qiáng)大的功能以及優(yōu)秀的用戶界面,為零售商、倉(cāng)庫(kù)管理員或任何需要商品識(shí)別服務(wù)的用戶提供了一套完整的解決方案。這一系統(tǒng)不僅能夠顯著提升商品管理的效率和準(zhǔn)確性,也極大地簡(jiǎn)化了用戶的操作流程。
5.2 登錄與賬戶管理
????????在當(dāng)今的信息時(shí)代,安全性和個(gè)性化成為了軟件系統(tǒng)設(shè)計(jì)中不可或缺的部分。本系統(tǒng)不僅重視商品識(shí)別的核心功能,更在用戶體驗(yàn)上下足了功夫,通過(guò)實(shí)現(xiàn)登錄與賬戶管理,為用戶提供了一個(gè)既安全又個(gè)性化的操作平臺(tái)。
????????我們的系統(tǒng)通過(guò)整合了PySide6框架的高效GUI編程和SQLite的輕量級(jí)數(shù)據(jù)庫(kù)技術(shù),打造了一個(gè)用戶登錄界面,確保每位用戶都能擁有一個(gè)專屬的操作環(huán)境。在用戶登錄界面,我們提供了賬戶注冊(cè)功能,允許新用戶創(chuàng)建自己的賬號(hào);密碼修改功能,保證用戶可以在必要時(shí)更新自己的登錄憑證;頭像設(shè)置,讓用戶的個(gè)性化需求得到滿足;以及賬戶注銷功能,確保用戶在不需要使用系統(tǒng)時(shí),能夠安全地退出。
????????當(dāng)用戶通過(guò)這一界面登錄后,便可以進(jìn)入到我們功能強(qiáng)大的商品識(shí)別主界面。在這里,用戶的操作不僅限于商品識(shí)別,更包括對(duì)識(shí)別結(jié)果的保存和管理。無(wú)論是圖片、視頻文件、實(shí)時(shí)捕捉的攝像頭圖像還是批量文件,系統(tǒng)都能提供穩(wěn)定而精準(zhǔn)的識(shí)別服務(wù),并實(shí)時(shí)顯示包括檢測(cè)框、類別及置信度在內(nèi)的詳細(xì)信息。
????????此外,系統(tǒng)的個(gè)性化設(shè)置也不僅限于登錄界面。在主界面中,用戶的個(gè)性化需求得到了進(jìn)一步的體現(xiàn)——不僅可以實(shí)時(shí)監(jiān)控識(shí)別過(guò)程,還能對(duì)識(shí)別結(jié)果進(jìn)行詳盡的分析和篩選。用戶還可以根據(jù)自己的需要對(duì)系統(tǒng)設(shè)置進(jìn)行調(diào)整,使系統(tǒng)更加符合個(gè)人的操作習(xí)慣。
????????通過(guò)這樣的系統(tǒng)設(shè)計(jì),我們的商品識(shí)別系統(tǒng)既展現(xiàn)了技術(shù)上的先進(jìn)性,又在實(shí)用性和人性化設(shè)計(jì)上達(dá)到了新的高度。用戶在享受智能識(shí)別帶來(lái)的便捷的同時(shí),也能感受到系統(tǒng)對(duì)于個(gè)人隱私和個(gè)性化需求的尊重。
下載鏈接
????若您想獲得博文中涉及的實(shí)現(xiàn)完整全部資源文件(包括測(cè)試圖片、視頻,py, UI文件,訓(xùn)練數(shù)據(jù)集、訓(xùn)練代碼、界面代碼等),這里已打包上傳至博主的面包多平臺(tái),見(jiàn)可參考博客與視頻,已將所有涉及的文件同時(shí)打包到里面,點(diǎn)擊即可運(yùn)行,完整文件截圖如下:
完整資源中包含數(shù)據(jù)集及訓(xùn)練代碼,環(huán)境配置與界面中文字、圖片、logo等的修改方法請(qǐng)見(jiàn)視頻,項(xiàng)目完整文件下載請(qǐng)見(jiàn)演示與介紹視頻的簡(jiǎn)介處給出:???
演示與介紹視頻:https://www.bilibili.com/video/BV1Bj421Z7YU/
????在文件夾下的資源顯示如下,下面的鏈接中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟件后,復(fù)制離線依賴包至項(xiàng)目目錄下進(jìn)行安裝,另外有詳細(xì)安裝教程:(1)Pycharm軟件安裝教程;(2)Anaconda軟件安裝教程;(3)Python環(huán)境配置教程;
離線依賴安裝教程:https://www.bilibili.com/video/BV1hv421C7g8/
離線依賴庫(kù)下載鏈接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取碼:33z5)
6. 總結(jié)與展望
????????在本博客中,我們?cè)敿?xì)介紹了一個(gè)基于YOLOv8模型的實(shí)時(shí)商品識(shí)別系統(tǒng)。系統(tǒng)以模塊化的方式設(shè)計(jì),充分采用了合理的架構(gòu)設(shè)計(jì),帶來(lái)良好的可維護(hù)性和可擴(kuò)展性。其用戶界面友好,能夠提供實(shí)時(shí)的商品識(shí)別結(jié)果展示,同時(shí)支持用戶賬戶管理,以便于保存和管理檢測(cè)結(jié)果和設(shè)置。
????????該系統(tǒng)支持?jǐn)z像頭、視頻、圖像和批量文件等多種輸入源,能夠滿足用戶在不同場(chǎng)景下的需求。在后面可以添加更多預(yù)訓(xùn)練模型,增加檢測(cè)和識(shí)別的種類;優(yōu)化用戶界面,增強(qiáng)個(gè)性化設(shè)置;并積極聆聽(tīng)用戶反饋,以期不斷改進(jìn)系統(tǒng),以更好地滿足用戶的需求。
結(jié)束語(yǔ)
????????由于博主能力有限,博文中提及的方法即使經(jīng)過(guò)試驗(yàn),也難免會(huì)有疏漏之處。希望您能熱心指出其中的錯(cuò)誤,以便下次修改時(shí)能以一個(gè)更完美更嚴(yán)謹(jǐn)?shù)臉幼?#xff0c;呈現(xiàn)在大家面前。同時(shí)如果有更好的實(shí)現(xiàn)方法也請(qǐng)您不吝賜教。
Huang R, Pedoeem J, Chen C. YOLO-LITE: a real-time object detection algorithm optimized for non-GPU computers[C]//2018 IEEE international conference on big data (big data). IEEE, 2018: 2503-2510. ??
Mathew M P, Mahesh T Y. Leaf-based disease detection in bell pepper plant using YOLO v5[J]. Signal, Image and Video Processing, 2022: 1-7. ??
Yung N D T, Wong W K, Juwono F H, et al. Safety helmet detection using deep learning: Implementation and comparative study using YOLOv5, YOLOv6, and YOLOv7[C]//2022 International Conference on Green Energy, Computing and Sustainable Technology (GECOST). IEEE, 2022: 164-170. ??
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ??
Wang G, Chen Y, An P, et al. UAV-YOLOv8: a small-object-detection model based on improved YOLOv8 for UAV aerial photography scenarios[J]. Sensors, 2023, 23(16): 7190. ??