競賽選題 python+深度學習+opencv實現植物識別算法系統

0 前言

🔥 優質競賽項目系列,今天要分享的是

🚩 基于深度學習的植物識別算法研究與實現

在這里插入圖片描述

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:4分
  • 工作量:4分
  • 創新點:4分

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate


2 相關技術

2.1 VGG-Net模型

Google DeepMind公司研究員與牛津大學計算機視覺組在2014年共同研發出了一種全新的卷積神經網絡–VGG-
Net。在同年舉辦的ILSVRC比賽中,該網絡結構模型在分類項目中取得了十分出色的成績,由于其簡潔性和實用性,使得其在當時迅速,飛快地成為了最受歡迎的卷積神經網絡模型。VGG-
Net卷積神經網絡在近年來衍生出了A-
E七種不同的層次結構,本次研究使用其中的D結構,也就是VGG-16Net結構,該結構中包含了13個卷積層,5個池化層和3個全連接層。針對所有的卷積層,使用相同的5x5大小的卷積核,針對所有的池化層,使用相同的3x3大小的池化核。VGG-
Net結構如圖所示。

在這里插入圖片描述

2.2 VGG-Net在植物識別的優勢

在針對植物識別問題上,VGG-Net有著一些相較于其他神經網絡的優勢,主要包括以下幾點:

(1) 卷積核,池化核大小固定

網絡中所有的卷積核大小固定為3x3,所有的池化核大小固定為5x5。這樣在進行卷積和池化操作的時候,從數據中提取到的特征更加明顯,同時在層與層的連接時,信息的丟失會更少,更加方便后續對于重要特征的提取和處理。

(2) 特征提取更全面

VGG-
Net網絡模型中包含了13個卷積層。卷積層數目越多,對于特征的提取更加的全面。由于需要對于植物的姿態、顏色等進行判定,植物的特征較多,需要在提取時更加的全面,細致,才有可能得到一個更加準確的判定。VGG-
Net符合條件。

在這里插入圖片描述

(3) 網絡訓練誤差收斂速度較快

VGG-
Net網絡在訓練時收斂速度相對較快,能夠較快地得到預期的結果。具有這一特點的原因有兩個,一個是網絡中每一個卷積層和池化層中的卷積核大小與池化核大小固定,另一個就是對于各個隱藏層的參數初始化方法使用專門針對ReLU激活函數的Kaiming正態初始化方法。

3 VGG-Net的搭建

本次研究基于Pytorch深度學習框架進行網絡的搭建,利用模塊化的設計思想,構建一個類,來對于整個的網絡進行結構上的封裝。這樣搭建的好處是可以隱藏實現的內部細節,提高代碼的安全性,增強代碼的復用效率,并且對于一些方法,通過在內部集成,可以方便之后對于其中方法的調用,提升代碼的簡潔性。
在網絡搭建完成后,將數據集傳入網絡中進行訓練,經過一段時間后即可得到植物識別的分類識別結果。

3.1 Tornado簡介

Tornado全稱Tornado Web
Server,是一個用Python語言寫成的Web服務器兼Web應用框架,由FriendFeed公司在自己的網站FriendFeed中使用,被Facebook收購以后框架在2009年9月以開源軟件形式開放給大眾。

(1) 優勢

  • 輕量級web框架
  • 異步非阻塞IO處理方式
  • 出色的抗負載能力
  • 優異的處理性能,不依賴多進程/多線程,一定程度上解決C10K問題
  • WSGI全棧替代產品,推薦同時使用其web框架和HTTP服務器

(2) 關鍵代碼

    
?    class MainHandler(tornado.web.RequestHandler):
?        def get(self):
?            self.render("index.html")
?    def post(self):keras.backend.clear_session()img = Image.open(BytesIO(self.request.files['image'][0]['body']))img = imgb_img = Image.new('RGB', (224, 224), (255, 255, 255))size = img.sizeif size[0] >= size[1]:rate = 224 / size[0]new_size = (224, int(size[1] * rate))img = img.resize(new_size, Image.ANTIALIAS).convert("RGB")b_img.paste(img, (0, random.randint(0, 224 - new_size[1])))else:rate = 224 / size[1]new_size = (int(size[0] * rate), 224)img = img.resize(new_size, Image.ANTIALIAS).convert("RGB")b_img.paste(img, (random.randint(0, 224 - new_size[0]), 0))if self.get_argument("method", "mymodel") == "VGG16":Model = load_model("VGG16.h5")else:Model = load_model("InceptionV3.h5")data = orc_img(Model,b_img)self.write(json.dumps({"code": 200, "data": data}))def make_app():template_path = "templates/"static_path = "./static/"return tornado.web.Application([(r"/", MainHandler),], template_path=template_path, static_path=static_path, debug=True)?    
?    def run_server(port=8000):
?        tornado.options.parse_command_line()
?        app = make_app()
?        app.listen(port)
?        print("\n服務已啟動 請打開 http://127.0.0.1:8000 ")
?        tornado.ioloop.IOLoop.current().start()

4 Inception V3 神經網絡

GoogLeNet對網絡中的傳統卷積層進行了修改,提出了被稱為 Inception
的結構,用于增加網絡深度和寬度,提高深度神經網絡性能。從Inception V1到Inception
V4有4個更新版本,每一版的網絡在原來的基礎上進行改進,提高網絡性能。

4.1 網絡結構

在這里插入圖片描述

inception結構的作用(inception的結構和作用)

作用:代替人工確定卷積層中過濾器的類型或者確定是否需要創建卷積層或者池化層。即:不需要人為決定使用什么過濾器,是否需要創建池化層,由網絡自己學習決定這些參數,可以給網絡添加所有可能值,將輸入連接起來,網絡自己學習需要它需要什么樣的參數。

inception主要思想

用密集成分來近似最優的局部稀疏解(如上圖)

  • 采用不同大小的卷積核意味著有不同大小的感受野,最后的拼接意味著不同尺度特征的融合。
  • 之所以卷積核大小采用1x1、3x3和5x5,主要是為了方便對齊。設定卷積步長stride=1之后,只要分別設定padding = 0、1、2,采用same卷積可以得到相同維度的特征,然后這些特征直接拼接在一起。
  • 很多地方都表明pooling挺有效,所以Inception里面也嵌入了pooling。
  • 網絡越到后面特征越抽象,且每個特征涉及的感受野也更大,隨著層數的增加,3x3和5x5卷積的比例也要增加。
  • 最終版inception,加入了1x1 conv來降低feature map厚度。

5 開始訓練

5.1 數據集

訓練圖像按照如下方式進行分類,共分為9文件夾。

在這里插入圖片描述

5.2 關鍵代碼

?

   from keras.utils import Sequenceimport math?    class SequenceData(Sequence):
?        def __init__(self, batch_size, target_size, data):# 初始化所需的參數self.batch_size = batch_sizeself.target_size = target_sizeself.x_filenames = datadef __len__(self):# 讓代碼知道這個序列的長度num_imgs = len(self.x_filenames)return math.ceil(num_imgs / self.batch_size)def __getitem__(self, idx):# 迭代器部分batch_x = self.x_filenames[idx * self.batch_size: (idx + 1) * self.batch_size]imgs = []y = []for x in batch_x:img = Image.open(x)b_img = Image.new('RGB', self.target_size, (255, 255, 255))size = img.sizeif size[0] >= size[1]:rate = self.target_size[0] / size[0]new_size = (self.target_size[0], int(size[1] * rate))img = img.resize(new_size, Image.ANTIALIAS).convert("RGB")b_img.paste(img, (0, random.randint(0, self.target_size[0] - new_size[1])))else:rate = self.target_size[0] / size[1]new_size = (int(size[0] * rate), self.target_size[0])img = img.resize(new_size, Image.ANTIALIAS).convert("RGB")b_img.paste(img, (random.randint(0, self.target_size[0] - new_size[0]), 0))img = b_imgif random.random() < 0.1:img = img.convert("L").convert("RGB")if random.random() < 0.2:img = img.rotate(random.randint(0, 20))  # 隨機旋轉一定角度if random.random() < 0.2:img = img.rotate(random.randint(340, 360))  # 隨 旋轉一定角度imgs.append(img.convert("RGB"))x_arrays = 1 - np.array([np.array(i)  for i in imgs]).astype(float) / 255  # 讀取一批圖片batch_y = to_categorical(np.array([labels.index(x.split("/")[-2]) for x in batch_x]), len(labels))return x_arrays, batch_y?    

5.3 模型預測

利用我們訓練好的 vgg16.h5 模型進行預測,相關代碼如下:

?

    def orc_img(model,image):
?        img =np.array(image)
?        img = np.array([1 - img.astype(float) / 255])
?        predict = model.predict(img)
?        index = predict.argmax()
?        print("CNN預測", index)
?    target = target_name[index]index2 = np.argsort(predict)[0][-2]target2 = target_name[index2]index3 = np.argsort(predict)[0][-3]target3 = target_name[index3]return {"target": target,"predict": "%.2f" % (float(list(predict)[0][index]) * 64),"target2": target2,"predict2": "%.2f" % (float(list(predict)[0][index2]) * 64),}

6 效果展示

6.1 主頁面展示

在這里插入圖片描述

6.2 圖片預測

在這里插入圖片描述

6.3 三維模型可視化

學長在web頁面上做了一個三維網絡結構可視化功能,可以直觀的看到網絡模型結構

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

7 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相關文章

基于Java微信小程序自駕游拼團設計和實現(源碼+LW+調試文檔+講解等)

&#x1f497;博主介紹&#xff1a;?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者&#xff0c;博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?&#x1f497; &#x1f31f;文末獲取源碼數據庫&#x1f31f;感興趣的可以先收藏起來&#xff0c;還…

27. 高級特性(下)

目錄 一、為了類型安全和抽象而使用 newtype 模式二、使用類型別名創建類型同義詞2.1 使用type關鍵賦予現有類型一個別名2.2 減少重復2.3 與Result<T, E>結合使用2.4 從不返回的 never type 三、高級函數和閉包3.1 函數指針3.2 返回閉包 四、宏4.1 宏和函數的區別4.2 mac…

python基礎語法 003-3 數據類型元組

1 元組 1.1 元組含義 1.1.1 元組的表示 #元組的表示方法:() names ("xiaoyun", "xiaoming") print(names)--結果------- (xiaoyun, xiaoming) 1.1.2 空元組 #空元組 names () print(type(names)) print(len(names))----------------結果--------- &l…

安裝vue開發者工具

瀏覽器控制臺提示&#xff1a; 打開網址 GitHub - vuejs/devtools: ?? Browser devtools extension for debugging Vue.js applications. 點擊添加 上圖地址&#xff1a;Installation | Vue Devtools 安裝好了

Spring Boot中如何使用Flyway進行數據庫版本控制

Spring Boot中如何使用Flyway進行數據庫版本控制 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在現代的軟件開發中&#xff0c;數據庫版本控制是保證應用程序…

群體優化算法---石墨烯優化算法介紹以及在期權定價上的應用(Black-Scholes模型來計算歐式期權的理論價格)

介紹 石墨烯算法是一種新興的優化算法&#xff0c;靈感來自于石墨烯的結構和特性。石墨烯是一種由碳原子構成的二維蜂窩狀晶格結構&#xff0c;具有優異的機械、電學和熱學性能。石墨烯算法通過模擬石墨烯原子之間的相互作用和遷移&#xff0c;來求解復雜的優化問題 基本概念…

K8S -理解StatefulSet - 部署有狀態應用

什么是 有狀態服務和 無狀態服務 有狀態服務&#xff08;Stateful Service&#xff09;&#xff1a; 有狀態服務是指在處理請求期間維護和跟蹤用戶狀態或會話信息的服務。這意味著服務在多個請求之間保持狀態&#xff0c;并且需要在請求之間共享和使用這些狀態信息。通常&…

Websocket在Java中的實踐——握手攔截器

在《Websocket在Java中的實踐——最小可行案例》一文中&#xff0c;我們看到如何用最簡單的方式實現Websocket通信。本文中&#xff0c;我們將介紹如何在握手前后進行干涉&#xff0c;以定制一些特殊需求。 在《Websocket在Java中的實踐——最小可行案例》的基礎上&#xff0c;…

PID原理及控制算法詳解

文章目錄 1. 概念 1.1 PID框圖 1.2 具體示例&#xff1a;無人機高度控制 2. PID原理 3. 常用術語 4. 計算過程 4.1 比例控制&#xff08;Proportional&#xff09; 4.2 積分控制&#xff08;Integral&#xff09; 4.3 微分控制&#xff08;Derivative&#xff09; 5.…

windows@文件高級共享設置@網絡發現功能@從資源管理器網絡中訪問遠程桌面

文章目錄 高級共享設置常用選項其他選項操作界面說明 網絡類型檢查和設置(專用網絡和公用網絡)&#x1f47a;Note 高級共享設置和防火墻&#x1f47a;命令行方式使用圖形界面方式配置 網絡發現網絡發現功能的詳細介紹網絡發現的作用&#x1f47a;網絡發現的工作原理啟用和配置網…

SOC和SOH聯合估計 | 基于集成ELM的鋰離子電池充電截止電壓下的SOC和SOH聯合估計

目錄 研究概述研究內容研究路線研究介紹研究概述 充電截止電壓是大多數電動汽車用戶充電都會經歷的電壓點。針對傳統安時積分法忽略初始容量誤差和電池老化等一系列待優化的問題,提出了雙層集成極限學習機(extreme learning machine, ELM)算法,實現鋰離子電池充電截止電壓下…

【Python實戰因果推斷】2_因果效應異質性2

目錄 CATE with Regression Evaluating CATE Predictions CATE with Regression 我想你可能已經預料到了&#xff1a;與應用因果推理中的大多數情況一樣&#xff0c;答案往往從線性回歸開始。但在走這條路之前&#xff0c;讓我們把事情變得更具體一些。假設你在一家遍布全國的…

[A133]uboot啟動流程

[A133]uboot啟動流程 hongxi.zhu 2024-6-21 1. 第一階段 lds描述 從u-boot.lds中能找到程序的匯編入口ENTRY(_start) brandy/brandy-2.0/u-boot-2018/u-boot.lds OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUT…

Spring Boot中的異步編程技巧

Spring Boot中的異步編程技巧 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討在Spring Boot應用程序中如何使用異步編程技巧&#xff0c;以提升性…

LeetCode題練習與總結:單詞拆分--139

一、題目描述 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。如果可以利用字典中出現的一個或多個單詞拼接出 s 則返回 true。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 示例 1&#xff1a; 輸入: s "l…

vant組件 頂部下拉刷新和頁面底部下拉獲取數據+頂部搜索框

1.html部分&#xff08;頂部tab切換無&#xff0c;只有主體list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"請輸入搜索關鍵詞"search"…

JavaEE之HTTP協議(1)_HTTP基礎知識,HTTP 請求、響應格式,方法,狀態碼

一、HTTP協議 1.1 基本概念: HTTP全稱超文本傳輸協議&#xff0c;是一種無狀態的、應用層的協議&#xff0c;它基于請求/響應模型。客戶端&#xff08;通常是Web瀏覽器&#xff09;通過發送HTTP請求到服務器來獲取或發送信息&#xff0c;服務器則返回HTTP響應作為回應。HTTP協…

shell (三)shell腳本

SHELL腳本 編程語言的分類 解釋型語言&#xff1a;shell&#xff0c;Python&#xff0c;需要解析器 編譯型語言&#xff1a;C語言&#xff0c;C&#xff0c;需要編譯器 shell腳本 操作系統的結構 shell&#xff08;貝殼&#xff09; 應用層 app&#xff0c;代碼 應用層需要通…

2024年軟件測試面試題大全【答案+文檔】

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、面試基礎題 簡述測試流程&#xff1a; 1、閱讀相關技術文檔&#xff08;如產品PRD、UI設計…

1、線性回歸模型

1、主要解決問題類型 1.1 預測分析(Prediction) 線性回歸可以用來預測一個變量(通常稱為因變量或響應變量)的值,基于一個或多個輸入變量(自變量或預測變量)。例如,根據房屋的面積、位置等因素預測房價。 1.2 異常檢測(Outlier Detection) 線性回歸可以幫助識別數…