互联网加竞赛 python+深度学习+opencv实现植物识别算法系统

2023-12-20

0 前言

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

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

在这里插入图片描述

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

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

???? 更多资料, 项目分享:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互联网加竞赛 python+深度学习+opencv实现植物识别算法系统 的相关文章

  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • 在相同任务上,Keras 比 TensorFlow 慢

    我正在使用 Python 运行斩首 DCNN 本例中为 Inception V3 来获取图像特征 我使用的是 Anaconda Py3 6 和 Windows7 使用 TensorFlow 时 我将会话保存在变量中 感谢 jdehesa 并
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 在 Spyder 的变量资源管理器中查看局部变量

    我是 python 新手 正在使用 Spyder 的 IDE 我欣赏它的一项功能是它的变量资源管理器 然而 根据一些研究 我发现它只显示全局变量 我找到的解决方法是使用检查模块 import inspect local vars def m
  • 使用 pybtex 将 bibtex 转换为格式化的 HTML 参考书目,例如哈佛风格

    我正在使用 Django 并将 bibtex 存储在我的模型中 并且希望能够以格式化 HTML 字符串的形式向我的视图传递引用 使其看起来像哈佛引用样式 使用中描述的方法Pybtex 无法识别 bibtex 条目 https stackov
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • python 中的 after() 与 update()

    我是 python 新手 开始使用 tkinter 作为画布 到目前为止 我使用 update 来更新我的画布 但还有一个 after 方法 谁能给我解释一下这个函数 请举个例子 两者之间有什么区别 root after integer c
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 速通Python基础语法--周边知识篇

    一 注释的使用 注释方法 批量化注释 Ctrl 注释 再按一次取消 注释位置 注释的原则 要求 二 输出到控制台 格式化打印字符串 三 通过控制台输入 input 返回值 类型转换int 例子
  • 计算机基础:网络基础

    一 网线制作 1 制作所需要工具 网线 网线制作标准 2 水晶头使用 3 网线钳使用 4 视频教学 网线制作 二 集线器 交换机介绍 1 OSI七层模型 Open System Interconnect 即开放系统互连参考模型 是由 ISO
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • C++常见STL容器基本用法

    1 vector include
  • 抓包干什么用?

    抓包是一种网络分析工具 用于捕获和分析网络流量 它可以用于各种测试和调试场景 包括但不限于以下几个方面 1 网络故障排除 当网络出现问题时 抓包可以帮助你捕获和分析数据包 以确定问题的根本原因 你可以检查数据包的源和目标地址 协议 端口等信
  • 计算机毕设项目分享(含算法) 源码+论文(三)

    1 基于机器视觉的人体姿态行为识别 人体姿态估计是通过将图片中已检测到的人体关键点正确的联系起来 从而估计人体姿态 人体关键点通常对应人体上有一定自由度的关节 比如颈 肩 肘 腕 腰 膝 踝等 通过对人体关键点在三维空间相对位置的计算 来估
  • MySQL使用DISTINCT过滤重复数据和MySQL AS:设置别名

    MySQL使用DISTINCT过滤重复数据 在 MySQL 中使用 SELECT 语句执行简单的数据查询时 返回的是所有匹配的记录 如果表中的某些字段没有唯一性约束 那么这些字段就可能存在重复值 为了实现查询不重复的数据 MySQL 提供了
  • javafx实现图形编辑器

    下面是一个简单的示例 使用JavaFX实现了一个基本的图形编辑器 可以绘制矩形和圆形 import javafx application Application import javafx scene Scene import javafx
  • java实现回文数算法

    判断一个数是否为回文数可以使用以下算法 将数字转化为字符串 初始化左右两个指针 分别指向字符串的首尾 循环比较左右指针指向的字符 如果相等则继续比较 直到左右指针相遇或者发现不相等的字符为止 如果左右指针相遇 则说明数字是回文数 返回tru
  • 分页查询,order by,where用法

    一 查询数据库ESS的Elog表格的ETime Des列 查询出的结果只显示这两列 SELECT E LOG ETime E LOG Des ROWNUM rn FROM ESS E LOG 二 分页查询ROWNUM 用法 rn变量 行号
  • 【已解决】CString与int互相转化

    本博文源于笔者在mfc下进行编码时遇到的一个问题 算是原创也算是转载 因为借鉴别人的思路 自己又转述罢了 之前看用atoi发现不行 最后用了 ttoi解决 int转化为CString CString tmp int i 5 tmp Form
  • Plist编辑器:PlistEdit Pro中文

    PlistEdit Pro是一款功能强大的plist文件编辑软件 旨在提供简单而强大的方式来修改和管理Mac OS X的配置文件 它具有直观的用户界面和丰富的功能 让你可以轻松地编辑和管理plist文件 PlistEdit Pro支持对各种
  • 【taro react】---- 解决 iOS 真机微信小程序 Input 密码框 type 切换会导致 Input 内容丢失问题

    1 问题场景 在密码登陆时 有显示和隐藏密码的功能 实现方式很简单 直接对输入 input 的 type 进行 password 和 text 值进行切换 就可以实现密码的显示和隐藏 2 实现代码 通过修改 input 的 type 值实现
  • 【taro react】---- 解决 taro 编译 H5 姓名脱敏导致的 iOS 部分低版本白屏问题

    1 姓名脱敏方法 判断传入字段是否是字符串 将字符串除第一个字符后的其他字符全部替换为 const replaceUserName name gt if isTypingMathods isString name return name r
  • 【已解决】vs2015下QtnetWork No Such File or Directory报错

    源于笔者在做qt工具时 遇到的一个问题 问题很直观 加载第三方文件时 第三方文件调用了 include
  • Goby 漏洞发布| Apusic 应用服务器 createDataSource 远程代码执行漏洞

    漏洞名称 Apusic 应用服务器 createDataSource 远程代码执行漏洞 English Name Apusic Application Server loadTree Remote Code Execution Vulner
  • Hamming space

    汉明距离表示两个相同长度字符串对应位置的不同字符的数量 对两个字符串异或运算 并统计1的个数并相减 这个数就是汉明距离
  • Tomcat远程调试

    windows环境 写一个 startup debug bat 指定tomcat的根目录 端口自己定义 rem 设置Tomcat目录 set CATALINE HOME D asd A8 2 tomcat d rem 8787为可用端口 为
  • 互联网加竞赛 python+深度学习+opencv实现植物识别算法系统

    0 前言 优质竞赛项目系列 今天要分享的是 基于深度学习的植物识别算法研究与实现 学长这里给一个题目综合评分 每项满分5分 难度系数 4分 工作量 4分 创新点 4分 更多资料 项目分享 https gitee com dancheng s