蔬菜和水果成熟度检测用颜色w / tensorflow

10,318

86.

6

产品简介:彩色W/张量法检测蔬菜和水果的成熟度

About:自学全栈开发者|程序员| Maker |物理爱好者

整理不同水果和蔬菜的光谱颜色数据,并用神经网络对数据集进行解释,以预测成熟阶段。

供应

1 X Arduino Nano 33物联网

1 X DFRobot AS7341 11通道可见光传感器

1 X树莓派3B+或4

1 X 10K电位器(长轴)

1 x电位器旋钮

4 X按钮(6x6)

1 X 5毫米LED:绿色

1 X 5毫米LED:红色

1 X电路试验板

步骤1:故事

多亏了我们进化出的敏力,我们不再费力地通过水果或蔬菜的外观来判断其是否成熟。然而,如今,食品是大规模生产的主题。因此,我们需要一种比肉眼更可靠、更轻松的方法来根据水果和蔬菜的成熟度来区分它们。为了帮助食品公司、杂货店和农民对水果和蔬菜进行分类,我开发了这个设备,利用神经网络模型通过光谱颜色来检测成熟阶段。

随着水果和蔬菜成熟,它们的颜色会因为四科色素而改变:

  • 叶绿素(绿色)
  • 类胡萝卜素(黄色、红色、橙色)
  • 类黄酮:花青素+花黄素(红、蓝、紫)
  • 甜菜碱(红、黄、紫)

这些色素是一组分子结构,吸收一组特定的波长并反射其余的波长。未成熟的水果由于细胞中的叶绿素而呈绿色。当它们成熟时,叶绿素分解,被橙色类胡萝卜素和红色花青素取代。这些化合物是抗氧化剂,可以防止水果在空气中过快腐烂。然后,酶促褐变发生并导致变色-变成棕色。酶作为化学反应的催化剂,促进变色,如:

  • 苯酚的羟基化
  • 酚氧化

在研究了水果和蔬菜成熟时的变色过程后,我决定基于分类模型构建人工神经网络(ANN)来解释不同水果和蔬菜的光谱颜色来预测成熟阶段。

在构建和测试我的神经网络模型之前,我在PHP中开发了一个Web应用程序,将由AS7341可见光传感器产生的水果和蔬菜的光谱颜色数据进行整理,以创建通过光谱颜色设置的成熟阶段数据。我使用了Arduino Nano 33 IoT将可见光传感器产生的数据发送到Web应用程序。经验上,我通过使用连接到Nano 33 IOT的四个类按钮获得每个水果和蔬菜的频谱颜色数据,同时获得成熟阶段(标签),同时获得每个水果和蔬菜的频谱颜色数据:

  • 早熟
  • 部分成熟
  • 成熟
  • 衰变

完成数据集后,我用Tensorflow建立了我的人工神经网络(ANN),以便基于光谱颜色对成熟阶段(标签)进行预测。

然后,经过测试,我用我的神经网络模型进行实验,通过光谱颜色预测不同水果和蔬菜的成熟阶段。就我的实验而言,这个模型运行得无可挑剔。

简而言之,这就是我的项目

在以下步骤中,您可以找到关于编码、数据收集和使用TensorFlow构建人工神经网络模型的更详细信息。

非常感谢DFRobot对这个项目的赞助。

DFRobot赞助产品:

⭐DFRobot AS7341 11通道可见光传感器|检查

第2步:用PHP开发一个Web应用程序来整理水果和蔬菜的光谱颜色数据

我开发了这个web应用程序(蔬菜及水果数据记录仪),通过Arduino Nano 33 IoT从AS7341可见光传感器获取水果和蔬菜的光谱颜色数据,并将该数据插入到CSV文件中(光谱颜色数据库.csv)通过光谱颜色来创建成熟阶段的数据集。

Web应用程序包括一个文件(index.php)并要求这些参数向数据集插入新行(条目):

  • F1
  • F2
  • F3
  • F4
  • F5
  • F6
  • F7
  • F8
  • nir_1
  • nir_2

index . php

⭐是否所有需要的参数都已通过Nano 33物联网传输。

⭐如果是,则创建数据数组,包含获取的参数,包括当前日期。

⭐插入最近生成的数据数组的spectral_color_database.csv文件的新行函数函数。

⭐然后打印:数据插入成功!

⭐如果存在遗漏或没有传入数据,请打印:等待AS7341传感器的数据插入…

#检查来来数据包:若(isset(($00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3)))10))及及isset(10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10及isset((((((((($00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0#创建数据数组。$data=array($\u GET[“F1”],$\u GET[“F2”],$获取[“F3”],$获取[“F4”],$获取[“F5”],$获取[“F6”],$获取[“F7”],$获取[“F8”],$获取[“nir_1”],$获取[“nir_2”],$获取[“类”],“日期”(“m/d”);#将最近生成的数据数组作为新行插入CSV文件。$file=fopen(“光谱颜色数据库”;$CSV.uta”),$echo($CSV);打印文件($fclose)“数据插入成功!”;}否则{echo“正在等待AS7341传感器的数据插入…”;}

步骤3:在树莓派上设置Web应用程序

创建PHP Web应用程序后,我决定在raspberry pi上运行它,但只要它是PHP服务器,您可以在任何服务器上运行应用程序。

如果你想使用树莓派,但不知道如何在上面设置LAMP web服务器,你可以检查本教程

⭐首先,提取Vegetables_and_Fruits_Data_Logger.zip文件夹。

⭐然后移动应用文件夹(蔬菜和水果数据记录器)到apache服务器(/ var / www / html)通过使用终端,因为apache服务器是一个受保护的位置。

sudo mv /home/pi/ downloads / vegetables_and_fruits_data_logger /var/www/html/

⭐如果没有设置或找到所需的参数,web应用程序打印:等待AS7341传感器的数据插入…

http:// localhost / cenued_and_fruits_data_logger /

否则,web应用程序通过添加当前日期将传入的数据作为新行插入到CSV文件(数据集)中并打印:数据插入成功!

http:// localhost / cenued_and_fruits_data_logger /?f1 = 13&f2 = 12&f3 = 12&f4 = 12&f5 = 12&f6 = 12&f7 = 12&f8 = 12&n = 12&nir_2 = 9&class = 0

步骤4:设置Arduino Nano 33物联网

如果您是使用Arduino Nano 33 IOT编程的新手,请按照以下步骤进行操作以将其与Arduino IDE进行编程。

⭐下载所需的驱动程序- Arduino SAMD核心-如解释在这里

⭐ 要连接到WiFi,请下载维菲尼娜图书馆从在这里

步骤5:Arduino Nano 33 IoT编程,获取所需参数并发送到Web应用程序

首先,为了能够通过Arduino Nano 33 IoT从AS7341可见光传感器获取光谱颜色数据,需要安装DFRobot AS7341图书馆

⭐包括必需的图书馆和定义WiFi设置。

char ssid [] =“ssid”;//您的网络SSID(name)char pass [] =“password”;//您的网络密码(用于WPA,或用作WEP的键)int KeyIndex = 0;//您的网络密钥索引号(仅适用于WEP)int status = wl_idle_status;//输入raspberry pi的ipaddress。iPaddress服务器(192,168,120);//初始化以太网客户端库wificlient客户端;/ * wifissllclient客户端;* /

⭐定义AS7341可见光传感器设置和对象。

//定义AS7341对象。DFRobot_AS7341 as7341;//定义AS7341数据对象:DFRobot_AS7341::sModeOneData_t data1;DFRobot_AS7341: sModeTwoData_t data2;

⭐ 检测I2C是否可以正常通信,并启用AS7341传感器上的内置LED。

//检测I2C是否可以正常通信,while (as7341.begin() != 0);println("I2C init failed, please check if the wire connection is correct");延迟(1000);} //使能AS7341传感器自带的LED。as7341.enableLed(真正的);

⭐检查WiFi模块是否连接正常。

if (WiFi.status() == WL_NO_MODULE) {Serial. if (WiFi.status() == WL_NO_MODULE);println(“连接失败!”);而(真正的);} //尝试连接到WiFi网络:while (status != WL_CONNECTED) {Serial. log . log . log . log . log . log . log。println("尝试连接WiFi !!");//连接WPA/WPA2网络。如果使用open或WEP网络,请更改此线路:status = WiFi。开始(ssid,通过);//等待10秒连接:delay(10000);}

⭐在read_controls功能,读取电位器和四类按钮值。

void read_controls(){//电位计:pot_val = analogRead(pot);//类按钮:class_1_val = digitalRead(class_1);class_2_val = digitalRead (class_2);class_3_val = digitalRead (class_3);class_4_val = digitalRead (class_4);}

⭐在adjust_brightness功能,设置引脚电流控制亮度(1~20对应电流4mA、6mA、8mA、10mA、12mA, ......AS7341传感器上的内置LED。

⭐用AS7341传感器启动频谱测量,读取传感器数据通道0~5在以下通道映射模式下的值:

  • eF1F4ClearNIR
  • eF5F8ClearNIR

⭐然后打印传感器生成的光谱颜色数据:

//开始频谱测量://通道映射模式:1。eF1F4ClearNIR as7341.startMeasure (as7341.eF1F4ClearNIR);//读取传感器数据通道0~5的值,在eF1F4ClearNIR data1 = as7341.readSpectralDataOne();//通道映射模式:2。eF5F8ClearNIRas7341.startMeasure(as7341.eF5F8ClearNIR); // Read the value of sensor data channel 0~5, under eF5F8ClearNIR data2 = as7341.readSpectralDataTwo(); // Print data: Serial.print("F1(405-425nm): "); Serial.println(data1.ADF1); Serial.print("F2(435-455nm): "); Serial.println(data1.ADF2); Serial.print("F3(470-490nm): "); Serial.println(data1.ADF3); Serial.print("F4(505-525nm): "); Serial.println(data1.ADF4); Serial.print("F5(545-565nm): "); Serial.println(data2.ADF5); Serial.print("F6(580-600nm): "); Serial.println(data2.ADF6); Serial.print("F7(620-640nm): "); Serial.println(data2.ADF7); Serial.print("F8(670-690nm): "); Serial.println(data2.ADF8); // CLEAR and NIR: Serial.print("Clear_1: "); Serial.println(data1.ADCLEAR); Serial.print("NIR_1: "); Serial.println(data1.ADNIR); Serial.print("Clear_2: "); Serial.println(data2.ADCLEAR); Serial.print("NIR_2: "); Serial.println(data2.ADNIR); Serial.print("\n------------------------------\n"); delay(1000);

⭐根据按下的Class按钮,通过分配成熟级标签[0 - 3]将光谱颜色数据发送到PHP Web应用程序

  • 0 -早熟
  • 1 -半熟
  • 2 - 成熟
  • 3 -衰变
如果(! class_1_val) make_a_get_request(“/ Vegetables_and_Fruits_Data_Logger”、“0”);如果(! class_2_val) make_a_get_request(“/ Vegetables_and_Fruits_Data_Logger /”,“1”);如果(! class_3_val) make_a_get_request(“/ Vegetables_and_Fruits_Data_Logger /”,“2”);如果(! class_4_val) make_a_get_request(“/ Vegetables_and_Fruits_Data_Logger”、“3”);

⭐在提出请求功能:

⭐连接到名为蔬菜和水果数据记录器

⭐如果连接成功,请创建询问串联光谱彩色数据和所选成熟阶段标签。否则,打开5mm红色LED。

⭐ 然后,使用询问字符串将所需参数发送到web应用程序。

⭐如果有传入字节可用,从web应用程序获得响应。

⭐ 如果将传输的数据插入数据集中(光谱颜色数据库.csv)成功通过web应用,打开5mm绿色LED:

response.indexOf(“数据插入成功!”)>0

否则,打开5mm红色LED。

void make_a_get_request(字符串应用程序,字符串_class){//连接到名为cheeraules_and_fruits_data_logger的Web应用程序。如果使用SSL连接,请使用'443'更改'80'。if(client.connect(服务器,80)){//如果成功:serial.println(“\ n \ n为服务器!服务器!”);//创建查询字符串:字符串Query = application +“?f1 =”+ data1.adf1 +“&f2 =”+ data1.adf2 +“&f3 =”+ data1.adf3 +“&f4 =”+ data1.adf4 +“&f5 =”+/data2.adf5 +“&f6 =”+ data2.adf6 +“&f7 =”+ data2.adf7 +“&f8 =”data2.adf8 +“&nir_1 = data1.adnir +”&nir_2 = data2.adnir +“&class =”+ _类;//制作一个http get请求:client.println(“get”+查询+“http / 1.1”);client.println(“主持人:192.168.1.20”);client.println(“连接:关闭”);client.println();} else {serial.println(“服务器错误!”);DigitalWrite(红色,高); } delay(2000); // Wait 2 seconds after connection... // If there are incoming bytes available, get the response from the web application. String response = ""; while (client.available()) { char c = client.read(); response += c; } if(response != ""){ Serial.println(response); Serial.println("\n"); // Check whether the transferred data is inserted successfully or not: if(response.indexOf("Data Inserted Successfully!") > 0){ digitalWrite(green, HIGH); }else{ digitalWrite(red, HIGH); } } // Turn off LEDs: delay(3000); digitalWrite(green, LOW); digitalWrite(red, LOW); }

⭐通过串口通信,Arduino Nano 33物联网在运行时打印:

  • AS7341传感器内置LED的亮度级别
  • AS7341传感器生成的光谱颜色数据
  • 来自web应用程序的服务器响应

步骤6:创建基于光谱颜色的成熟阶段数据集

为了用光谱颜色来训练我的成熟阶段的神经网络模型,我需要收集不同水果和蔬菜的光谱颜色数据,以创建一个具有显著有效性的数据集。因此,我决定使用AS7341可见光传感器收集光谱颜色数据。

该传感器采用了知名AMS公司推出的新一代AS7341光谱传感器IC。它有8个可见光通道,一个近红外(NIR)通道,一个没有过滤器的通道(Clear),和一个额外的通道分布在环境光闪烁(flicker)。此外,它还有6个并行的16位ADC通道用于信号和数据处理。由于集成了两个亮度可调的led,它甚至可以在黑暗的环境中收集数据。

#️⃣运行时,我使用AS7341可见光传感器收集以下参数:

  • F1 (405 - 425 nm)
  • F2 (435 - 455 nm)
  • F3 (470 - 490 nm)
  • F4 (505 - 525 nm)
  • F5(545-565nm)
  • F6 (580 - 600 nm)
  • F7 (620 - 640 nm)
  • F8 (670 - 690 nm)
  • 清除1
  • NIR_1
  • 清除2
  • NIR_2

#️⃣ 如前一步所述,我将AS7341传感器连接到Arduino Nano 33 IoT,以将参数和指定的成熟阶段标签发送到PHP web应用程序。获取数据后,web应用程序通过将当前日期参数(步骤1)添加到spectral_color_database.csv将(数据集)置于以下列下:

  • F1
  • F2
  • F3
  • F4
  • F5
  • F6
  • F7
  • F8
  • NIR_1
  • NIR_2
  • 成熟
  • 日期

在完成编程和组装设备后,我选择了11种不同的水果和蔬菜,根据光谱颜色收集它们的成熟度级别:金宝博娱乐城

#️⃣ 该设备允许用户通过按下四个类按钮之一,向web应用程序发送数据并分配成熟度类(标签):

  • 0 -早熟
  • 1 -半熟
  • 2 - 成熟
  • 3 -衰变

#️⃣对于每一种水果和蔬菜,我整理光谱颜色数据和经验分配的成熟度等级,每天三次,为期十天:

#️⃣该设备允许用户通过电位器调整AS7341传感器上内置LED的亮度。

#️⃣如果传输的数据插入数据集成功,则设备打开5mm绿色LED。否则,5mm红色LED亮起。

不出所料,在十天的数据收集过程中,水果和蔬菜已经逐渐变质:

最后,通过光谱颜色每天收集三次成熟度类,连续十天,我得到了一个数据集金宝博娱乐城(光谱颜色数据库.csv)对神经网络模型的训练具有显著的有效性。

步骤7:用TensorFlow构建人工神经网络(ANN)

当我用光谱颜色数据集完成我的成熟阶段后,我开始使用我的人工神经网络(ANN)模型来预测不同水果和蔬菜的成熟阶段。

我决定用TensorFlow在Python中创建我的神经网络模型。因此,首先,我遵循以下步骤来更好地理解我的数据集:

  • 数据可视化
  • 数据扩展(正火)
  • 数据预处理
  • 数据分割

正如前面的步骤所解释的,在收集光谱颜色数据的同时,我根据经验为每个水果和蔬菜入口(输入)分配成熟阶段类别。金宝博娱乐城因此,我使用这些预定义的类作为标签,不需要预处理我的数据集来分配金宝博娱乐城标签:

  • 0 -早熟
  • 1 -半熟
  • 2 - 成熟
  • 3 -衰变

在对数据集中的输入进行缩放(标准化)和预处理后,我为每个水果和蔬菜条目提取了10个输入变量和一个标签,并按照上述四个类别进行分类。然后,我用TensorFlow建立了一个人工神经网络模型,并用我的数据集对其进行训练,以获得最佳的结果和预测。金宝博娱乐城

层:

  • 10 [输入]
  • 16[隐藏]
  • 32[隐藏]
  • 64年[隐藏]
  • 128年[隐藏]
  • 256[隐藏]
  • 4(输出)

为了执行上面的所有步骤,我创建了一个名为Ripeness_Detection在Python中包含所需库后:

Import tensorflow as tf from tensorflow Import keras Import matplotlibPyplot as PLT import numpy as np import pandas as pd

随后,我将讨论上面提到的每个步骤的Python编码。

另外,你可以下载build_neural_network_model.py检查代码。

步骤8:基于光谱颜色可视化成熟阶段数据集

在深入构建神经网络模型之前,理解给定的数据集以传递适当格式的数据是至关重要的。

因此,在这一步中,我将向您展示如何可视化成熟阶段数据集,并在Python中缩放(标准化)它。

⭐首先,阅读从中读取成熟阶段数据spectral_color_database.csv

csv_path = "E: PYTHON\Vegetables_and_Fruits_Ripeness_Detection\spectral_color_database.csv" df = pd.read_csv(csv_path)

⭐在图形函数中,使用Matplotlib图书馆。

def graphics(self, column_1, column_2, x_label, y_label): #显示数据集中请求的列:set_window_title('蔬菜和水果的成熟度检测颜色')df (column_1),自我。df[column_2], cmap='RdBu') plt.colorbar() plt.xlabel(x_label) plt.ylabel(y_label) plt.title(x_label) plt.show()

⭐在data_visualization函数,在缩放和预处理成熟阶段数据集之前仔细检查所有列,以使用适当格式的数据构建模型。

def data_visualization(self): #仔细检查请求的列,使用适当格式的数据构建模型:self。图形(“F1”、“NIR_1”,“F1 (405 - 425 nm)”,“近红外”)的自我。图形(F2,‘NIR_1’,‘F2 (435 - 455 nm),近红外)的自我。图形(‘F3’,‘NIR_1’,‘F3 (470 - 490 nm),近红外)的自我。图形(“F4”、“NIR_1”,“F4 (505 - 525 nm)”,“近红外”)的自我。图形(“F5”、“NIR_2”,“F5 (545 - 565 nm)”,“近红外”)的自我。图形(F6,‘NIR_2’,‘F6 (580 - 600 nm),近红外)的自我。图形(F7,‘NIR_2’,‘F7 (620 - 640 nm),近红外)的自我。图形(F8,“NIR_2”、“F8 (670 - 690 nm)”,“近红外”)

步骤9:分配标签(预定义的成熟阶段)和缩放(标准化)输入数据

在构建和培训我的神经网络模型之前,我将每种食物和蔬菜条目(输入)的预先定义的成熟类用作标签。金宝博娱乐城

⭐在define_and_assign_labels函数,为数据集中的每个输入获取预定义的成熟类(标签)[0 - 3],并金宝博娱乐城将它们附加到标签大堆

def define_and_assign_labels(自我):自我。标签= self.df.pop(“成熟”)

分配标签后,我需要创建输入来训练我的神经网络模型。从我的成熟阶段数据集,我决定使用AS7341可见光传感器生成的这十个参数作为光谱颜色数据来创建输入:

  • F1
  • F2
  • F3
  • F4
  • F5
  • F6
  • F7
  • F8
  • NIR_1
  • NIR_2

在为输入选择10个参数并可视化数据集之后,我缩放(标准化)每个参数列以正确格式化它们。

通常情况下,数据集中水果或蔬菜的每个输入在缩放之前如下所示:

  • 131, 148, 184, 765, 1000, 1000, 1000, 809, 276, 273

在完成缩放(归一化)后,我从每个水果和蔬菜输入(输入)的成熟阶段数据集中提取了这些缩放参数列:

  • scaled_f1.
  • scaled_f2.
  • scaled_f3.
  • scaled_f4.
  • Scaled_F5.
  • scaled_f6.
  • scaled_f7.
  • scaled_f8.
  • scaled_NIR_1
  • scaled_NIR_2

输入缩放参数:

  • [0.131 0.148 0.184 0.765 1 1 1 0.809 0.276 0.273]

⭐在scale_data_and_define_inputs函数,将每个参数列划分为所需的值,以便使它们小于或等于1。

然后,创建带有缩放参数的输入,将其添加到输入属性,并将该数组转换为NumPy数组asarray()函数。

⭐每个输入包含10个参数[shape=(10,)]:

  • [scaled_F1, scaled_F2, scaled_F3, scaled_F4, scaled_F5, scaled_F6, scaled_F7, scaled_F8, scaled_NIR_1, scaled_NIR_2]
def scale_data_and_define_inputs(自我):自我。df["scaled_F1"] = self.df.pop("F1") / 1000 self.df ["scaled_F1"] = self.df.pop("F1") / 1000df["scaled_F2"] = self.df.pop("F2") / 1000 self.df [" F2"] = self.df.pop("F2") / 1000 self.df [" F2")df["scaled_F3"] = self.df.pop("F3") / 1000 self.df ["scaled_F3"] = self.df.pop("F3") / 1000df["scaled_F4"] = self.df.pop("F4") / 1000 self.df [" F4"] = self.df.pop("F4") / 1000 self.df [" F4")df["scaled_F5"] = self.df.pop("F5") / 1000 self.df ["scaled_F5"] = self.df.pop("F5") / 1000df["scaled_F6"] = self.df.pop("F6") / 1000 self.df ["scaled_F6"] = self.df.pop("F6") / 1000df(“scaled_F7”)= self.df.pop (F7) / 1000的自我。df["scaled_F8"] = self.df.pop("F8") / 1000 self.df ["scaled_F8"] = self.df.pop("F8") / 1000df["scaled_NIR_1"] = self.df.pop("NIR_1") / 1000 self.df ["scaled_NIR_1"] = self.df.pop("NIR_1") / 1000df["scaled_NIR_2"] = self.df.pop("NIR_2") / 1000 #使用缩放变量创建输入数组:df[“scaled_F1”][我],自我。df[“scaled_F2”][我],自我。df[“scaled_F3”][我],自我。df[“scaled_F4”][我],自我。df[“scaled_F5”][我],自我。df[“scaled_F6”][我],自我。df[“scaled_F7”][我],自我。df[“scaled_F8”][我],自我。df[“scaled_NIR_1”][我],self.df[“scaled_NIR_2”][我]]))的自我。输入= np.asarray (self.inputs)

步骤10:基于光谱颜色在成熟阶段类上训练模型(ANN)金宝博娱乐城

在预处理和缩放(标准化)成熟阶段数据集创建输入和标签后,我将它们分为训练(95%)和测试(5%)集:

def split_data(self):l=len(self.df)#(95%,5%)-(训练,测试)self.train_inputs=self.inputs[0:int(l*0.95)]self.test_inputs=self.inputs[int(l*0.95):]self.train_labels=self.labels[0:int(l*0.95)]

然后,我用Keras建立了我的人工神经网络(ANN)模型,并用十九个时期的训练集对其进行训练。

您可以检查这些教程学习激活函数、损失函数、周期等。

def build_and_train_model(self): #构建神经网络。= keras模型。连续([keras.Input(shape=(10,)), keras.layers. dense (16), keras.layers. dense (32), keras.layers. dense (64), keras.layers. dense (128), keras.layers. dense (256), keras.layers. dense (16), keras.layers. dense (32), keras.layers. dense (64), keras.layers. dense (128), keras.layers. dense (256), keras.layers.# self.model. Compile (optimizer='adam', loss="sparse_categorical_crossentropy", metrics=['accuracy']) #train_inputs,自我。train_labels时代= 19)……

使用训练集(输入和标签)进行训练后,我的神经网络模型的精度介于0.820.89

步骤11:评估模型

在建立和训练我的人工神经网络模型后,我利用测试集(输入和标签)测试了它的准确性和有效性。

该模型的评估准确性是0.9412

...#测试准确性:print("\n\nModel Evaluation:") test_loss, test_acc = self.model.evaluate(self。test_inputs, self.test_labels) print(" evaluate Accuracy: ", test_acc)

在评估我的神经网络模型后,我将其保存为Tensorflow Keras H5模型(Ann_ripeness_Detection.h5)

def save_model(self):self.model.save(“E:\PYTHON\vegets\u and\u Fruits\u summess\u Detection\model\ANN\u summess\u Detection.h5”)

步骤12:通过对成熟阶段进行预测,对模型进行实验

在完成并保存我的神经网络模型后,我用设备获取水果和蔬菜的光谱颜色数据,并根据我在训练模型时如何缩放(标准化)它们(步骤5.2),将它们格式化为输入参数。然后,我创建了一个NumPy数组(prediction_array)该模型由格式化后的输入参数组成,利用光谱颜色预测成熟阶段。

该模型以4个数字的数组形式预测每个输入的标签(成熟度类)的可能性。它们表示模型的金宝博娱乐城“信心”即给定的输入数组根据光谱颜色[0 - 3]对应四个不同的成熟度类别中的每一个,如步骤5所示。金宝博娱乐城

  • 早期成熟[0]
  • [1]部分成熟
  • [2] 成熟的
  • [3]衰变

⭐在make_predictions功能:

⭐ 加载保存的模型(Ann_ripeness_Detection.h5)到内存中。

⭐格式化输入数据。

⭐然后,使用NumPy数组中的格式化输入数据为每个水果和蔬菜输入设置输入张量值prediction_array

⭐ 运行模型进行预测。

⭐最后,显示使用该输入的模型预测的最准确的标签(成熟类)argmax ()函数。

def make_predictions(self): saved_model = keras.models.load_model("E: PYTHON\Vegetables_and_Fruits_Ripeness_Detection\model\ANN_Ripeness_Detection.h5")阵列([[0.131,0.148,0.184,0.765,1,1,1,0.809,0.276,0.273),(0.143,0.122,0.157,0.228,1,1,1,1,0.335,0.334),(0.038,0.032,0.032,0.030,0.042,0.055,0.467,0.880,0.100,0.102),(0.002, 0.001, 0.001, 0.002, 0.003, 0.003, 0.002, 0.007, 0.010, 0.012]])预测= saved_model.predict (prediction_array)打印(“\ n \ nModel预测:\ n”)我的范围(len (prediction_array)):打印(“输入”+ str (i + 1 ) + "] => ", self.ripeness_class_names [np.argmax(预测[我])))

我用这个模型来预测许多水果和蔬菜的成熟阶段。就我的实验而言,这个模型运行得无可挑剔:)

步骤13:连接和调整

//连接//Arduino Nano 33 IoT://AS7341 11通道光谱颜色传感器//3.3V---------------------------+//GND-----------------//A5------------------C//A4------------------D//10K电位计//A0------------------S//Class按钮(6x6)//D2----------------------//类按钮_2(6x6)//D3-----------------//类按钮_3(6x6)//D4-----------------//类按钮_4(6x6)//D5-----------------//5mm绿色LED//D6-----------------//5mm红色LED//D7---------------------------

为了采集和发送AS7341可见光传感器产生的光谱颜色数据,我将传感器安装在Arduino Nano 33物联网上。然后,在向PHP web应用程序发送数据时,我连接了四个类按钮来分配成熟类(Early Ripe, Partially Ripe, Ripe, Decay)。我用一个电位器(长轴带旋钮)来调节AS7341传感器上内置LED的亮度。最后,我添加了5mm的绿色和红色led,表示来自web应用程序的响应——成功与否。

连接完成后,我用热胶枪将面包板和AS7341传感器固定在一个旧书架上,形成一个坚固的设备。

步骤14:视频和结论

在完成上述所有步骤和实验后,该设备就成为了一个熟练的助手,可以根据水果和蔬菜的成熟阶段,根据光谱颜色进行分类。

第15步:进一步讨论

将这种光谱颜色的成熟度检测方法推广使用,可以帮助[1]:

避免农民消耗大量时间,以便在收获中手动分类和检查水果和蔬菜,直至其生长期,

提高产量估算,

加速疾病检测。

参考文献

Mrs Rex Fiona et al 2019 J. Phys。:配置号1362 012033。

16步:示意图

步骤17:代码和下载

Arduino比赛

亚军
Arduino比赛

第一个分享

    建议

    • 万圣节竞赛

      万圣节竞赛
    • 复古的技术挑战

      复古的技术挑战
    • 塑料的挑战

      塑料的挑战

    6评论

    0
    joymcjoy

    8周前

    如前所述,高CRI光源是必须的或校准您的设备的led,如果led的数据表是一个很好的估计,以纠正传感器读数,但仍然应该验证。
    频谱给出的文档wiki:https://dfimg.dfrobot.com/nobody/wiki/87f89c470604ff47db5bf083cece4abd.png
    接下来3D打印一个黑色漏斗甚至是一根软管。小到足以覆盖任何水果,蔬菜的一部分。这将是好的高度可调从顶部adand给你完全相同的距离在每个测量。此外,它周围有一个黑盒子,以遮挡外部阳光,进一步提高精度。在实验室中,为了计算出神经网络的参数,比如在期刊上发表,我将切割出cm²皮肤,将其平铺,并使用上述原理。伟大的工作!

    0
    dlebryk

    2个月前

    祝贺您使用ANN对未知样本进行预测。作为概念的证明,你做得很好。我明白了,ANN那篇文章是你的巨大成就。在频谱分析的世界里,在你尝试更广泛地使用它之前,有一些事情你应该考虑。

    从视频中,我可以看出你把标本放在传感器上有很多困难。如果你看一下原始数据的单个部件以不同的方式放置在传感器上,你会看到巨大的变化。你需要用某种方法来更精确地再现这个标本。

    你用设备上的两个LED来照亮标本。这些可能是被丢弃的发光二极管发射光谱很随机。至少,它们很可能不是高CRI的LED,因此在光谱上有偏差。下一步是使用高质量/高CRI LED来照亮样品。

    使用人工神经网络和光对未知样本进行预测的概念已经存在了很长时间(至少10年)。光源和你拿样品的方式是这个复制工作的关键。你发现的秘密武器是一个廉价的传感器和一些伟大的编码工作,以证明概念的工作。

    好工作。

    0
    davidrandallmccann

    2个月前

    那真的很酷,但是眼睛、鼻子和触摸是最好的方式!!

    0
    约西亚米勒

    3个月前

    虽然有些东西在未来的项目中可能会得到更多的解决,这个项目,以及这个想法本身都是非常棒的,我完全是这个项目的粉丝!伟大的工作!

    0
    imperf3kt

    3个月前

    从商店买的西红柿怎么样?这些水果通常是通过将其暴露在气体中人工“成熟”的,而不是实际上的“成熟”,尽管表皮是深红色的。

    0
    kymyst

    3个月前

    这是个有趣的想法,但你打算如何处理颜色不均匀或多色的水果呢?