競賽 : 題目:基于深度學習的水果識別 設計 開題 技術

1 前言

Hi,大家好,這里是丹成學長,今天做一個 基于深度學習的水果識別demo

這是一個較為新穎的競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

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

2 開發簡介

深度學習作為機器學習領域內新興并且蓬勃發展的一門學科, 它不僅改變著傳統的機器學習方法, 也影響著我們對人類感知的理解,
已經在圖像識別和語音識別等領域取得廣泛的應用。 因此, 本文在深入研究深度學習理論的基礎上, 將深度學習應用到水果圖像識別中,
以此來提高了水果圖像的識別性能。

3 識別原理

3.1 傳統圖像識別原理

傳統的水果圖像識別系統的一般過程如下圖所示,主要工作集中在圖像預處理和特征提取階段。

在大多數的識別任務中, 實驗所用圖像往往是在嚴格限定的環境中采集的, 消除了外界環境對圖像的影響。 但是實際環境中圖像易受到光照變化、 水果反光、
遮擋等因素的影響, 這在不同程度上影響著水果圖像的識別準確率。

在傳統的水果圖像識別系統中, 通常是對水果的紋理、 顏色、 形狀等特征進行提取和識別。

在這里插入圖片描述

3.2 深度學習水果識別

CNN 是一種專門為識別二維特征而設計的多層神經網絡, 它的結構如下圖所示,這種結構對平移、 縮放、 旋轉等變形具有高度的不變性。

在這里插入圖片描述

學長本次采用的 CNN 架構如圖:
在這里插入圖片描述

4 數據集

  • 數據庫分為訓練集(train)和測試集(test)兩部分

  • 訓練集包含四類apple,orange,banana,mixed(多種水果混合)四類237張圖片;測試集包含每類圖片各兩張。圖片集如下圖所示。

  • 圖片類別可由圖片名稱中提取。

訓練集圖片預覽

在這里插入圖片描述

測試集預覽
在這里插入圖片描述

數據集目錄結構
在這里插入圖片描述

5 部分關鍵代碼

5.1 處理訓練集的數據結構

import os
import pandas as pd    train_dir = './Training/'
test_dir = './Test/'
fruits = []
fruits_image = []for i in os.listdir(train_dir):for image_filename in os.listdir(train_dir + i):fruits.append(i) # name of the fruitfruits_image.append(i + '/' + image_filename)
train_fruits = pd.DataFrame(fruits, columns=["Fruits"])
train_fruits["Fruits Image"] = fruits_imageprint(train_fruits)

5.2 模型網絡結構

    
?    import matplotlib.pyplot as plt
?    import seaborn as sns
?    from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
?    from glob import glob
?    from keras.models import Sequential
?    from keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Flatten, Dense
?    img = load_img(train_dir + "Cantaloupe 1/r_234_100.jpg")
?    plt.imshow(img)
?    plt.axis("off")
?    plt.show()
?    array_image = img_to_array(img)# shape (100,100)print("Image Shape --> ", array_image.shape)# 131個類目fruitCountUnique = glob(train_dir + '/*' )numberOfClass = len(fruitCountUnique)print("How many different fruits are there --> ",numberOfClass)# 構建模型model = Sequential()model.add(Conv2D(32,(3,3),input_shape = array_image.shape))model.add(Activation("relu"))model.add(MaxPooling2D())model.add(Conv2D(32,(3,3)))model.add(Activation("relu"))model.add(MaxPooling2D())model.add(Conv2D(64,(3,3)))model.add(Activation("relu"))model.add(MaxPooling2D())model.add(Flatten())model.add(Dense(1024))model.add(Activation("relu"))model.add(Dropout(0.5))# 區分131類model.add(Dense(numberOfClass)) # outputmodel.add(Activation("softmax"))model.compile(loss = "categorical_crossentropy",optimizer = "rmsprop",metrics = ["accuracy"])print("Target Size --> ", array_image.shape[:2])## 

5.3 訓練模型

    
?    train_datagen = ImageDataGenerator(rescale= 1./255,
?                                       shear_range = 0.3,
?                                       horizontal_flip=True,
?                                       zoom_range = 0.3)
?    test_datagen = ImageDataGenerator(rescale= 1./255)epochs = 100batch_size = 32train_generator = train_datagen.flow_from_directory(train_dir,target_size= array_image.shape[:2],batch_size = batch_size,color_mode= "rgb",class_mode= "categorical")test_generator = test_datagen.flow_from_directory(test_dir,target_size= array_image.shape[:2],batch_size = batch_size,color_mode= "rgb",class_mode= "categorical")for data_batch, labels_batch in train_generator:print("data_batch shape --> ",data_batch.shape)print("labels_batch shape --> ",labels_batch.shape)breakhist = model.fit_generator(generator = train_generator,steps_per_epoch = 1600 // batch_size,epochs=epochs,validation_data = test_generator,validation_steps = 800 // batch_size)#保存模型 model_fruits.h5model.save('model_fruits.h5')

順便輸出訓練曲線

?

    #展示損失模型結果
?    plt.figure()
?    plt.plot(hist.history["loss"],label = "Train Loss", color = "black")
?    plt.plot(hist.history["val_loss"],label = "Validation Loss", color = "darkred", linestyle="dashed",markeredgecolor = "purple", markeredgewidth = 2)
?    plt.title("Model Loss", color = "darkred", size = 13)
?    plt.legend()
?    plt.show()
?    #展示精確模型結果plt.figure()plt.plot(hist.history["accuracy"],label = "Train Accuracy", color = "black")plt.plot(hist.history["val_accuracy"],label = "Validation Accuracy", color = "darkred", linestyle="dashed",markeredgecolor = "purple", markeredgewidth = 2)plt.title("Model Accuracy", color = "darkred", size = 13)plt.legend()plt.show()![在這里插入圖片描述](https://img-blog.csdnimg.cn/686ace7db27c4145837ec2e09e8ad917.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFuQ2hlbmctc3R1ZGlv,size_17,color_FFFFFF,t_70,g_se,x_16)

在這里插入圖片描述

6 識別效果

from tensorflow.keras.models import load_model
import os
import pandas as pd
from keras.preprocessing.image import ImageDataGenerator,img_to_array, load_img
import cv2,matplotlib.pyplot as plt,numpy as np
from keras.preprocessing import imagetrain_datagen = ImageDataGenerator(rescale= 1./255,shear_range = 0.3,horizontal_flip=True,zoom_range = 0.3)model = load_model('model_fruits.h5')
batch_size = 32
img = load_img("./Test/Apricot/3_100.jpg",target_size=(100,100))
plt.imshow(img)
plt.show()array_image = img_to_array(img)
array_image = array_image * 1./255
x = np.expand_dims(array_image, axis=0)
images = np.vstack([x])
classes = model.predict_classes(images, batch_size=10)
print(classes)
train_dir = './Training/'train_generator = train_datagen.flow_from_directory(train_dir,target_size= array_image.shape[:2],batch_size = batch_size,color_mode= "rgb",class_mode= "categorical”)
print(train_generator.class_indices)

在這里插入圖片描述

?

?

    fig = plt.figure(figsize=(16, 16))axes = []files = []predictions = []true_labels = []rows = 5cols = 2
# 隨機選擇幾個圖片
def getRandomImage(path, img_width, img_height):"""function loads a random image from a random folder in our test path"""folders = list(filter(lambda x: os.path.isdir(os.path.join(path, x)), os.listdir(path)))random_directory = np.random.randint(0, len(folders))path_class = folders[random_directory]file_path = os.path.join(path, path_class)file_names = [f for f in os.listdir(file_path) if os.path.isfile(os.path.join(file_path, f))]random_file_index = np.random.randint(0, len(file_names))image_name = file_names[random_file_index]final_path = os.path.join(file_path, image_name)return image.load_img(final_path, target_size = (img_width, img_height)), final_path, path_classdef draw_test(name, pred, im, true_label):BLACK = [0, 0, 0]expanded_image = cv2.copyMakeBorder(im, 160, 0, 0, 300, cv2.BORDER_CONSTANT, value=BLACK)cv2.putText(expanded_image, "predicted: " + pred, (20, 60), cv2.FONT_HERSHEY_SIMPLEX,0.85, (255, 0, 0), 2)cv2.putText(expanded_image, "true: " + true_label, (20, 120), cv2.FONT_HERSHEY_SIMPLEX,0.85, (0, 255, 0), 2)return expanded_image
IMG_ROWS, IMG_COLS = 100, 100# predicting images
for i in range(0, 10):path = "./Test"img, final_path, true_label = getRandomImage(path, IMG_ROWS, IMG_COLS)files.append(final_path)true_labels.append(true_label)x = image.img_to_array(img)x = x * 1./255x = np.expand_dims(x, axis=0)images = np.vstack([x])classes = model.predict_classes(images, batch_size=10)predictions.append(classes)class_labels = train_generator.class_indices
class_labels = {v: k for k, v in class_labels.items()}
class_list = list(class_labels.values())for i in range(0, len(files)):image = cv2.imread(files[i])image = draw_test("Prediction", class_labels[predictions[i][0]], image, true_labels[i])axes.append(fig.add_subplot(rows, cols, i+1))plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.grid(False)plt.axis('off')
plt.show()

在這里插入圖片描述

7 最后

🧿 更多資料, 項目分享:

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

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

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

相關文章

Spark-06:共享變量

目錄 1.廣播變量(broadcast variables) 2.累加器(accumulators) 在分布式計算中,當在集群的多個節點上并行運行函數時,默認情況下,每個任務都會獲得函數中使用到的變量的一個副本。如果變量很…

開啟數據庫審計(db,extended級別或os級別),并將審計文件存放到/home/oracle/audit下

文章目錄 開啟數據庫審計(db,extended級別或os級別),并將審計文件存放到/home/oracle/audit下一. 簡介二. 配置2.1. 審計是否安裝2.2. 審計表空間遷移2.3. 審計參數2.4. 審計級別2.5. 其他審計選項2.6. 審計相關視圖 三. 使用3.1. 開啟/關閉審…

成為獨立開發者有多難

首先自我介紹:我是一名前端開發工程師,7年的前端開發經驗。CSDN 九段刀客_js,vue,ReactNative-CSDN博客,80多萬的訪問量,1萬多的粉絲。 相信80%的程序員的終極夢想都是成為一名獨立開發者,不用找工作有自己的產品可以有睡后收入。…

深度學習模型訓練計算量的估算

深度學習模型訓練計算量的估算 方法1:基于網絡架構和批處理數量計算算術運算次數前向傳遞計算和常見層的參數數量全連接層(Fully connected layer)參數浮點數計算量 CNN參數浮點數計算量 轉置CNN參數浮點數計算量 RNN參數浮點數計算量 GRU參數…

刷題學習記錄(含2023ISCTFweb題的部分知識點)

[SWPUCTF 2021 新生賽]sql 進入環境 查看源碼,發現是get傳參且參數為wllm fuzz測試,發現空格,,and被過濾了 同樣的也可以用python腳本進行fuzz測試 import requests fuzz{length ,,handler,like,select,sleep,database,delete,h…

java學習part09類的構造器

1. 2.默認構造器 如果沒有顯式定義任何構造器,系統會默認加一個默認構造器。 如果定義了,則不會有默認構造器。 默認構造器的權限和類的權限一樣,類是public構造器就是public,類是缺省默認構造器就是缺省 反編譯之后添加的構造…

解決DaemonSet沒法調度到master節點的問題

最近在kubernetes部署一個springcloud微服務項目,到了最后一步部署邊緣路由:使用nginx-ingress和traefik都可以,必須使用DaemonSet部署,但是發現三個節點,卻總共只有兩個pod。 換句話說, DaemonSet沒法調度…

UML建模圖文詳解教程05——包圖

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文參考資料:《UML面向對象分析、建模與設計(第2版)》呂云翔,趙天宇 著 包圖概述 包圖(package diagram)是用來描述模型中的…

一個最簡單的工業通訊數據分析例子

1.背景 對工業設備的通訊協議進行分析可以幫助我們更好地理解其工作原理和相關技術,并且有助于以下幾個方面: 1. 優化工業設備的通訊效率:了解通訊協議的細節可以幫助我們找到通訊效率低下的原因并進行優化,提高設備的通訊效率和…

Axioss筆記

一、Get請求 // 請求頭攜帶參數,案例:?uid1001 axios.get(http://localhost:8080/user/api/v1/user/query, {params: {uid: 1001}}).then(res > {console.log(res.data) }).catch(err > {console.log("請求錯誤" err) }).finally(() …

MySQL 8 配置文件詳解與最佳實踐

MySQL 8 是一款強大的關系型數據庫管理系統,通過適當的配置文件設置,可以充分發揮其性能潛力。在這篇博客中,我們將深入探究 MySQL 8 常用的配置文件,并提供一些建議,幫助您優化數據庫性能。 配置文件概覽 在 MySQL …

【華為OD題庫-030】阿里巴巴找黃金寶箱(V)-java

題目 一貧如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;無意中發現了強盜集團的藏寶地&#xff0c;藏寶地有編號從0-N的箱子&#xff0c;每個箱子上面貼有一個數字.阿里巴巴念出一個咒語數字k(k<N),找出連續k個寶箱數字和的最大值&#xff0c;并輸出該最大值。 輸入描述 第…

攔截器的使用

攔截器&#xff08;Interceptor&#xff09;是一種在應用程序中用于干預、修改或攔截請求和響應的組件&#xff0c;是AOP 編程的一種實踐&#xff0c;和過濾器一樣都是一種具體的AOP實現。它可以在請求被發送到目標處理程序之前或之后&#xff0c;對請求進行預處理或對響應進行…

【數據結構】二叉樹概念 | 滿二叉樹 | 完全二叉樹

二叉樹的概念 二叉樹在實踐中用的很多。 一棵二叉樹是結點的一個有限集合&#xff0c;該集合&#xff1a; 或者為空&#xff1b;由一個根結點加上兩棵別稱為左子樹和右子樹的二叉樹組成。二叉樹最多兩個孩子。 這里注意&#xff1a;二叉樹并不是度為2的樹。 二叉樹的度最大值是…

Go lumberjack 日志輪換和管理

在開發應用程序時&#xff0c;記錄日志是一項關鍵的任務&#xff0c;以便在應用程序運行時追蹤問題、監視性能和保留審計記錄。Go 語言提供了靈活且強大的日志記錄功能&#xff0c;可以通過多種方式配置和使用。其中一個常用的日志記錄庫是 github.com/natefinch/lumberjack&am…

python selenium 模擬瀏覽器自動操作搶購腳本

每逢秒殺&#xff0c;都在遺憾網速和手速慢沒能搶購到商品吧。 手寫一個腳本&#xff0c;讓程序幫你搶&#xff0c;搶到的概率會大大提升。 廢話不多說&#xff0c;直接上代碼。 本實例以華為官網搶購手機為例 """ 模擬瀏覽器操作華為官網(1) 【只需要安裝一…

【JAVA】我們該如何規避代碼中可能出現的錯誤?(二)

個人主頁&#xff1a;【&#x1f60a;個人主頁】 系列專欄&#xff1a;【??初識JAVA】 文章目錄 前言異常方法&#xff08;Throwable類&#xff09;Throwable類的方法 捕獲異常多重捕獲塊 前言 異常是程序中的一些錯誤&#xff0c;但并不是所有的錯誤都是異常&#xff0c;并…

git-3

1.如何讓工作區的文件恢復為和暫存區一樣&#xff1f; 工作區所作的變更還不及暫存區的變更好&#xff0c;想從暫存區拷貝到工作區&#xff0c;變更工作區(恢復成和暫存區一樣的狀態)&#xff0c;想到用git checkout -- 文件名 2.怎樣取消暫存區部分文件的更改&#xff1f; 如…

無損壓縮技巧:減小PDF文件尺寸的有效方法

我們在制作pdf文檔的時候&#xff0c;會加入許多內容&#xff0c;文字、圖片等等&#xff0c;素材添加的過多之后就會導致pdf文檔特別大&#xff0c;在上傳或者儲存時&#xff0c;就會特別不方便&#xff0c;所以今天就告訴大家一個pdf壓縮的方法&#xff0c;使用pdf在線壓縮工…

4-Docker命令之docker info

后續為大家逐個講解一下docker常用命令及其相關用法。docker常用命令查看如下: [root@centos79 ~]# docker --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec…