基于PyQt5與深度學習的可視化水果識別系統(集成CNN, MobileNetV2, VGG16)

一、項目概述

大家好!今天我將分享一個我近期完成的深度學習項目——一個功能強大的、帶圖形化界面(GUI)的水果識別系統。該系統不僅能識別靜態圖片中的水果,還集成了模型訓練、評估、數據增強等功能于一體,為深度學習的入門和實踐提供了一個絕佳的案例。

本項目使用 Python 作為主要開發語言,后端算法基于 TensorFlow/Keras 深度學習框架,前端界面則采用 PyQt5 構建,實現了算法與應用的分離,界面美觀,交互友好。

核心技術棧:

  • GUI框架: PyQt5
  • 深度學習框架: TensorFlow 2.x / Keras
  • 計算機視覺庫: OpenCV-Python
  • 數據可視化: Matplotlib
  • 核心模型:
    1. 自定義的輕量級 CNN
    2. 基于遷移學習的 MobileNetV2
    3. 基于遷移學習的 VGG16

二、功能展示

系統主界面通過一個選項卡(QTabWidget)清晰地劃分了五大核心功能區。

1. 靜態圖片識別

在這里插入圖片描述
用戶可以選擇本地的水果圖片,然后從下拉列表中選擇一個已訓練好的模型(CNN, MobileNetV2, VGG16)進行識別。識別結果會立刻顯示在界面右側。

2. 實時視頻識別(補充功能)

本系統支持通過本地視頻文件或直接調用攝像頭進行實時識別。在視頻流的每一幀上,系統都會進行預測,并將結果實時繪制在畫面上,非常直觀。

3. 模型訓練

在這里插入圖片描述
這是系統的核心功能之一。用戶可以直接在界面上點擊按鈕,啟動對CNN、MobileNetV2或VGG16模型的訓練。訓練過程中的所有日志(Epoch、loss、accuracy等)都會實時顯示在文本框中。訓練結束后,準確率和損失曲線圖會自動繪制并顯示在右側,同時新模型會被自動加載,可立即用于識別。

4. 模型評估

在這里插入圖片描述

為了量化模型的性能,評估功能可以計算模型在驗證集上的準確率,并生成一個詳細的混淆矩陣(Confusion Matrix)熱力圖。這有助于我們分析模型對哪些類別的識別效果好,哪些容易混淆。

5. 數據增強

提供了一個一鍵數據增強的工具。它會遍歷指定文件夾中的原始圖片,通過旋轉、平移、縮放、翻轉等操作批量生成新的訓練樣本,有效擴充數據集,防止模型過擬合。

三、系統架構與代碼解析

項目的代碼結構清晰,每個文件各司其職。

  • main.ui.py: 主程序入口和UI界面。負責創建所有窗口控件,處理用戶交互事件,并使用 QProcessQThread 調用后端的訓練和識別腳本,避免了界面卡死。
  • CNNTrain.py: 自定義CNN模型的訓練腳本。包含數據加載、模型構建、訓練和保存的全過程。
  • MobileNetTrain.py: MobileNetV2模型的遷移學習訓練腳本。
  • VGG16Train.py: VGG16模型的遷移學習訓練腳本。
  • testModel.py: 模型評估腳本。負責加載模型,在驗證集上進行測試,并生成混淆矩陣。
  • geneImage.py: 數據增強腳本。用于離線擴充數據集。

1. 核心亮點:遷移學習的應用 (MobileNetTrain.py)

為了在有限的數據集上達到高精度,我們主要采用了遷移學習。以 MobileNetTrain.py 為例,我們加載了在ImageNet上預訓練的MobileNetV2模型,并凍結其大部分權重,只訓練我們自己添加的分類層。

def model_load(IMG_SHAPE=(224, 224, 3), class_num=15):# 加載預訓練的MobileNetV2模型,不包含頂部分類層base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,include_top=False, # 關鍵:不加載全連接層weights='imagenet')# 凍結預訓練模型的權重,在訓練中不更新它們base_model.trainable = Falsemodel = tf.keras.models.Sequential([# 使用預訓練的MobileNetV2作為基座base_model,# 對主干模型的輸出進行全局平均池化tf.keras.layers.GlobalAveragePooling2D(),# 添加Dropout層,防止分類器過擬合tf.keras.layers.Dropout(0.5),# 添加我們自己的全連接分類層tf.keras.layers.Dense(class_num, activation='softmax')])# 編譯模型model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])model.summary()return model

關鍵點

  1. include_top=False:這是使用遷移學習的核心,我們只借用模型的特征提取部分。
  2. base_model.trainable = False:凍結權重可以防止在小數據集上破壞預訓練學到的通用特征。
  3. 自定義分類頭:在base_model之后添加了GlobalAveragePooling2DDropoutDense層,這是我們需要從頭開始訓練的部分。

2. 界面與邏輯分離 (main.ui.py)

為了保證用戶體驗,耗時的任務(如模型訓練和實時視頻處理)不能阻塞UI主線程。

  • 模型訓練:通過QProcess啟動一個外部Python進程來執行訓練腳本。這樣,訓練過程與主界面完全分離,并且可以通過重定向標準輸出來捕獲日志。

    def run_script(self, script_name, args=None):# ... 省略部分代碼 ...self.process = QProcess(self)# 連接信號與槽,用于讀取輸出self.process.readyReadStandardOutput.connect(lambda: self.handle_stdout(output_widget))self.process.finished.connect(...)# 啟動外部腳本command = f'python -u {script_name}'self.process.start(command)
    
  • 實時識別:通過QThread將視頻的讀取和模型預測放到一個工作線程中。工作線程完成一幀的預測后,通過pyqtSignal發射一個信號,將處理好的圖像(QImage)傳回主線程進行顯示。

    class VideoWorker(QThread):change_pixmap_signal = pyqtSignal(QImage)def run(self):# ... 視頻讀取和模型預測 ...# 循環中if ret:# ...# 發射信號,將處理后的圖像傳給UI線程self.change_pixmap_signal.emit(qt_image)# 在主窗口中
    self.video_thread.change_pixmap_signal.connect(self.update_frame)
    

3. 精細化的模型預處理

不同的預訓練模型通常需要不同的輸入預處理方式。例如,CNN模型通常需要將像素值歸一化到[0, 1],而MobileNetV2和VGG16則有自己專用的preprocess_input函數。我們的代碼嚴格區分了這一點,確保模型在預測時接收到正確格式的數據。

# 在 main.ui.py 的 predict_image 方法中
if model_name == 'MobileNetV2':processed_array = mobilenet_preprocess_input(img_array)
elif model_name == 'VGG16':processed_array = vgg16_preprocess_input(img_array)
else: # Default for CNNprocessed_array = img_array / 255.0# 模型預測
predictions = model.predict(processed_array)

四、如何運行

  1. 環境配置:
    pip install tensorflow opencv-python matplotlib pyqt5
    
  2. 數據集準備:
    在項目根目錄的上級目錄創建一個fruit文件夾,內部結構如下:
    /project_folder/your_scripts_foldermain.ui.py...
    /fruit/train/Apple1.jpg2.jpg.../Banana.../val/Apple.../Banana...
    
  3. 訓練模型:
    直接運行main.ui.py,在“模型訓練”選項卡中點擊相應的按鈕進行訓練。訓練好的模型會保存在models文件夾下。
  4. 開始使用:
    模型訓練完畢后,即可在其他選項卡中進行識別和評估。

五、總結與展望

本項目完整地實現了一個從數據處理、模型訓練到部署應用的深度學習全流程。通過PyQt5將復雜的功能封裝在友好的圖形界面下,大大降低了使用門檻。

未來可擴展的方向:

  • 模型優化: 嘗試更先進的模型(如EfficientNet)或對當前模型進行微調(Fine-tuning)以提高精度。
  • 功能擴展: 增加對水果新鮮度、卡路里等信息的識別與展示。
  • 部署: 將模型部署到Web端或移動端,提供更廣泛的服務。

希望這個項目能對你有所啟發,感謝閱讀!如果你覺得不錯,歡迎點贊、收藏、關注!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s-服務發布基礎

目錄 Service的定義 核心定義 Service 的類型 關鍵組件與機制 工作流程示例 高級特性 Service工作原理 核心工作原理 標簽選擇器(Label Selector) Endpoints 對象 網絡代理與負載均衡(kube-proxy) userspace 模式&#…

洛谷P1514 [NOIP 2010 提高組] 引水入城

洛谷P1514 [NOIP 2010 提高組] 引水入城 洛谷題目傳送門 題目背景 NOIP2010 提高組 T4 題目描述 在一個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成一個 NNN 行 MMM 列的矩形&#xff…

【unity小技巧】國內Unity6下載安裝和一些Unity6新功能使用介紹

文章目錄前言一、安裝1、國外下載2、國內下載二、常用的新功能變化1、官方推薦使用inputsystem進行輸入控制2、修復了InputSystem命名錯誤導致listen被遮擋的bug3、自帶去除unity啟動畫面logo功能4、unity官方的behavior行為樹插件5、linearVelocity代替過時的velocity方法6、隨…

Rust 中字符串類型區別解析

在 Rust 中,"hello" 和 String::from("hello") 都表示字符串,但它們在內存表示、所有權和可變性上有本質區別:1. 類型與內存表示"hello" (字符串字面量):類型為 &str(字符串切片引用…

springMVC05-異常處理器

在 SpringMVC 中,異常處理是一個非常重要的功能,它可以讓你優雅地處理程序拋出的各種異常,向用戶展示友好的提示,而不是顯示一堆報錯信息(如 500 頁面)。一、SpringMVC的異常處理器返回的是ModelAndView&am…

安裝 Elasticsearch IK 分詞器

安裝 Elasticsearch IK 分詞器(手動 .zip/.zip 安裝) IK 分詞器(IK Analysis)是 Elasticsearch 最常用的中文分詞插件,支持 細粒度分詞(ik_max_word) 和 智能切分(ik_smart&#xf…

數據庫系統原理實驗1:創建數據庫、數據表及單表查詢

一、實驗目的1.掌握在SQL Server中使用對象資源管理器和SQL命令創建數據庫與修改數據庫的方法。2.掌握在SQL Server中使用對象資源管理器或者SQL命令創建數據表和修改數據表的方法(以SQL命令為重點)。3.掌握無條件查詢…

【STM32】ADC模數轉換基本原理(提供完整實例代碼)

這篇文章是嵌入式中我通過大量資料 整合成了一份 系統完整、層次清晰的 ADC 模數轉換原理解析 文檔。 這里系統地梳理了 STM32F1 系列 ADC 模數轉換的核心資料,包括: 1.原理 特性 2.通道配置 3.模式選擇(單次/連續/掃描) 4.關鍵寄…

圖神經網絡 gnn 應用到道路網絡拓撲結構與交通碳排放相關性。,拓撲指標量化、時空關聯模型及演化機制分析

針對您提出的“道路網絡拓撲結構與交通碳排放相關框架,以下結合研究目標、數據與方法進行系統性深化設計,重點強化拓撲指標量化、時空關聯模型及演化機制分析:一、核心研究問題深化 靜態關聯:不同拓撲結構(方格網/環射…

7.6 優先隊列| dijkstra | hash | rust

lc1337pair存入&#xff0c;lambda sort后取出&#xff0c;最開始想用hash&#xff0c;寫一半感覺寫復雜了class Solution {public:vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {int m mat.size();int n mat[0].size();vector<pair…

最新 HarmonyOS API 20 知識庫 重磅推出

最新 HarmonyOS API 20 知識庫 重磅推出 前言 最近整理下 華為開發者聯盟最新的 API 20的鴻蒙應用開發文檔&#xff0c;這次的API 20 相比較之前的文檔&#xff0c;要多了不少內容&#xff0c;目前整理后是9000千多篇&#xff0c;不容易呀。 如何使用 基于騰訊的知識庫工具 …

uniapp 監聽物理返回按鈕

import {onShow,onHide,onLoad,onReady,onBackPress} from "dcloudio/uni-app"onBackPress((e) > {showLog("返回按鈕觸發")if(e.frombackbutton){//開始干活}})參數說明屬性類型說明fromString觸發返回行為的來源&#xff1a;backbutton——左上角導航…

多線程(2)

多線程&#xff08;2&#xff09; &#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&#x1f7e2;&#x1f535;&#x1f7e3;&#x1f534;&#x1f534;&#x1f7e0;&#x1f7e1;&am…

網關助力航天噴涂:Devicenet與Modbus TCP的“跨界對話“

在航空航天領域&#xff0c;飛機、航天器的制造過程有著極高的精度與安全性要求。以飛機、航天器表面噴涂作業為例&#xff0c;不僅要進行嚴格的防腐蝕處理&#xff0c;而且對表面光滑度要求極高&#xff0c;這直接關系到飛行器的空氣動力學性能和使用壽命。為確保作業安全與質…

從傳統項目管理到敏捷DevOps:如何轉向使用DevOps看板工具進行工作流管理

在DevOps實踐中&#xff0c;DevOps看板工具成為了開發與運維團隊之間高效協作的關鍵。隨著企業對敏捷開發和持續交付的需求日益增長&#xff0c;DevOps看板工具通過可視化的管理方法&#xff0c;幫助團隊在繁雜的任務中保持高效的工作節奏和清晰的進度跟蹤。 具體而言&#xff…

【leetcode100】下一個排列

1、題目描述 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整數數組的 下一個排列 是指其整數的下一個字典序更大的排列。更正…

Flink-Source算子狀態恢復分析

背景 修改 source 算子 kafka_old_topic 消費任務運行一段時間后&#xff0c;暫停狀態并保留。然后將 uid 和 topic 都改了&#xff0c;消費者 offset 會從 earliest 開始。 // before FlinkKafkaConsumer consumer KafkaConfig.getConsumer("kafka_old_topic");…

IDEA中application.yml配置文件不自動提示解決辦法

今天在自己的電腦上使用IDEA的時候&#xff0c;發現在application配置文件里面輸入配置項的時候沒有提示&#xff0c;網上找了一圈也沒解決&#xff0c;最后自己試出來了。 解決辦法&#xff1a; 鼠標移動到配置文件上&#xff0c;單擊右鍵-重寫文件類型、選擇YAML(捆綁)&#…

Vite 完整功能詳解與 Vue 項目實戰指南

Vite 完整功能詳解與 Vue 項目實戰指南 Vite 是下一代前端開發工具&#xff0c;由 Vue 作者尤雨溪開發&#xff0c;提供極速的開發體驗和高效的生產構建。以下是完整功能解析和實戰示例&#xff1a;一、Vite 核心功能亮點閃電般冷啟動 基于原生 ES 模塊&#xff08;ESM&#xf…

Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解

&#x1f4d8;Vue 3 中使用路由參數跳轉時 watch 觸發重復請求問題詳解&#x1f516; 收藏 點贊 關注&#xff0c;掌握 Vue 3 路由參數監聽中的隱藏陷阱&#xff0c;避免詳情頁、嵌套路由頁誤觸發重復請求&#xff01;&#x1f9e9; 一、問題背景 在 Vue 3 項目中&#xff0c…