首页 > 其他分享 >机器学习--识别腐烂水果和不腐烂的水果

机器学习--识别腐烂水果和不腐烂的水果

时间:2023-05-29 23:45:40浏览次数:56  
标签:layers 水果 plt keras -- 腐烂 add tf model

(一)选题背景:

苹果树是优良的经济作物,目前我国苹果树的种植面积较大,产量较高,而且苹果的品种也在不断改良和更新。苹果的种植条件比较宽泛,大部分栽植于北方地区,种植面积大,市场需求量也大,其中陕西洛川、甘肃天水、宜川、新疆阿克苏等地盛产苹果,这几个地方产的苹果品质优良。农场采摘了许多苹果和香蕉,但由于机器人没有辨别程序和天气太热,将苹果和香蕉放在了一起,容易导致苹果和香蕉腐烂变质,导致农民经济收入降低,为了提高效益,机器人应该如何判断水果是否腐烂,于是通过计算机视觉和机器学习设计了一套程序用于判断水果是否腐烂。

(二)机器学习设计案例:从网站中下载相关的数据集,对数据集进行整理,在python的环境中,给数据集中的文件打上标签,对数据进行预处理,利用keras--gpu和tensorflow,通过构建输入层,隐藏层,输出层建立训练模型,导入图片测试模型。

参考来源:机器学习-周志华.关于水果如何分类

数据集来源:kaggle,网址:https://www.kaggle.com/

(三)机器学习的实现步骤:

1.下载数据集

 

 2.导入需要用到的库

import numpy as np

import pandas as pd

import os

import numpy as np
import matplotlib.pyplot as plt
import os
import shutil

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
from tensorflow.keras.models import Sequential, Model

TRAIN_PATH = './chenhuangyu/data/dataset/train/'#设置锻炼数据所在的路径
TEST_PATH = './chenhuangyu/data/dataset/test/' #设置测试数据所在的路径
SIZE = (240, 240)

3.通过遍历得到train的目录下的文件

labels = []
for class_ in os.listdir(TRAIN_PATH):
labels.append(class_)
NUM_LABELS = len(labels)

print(labels)

4.得到每个文件中图片的数量并进行图像预处理

from keras.preprocessing.image import ImageDataGenerator

datagen=ImageDataGenerator(rescale=1./255, validation_split = 0.1)


test_datagen = ImageDataGenerator(rescale=1./255)

train_dataset = datagen.flow_from_directory(batch_size=32,

directory=TRAIN_PATH,

shuffle=True,

classes=labels,

target_size=SIZE,

subset="training",
class_mode='categorical')

val_dataset = datagen.flow_from_directory(batch_size=32,
directory=TRAIN_PATH,
shuffle=True,
classes=labels,
target_size=SIZE,
subset="validation",
class_mode='categorical')

‘’‘
-- 图像数据生成器将调整所有图像的大小为target_size
-- x_col是图像名称所在的列
-- y_col是标签所在的列
-- has_ext表示图像的名称包含文件扩展名,例如image_name.jpg
-- 在这里您可以更改targe_size将所有图像调整为不同的形状。

’‘’

 5.导入训练所需要的图片,查看经过处理的图片以及它的标签

fig, ax = plt.subplots(nrows=3, ncols=4, figsize=(15, 12))
idx = 0

for i in range(3):
for j in range(4):
label = labels[np.argmax(train_dataset[0][1][idx])]
ax[i, j].set_title(f"{label}")
ax[i, j].imshow(train_dataset[0][0][idx][:, :, :])
ax[i, j].axis("off")
idx += 1

# plt.tight_layout()
plt.suptitle("Sample Training Images", fontsize=21)
plt.show()

 

8.构建神经网络并对模型进行训练

model = tf.keras.Sequential()  #构建神经网络

# 1.Conv2D层,32个过滤器

model.add(tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape = (240,240,3)))  

model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Dropout(0.2))

# 2.Conv2D层,64个过滤器
model.add(tf.keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'))  
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Dropout(0.2))

#3.Conv2D层,128个过滤器
model.add(tf.keras.layers.Conv2D(128, kernel_size=(3,3), activation='relu')) 

model.add(tf.keras.layers.MaxPool2D((2,2)))

model.add(tf.keras.layers.Dropout(0.2))

#将输入层的数据压缩

model.add(tf.keras.layers.Flatten())

model.add(tf.keras.layers.Dense(128, activation='relu'))

model.add(tf.keras.layers.Dense(64, activation='relu'))

model.add(tf.keras.layers.Dense(6, activation='softmax'))

# 模型编译

model.compile(optimizer='adam', loss = 'categorical_crossentropy', metrics=['accuracy'])

9.总结模型

model.summary()

#设置训练次数为12次

 history = model.fit_generator(generator=train_dataset, steps_per_epoch=len(train_dataset), epochs=12, validation_data=val_dataset, validation_steps=len(val_dataset))

#保存模型

9.绘制损失曲线和精度曲线图

import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])

plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')

plt.xlabel('Epochs')

plt.ylabel('Accuracy')
plt.legend(['Acc','Val'], loc = 'lower right')

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['loss','Val'], loc = 'upper right')

 

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(TEST_PATH,
                                                  batch_size=1,
                                                  target_size=SIZE,
                                                  shuffle = False,
                                                  classes=labels,
                                                  class_mode='categorical')


10.测试模型 filenames = test_generator.filenames nb_samples = len(filenames) loss, acc = model.evaluate(test_generator,steps = (nb_samples), verbose=1) print('accuracy test: ',acc) print('loss test: ',loss)

predictions = model.predict(test_generator)

files=test_generator.filenames
class_dict=test_generator.class_indices # a dictionary of the form class name: class index
rev_dict={}
for key, value in class_dict.items():
    rev_dict[value]=key

for i, p in enumerate(predictions):
    index=np.argmax(p)
    klass=rev_dict[index]    
    prob=p[index]

 11.显示图片

 

fig, ax = plt.subplots(nrows=3, ncols=4, figsize=(12, 10))
idx = 0

for i in range(3):
for j in range(4):

predicted_label = labels[np.argmax(predictions[idx])]

ax[i, j].set_title(f"{predicted_label}")

ax[i, j].imshow(test_generator[idx][0].reshape(240,240,3))
ax[i, j].axis("off")
idx += 200

# plt.tight_layout()

plt.suptitle("Test Dataset Predictions", fontsize=20)

plt.show()

 

 

#预测比较准确

四)收获:本次的程序设计主要内容是机器学习,通过本次课程设计,是我对机器学习的理解更加深刻,同时,使我掌握了机器学习的步骤 1.提出问题2.理解数据,3.导入数据,4.查看数据,5.数据清洗(数据预处理:缺失值处理、重复值处理、数据类型的转换、字符串数据的规整),特征提取(特征工程.),特征选择,6.构建模型 ,7.选择算法(逻辑回归(logisic regression)随机森林(Random Forests Model)支持向量机(Support Vector Machines)Gradient Boosting ClassifierK-nearest neighbors) 8.评论模型,9撰写报告

 总结:这次试验的缺陷 ,识别的水果种类比较少,可以适当的改进升级提高识别的种类,训练次数较少和精度不够高.

  改进:可以进行多次训练,提高次数

#全代码

import numpy as np
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import shutil
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout
from tensorflow.keras.models import Sequential, Model
TRAIN_PATH = './chenhuangyu/data/dataset/train/'
TEST_PATH = './chenhuangyu/data/dataset/test/'
SIZE = (240, 240)
labels = []
for class_ in os.listdir(TRAIN_PATH):
labels.append(class_)
NUM_LABELS = len(labels)

print(labels)
from keras.preprocessing.image import ImageDataGenerator

datagen=ImageDataGenerator(rescale=1./255, validation_split = 0.1)
test_datagen = ImageDataGenerator(rescale=1./255)
train_dataset = datagen.flow_from_directory(batch_size=32,
directory=TRAIN_PATH,
shuffle=True,
classes=labels,
target_size=SIZE,
subset="training",
class_mode='categorical')

val_dataset = datagen.flow_from_directory(batch_size=32,
directory=TRAIN_PATH,
shuffle=True,
classes=labels,
target_size=SIZE,
subset="validation",
class_mode='categorical')
fig, ax = plt.subplots(nrows=3, ncols=4, figsize=(15, 12))
idx = 0

for i in range(3):
for j in range(4):
label = labels[np.argmax(train_dataset[0][1][idx])]
ax[i, j].set_title(f"{label}")
ax[i, j].imshow(train_dataset[0][0][idx][:, :, :])
ax[i, j].axis("off")
idx += 1


plt.suptitle("Sample Training Images", fontsize=21)
plt.show()
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape = (240,240,3)))
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv2D(128, kernel_size=(3,3), activation='relu'))
model.add(tf.keras.layers.MaxPool2D((2,2)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(64, activation='relu'))

model.add(tf.keras.layers.Dense(6, activation='softmax'))
model.compile(optimizer='adam', loss = 'categorical_crossentropy', metrics=['accuracy'])
model.summary()
history = model.fit_generator(generator=train_dataset, steps_per_epoch=len(train_dataset), epochs=12, validation_data=val_dataset, validation_steps=len(val_dataset))
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Acc','Val'], loc = 'lower right')
learning_rate = history.history['lr']
plt.plot(history.history['lr'])
plt.title('Learning Rate')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.legend(['loss','Val'], loc = 'upper right')
test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(TEST_PATH,
batch_size=1,
target_size=SIZE,
shuffle = False,
classes=labels,
class_mode='categorical')


filenames = test_generator.filenames
nb_samples = len(filenames)

loss, acc = model.evaluate(test_generator,steps = (nb_samples), verbose=1)
print('accuracy test: ',acc)
print('loss test: ',loss)
predictions = model.predict(test_generator)
files=test_generator.filenames
class_dict=test_generator.class_indices # a dictionary of the form class name: class index
rev_dict={}
for key, value in class_dict.items():
rev_dict[value]=key

for i, p in enumerate(predictions):
index=np.argmax(p)
klass=rev_dict[index]
prob=p[index]
fig, ax = plt.subplots(nrows=3, ncols=4, figsize=(12, 10))
idx = 0

for i in range(3):
for j in range(4):
predicted_label = labels[np.argmax(predictions[idx])]
ax[i, j].set_title(f"{predicted_label}")
ax[i, j].imshow(test_generator[idx][0].reshape(240,240,3))
ax[i, j].axis("off")
idx += 200

# plt.tight_layout()
plt.suptitle("Test Dataset Predictions", fontsize=20)
plt.show()

 

标签:layers,水果,plt,keras,--,腐烂,add,tf,model
From: https://www.cnblogs.com/chenhuangyu/p/17442038.html

相关文章

  • sql学习5.29
    length()返回字符串的长度,例如可以返回数据库名字的长度substr()⽤来截取字符串ascii()返回字符的ascii码sleep(n)将程序挂起⼀段时间,n为n秒if(expr1,expr2,expr3)判断语句如果第⼀个语句正确就执⾏第⼆个语句如果错误执⾏第三个语句报错回显注入:1、通过floor报错,......
  • 一分钟学一个 Linux 命令 - ls
    前言大家好,我是god23bin。今天我给大家带来的是Linux命令系列,每天只需一分钟,记住一个Linux命令不成问题。今天,我们要介绍的是一个常用而又强大的命令:ls(list)。什么是ls命令?ls命令来自英文单词list,动词意思译为「列出」。ls命令用于列出指定目录中的文件和子目录及其......
  • python内置库--argparse
    1关于argparse从命令行工具运行python时,argparse可以解析命令行工具输入的各种数据,通过argparse提供的函数或者属性,我们可以获得它解析到的数据通过argparse,我们也可以自定义命令行选项,比如pytest-s-v,-s-v就是pytest定义的命令行选项,通过argparse,我们也可以定义自己的命......
  • Visual AssistX Version 10.9.2491 Cracked
    任何问题请反馈至邮箱:[email protected](随缘查看邮件)Anyporbs->[email protected]再次声明:本破解补丁仅供交流学习和研究使用,不可用于商业。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。Notice:thispatcherisforcommunication,lear......
  • 点与圆的关系
    #include<iostream>#include<string>usingnamespacestd;classpoint{private: intx,y;public: voidsetx(inta) { x=a; } intgetx() { returnx; } voidsety(intb) { y=b; } intgety() { returny; }};classcircle{private: intr; pointcen......
  • CentOS Linux基础操作
    CentOSLinuxLinux基础操作ifconfig查看端口号ls查看当前文件夹下内容-a显示指定文件夹下隐藏文件-l以列表的方式显示该文件夹-h配合-l显示文件大小ll的本质是ls-l,只是ll是Linux的第三方插件,系统如果没有安装,会显示没有此命令。pw......
  • Codeforces Round 875 (Div. 2) A-D
    A.TwinPermutations题意:给出一个由[1,2,...,n]组成的数组a,构造另一个由[1,2,...,n]组成的数组b,使得a[1]+b[1]<=a[2]+b[2]<=...<=a[n]+b[n]Solution可以想到只要让他们全为n+1就行了,这样是一定有解的voidsolve(){ intn;cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; ......
  • SQL语句
    SQL语句分类:DQL:数据查询语言,用于对数据进行查询DML:数据操作语言,对数据进行增加、修改、删除TPL:事务处理语言,对事务进行处理DDL:数据定义语言,进行数据库、表的管理等DCL:数据控制语言,进行授权与权限回收CCL:指针控制语言,通过控制指针完成表的操作数据库的增删改查是必须要掌......
  • Go语言学习之路
    【阶段1Go语言基础】Day01变量、字符串、运算符Day02Go语言流程控制、数组、切片、切片原理、map、Day03函数基础、错误处理、包管理Day04常用内置包Day05结构体Day06文件I/O操作Day07接口Day08并发编程Day09网络编程Day10webrpc爬虫模板语法【阶段2Go......
  • cpp: State Pattern
     /*****************************************************************//***\fileGold.h*\briefStatePattern状态模式C++14*2023年5月29日涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateMay2023************************......