基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(四)

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
    • Python环境
    • TensorFlow 环境
    • Jupyter Notebook环境
    • Pycharm 环境
    • 微信开发者工具
    • OneNET云平台
  • 模块实现
    • 1. 数据预处理
    • 2. 创建模型并编译
    • 3. 模型训练及保存
      • 1)模型训练
      • 2)模型保存
    • 4. 上传结果
      • 1)图片拍摄
      • 2)模型导入及调用
      • 3)数据上传OneNET云平台
        • (1)图片信息上传
        • (2)预测结果上传
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目基于Keras框架,引入CNN进行模型训练,采用Dropout梯度下降算法,按比例丢弃部分神经元,同时利用IOT及微信小程序实现自动化远程监测果实成熟度以及移动端实时监测的功能,为果农提供采摘指导,有利于节约劳动力,提高生产效率,提升经济效益。

本项目基于Keras框架,采用卷积神经网络(CNN)进行模型训练。通过引入Dropout梯度下降算法,实现了对神经元的按比例丢弃,以提高模型的鲁棒性和泛化性能。同时,利用物联网(IoT)技术和微信小程序,项目实现了自动化远程监测果实成熟度,并在移动端实时监测果园状态的功能。这为果农提供了采摘的实时指导,有助于节约劳动力、提高生产效率,从而提升果园经济效益。

首先,项目采用Keras框架构建了一个卷积神经网络,利用深度学习技术对果实成熟度进行准确的识别和预测。

其次,引入Dropout梯度下降算法,通过随机丢弃神经元的方式,防止模型过拟合,提高了对新数据的泛化能力。

接着,项目整合了物联网技术,通过传感器等设备对果园中的果实进行远程监测。这样,果农可以在不同地点远程了解果实的成熟度状况。

同时,通过微信小程序,果农可以实时监测果园状态,了解果实成熟度、采摘时机等信息,从而更加科学地安排采摘工作。

总体来说,该项目不仅在模型训练上引入了先进的深度学习技术,还通过物联网和微信小程序实现了智能化的果园管理系统,为果农提供了更加便捷、高效的农业生产解决方案。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

模型训练流程如图所示。
在这里插入图片描述

数据上传流程如图所示。

在这里插入图片描述

小程序流程如图所示。
在这里插入图片描述

运行环境

本部分包括Python环境、TensorFlow环境、JupyterNotebook环境、PyCharm环境、微信开发者工具和OneNET云平台。

Python环境

详见博客。

TensorFlow 环境

详见博客。

Jupyter Notebook环境

详见博客。

Pycharm 环境

详见博客。

微信开发者工具

详见博客。

OneNET云平台

详见博客。

模块实现

本项目包括本项目包括5个模块:数据预处理、创建模型与编译、模型训练及保存、上传结果、小程序开发。下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

以红枣为实验对象,在互联网上爬取1000张图片作为数据集。

详见博客。

2. 创建模型并编译

数据加载进模型之后,需要定义模型结构并优化损失函数。

详见博客。

3. 模型训练及保存

定义模型架构和编译之后,通过训练集训练,使模型可以识别红枣的成熟程度。这里将使用训练集和测试集来拟合并保存模型。

1)模型训练

本部分相关代码如下:

#model.fit函数返回一个History的对象
#History属性记录了损失函数和其他指标的数值随epoch变化的情况
hist =model.fit(x = train_data, y = train_label,
                validation_data=[test_data, test_label], 
                epochs = 500, batch_size = 64)
hist.history['val_acc'][0]#记录运行输出
preds = model.evaluate(test_data, test_label)
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))

其中,一个batch就是在一次前向/后向传播过程用到的训练样例数量,本项目中每一次用64张图片进行训练。预处理数据集后,按照8:2的比例划分训练集和测试集,如图所示。

在这里插入图片描述

通过观察训练集和测试集的损失函数、准确率的大小来评估模型的训练程度,并进行模型训练的进一步决策。一般来说,训练集和测试集的损失函数(或准确率)不变且基本相等为模型训练的最佳状态。

可以将训练过程中保存的准确率和损失函数以图片的形式呈现。

import numpy as np
import matplotlib.pyplot as plt
#绘制曲线
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] #指定默认字体
plt.rcParams['axes.unicode_minus'] = False #解决保存图像是“-”显示为方块的问题
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
lns1 = ax1.plot(np.arange(500), loss, label="Loss")
#按一定间隔显示实现方法
#ax2.plot(200 * np.arange(len(fig_accuracy)), fig_accuracy, 'r')
lns2 = ax2.plot(np.arange(500), acc, 'r', label="Accuracy")
ax1.set_xlabel('训练轮次')
ax1.set_ylabel('训练损失值')
ax2.set_ylabel('训练准确率')
#合并图例
lns = lns1 + lns2
labels = ["损失", "准确率"]
#labels = [l.get_label() for l in lns]
plt.legend(lns, labels, loc=7)
plt.show()

2)模型保存

为能够被Python程序读取,将模型保存为.h5格式,利用Keras中的Model模块进行保存。模型被保存后,可以被重用,也可以移植到其他环境中使用。

from keras.models import Model
model = HappyModel((IMG_H,IMG_W,3))
#保存为.h5文件
model.save('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')

模型被保存后,可以被重用,也可以移植到其他环境中使用。

4. 上传结果

上传结果有两种方法:一是调用计算机摄像头拍摄图片,将图片信息转换为二进制数据流后上传至OneNET云平台;二是将数字图片输入Keras模型中,获取输出后将识别结果上传至OneNET云平台。

1)图片拍摄

图片拍摄具体操作如下:
(1)调用摄像头需要引入cv2类,对数据进行保护。

import cv2

(2)调用cv2类中的VideoCapture函数,实现调用笔记本内置摄像头拍摄的功能。

#调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2
cap=cv2.VideoCapture(0) 
while True:
    #从摄像头读取图片
    sucess,img=cap.read()
    #显示摄像头
    cv2.imshow("img",img)
    #等待时延为1ms,保持画面的持续
    k=cv2.waitKey(1)
    if k == 27:
        #通过ESC键退出摄像
        cv2.destroyAllWindows()
        break
    elif k == 13:
        #通过回车保存图片,并退出
        cv2.imwrite('C:/Users/SeverusSnape/Desktop/myProject/images/try.png',img)
        cv2.destroyAllWindows()
        break
#关闭摄像头
cap.release()    

2)模型导入及调用

模型导入及调用的相关操作如下:

(1)把训练好的.h5文件放入myProject项目目录。

(2)加载Keras模型库,调用Keras模型得到预测结果。

from keras.models import load_model

(3)在xxxtsj.ipynb中声明模型存放路径,调用load_model()函数。

#加载模型.h5文件
model=load_model('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')
#定义规范化图片大小和像素值的函数
def get_inputs(src=[]):
    rsltData = []
    for s in src:
        input = cv2.imread(s)#读入图像,BGR
        input = cv2.resize(input, (IMG_W, IMG_H))#缩放
        input = cv2.cvtColor(input, cv2.COLOR_BGR2RGB)#将BGR图片转成RGB
pre_y=model.predict(np.reshape(input,[1,IMG_H,IMG_W,3]),batch_size=1)
        print(np.argmax(pre_y, axis=1))#打印最大概率对应的标签
       a=np.argmax(pre_y,axis=1)#必须通过遍历否则格式不对,不止包含数还包括btypy
        for i in a:
            rsltData.append(i)#将最大概率对应的标签加入rsltData列表尾部
    return rsltData
predict_dir = 'C:/Users/SeverusSnape/Desktop/myProject/images/'
#要预测图片所在的文件夹
picName = os.listdir(predict_dir)#获得文件夹内的文件名
images = []
for testpath in picName:
    fn = os.path.join(predict_dir, testpath)
    if fn.endswith('png'):#后缀是png的文件会被存入images列表
        picData = fn
        print(picData)#打印被存入的图片地址
        images.append(picData)#地址存入images列表
rsltData = get_inputs(images)#调用规范化图片函数得到最大概率对应标签

3)数据上传OneNET云平台

本部分包括图片信息上传和识别结果上传。

(1)图片信息上传

将图片信息转换成二进制数据流,使用POST方法上传。

#定义图片上传函数
http_put_pic(data):
    url = "http://api.heclouds.com/bindata"
    headers = {
        "Content-Type": "image/png", #格式
        "api-key": "93IlIl2tfXddMN8sgQIInc7qbXs=", 
    }
    #device_id是设备ID
    #datastream_id是数据流ID
    querystring = {"device_id": "586488389", "datastream_id": "pic"}
    #流式上传
    with open(data, 'rb') as f:
        requests.post(url, params=querystring, headers=headers, data=f)
(2)预测结果上传

因为识别的结果是整型数据,直接使用POST方法上传数值。

#定义预测结果上传函数
def http_put_rslt(data):
    url = "http://api.heclouds.com/devices/" + deviceId + '/datapoints'
    d = time.strftime('%Y-%m-%dT%H:%M:%S')
    data = int(data)  #将Numpy数据int64转化成json可识别的int
    values = {"datastreams": [{"id": "rslt", "datapoints": [{"value": data}]}]}
    jdata = json.dumps(values).encode("utf-8")
    request = urllib.request.Request(url, jdata)  #获取链接数据
    request.add_header('api-key', APIKey)
    request.get_method = lambda: 'POST'  #POST方法
    request = urllib.request.urlopen(request)
    return request.read()

相关其它博客

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(一)

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(二)

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(三)

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(五)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

农副产品行业ERP有哪些?农副产品行业ERP是做什么的

现实生活当中有很多种类的农副产品,这些琳琅满目的商品有多元化的营销渠道和策略,同时在保质期、包装、价格策略、配料、生产工艺等诸多方面存在明显的差异。 由于行业的特殊性,传统的人工统计分析工作量较大,同时也难以确保业务…

数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载 地址:https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键,选择“链接…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)

DevExpress WPF的Side Navigation(侧边导航)、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar(导航栏),DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

路面状况监测站-科普百科

随着城市化进程的加速,道路交通问题日益凸显,路面状况的监测和预警成为了至关重要的一环。为了保障市民的出行安全,路面状况监测站智能设备,为您的出行保驾护航。 WX-LM1路面状况监测站采用了物联网技术,通过传感器实…

节省时间,提高效率:深入解析MyBatis Plus

1. MyBatis Plus 概述 将Mybatis 通用Mapper PageHelper 升级成 MyBatis Plus 1.1 简介 官网:https://baomidou.com/ 参考教程:https://baomidou.com/pages/24112f/ MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具&#…

【Axure原型分享】3D多柱状图_中继器版

今天和大家分享3D多柱状图_中继器版的原型模板,鼠标移入时,对应区域的背景会高亮变色,并且显示对应柱状体的数据。那这个原型是用Axure原生元件制作的,样式交互都可以自行修改,图表数据在中继器表格里填写,…

企业举办年会,可以邀请哪些媒体进行宣传?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 年关将至,筹办年会成为每个企业必做的事情,也是大家非常期待的年终大会,在我们策划年会时候,也要抓住最后宣传的机会。那么企业举办年会时…

自定义异常

这个类上加上controlleradvice注解

性能测试:方法、工具与最佳实践

目录 前言 1. 为什么进行性能测试? 2. 性能测试方法 3. 性能测试工具 Apache JMeter: LoadRunner: Gatling: Apache ab (Apache Benchmark): Locust: Tsung: BlazeMeter: K6: Neoload: WebLOAD: 4. 最佳实践 设定明确的性能测试目标: 模…

yarn系统架构与安装

1.1 YARN系统架构 YARN的基本思想是将资源管理和作业调度/监视功能划分为单独的守护进程。其思想是拥有一个全局ResourceManager (RM),以及每个应用程序拥有一个ApplicationMaster (AM)。应用程序可以是单个作业,也可以是一组作业。 一个ResourceManage…

Rust 学习

Rust 官网:https://www.rust-lang.org/zh-CN/ 1、Rust 简介 Rust 是一门注重安全(safety)、速度(speed)和并发(concurrency)的现代系统编程语言。Rust 通过内存安全来实现以上目标,但…

YB5212A高输入耐压2A单节/双节锂电池充电芯片

YB5212A高输入耐压2A单节/双节锂电池充电芯片 概述: YB5212A 是一种5-18V输入,2A电流可支持单节和双节锂电池的同步Buck锂离子电池充电器,适用于便携式应用。选择引脚方便多单元充电。800khz同步降压调节器集成MOS,超低导通电阻&a…

聚焦中国—东盟大健康产业峰会 点靓广西“长寿福地”品牌

12月8-10日2023中国—东盟大健康产业峰会暨大健康产业博览会在南宁国际会展中心成功举办,本次峰会由国家中医药管理局、广西壮族自治区人民政府联合主办,中国老年学和老年医学学会、自治区党委宣传部、自治区民政厅、广西壮族自治区外事办公室、广西壮族…

vue 实现点击复制文本到剪贴板

vue 实现点击复制文本到剪贴板 共四种方法 1. navigator.clipboard.writeText该方法需要在安全域下才能够使用&#xff0c;比如&#xff1a;https 协议的地址、127.0.0.1、localhost <template><div><el-button type"primary" click"btn1"…

Dockerfile创建镜像介绍

1.介绍 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile&#xff0c;docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 常用选项说明 --build-arg&#xff0c;设置构建时的…

命名空间 嵌套类和局部类

命名空间 命名空间可以不连续 未命名空间 命名空间的别名 using声明和using指示 嵌套类 访问嵌套类成员 嵌套类的名称查找 嵌套类中名称查找失败会在外围中查找 局部类 局部类可以访问外围函数枚举 静态对象 局部类可以定义函数但是函数必须在类内定义 局部类内不能定义静态成…

【Jeecg Boot 3 - 第二天】1.2、jar 包和 lib 依赖分离,部署包缩小100倍

一、场景 二、思路 三、实战 ▶ 2.1、项目 jar 包解压获取 lib config Stage 1&#xff1a;正常打包获取 jeecg-system-start-3.6.0.jar Stage 2&#xff1a;解压 获取如下文件 Stage 3&#xff1a;获取 lib config ▶ 2.2、获取简化版项目jar包 Stage 1&#xff1…

gitlab动态流水线

文章目录 1. 说明2. 官方样例2.1 在作业中生成配置文件&#xff0c;保存为产物2.2 将触发器作业配置为在生成配置文件的作业之后运行。 3. 实战应用3.1 背景介绍3.2 项目介绍3.3 公共项目配置3.4 测试项目配置3.5 测试 4. 总结 1. 说明 顾名思义&#xff0c;动态流水线就是一种…

Altman作了多少恶?排挤首席科学家出GPT5开发、离间董事会、PUA员工

在山姆奥特曼&#xff08;Sam Altman&#xff09;被OpenAI董事会突然解职后的几天里&#xff0c;这个消息在科技圈引发轰动&#xff0c;该公司内部员工和许多科技界人士甚至将此举比作一场政变。 奥特曼被解雇后立即传出的说法是&#xff0c;OpenAI的广大员工都很喜欢他&#x…

治疗复发或难治性多发性骨髓瘤:2期MagnetisM-3试验结果

今天给同学们分享一篇实验文章“Elranatamab in relapsed or refractory multiple myeloma: phase 2 MagnetisMM-3 trial results”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 试验设计和患者 MagnetisMM-3是一项正在进行的…