软著项目推荐 深度学习 植物识别算法系统

文章目录

  • 0 前言
  • 2 相关技术
    • 2.1 VGG-Net模型
    • 2.2 VGG-Net在植物识别的优势
      • (1) 卷积核,池化核大小固定
      • (2) 特征提取更全面
      • (3) 网络训练误差收敛速度较快
  • 3 VGG-Net的搭建
    • 3.1 Tornado简介
      • (1) 优势
      • (2) 关键代码
  • 4 Inception V3 神经网络
    • 4.1 网络结构
  • 5 开始训练
    • 5.1 数据集
    • 5.2 关键代码
    • 5.3 模型预测
  • 6 效果展示
    • 6.1 主页面展示
    • 6.2 图片预测
    • 6.3 三维模型可视化
  • 7 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的植物识别算法研究与实现

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

在这里插入图片描述

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 更多资料, 项目分享:

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 = img
            b_img = Image.new('RGB', (224, 224), (255, 255, 255))
            size = img.size
            if 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 Sequence
    import math


    class SequenceData(Sequence):
        def __init__(self, batch_size, target_size, data):
            # 初始化所需的参数
    
            self.batch_size = batch_size
            self.target_size = target_size
            self.x_filenames = data
    
        def __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.size
                if 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_img
                if 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

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

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

相关文章

玩转大数据:3-Hadoop家族的力量与挑战

引言 Hadoop作为一个强大的大数据处理框架&#xff0c;以其分布式计算和存储能力在业界备受关注。然而&#xff0c;Hadoop在应用场景、适用范围、社区支持以及后续持续发展等方面也面临着一些挑战。本文将围绕Hadoop的生态应用&#xff0c;以及来自其他生态的挑战&#xff0c;…

浅聊代理(应用部署)

以前很少接触过项目的上线部署&#xff0c; 我对前后端交互的认知还停留在前端一个请求 对应后端一个API 比如后端提供: /api/backend/categories -GET 前端则通过使用ajax或者axios组件去构建http请求&#xff0c; 发送到: https://host:port/api/backend/categories -GET 一、…

华为云之云桌面Workspace的使用体验

华为云之云桌面Workspace的使用体验 一、云桌面Workspace介绍1.云桌面简介2.云桌面特点3. 云桌面应用场景①远程移动办公②协同办公③安全办公④公用终端⑤图形制作渲染 二、本次实践介绍1. 本次实践目的2. 本次实践环境 三、购买云桌面1. 进入华为云的云桌面购买界面2. 选择购…

《C++PrimerPlus》第9章 内存模型和名称空间

9.1 单独编译 Visual Studio中新建头文件和源代码 通过解决方案资源管理器&#xff0c;如图所示&#xff1a; 分成三部分的程序&#xff08;直角坐标转换为极坐标&#xff09; 头文件coordin.h #ifndef __COORDIN_H__ // 如果没有被定义过 #define __COORDIN_H__struct pola…

人工智能概论

一、关键技术 人工智能包含了七项关键技术: 1. 机器学习: 机器学习是研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能&#xff0c;是人工智能技术的核心。 从学习模式划分&#xff0c;分…

JMeter从入门到精通

1、 jmeter的介绍 jmeter也是一款接口测试工具&#xff0c;由java语言开发的&#xff0c;主要进行性能测试。 2、jmeter安装 jmeter官网下载链接&#xff1a; https://jmeter.apache.org/download_jmeter.cgi &#xff0c;查看是否安装成功【jmeter -v】 下载 java jdk1.8&…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

应用程序APP制作用Vue3CreateApp打包有什么优势?有哪些好处?

在当代的前端开发领域&#xff0c;Vue.js作为一个领先的JavaScript框架&#xff0c;一直处于技术革新和发展的前沿。Vue3作为该框架的最新版本&#xff0c;带来了更多的新特性和优化。在这些新特性中&#xff0c;createApp方法是一个非常值得关注的变化。对于开发者而言&#x…

redis相关题

1 什么是Redis Redis(Remote Dictionary Server) 是⼀个使⽤ C 语⾔编写的&#xff0c;开源的&#xff08;BSD许可&#xff09;⾼性能⾮关系型&#xff08;NoSQL&#xff09;的键值对数据库。Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串&#xff0c;…

石油化工隐蔽设备AR可视化检修协助系统让新手也能轻松上岗

随着城市基础设施建设的不断推进&#xff0c;地下管线巡检工作的重要性日益凸显。传统的巡检方法已无法满足现代都市的高效运营需求。此时&#xff0c;地下管线AR智慧巡检远程协助系统应运而生&#xff0c;凭借其独特的特点与优势&#xff0c;为城市地下管线巡检带来了革命性的…

vue中的插槽用法(动态插槽)

vue中提供了一种通讯方式叫插槽>分为&#xff1a;默认插槽、具名插槽(作用域插槽) 1. 当一个组件有不确定的结构时, 就需要使用slot技术了 2. 注意: 插槽内容是在父组件中编译后, 再传递给子组件 3. 如果决定结构的数据在父组件, 那用默认slot或具名slot (1) 当只有一个不…

易石无代码开发:电商平台连接CRM与客服系统,实现营销自动化

易石无代码开发的优势 易石软件以其强大的无代码开发平台&#xff0c;为电商企业提供了一种全新的业务集成手段。在激烈的市场竞争中&#xff0c;电商平台必须不断优化其运营效率和客户服务质量。易石无需复杂的API开发&#xff0c;通过简单的配置就能实现电商平台与CRM、客服…

openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态

文章目录 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态135.1 检查办法135.2 操作步骤135.3 异常处理 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态 135.1 检查办法 通过openGauss提供的gs_check工具可以开展o…

Python自动化测试——元素定位

1.selenium简介 Selenium是一个用于Web应用程序测试的工具。Selenium是直接运行在浏览器中&#xff0c;模拟用户操作web界面。支持多平台&#xff1a;windows、linux、MAC &#xff0c;支持多浏览器&#xff1a;ie、firefox、chrome等浏览器。 2. 启动浏览器 # 导入webdrive…

狗都会配的SNAT和DNAT配置

1 SNAT 1.1 SNAT SNAT原理与应用:. SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理:源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 SNAT转换前提条件: 1.局域网各主机已正确设…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(系统概述与环境搭建)

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(系统概述与环境搭建) 该项目分析着重于设计和实现基于SpringBoot+MyBatis框架的电脑商城。首先,通过深入分析项目所需数据,包括用户、商品、商品类别、收藏、订单、购物车、收货地址,建立了数据模型。在…

美团三季报“外强中干”,二级市场叫好不叫座

11月28日&#xff0c;美团&#xff08;HK:03690&#xff09;发布截至2023年9月30日的业绩公告。财报显示&#xff0c;美团2023年第三季度的收入为764.67亿元&#xff0c;较2022年同期的626.19亿元增长22.1%&#xff1b;净利润为35.93亿元&#xff0c;同比增长195.3%。 在非国际…

ArcGIS制作广场游客聚集状态及密度图

文章目录 一、加载实验数据二、平均最近邻法介绍1. 平均最近邻工具2. 广场游客聚集状态3. 结果分析三、游客密度制图一、加载实验数据 二、平均最近邻法介绍 1. 平均最近邻工具 “平均最近邻”工具将返回五个值:“平均观测距离”、“预期平均距离”、“最近邻指数”、z 得分和…

【JMeter】菜单栏介绍

【菜单栏】 1. Tools 导入curl接口信息 作用&#xff1a;快速导入接口信息&#xff0c;响应头和缓存信息等 Log level临时修改日志等级 作用&#xff1a; 从勾选的level开始往更高等级level抓取log日志等级优先级&#xff1a; ALL < TRACE < DEBUG <INFO<WA…

内模原理与控制

基于模型的控制方法&#xff1a; 把外部作用信号的动力学模型植入控制器来构成高精度反馈控制系统的设计原理。 内模原理&#xff08;IMP&#xff09;指的是&#xff0c;想要实现对R(s)的无差跟踪&#xff0c;系统的反馈回路中需要包含一个与外部输入R(s)相同的动力学模型。通…