深度学习 植物识别算法系统 计算机竞赛

文章目录

  • 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 = imgb_img = Image.new('RGB', (224, 224), (255, 255, 255))size = img.sizeif 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 Sequenceimport mathclass SequenceData(Sequence):def __init__(self, batch_size, target_size, data):# 初始化所需的参数self.batch_size = batch_sizeself.target_size = target_sizeself.x_filenames = datadef __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.sizeif 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_imgif 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解JMeter中的JSON Extractor

Apache JMeter是一款出色的开源性能和功能测试工具&#xff0c;这款工具提供了丰富的功能和强大的扩展性&#xff0c;可以应对各种复杂的测试需求。当我们在进行接口测试时&#xff0c;经常会遇到需要从接口响应中提取信息并在后续请求中使用的情况。这时候&#xff0c;JMeter中…

arf_1解题

arf_1解题 镜像环境 version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-1:latestports:- 80:80新建yml文件将代码保存在当前位置 使用docker-compost up -d 拉取镜像 解题 访问该镜像映射端口为1520 可以看到页面只有一个holle但…

java Concurrent 线程安全的集合类

ConcurrentHashMap&#xff1a;是一个线程安全的哈希表实现&#xff0c;它支持高并发的读写操作。它采用了分段锁的机制&#xff0c;将整个哈希表分成多个段&#xff0c;每个段都有一个独立的锁&#xff0c;不同的线程可以同时访问不同的段&#xff0c;从而提高并发性能。 Con…

【Python】一文带你掌握数据容器之集合,字典

目录&#xff1a; 一、集合 思考&#xff1a;我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: &#xff08;1&#xff09;列表可修改、支持重复元素且有序 &#xff08;2&#xff09;元组、字符…

DAY52 300.最长递增子序列 + 674. 最长连续递增序列 + 718. 最长重复子数组

300.最长递增子序列 题目要求&#xff1a;给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 […

Home Assistant使用ios主题更换背景

Home Assistant使用ios主题、更换背景 lovelace-ios-dark-mode-theme 默认前置情况&#xff0c;1、已安转HACS插件2、搜索安装 IOS Dark Mode Theme1&#xff09;第一、二步应该很容易实现&#xff0c;configuration.yaml文件很容易被找到2&#xff09;而本人在进行第三步操作时…

python_定时任务自动匹配数据II

从配置文件读取配置参数&#xff0c;并每天定时执行日常任务、每周一定时执行周任务&#xff0c;匹配符合要求的org数据&#xff0c;文件查找-复制-合并-裁剪。 import os import re import shutil import threading import datetime import timeimport schedule# 全局变量&am…

php+vue3实现点选验证码

buildadmin 中的点选验证码实现 验证码类 <?phpnamespace ba;use Throwable; use think\facade\Db; use think\facade\Lang; use think\facade\Config;/*** 点选文字验证码类*/ class ClickCaptcha {/*** 验证码过期时间(s)* var int*/private int $expire 600;/*** 可以…

我记不住的那些命令(不断更新中)

fzf 一种进行模糊查找的命令行工具 主页&#xff1a;https://github.com/junegunn/fzf 我的主机是 Kali&#xff0c;通过apt进行安装fzf&#xff0c;并进行配置。 # apt install fzf # apt show fzf 通过参考/usr/share/doc/fzf/README.Debian来进行快速配置快捷键和自动补…

保护您的Google账号安全:检查和加固措施

简介&#xff1a;随着我们在日常生活中越来越依赖于Google账号&#xff0c;我们的个人信息和敏感数据也变得越来越容易受到威胁。为了确保您的Google账号的安全性&#xff0c;本文将介绍一些简单但有效的方法&#xff0c;帮助您检查和加固您的Google账号。 --- 在数字时代&am…

squid代理服务器

squide是正向代理&#xff0c;缓存加速。基于aci访问控制协议。可以过滤控制。可以实现访问控制 squid代理的工作机制 nginx是转发 1、 squid是代替客户端向网站请求数据&#xff0c;不需要访问代理的ip地址。直接请求目的网站即可。由代理服务器处理请求和响应。squid也可以…

Linux 应用服务

Part I: Linux 系统概述 什么是 LinuxLinux 的历史和版本Linux 发行版介绍Linux 的优缺点 Part II: Linux 安装与配置 5. 硬件要求与准备工作 6. 安装 Linux 操作系统 7. Linux 系统初始化设置 8. Linux 系统更新与升级 9. Linux 基础配置 Part III: Linux 命令行 10. Linux…

关于前端地图笔记

坐标系 地球坐标系——WGS84&#xff1a;常见于 GPS 设备&#xff0c;Google 地图等国际标准的坐标体系。火星坐标系——GCJ-02&#xff1a;中国国内使用的被强制加密后的坐标体系&#xff0c;高德坐标、腾讯地图。百度坐标系——BD-09&#xff1a;百度地图所使用的坐标体系&a…

如何创建NTP Server给本地局域网用

安装NTP Server sudo apt-get install ntp配置conf文件 sudo vimd /etc/ntp.conf# 允许本地网络的客户端访问&#xff0c;但是不允许本地机器修改server的时间 restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap启动服务 sudo service ntp start你可以使用以下命令来检…

[Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版

软件说明 使用Media Encoder&#xff0c;您将能够处理和管理多媒体。插入、转码、创建代理版本&#xff0c;并几乎以任何可用的格式输出。在应用程序中以单一方式使用多媒体&#xff0c;包括Premiere Pro、After Effects和Audition。 紧密整合 与Adobe Premiere Pro、After …

WebRTC简介及使用

文章目录 前言一、WebRTC 简介1、webrtc 是什么2、webrtc 可以做什么3、数据传输需要些什么4、SDP 协议5、STUN6、TURN7、ICE 二、WebRTC 整体框架三、WebRTC 功能模块1、视频相关①、视频采集---video_capture②、视频编解码---video_coding③、视频加密---video_engine_encry…

保护数字前沿:下一代防火墙如何塑造网络安全的未来

下一代防火墙通过提供先进的威胁检测、精细控制和云安全功能&#xff0c;正在重塑网络安全的未来。随着数字环境的不断发展&#xff0c;组织必须采用这些创新解决方案来保护其数字资产并维护安全的数字前沿。 在当今互联的世界中&#xff0c;网络威胁变得越来越复杂&#xff0c…

安全认证 | CISP和CISSP区别是什么?考哪个好?

随着信息安全愈发受到重视&#xff0c;信息安全领域的证书也越来越多&#xff0c;其中比较权威的如CISP和CISSP证书是不少人的选择。 那么这两者之间到底有什么区别&#xff1f;究竟考哪个会比较好呢&#xff1f; 01 CISP是什么 CISP指的是注册信息安全专业人员&#xff0c;系…

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家&#xff0c;通过helm安装很简单&#xff0c;但是会遇到一些问题。 安装 首先登录阿里云控制台&#xff0c;在ACK集群详情页&#xff0c;进入CloudShell&#xff0c;执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…